diff options
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/guile-doc-snarf | 113 | ||||
-rw-r--r-- | scripts/guile-doc-snarf.awk | 89 | ||||
-rwxr-xr-x | scripts/guile-func-name-check | 64 |
3 files changed, 153 insertions, 113 deletions
diff --git a/scripts/guile-doc-snarf b/scripts/guile-doc-snarf index 16f739c..8b3aae4 100755 --- a/scripts/guile-doc-snarf +++ b/scripts/guile-doc-snarf @@ -1,57 +1,72 @@ #! /bin/sh -# Extract the initialization actions for builtin things. +# Copyright (C) 2002 Sergey Poznyakoff # -# Copyright (C) 1999, 2000 Free Software Foundation, Inc. +# This is a snarfer for guile version 1.6 # -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this software; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 59 Temple Place, Suite 330, -# Boston, MA 02111-1307 USA -# -## For some obscure reason, the original guile-doc-snarf distributed -## with guile up to version 1.4, passes guile-func-name-check -## to awk without absolute path spec. Consequently the script bails -## out unless guile-func-name-check is in the current directory. -## This version assumes that both scripts live in the same directory -## and deduces the path to guile-func-name-check from the own pathname. -## --gray - -fullfilename=$1; shift - -# strip path to source directory -filename=`basename $fullfilename` - -# we need to be sure that the .x file exists -# since the .c/.cc file may include it -# (the old guile-snarf did not have this problem -# because the makefile redirects output to the .x file -# which creates the file before the inclusion occurs) -# --12/12/99 gjb -no_ext=`echo $filename | sed 's/\.[^.]*$//g'` -dot_doc=${no_ext}.doc - -temp="/tmp/snarf.$$" -trap "rm -f $temp" 0 1 2 15 +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -## Let the user override the preprocessor & awk autoconf found. +OUTFILE=/dev/tty +DOCFILE=0 +BASEDIR=`dirname $0` test -n "${CPP+set}" || CPP="gcc -E" -test -n "${AWK+set}" || AWK="gawk" +test -n "${AWK+set}" || AWK=awk +temp=/tmp/snarf.$$ +trap "rm -f $temp" 0 1 2 15 + +# process aruments +while [ $# -gt 0 ]; +do + case $1 in + -o) OUTFILE=$2; shift 2;; + -d) DOCFILE=1; shift;; + *) break;; + esac +done + +INFILE=$1; shift + +cpp_exit=1 + +snarf_x() { + echo "/* source: $INFILE */" ; + echo "/* cpp arguments: $@ */" ; + $CPP -DSCM_MAGIC_SNARF_INITS -DSCM_MAGIC_SNARFER "$@" > ${temp} + cpp_exit=$? + grep "^ *\^ *\^" ${temp} | sed -e "s/^ *\^ *\^//" -e "s/\^\ *:\ *\^.*/;/" +} + +snarf_doc() { + $CPP -DSCM_MAGIC_SNARF_DOCS "$@" > ${temp} + cpp_exit=$? + $AWK ' +NF<2 {next} +state == 0 && /\^\^ {/ { state = 1; print; next } +state == 0 && /\^\^/ { print } +state == 1 && /\^\^ }/ { state = 0; print; next } +state == 1 { print } +state == 0 { next }' $temp |\ + tr -d '\n' | tr '^' '\n' |\ + awk -f $BASEDIR/guile-doc-snarf.awk > $OUTFILE +} -## Must run guile-func-name-check on the unpreprocessed source -${AWK} -f `dirname $0`/guile-func-name-check "$fullfilename" +case "$DOCFILE" in + 0) snarf_x $INFILE "$@" > $OUTFILE;; + 1) snarf_doc $INFILE "$@" > $OUTFILE;; +esac -## We must use a temporary file here, instead of a pipe, because we -## need to know if CPP exits with a non-zero status. -${CPP} -DSCM_MAGIC_SNARFER "$@" > ${temp} || exit $? -cat ${temp} | sed 's/^\(.\{128\}.\{128\}.\{128\}.\{128\}.\{128\}.\{128\}.\{128\}.\{128\}\).*/\1/g' | \ -${AWK} -f `dirname $0`/guile-snarf.awk `basename ${dot_doc}` +if [ $cpp_exit -ne 0 ]; then + [ "$OUTFILE" != "/dev/tty" ] && rm $OUTFILE +fi +exit $cpp_exit diff --git a/scripts/guile-doc-snarf.awk b/scripts/guile-doc-snarf.awk new file mode 100644 index 0000000..b29d25a --- /dev/null +++ b/scripts/guile-doc-snarf.awk @@ -0,0 +1,89 @@ +# Copyright (C) 2002 Sergey Poznyakoff +# +# This is a snarfer for guile version 1.6 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +BEGIN { + cname = "" +} + +function flush() { + if (cname == "") + return; + if (arg_req + arg_opt + arg_var != numargs) + error(cname " incorrectly defined as taking " numargs " arguments") + + print "\f" cname + print "@c snarfed from " loc_source ":" loc_line + printf "@deffn {Scheme procedure} %s", cname + for (i = 1; i <= numargs; i++) + printf(" %s", arglist[i]) + print "" + print docstring + print "@end deffn\n" + + delete argpos + delete arglist + cname = "" +} + +function error(s) { + print loc_source ":" loc_line ": " s > "/dev/stderr" + exit 1 +} + +state == 0 && /{/ { + flush() + cname = $3 + next +} + +state == 0 && /fname/ { fname = $2; next } +state == 0 && /type/ { type = $2; next } +state == 0 && /location/ { loc_source = $2; loc_line = $3 } +state == 0 && /arglist/ { + match($0, "\\(.*\\)") + s = substr($0,RSTART+1,RLENGTH-2) + numargs = split(s, a, ",") + for (i = 1; i <= numargs; i++) { + m = split(a[i], b, "[ \t]*") + if (b[1] == "") { + t = b[2] + n = b[3] + m-- + } else { + t = b[1] + n = b[2] + } + if (m > 2 || t != "SCM") + error(cname ": wrong argument type for arg " i " " t) + arglist[i] = n + } +} +state == 0 && /argsig/ { arg_req = $2; arg_opt = $3; arg_var = $4 } + +state == 0 && /.*\"/ { + gsub("\"\"", "") + gsub("\\\\n", "\n") + match($0,"\".*\"") + docstring = substr($0,RSTART+1,RLENGTH-2) +} + +/argpos/ { argpos[$2] = $3 } + +END { + flush() +}
\ No newline at end of file diff --git a/scripts/guile-func-name-check b/scripts/guile-func-name-check deleted file mode 100755 index 86b00ae..0000000 --- a/scripts/guile-func-name-check +++ /dev/null @@ -1,64 +0,0 @@ -#! /usr/bin/awk -f -# -# Copyright (C) 2000 Free Software Foundation, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this software; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 59 Temple Place, Suite 330, -# Boston, MA 02111-1307 USA -# -# Written by Greg J. Badros, <gjb@cs.washington.edu> -# 11-Jan-2000 - -BEGIN { - filename = ARGV[1]; -} - -/^SCM_DEFINE/ { - func_name = $0; - sub(/^[^\(\n]*\([ \t]*/,"", func_name); - sub(/[ \t]*,.*/,"", func_name); -# print func_name; # GJB:FIXME:: flag to do this to list primitives? - in_a_func = 1; -} - -in_a_func && /^\{/ { - if (!match(last_line,/^#define[ \t]+FUNC_NAME[ \t]+/)) { - printf filename ":" NR ":***" > "/dev/stderr"; - print "Missing or erroneous `#define FUNC_NAME s_" func_name "'" > "/dev/stderr"; - } else { - sub(/^#define[ \t]+FUNC_NAME[ \t]+s_/, "", last_line); - sub(/[ \t]*$/,"",last_line); - if (last_line != func_name) { - printf filename ":" NR ":***" > "/dev/stderr"; - print "Mismatching FUNC_NAME. Should be: `#define FUNC_NAME s_" func_name "'" > "/dev/stderr"; - } - } -} - -1 == next_line_better_be_undef { - if (!match($0,/^#undef FUNC_NAME[ \t]*$/)) { - printf filename ":" NR ":***" > "/dev/stderr"; - print "Missing or erroneous #undef for " func_name ": " - "Got `" $0 "' instead." > "/dev/stderr"; - } - in_a_func = ""; - func_name = ""; - next_line_better_be_undef = 0; -} - -in_a_func && /^\}/ { - next_line_better_be_undef = 1; -} - -{ last_line = $0; } |