#!/bin/sh # # MKlib_gen.sh -- generate sources from curses.h macro definitions # # ($Id: MKlib_gen.sh,v 1.1 1996/12/16 08:43:21 tholo Exp $) # # The XSI Curses standard requires all curses entry points to exist as # functions, even though many definitions would normally be shadowed # by macros. Rather than hand-hack all that code, we actually # generate functions from the macros. # # This script accepts a file of prototypes on standard input. It discards # any that don't have a `generated' comment attached. It then parses each # prototype (relying on the fact that none of the macros take function # pointer or array arguments) and generates C source from it. # # Here is what the pipeline stages are doing: # # 1. sed: extract prototypes of generated functions # 2. sed: decorate prototypes with generated arguments a1. a2,...z # 3. awk: generate the calls with args matching the formals # 4. sed: prefix function names in prototypes so the preprocessor won't expand # them. # 5. cpp: macroexpand the file so the macro calls turn into C calls # 6. awk: strip the expansion junk off the front and add the new header # 7. sed: squeeze spaces, strip off gen_ prefix, create needed #undef # preprocessor="$1 -I../include" AWK="$2" TMP=gen$$.c trap "rm -f $TMP" 0 1 2 5 15 (cat <$TMP $preprocessor $TMP 2>/dev/null \ | $AWK ' BEGIN { print "/*" print " * DO NOT EDIT THIS FILE BY HAND!" print " * It is generated by MKlib_gen.sh." print " *" print " * This is a file of trivial functions generated from macro" print " * definitions in curses.h in order to satisfy the XSI Curses" print " * requirement that every macro also exist as a callable" print " * function." print " *" print " * It will neever be linked unless you call one of the entry" print " * points with its normal macro definition disabled. In that" print " * case, if you have no shared libraries, it will indirectly" print " * pull most of the rest of the library into your link image." print " * Cope with it." print " */" print "#include \"curses.h\"" print "" } /^DECLARATIONS/ {start = 1; next;} {if (start) print $0;} ' \ | sed \ -e 's/ */ /g' \ -e 's/ */ /g' \ -e 's/ gen_/ /' \ -e 's/^M_/#undef /' \ -e '/^%%/s// /'