#!/bin/sh
preprocessor="$1 -I../include"
AWK="$2"
ED1=sed1$$.sed
ED2=sed2$$.sed
ED3=sed3$$.sed
AW1=awk1$$.awk
TMP=gen$$.c
trap "rm -f $ED1 $ED2 $ED3 $AW1 $TMP" 0 1 2 5 15
(cat <<EOF
DECLARATIONS
EOF
cat >$ED1 <<EOF1
/^extern.*generated/{
h
s/^.*generated:\([^ *]*\).*/P_ g
s/^extern \([^;]*\);.*/\1/p
g
s/^.*generated:\([^ *]*\).*/P_}
EOF1
cat >$ED2 <<EOF2
/^P_/b nc
/(void)/b nc
s/,/ a1% /
s/,/ a2% /
s/,/ a3% /
s/,/ a4% /
s/,/ a5% /
s/,/ a6% /
s/,/ a7% /
s/,/ a8% /
s/,/ a9% /
s/,/ a10% /
s/,/ a11% /
s/,/ a12% /
s/,/ a13% /
s/,/ a14% /
s/,/ a15% /
s/*/ * /g
s/%/ , /g
s/)/ z)/
:nc
/(/s// ( /
s/)/ )/
EOF2
cat >$ED3 <<EOF3
/^P_/{
s/^P_ s/^P_//
b done
}
s/ */ /g
s/ */ /g
s/ ,/,/g
s/ )/)/g
s/ gen_/ /
s/^M_/ /^%%/s// /
:done
EOF3
cat >$AW1 <<\EOF1
BEGIN {
skip=0;
}
/^P_ print "\n"
print $0
skip=0;
}
/^P_ print $0
skip=1;
}
$0 !~ /^P_/ {
if (skip)
print "\n"
skip=1;
if ( $1 == "chtype" ) {
returnType = "Char";
} else {
returnType = "Code";
}
print "M_" $2
print $0;
print "{";
argcount = 1;
if (NF == 5 && $4 == "void")
argcount = 0;
if (argcount != 0) {
for (i = 1; i <= NF; i++)
if ($i == ",")
argcount++;
}
dotrace = 1;
if ($2 == "innstr")
dotrace = 0;
call = "%%T((T_CALLED(\""
args = ""
comma = ""
num = 0;
pointer = 0;
argtype = ""
for (i = 1; i <= NF; i++) {
ch = $i;
if ( ch == "*" )
pointer = 1;
else if ( ch == "va_list" )
pointer = 1;
else if ( ch == "char" )
argtype = "char";
else if ( ch == "int" )
argtype = "int";
else if ( ch == "short" )
argtype = "short";
else if ( ch == "chtype" )
argtype = "chtype";
else if ( ch == "attr_t" || ch == "NCURSES_ATTR_T" )
argtype = "attr";
if ( ch == "," || ch == ")" ) {
if (pointer) {
if ( argtype == "char" ) {
call = call "%s"
comma = comma "_nc_visbuf2(" num ","
pointer = 0;
} else
call = call "%p"
} else if (argcount != 0) {
if ( argtype == "int" || argtype == "short" ) {
call = call "%d"
argtype = ""
} else if ( argtype != "" ) {
call = call "%s"
comma = comma "_trace" argtype "2(" num ","
} else {
call = call "%#lx"
comma = comma "(long)"
}
}
if (ch == ",")
args = args comma "a" ++num;
else if (argcount != 0)
args = args comma "z"
call = call ch
if (pointer == 0 && argcount != 0 && argtype != "" )
args = args ")"
if (args != "")
comma = ", "
pointer = 0;
argtype = ""
}
if ( i == 2 || ch == "(" )
call = call ch
}
call = call "\")"
if (args != "")
call = call ", " args
call = call ")); "
if (dotrace)
printf "%s", call
if (match($0, "^void"))
call = ""
else if (dotrace)
call = sprintf("return%s( ", returnType);
else
call = "%%return ";
call = call $2 "(";
for (i = 1; i < argcount; i++)
call = call "a" i ", ";
if (argcount != 0)
call = call "z";
if (!match($0, "^void"))
call = call ") ";
if (dotrace)
call = call ")";
print call ";"
if (match($0, "^void"))
print "%%returnVoid;"
print "}";
}
EOF1
sed -n -f $ED1 \
| sed -e 's/NCURSES_EXPORT(\(.*\)) \(.*\) (\(.*\))/\1 \2(\3)/' \
| sed -f $ED2 \
| $AWK -f $AW1 ) \
| sed \
-e '/^\([a-z_][a-z_]*\) /s//\1 gen_/' >$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 <curses.priv.h>"
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;/' \
| sed \
-e 's/^\(.*\) \(.*\) (\(.*\))$/NCURSES_EXPORT(\1) \2 (\3)/'