summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Livshin <mlivshin@bigfoot.com>2001-06-25 03:30:02 +0000
committerMichael Livshin <mlivshin@bigfoot.com>2001-06-25 03:30:02 +0000
commitac13d9d210fa8c88d28b7dedd6b44762e610ae83 (patch)
tree3d5fc5b1cec71c57db8766dfa882060cbb4d76f3
parentfc7a9e81a699994b365e76ac84345aa354c3fe62 (diff)
downloadguile-ac13d9d210fa8c88d28b7dedd6b44762e610ae83.tar.gz
* snarf.h (SCM_SNARF_DOCS): change the "grammar" slightly.
* guile-snarf-docs.in, guile-snarf-docs-texi.in: rewrite & simplify. * eval.c: all hash signs are in column 0. * Makefile.am (guile_filter_doc_snarfage): build using c-tokenize.c, not filter-doc-snarfage.c. rearrange snarfing dependencies a bit. * c-tokenize.lex: new file.
-rw-r--r--libguile/ChangeLog15
-rw-r--r--libguile/Makefile.am8
-rw-r--r--libguile/c-tokenize.lex180
-rw-r--r--libguile/eval.c2
-rwxr-xr-xlibguile/guile-snarf-docs-texi.in31
-rwxr-xr-xlibguile/guile-snarf-docs.in8
-rw-r--r--libguile/snarf.h17
7 files changed, 212 insertions, 49 deletions
diff --git a/libguile/ChangeLog b/libguile/ChangeLog
index e205b2966..40e704526 100644
--- a/libguile/ChangeLog
+++ b/libguile/ChangeLog
@@ -1,3 +1,18 @@
+2001-06-25 Michael Livshin <mlivshin@bigfoot.com>
+
+ * snarf.h (SCM_SNARF_DOCS): change the "grammar" slightly.
+
+ * guile-snarf-docs.in, guile-snarf-docs-texi.in: rewrite &
+ simplify.
+
+ * eval.c: all hash signs are in column 0.
+
+ * Makefile.am (guile_filter_doc_snarfage): build using
+ c-tokenize.c, not filter-doc-snarfage.c.
+ rearrange snarfing dependencies a bit.
+
+ * c-tokenize.lex: new file.
+
2001-06-25 Marius Vollmer <mvo@zagadka.ping.de>
* srcprop.h, srcprop.c (scm_srcprops_to_plist): Renamed from
diff --git a/libguile/Makefile.am b/libguile/Makefile.am
index e8d0ab4a5..58d11cc4d 100644
--- a/libguile/Makefile.am
+++ b/libguile/Makefile.am
@@ -38,7 +38,7 @@ guile_SOURCES = guile.c
guile_LDADD = libguile.la ${THREAD_LIBS_LOCAL}
guile_LDFLAGS = @DLPREOPEN@
-guile_filter_doc_snarfage_SOURCES = filter-doc-snarfage.c
+guile_filter_doc_snarfage_SOURCES = c-tokenize.c
libguile_la_SOURCES = alist.c arbiters.c async.c backtrace.c boolean.c \
chars.c continuations.c debug.c deprecation.c dynl.c dynwind.c \
@@ -185,8 +185,6 @@ libpath.h: $(srcdir)/Makefile.in $(top_builddir)/config.status
@mv libpath.tmp libpath.h
-# ./guile-snarf $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $< > $@
-
SUFFIXES = .x .doc
.c.x:
./guile-snarf $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $< > $@ \
@@ -198,13 +196,13 @@ SUFFIXES = .x .doc
$(DOT_X_FILES) $(EXTRA_DOT_DOC_FILES): snarf.h guile-snarf.in
-$(DOT_DOC_FILES) $(EXTRA_DOT_DOC_FILES): snarf.h guile-snarf-docs.in guile_filter_doc_snarfage
+$(DOT_DOC_FILES) $(EXTRA_DOT_DOC_FILES): snarf.h guile-snarf-docs.in
error.x: cpp_err_symbols.c
posix.x: cpp_sig_symbols.c
load.x: libpath.h
-guile.texi: $(DOT_DOC_FILES) $(EXTRA_DOT_DOC_FILES) guile-snarf-docs-texi.in guile
+guile.texi: $(DOT_DOC_FILES) $(EXTRA_DOT_DOC_FILES) guile-snarf-docs-texi.in guile guile_filter_doc_snarfage
./guile-snarf-docs-texi $(DOT_DOC_FILES) $(EXTRA_DOT_DOC_FILES) > $@ \
|| { rm $@; false; }
diff --git a/libguile/c-tokenize.lex b/libguile/c-tokenize.lex
new file mode 100644
index 000000000..9c6c9387d
--- /dev/null
+++ b/libguile/c-tokenize.lex
@@ -0,0 +1,180 @@
+%option noyywrap
+%pointer
+
+EOL \n
+SPACE [ \t\v\f]
+WS [ \t\v\n\f]
+DIGIT [0-9]
+LETTER [a-zA-Z_]
+OCTDIGIT [0-7]
+HEXDIGIT [a-fA-F0-9]
+EXPONENT [Ee][+-]?{DIGIT}+
+FLOQUAL (f|F|l|L)
+INTQUAL (l|L|ll|LL|lL|Ll|u|U)
+
+%{
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int filter_snarfage = 0;
+int print = 1;
+
+enum t_state {
+ SKIP,
+ MULTILINE,
+ MULTILINE_COOKIE,
+ COOKIE,
+};
+
+enum t_state state = SKIP;
+int cookie_was_last = 0;
+
+#define OUT_RAW(type,text) if (print) printf ("(%s . \"%s\")\n", #type, text)
+
+#define OUT_T(type) OUT_RAW (type, yytext)
+#define OUT_S if (print) printf ("%s\n", yytext)
+#define OUT(type) if (print) printf ("%s\n", #type)
+
+#define IS_COOKIE cookie_was_last = 1
+#define IS_NOT_COOKIE cookie_was_last = 0
+
+%}
+
+%%
+
+\/\*(\n|[^*]|\*[^/])*\*\/ { OUT_T (comment); }
+
+({SPACE}*(\\\n)*{SPACE}*)+ ;
+
+({SPACE}*\n*{SPACE}*)+ { OUT(eol); }
+
+# { OUT(hash); IS_NOT_COOKIE; }
+
+{LETTER}({LETTER}|{DIGIT})* { OUT_T (id); IS_NOT_COOKIE; }
+
+0[xX]{HEXDIGIT}+{INTQUAL}? { OUT_RAW (int_hex, yytext + 2); IS_NOT_COOKIE; }
+0{OCTDIGIT}+{INTQUAL}? { OUT_RAW (int_oct, yytext + 1); IS_NOT_COOKIE; }
+{DIGIT}+{INTQUAL}? { OUT_T (int_dec); IS_NOT_COOKIE; }
+
+L?\'(\\.|[^\\\'])+\' { OUT_T (char); IS_NOT_COOKIE; }
+
+{DIGIT}+{EXPONENT}{FLOQUAL}? { OUT_T (flo_dec); IS_NOT_COOKIE; }
+{DIGIT}*"."{DIGIT}+({EXPONENT})?{FLOQUAL}? { OUT_T (flo_dec); IS_NOT_COOKIE; }
+{DIGIT}+"."{DIGIT}*({EXPONENT})?{FLOQUAL}? { OUT_T (flo_dec); IS_NOT_COOKIE; }
+
+L?\"(\\.|[^\\\"])*\" { OUT_S; IS_NOT_COOKIE; }
+
+"..." { OUT (ellipsis); IS_NOT_COOKIE; }
+
+">>=" { OUT (shift_right_assign); IS_NOT_COOKIE; }
+"<<=" { OUT (shift_left_assign); IS_NOT_COOKIE; }
+"+=" { OUT (add_assign); IS_NOT_COOKIE; }
+"-=" { OUT (sub_assign); IS_NOT_COOKIE; }
+"*=" { OUT (mul-assign); IS_NOT_COOKIE; }
+"/=" { OUT (div_assign); IS_NOT_COOKIE; }
+"%=" { OUT (mod_assign); IS_NOT_COOKIE; }
+"&=" { OUT (logand_assign); IS_NOT_COOKIE; }
+"^=" { OUT (logxor_assign); IS_NOT_COOKIE; }
+"|=" { OUT (logior_assign); IS_NOT_COOKIE; }
+">>" { OUT (right_shift); IS_NOT_COOKIE; }
+"<<" { OUT (left_shift); IS_NOT_COOKIE; }
+"++" { OUT (inc); IS_NOT_COOKIE; }
+"--" { OUT (dec); IS_NOT_COOKIE; }
+"->" { OUT (ptr); IS_NOT_COOKIE; }
+"&&" { OUT (and); IS_NOT_COOKIE; }
+"||" { OUT (or); IS_NOT_COOKIE; }
+"<=" { OUT (le); IS_NOT_COOKIE; }
+">=" { OUT (ge); IS_NOT_COOKIE; }
+"==" { OUT (eq); IS_NOT_COOKIE; }
+"!=" { OUT (ne); IS_NOT_COOKIE; }
+";" { OUT (semicolon); IS_NOT_COOKIE; }
+
+("{"|"<%") {
+ OUT (brace_open);
+ if (filter_snarfage && cookie_was_last && state == COOKIE)
+ state = MULTILINE;
+ IS_NOT_COOKIE; }
+
+("}"|"%>") {
+ OUT (brace_close);
+ if (filter_snarfage && cookie_was_last && state == MULTILINE_COOKIE) {
+ state = SKIP;
+ print = 0;
+ }
+ IS_NOT_COOKIE; }
+
+"," { OUT (comma); IS_NOT_COOKIE; }
+":" { OUT (colon); IS_NOT_COOKIE; }
+"=" { OUT (assign); IS_NOT_COOKIE; }
+"(" { OUT (paren_open); IS_NOT_COOKIE; }
+")" { OUT (paren_close); IS_NOT_COOKIE; }
+("["|"<:") { OUT (bracket_open); IS_NOT_COOKIE; }
+("]"|":>") { OUT (bracket_close); IS_NOT_COOKIE; }
+"." { OUT (dot); IS_NOT_COOKIE; }
+"&" { OUT (amp); IS_NOT_COOKIE; }
+"!" { OUT (bang); IS_NOT_COOKIE; }
+"~" { OUT (tilde); IS_NOT_COOKIE; }
+"-" { OUT (minus); IS_NOT_COOKIE; }
+"+" { OUT (plus); IS_NOT_COOKIE; }
+"*" { OUT (star); IS_NOT_COOKIE; }
+"/" { OUT (slash); IS_NOT_COOKIE; }
+"%" { OUT (percent); IS_NOT_COOKIE; }
+"<" { OUT (lt); IS_NOT_COOKIE; }
+">" { OUT (gt); IS_NOT_COOKIE; }
+
+\^{WS}*\^ {
+ if (filter_snarfage)
+ switch (state) {
+ case SKIP:
+ state = COOKIE;
+ print = 1;
+ OUT (snarf_cookie);
+ break;
+ case MULTILINE:
+ case MULTILINE_COOKIE:
+ state = MULTILINE_COOKIE;
+ OUT (snarf_cookie);
+ break;
+ case COOKIE:
+ state = SKIP;
+ OUT (snarf_cookie);
+ print = 0;
+ break;
+ default:
+ /* whoops */
+ abort ();
+ break;
+ }
+ else
+ OUT (snarf_cookie);
+
+ IS_COOKIE; }
+
+"^" { OUT (caret); IS_NOT_COOKIE; }
+"|" { OUT (pipe); IS_NOT_COOKIE; }
+"?" { OUT (question); IS_NOT_COOKIE; }
+
+. { fprintf (stderr, "*%s", yytext); fflush (stderr); IS_NOT_COOKIE; }
+
+%%
+
+int
+main (int argc, char *argv[])
+{
+ if (argc > 1 && !strcmp (argv[1], "--filter-snarfage")) {
+ filter_snarfage = 1;
+ print = 0;
+ }
+
+ yylex ();
+
+ return EXIT_SUCCESS;
+}
+
+/*
+ Local Variables:
+ c-file-style: "gnu"
+ End:
+*/
diff --git a/libguile/eval.c b/libguile/eval.c
index dad5aef6a..53177f6ae 100644
--- a/libguile/eval.c
+++ b/libguile/eval.c
@@ -68,7 +68,7 @@
# include <alloca.h>
# else
# ifdef _AIX
- #pragma alloca
+# pragma alloca
# else
# ifndef alloca /* predefined by HP cc +Olibcalls */
char *alloca ();
diff --git a/libguile/guile-snarf-docs-texi.in b/libguile/guile-snarf-docs-texi.in
index 2dbc4aecc..587c6aff7 100755
--- a/libguile/guile-snarf-docs-texi.in
+++ b/libguile/guile-snarf-docs-texi.in
@@ -24,37 +24,14 @@ bindir=`dirname $0`
bindir=`(cd $bindir; pwd)`
srcdir=`(cd $srcdir; pwd)`
-temp0="/tmp/snarf.0.$$"
-temp1="/tmp/snarf.1.$$"
-trap "rm -f $temp0 $temp1" 0 1 2 15
-
-# cat all the small files together:
-cat "$@" > ${temp1}
-
-## massage the arglists
-
-# lose the SCM types and commas, and texi-quote @'s in names and args
-< ${temp1} sed -e '/^arglist/s/[ ]*SCM[ ]*//g' \
- -e '/^arglist/s/,/ /g' \
- -e '/^arglist/s/([ ]*void[ ]*)/()/g' \
- -e '/^fname/s/@/@@/g' \
- -e '/^arglist/s/@/@@/g' \
- > ${temp0}
-
-# nothing to do with the docstrings
-< ${temp0} sed -e 's/^string //' > ${temp1}
-
-# we're too lame to check argpos assertions other then for straight names, so...
-< ${temp1} sed -e 's/^argpos.*[(\[].*//' > ${temp0}
-
echo "@paragraphindent 0"
-# now run the script that will generate texinfo
+# run the script that will generate texinfo
main='(module-ref (resolve-module '\''(scripts snarf-check-and-output-texi)) '\''main)'
apply_main="(apply $main (cdr (command-line)))"
if [ `basename ${bindir}` = libguile ]; then
- GUILE_LOAD_PATH=${srcdir}/.. ${bindir}/guile -c "${apply_main}" < ${temp0}
-else
- ${bindir}/guile -c "${apply_main}" < ${temp0}
+ GUILE_LOAD_PATH=${srcdir}/..; export GUILE_LOAD_PATH
fi
+
+cat "$@" | ${bindir}/guile_filter_doc_snarfage --filter-snarfage | ${bindir}/guile -c "${apply_main}"
diff --git a/libguile/guile-snarf-docs.in b/libguile/guile-snarf-docs.in
index 338b710d7..46c540d48 100755
--- a/libguile/guile-snarf-docs.in
+++ b/libguile/guile-snarf-docs.in
@@ -20,13 +20,7 @@
bindir=`dirname $0`
-temp="/tmp/snarf.$$"
-trap "rm -f $temp" 0 1 2 15
-
## Let the user override the preprocessor autoconf found.
test -n "${CPP+set}" || CPP="@CPP@"
-## 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_SNARF_DOCS "$@" > ${temp} || exit $?
-< ${temp} ${bindir}/guile_filter_doc_snarfage
+${CPP} -DSCM_MAGIC_SNARF_DOCS "$@"
diff --git a/libguile/snarf.h b/libguile/snarf.h
index 04c2a3022..d242e958d 100644
--- a/libguile/snarf.h
+++ b/libguile/snarf.h
@@ -85,14 +85,13 @@
# define SCM_SNARF_HERE(X)
# define SCM_SNARF_INIT(X)
# define SCM_SNARF_DOCS(TYPE, FNAME, ARGLIST, REQ, OPT, VAR, DOCSTRING) \
-^^{ \
-^^%fname . FNAME \
-^^%type . TYPE \
-^^%location __FILE__ . __LINE__ \
-^^%arglist . ARGLIST \
-^^%argsig REQ OPT VAR \
-^^(DOCSTRING) \
-^^}
+^^ { \
+fname FNAME ^^ \
+type TYPE ^^ \
+location __FILE__ __LINE__ ^^ \
+arglist ARGLIST ^^ \
+argsig REQ OPT VAR ^^ \
+DOCSTRING ^^ }
# else
# define SCM_SNARF_HERE(X) X
# define SCM_SNARF_INIT(X)
@@ -219,7 +218,7 @@ SCM_SNARF_INIT(c_name = scm_permanent_object (scm_sysintern (scheme_name, init_v
#ifdef SCM_MAGIC_SNARF_DOCS
#undef SCM_ASSERT
-#define SCM_ASSERT(_cond, _arg, _pos, _subr) ^^[ argpos _arg _pos __LINE__ ]
+#define SCM_ASSERT(_cond, _arg, _pos, _subr) ^^ argpos _arg _pos __LINE__ ^^
#endif /* SCM_MAGIC_SNARF_DOCS */
#endif /* LIBGUILE_SNARF_H */