Home | History | Annotate | Line # | Download | only in sh
mkoptions.sh revision 1.1
      1  1.1  kre #! /bin/sh
      2  1.1  kre 
      3  1.1  kre # $NetBSD: mkoptions.sh,v 1.1 2017/05/28 00:38:01 kre Exp $
      4  1.1  kre 
      5  1.1  kre #
      6  1.1  kre # It would be more sensible to generate 2 .h files, one which
      7  1.1  kre # is for everyone to use, defines the "variables" and (perhaps) generates
      8  1.1  kre # the externs (though they could just be explicit in options.h)
      9  1.1  kre # and one just for options.c which generates the initialisation.
     10  1.1  kre #
     11  1.1  kre # But then I'd have to deal with making the Makefile handle that properly...
     12  1.1  kre # (this is simpler there, and it just means a bit more sh compile time.)
     13  1.1  kre 
     14  1.1  kre set -f
     15  1.1  kre IFS=' 	'	# blank, tab (no newline)
     16  1.1  kre 
     17  1.1  kre IF="$1"
     18  1.1  kre OF="${3+$3/}$2"
     19  1.1  kre 
     20  1.1  kre {
     21  1.1  kre 	printf '/*\n * File automatically generated by %s.\n' "$0"
     22  1.1  kre 	printf ' * Do not edit, do not add to cvs.\n'
     23  1.1  kre 	printf ' */\n\n'
     24  1.1  kre 
     25  1.1  kre 	printf '#ifdef DEFINE_OPTIONS\n'
     26  1.1  kre 	printf '#define DEF_OPT(a,b,c,d,e) { a, b, c, d, e },\n'
     27  1.1  kre 	printf 'struct optent optlist[] = {\n'
     28  1.1  kre 	printf '#else\n'
     29  1.1  kre 	printf '#define DEF_OPT(a,b,c,d,e)\n'
     30  1.1  kre 	printf '#endif\n\n'
     31  1.1  kre } >"${OF}"
     32  1.1  kre 
     33  1.1  kre FIRST=true
     34  1.1  kre I=0
     35  1.1  kre 
     36  1.1  kre while read line
     37  1.1  kre do
     38  1.1  kre 	# Look for comments in various styles, and ignore them
     39  1.1  kre 	# preprocessor statements are simply output verbatim
     40  1.1  kre 	# but use them only first or last. one #ifdef/#endif at end is OK
     41  1.1  kre 
     42  1.1  kre 	case "${line}" in
     43  1.1  kre 	'')	continue;;
     44  1.1  kre 	/*)	continue;;
     45  1.1  kre 	\**)	continue;;
     46  1.1  kre 	\;*)	continue;;
     47  1.1  kre 	\#*)	printf '%s\n\n' "${line}" >&4; continue;;
     48  1.1  kre 	esac
     49  1.1  kre 
     50  1.1  kre 	set -- ${line%%[ 	]#*}
     51  1.1  kre 
     52  1.1  kre 	var="$1" name="$2"
     53  1.1  kre 
     54  1.1  kre 	case "${var}" in
     55  1.1  kre 	('' | [!A-Za-z_]* | *[!A-Za-z0-9_]*)
     56  1.1  kre 		printf >&2 "Bad var name: '%s'\\n" "${var}"
     57  1.1  kre 		# exit 1
     58  1.1  kre 		continue	# just ignore it for now
     59  1.1  kre 	esac
     60  1.1  kre 
     61  1.1  kre 	case "${name}" in
     62  1.1  kre #	=)	name=${var};;		# probably not a good idea
     63  1.1  kre 	?) 	set -- ${var} '' $name $3 $4; name= ;;
     64  1.1  kre 	esac
     65  1.1  kre 
     66  1.1  kre 	chr="$3" set="$4" dflt="$5"
     67  1.1  kre 
     68  1.1  kre 	case "${chr}" in
     69  1.1  kre 	-)	chr= set= dflt="$4";;
     70  1.1  kre 	''|?)	;;
     71  1.1  kre 	*)	printf >&2 'flag "%s": Not a character\n' "${chr}"; continue;;
     72  1.1  kre 	esac
     73  1.1  kre 
     74  1.1  kre 	# options must have some kind of name, or they are useless...
     75  1.1  kre 	test -z "${name}${chr}" && continue
     76  1.1  kre 
     77  1.1  kre 	case "${set}" in
     78  1.1  kre 	-)	set= ;;
     79  1.1  kre 	[01])	dflt="${set}"; set= ;;
     80  1.1  kre 	''|?)	;;
     81  1.1  kre 	*)	printf >&2 'set "%s": Not a character\n' "${set}"; continue;;
     82  1.1  kre 	esac
     83  1.1  kre 
     84  1.1  kre 
     85  1.1  kre 	if [ -n "${name}" ]
     86  1.1  kre 	then
     87  1.1  kre 		printf '    DEF_OPT("%s", ' "${name}" >&4
     88  1.1  kre 	else
     89  1.1  kre 		printf '    DEF_OPT(0, ' >&4
     90  1.1  kre 	fi
     91  1.1  kre 
     92  1.1  kre 	if [ -n "${chr}" ]
     93  1.1  kre 	then
     94  1.1  kre 		printf "'%s', " "${chr}" >&4
     95  1.1  kre 	else
     96  1.1  kre 		printf '0, ' >&4
     97  1.1  kre 	fi
     98  1.1  kre 
     99  1.1  kre 	if [ -n "${set}" ]
    100  1.1  kre 	then
    101  1.1  kre 		printf "'%s', 0, " "${set}" >&4
    102  1.1  kre 	else
    103  1.1  kre 		printf '0, 0, ' >&4
    104  1.1  kre 	fi
    105  1.1  kre 
    106  1.1  kre 	if [ -n "${dflt}" ]
    107  1.1  kre 	then
    108  1.1  kre 		printf '%s )\n' "${dflt}" >&4
    109  1.1  kre 	else
    110  1.1  kre 		printf '0 )\n' >&4
    111  1.1  kre 	fi
    112  1.1  kre 
    113  1.1  kre 	printf '#define	%s	optlist[%d].val\n\n' "${var}" "${I}" >&4
    114  1.1  kre 	I=$((I + 1))
    115  1.1  kre 
    116  1.1  kre 	test -z "${chr}" && continue
    117  1.1  kre 
    118  1.1  kre 	printf '%s %d\n' "${chr}" $((I - 1))
    119  1.1  kre 
    120  1.1  kre done < "$IF" 4>>"${OF}" | sort -t' ' -k1,1f -k1,1r | while read chr index
    121  1.1  kre do
    122  1.1  kre 	if $FIRST
    123  1.1  kre 	then
    124  1.1  kre 		printf '#ifdef DEFINE_OPTIONS\n'
    125  1.1  kre 		printf '    { 0, 0, 0, 0, 0 }\n};\n\n'
    126  1.1  kre 		printf 'const unsigned char optorder[] = {\n'
    127  1.1  kre 		FIRST=false
    128  1.1  kre 	fi
    129  1.1  kre 	printf '\t%s,\n' "${index}"
    130  1.1  kre 
    131  1.1  kre done >>"${OF}"
    132  1.1  kre 
    133  1.1  kre {
    134  1.1  kre 	printf '};\n\n'
    135  1.1  kre 	printf '#define NOPTS (sizeof optlist / sizeof optlist[0] - 1)\n'
    136  1.1  kre 	printf 'int sizeof_optlist = sizeof optlist;\n\n'
    137  1.1  kre 	printf	\
    138  1.1  kre 	   'const int option_flags = (sizeof optorder / sizeof optorder[0]);\n'
    139  1.1  kre 	printf '\n#else\n\n'
    140  1.1  kre 	printf 'extern struct optent optlist[];\n'
    141  1.1  kre 	printf 'extern int sizeof_optlist;\n'
    142  1.1  kre 	printf 'extern const unsigned char optorder[];\n'
    143  1.1  kre 	printf 'extern const int option_flags;\n'
    144  1.1  kre 	printf '\n#endif\n'
    145  1.1  kre } >> "${OF}"
    146  1.1  kre 
    147  1.1  kre exit 0
    148