#!/bin/sh # # MKlib_gen.sh -- generate sources from curses.h macro definitions # # (Id: MKlib_gen.sh,v 1.10 1997/07/26 22:12:20 tom 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: macro-expand 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" ED1=sed1$$.sed ED2=sed2$$.sed ED3=sed3$$.sed TMP=gen$$.c trap "rm -f $ED1 $ED2 $ED3 $TMP" 0 1 2 5 15 (cat < #include DECLARATIONS EOF cat >$ED1 <$ED2 <$ED3 <$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 to satisfy the XSI Curses requirement" print " * that every macro also exist as a callable function." print " *" print " * It will never 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 " */" print "#include " print "" } /^DECLARATIONS/ {start = 1; next;} {if (start) print $0;} ' \ | sed -f $ED3 \ | sed \ -e 's/^.*T_CALLED.*returnCode( \([a-z].*) \));/ return \1;/' \ -e 's/^.*T_CALLED.*returnCode( \((wmove.*) \));/ return \1;/'