This is conf.func.sh in view mode; [Download] [Up]
#!/bin/sh
# $Author: cck $ $Date: 88/05/19 13:09:24 $
# $Header: conf.func.sh,v 1.9 88/05/19 13:09:24 cck Rel $
# $Revision: 1.9 $
#
# CAP function configuration script. This ain't perfect, but it's a start
# execute with /bin/sh Configure if your system won't run it (ksh is okay
# too).
#
# Takes a function description list and outputs a set of cpp or m4 defines
# that tell us whether the various items are defined
#
# Usage: Conf.func.sh <name list> <function list> ["m4"|"cpp] <output>
# m4 - causes m4 output, cpp - cpp output
# <namelist> of library or libraries to search for function defs
# function list file in following format:
# comments start with "# "
# First field: type - see below
# Second field: define name
# Third field: name of include file
# Fourth field: function name to lookup in name list
# Fifth field: Reason for needing it
#
# type is one of:
# AND condition
# A+ - postive match: must match conditions
# A- - negative match: mustn't match conditions
# OR condition
# O+ - postive match: must match conditions
# O- - negative match: mustn't match conditions
# negative and postive matches are conditions on a "N" line
# N+ - last entry in a list of needed matches: output true definition
# N- - last entry in a list of needed matches: output false definition
# N+- - says to output a true if match else false definition
# N-+ - is the reverse of N+-
# by outputting true or false - it means outputting an uncommented
# vs. commented definition
# N - last entry in a list of needed matches: output nothing
# E - End of list - default value: don't output definition
#
# Conf.func.sh does the following:
# If C, then keep going until next N line matching "N" line
# iff all preceeding "C" lines match
# If "N" line has matched, scan to next "E" line
# If no "N" lines match, then put commented defintion out and
# tell via comment
#
NLIST=$1
FLIST=$2
OTYPE=$3
OFILE=$4
# debug option - don't bother compiling if set
FULLCHECK=$5
fullcheck=1
if [ -n "${FULLCHECK}" ]; then fullcheck=0; fi
# see if they gave us a grep
if [ -z "$PGREP" ]; then
PGREP=grep
fi
if [ -z "${OFILE}" ]; then
echo "No output file"
exit 255
fi
if [ "$OTYPE" != "m4" -a "$OTYPE" != "cpp" ]; then
echo "Type out of output must be m4 or cpp"
exit 255
fi
if [ "$OTYPE" = "m4" ]; then
m4out=1
fi
if [ ! -f ${FLIST} ]; then
echo "Function list ${FLIST} not found"
exit 255
fi
if [ ! -f ${NLIST} ]; then
echo "Name list ${NLIST} not found"
exit 255
fi
echo
echo "Conf.func.sh - find what functions cap wants are available"
echo "Tries to do this by reading the list ${FLIST} that tells"
echo "what functions to look for and the necessary include files."
echo
echo "Names are searched from the namelist passed in ${NLIST}"
echo "produced by nm. If a function is found in the name list,"
echo "a simple program is compiled and loaded to ensure that it is there."
echo
echo "Analyzing name list output"
grep "Symbols from" < ${NLIST} > /dev/null 2>/dev/null
rc=$?
if [ $rc -eq 0 ]; then
echo "nm output has \"Symbols from\" in it, assuming"
echo "System V style, will grep for function name followed by space"
gc=" "
else
echo "BSD style, will grep for function name at end of the line"
gc="$"
fi
echo
if [ $fullcheck -eq 1 ]; then
echo "Temporary files: /tmp/cfs$$.c, /tmp/cfs$$"
else
echo "Won't compile, because we are testing"
fi
if [ -f ${OFILE} ]; then
echo Will overwrite ${OFILE}
else
echo Will create ${OFILE}
fi
echo
echo "[Hit carriage return to continue]"
read ans
trap "
echo Exiting... Wait
if [ -f /tmp/cfs$$.c ]; then rm -f /tmp/cfs$$.c; fi
if [ -f /tmp/cfs$$ ]; then rm -f /tmp/cfs$$; fi
exec < /dev/tty
IFS=$oldifs
exit 255
" 2
exec < ${FLIST}
# save file seperators
oldifs=$IFS
IFS="${IFS},"
# foundit takes three values:
# 0 - include and/or call not found
# 1 - found a "N" entry
# 2 - found entry for a "C+","C-" line
# 3 - bad match on a "C+" or "C-"
foundit=0
echo
if [ -f ${OFILE} ]; then
rm ${OFILE}
echo Overwriting ${OFILE}
else
echo Creating ${OFILE}
fi
echo
while read type what inc call comment
do
# comment
if [ -z "$type" -o "$type" = "#" ]; then
continue;
fi
# map x to empty
if [ "$call" = "x" ]; then call=""; fi
if [ "$inc" = "x" ]; then inc=""; fi
if [ -n "$call" ]; then callmsg="${call} - "; else callmsg="" ; fi
# end of list
if [ "$type" = "E" ]; then
if [ $fullcheck -eq 0 ]; then echo "At end: $foundit"; fi
if [ $foundit -ne 1 ]; then
echo Defaulting to "$comment"
fi
foundit=0
continue
fi
case "$type" in
"N"|"N+"|"N-"|"N+-"|"N-+")
;;
"A+"|"A-")
# check conditions failed
if [ ${foundit} -eq 3 -o ${foundit} -eq 1 ]; then continue; fi
;;
"O-"|"O+")
# if foundit is 2, then a matching condition, since we are or
# we just continue. 1 implies previous n match in group and so
# continue there too
if [ ${foundit} -eq 2 -o ${foundit} -eq 1 ]; then continue; fi
;;
*) continue;;
esac
# if foundit is 2, then we have a good continuation sequence
if [ $foundit -eq 2 ]; then
also="Also c"
else
also="C"
fi
# if foundit is one, then we have matched a previous "N" line
# and output is always commented
# also the case when the previous line was a condition that failed
# if foundit 3 and we have "N" then reset foundit
if [ $foundit -eq 3 -o $foundit -eq 1 ]; then
case "$type" in
"N+"*|"N-"*)
if [ $m4out ]; then
echo "# ${callmsg}${comment}" >> ${OFILE}
echo "# define([X_${what}],1)" >> ${OFILE}
else
echo "/* # define ${what} */ /* ${callmsg}${comment} */" >> ${OFILE}
fi
if [ $foundit -eq 3 ]; then foundit=0 ; fi
continue
esac
fi
# now to the guts
# just to pretty print
if [ -n "${inc}" -o -n "${call}" ]; then
if [ -n "${call}" -a -n "${inc}" ]; then
echo "${also}hecking for existence of ${call} and ${inc}"
else
echo "${also}hecking for existence of ${call}${inc}"
fi
fi
# if include there or empty
good=1
if [ -z "${inc}" -o -f "${inc}" ]; then good=0; fi
# if call and include okay
if [ $good -eq 0 ]; then
if [ -n "${call}" ]; then
${PGREP} "${call}${gc}" < ${NLIST} 2>/dev/null >/dev/null
good=$?
if [ $fullcheck -eq 1 ]; then
if [ $good -eq 0 ]; then
echo "main(){$call();}" > /tmp/cfs$$.c
cc -o /tmp/cfs$$ /tmp/cfs$$.c >/dev/null 2>/dev/null
good=$?
else
echo "$call not found in namelist"
fi
fi
else
good=0
fi
fi
msg=""
if [ -n "$call" ]; then msg="$call "; fi
if [ -n "$msg" ]; then msg="${msg}and "; fi
if [ -n "$inc" ]; then msg="${msg}${inc} "; fi
if [ -n "$msg" ]; then msg="${msg}for "; fi
if [ $good -eq 0 ]; then
case "${type}" in
"A+"|"O+") echo "TRUE: match $msg$comment"; foundit=2;;
"A-"|"O-") echo "FALSE: match $msg$comment"; foundit=3;;
*) echo "Found $msg$comment"; foundit=1 ;;
esac
else
case "${type}" in
"A+"|"O+") echo "FALSE: no match $msg$comment"; foundit=3;;
"A-"|"O-") echo "TRUE: no match $msg$comment"; foundit=2;;
*) ;;
esac
fi
# output match
if [ $foundit -eq 1 ]; then
case "$type" in
"N+"*)
if [ $m4out ]; then
echo "# ${callmsg}${comment}" >> ${OFILE}
echo "define([X_${what}],1)" >> ${OFILE}
else
echo "# define ${what} /* ${callmsg}${comment} */" >> ${OFILE}
fi
;;
"N-"*)
if [ $m4out ]; then
echo "# ${callmsg}${comment}" >> ${OFILE}
echo "# define([X_${what}],1)" >> ${OFILE}
else
echo "/* # define ${what} */ /* ${callmsg}${comment} */" >> ${OFILE}
fi
;;
esac
continue
else
# failed: output second
if [ "$type" = "N-+" ]; then
if [ $m4out ]; then
echo "# ${callmsg}${comment}" >> ${OFILE}
echo "define([X_${what}],1)" >> ${OFILE}
else
echo "# define ${what} /* ${callmsg}${comment} */" >> ${OFILE}
fi
fi
if [ "$type" = "N+-" ]; then
if [ $m4out ]; then
echo "# ${callmsg}${comment}" >> ${OFILE}
echo "# define([X_${what}],1)" >> ${OFILE}
else
echo "/* # define ${what} */ /* ${callmsg}${comment} */" >> ${OFILE}
fi
fi
fi
done
IFS=$oldifs
trap 2
rm -f /tmp/cfs$$.c /tmp/cfs$$
exec < /dev/tty
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.