lib/Makefile.am | 4 +- lib/parser-sming.y | 2 +- lib/scanner-smi.h | 2 +- lib/scanner-sming.h | 2 + lib/scanner-yang.h | 3 +- tools/smicache.1.in | 8 ++-- tools/smistrip.in | 126 +++++++++++++++++++++++++++++++++++----------------- 7 files changed, 97 insertions(+), 50 deletions(-) diff --git a/lib/Makefile.am b/lib/Makefile.am index 8c5980f5..47657c39 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -48,10 +48,10 @@ libsmi_la_LDFLAGS = -version-info @VERSION_LIBTOOL@ parser-smi.c parser-smi.tab.h: parser-smi.y scanner-smi.h parser-smi.h error.h $(BISON) --defines=parser-smi.tab.h -t -psmi -o parser-smi.c parser-smi.y -parser-sming.c: parser-sming.y scanner-sming.h parser-sming.h error.h +parser-sming.c parser-sming.tab.h: parser-sming.y scanner-sming.h parser-sming.h error.h $(BISON) --defines=parser-sming.tab.h -t -psming -o parser-sming.c parser-sming.y -parser-yang.c: parser-yang.y scanner-yang.h parser-yang.h error.h +parser-yang.c parser-yang.tab.h: parser-yang.y scanner-yang.h parser-yang.h error.h $(BISON) --defines=parser-yang.tab.h -t -pyang -o parser-yang.c parser-yang.y scanner-smi.c: scanner-smi.l scanner-smi.h parser-smi.tab.h diff --git a/lib/parser-sming.y b/lib/parser-sming.y index ec25328b..fefeee91 100644 --- a/lib/parser-sming.y +++ b/lib/parser-sming.y @@ -1550,7 +1550,7 @@ identityStatement: identityKeyword sep lcIdentifier referenceStatement_stmtsep_01 { setIdentityReference(identityPtr, $14, - thisParserPtr) + thisParserPtr); } '}' optsep ';' { diff --git a/lib/scanner-smi.h b/lib/scanner-smi.h index 2507aa05..d4b0fa82 100644 --- a/lib/scanner-smi.h +++ b/lib/scanner-smi.h @@ -21,7 +21,7 @@ #define YY_NO_UNPUT extern char *yytext; -#if 0 +#ifndef yyleng extern int yyleng; #endif diff --git a/lib/scanner-sming.h b/lib/scanner-sming.h index 96e99a54..3ac53509 100644 --- a/lib/scanner-sming.h +++ b/lib/scanner-sming.h @@ -21,7 +21,9 @@ #define YY_NO_UNPUT extern char *yytext; +#ifndef yyleng extern int yyleng; +#endif extern int smingEnterLexRecursion(FILE *file); extern void smingLeaveLexRecursion(); diff --git a/lib/scanner-yang.h b/lib/scanner-yang.h index 3915e3b3..65f468b5 100644 --- a/lib/scanner-yang.h +++ b/lib/scanner-yang.h @@ -21,8 +21,7 @@ #define YY_NO_UNPUT extern char *yytext; -#if 0 -/* this does not seem to be needed with flex 2.5.35 and in fact conflicts */ +#ifndef yyleng extern int yyleng; #endif diff --git a/tools/smicache.1.in b/tools/smicache.1.in index 6a42390f..54cf8baf 100644 --- a/tools/smicache.1.in +++ b/tools/smicache.1.in @@ -45,13 +45,13 @@ you have to care about permissions in multi-user environments. global configuration file: .nf - cache /usr/local/share/mibs/cache \\ - /usr/local/bin/smicache \\ - -d /usr/local/share/mibs/cache \\ + cache /usr/share/mibs/cache \\ + /usr/bin/smicache \\ + -d /usr/share/mibs/cache \\ -p http://www.ibr.cs.tu-bs.de/projects/libsmi/smicache/ .fi -You might want to chmod 1777 /usr/local/share/mibs/cache. +You might want to chmod 1777 /usr/share/mibs/cache. .SH "SEE ALSO" The .BR libsmi (3) diff --git a/tools/smistrip.in b/tools/smistrip.in index b5223bac..848a0965 100644 --- a/tools/smistrip.in +++ b/tools/smistrip.in @@ -5,6 +5,13 @@ # Extract MIB and PIB modules from text files, like RFCs or I-Ds. # # Copyright (c) 1999 Frank Strauss, Technical University of Braunschweig. +# Copyright (c) Niels Baggesen, Jochen Friedrich +# +# Modified by Niels Baggesen to be somewhat more aggressive in suppressing +# blank lines, and support the -x option. +# +# Modified by Jochen Friedrich to merge the changes of libsmi back in and +# make the aggressive suppressing of blank lines optional. # # See the file "COPYING" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. @@ -27,13 +34,17 @@ do_version () { do_usage () { - echo "Usage: smistrip [-Vhn] [-i dir] [-d dir] [-m module] file1 [file2 [...]]" + echo "Usage: smistrip [-Vvhna] [-i dir] [-d dir] [-s suffix] [-m modules] file1 [file2 [...]]" echo "-V show version and license information" + echo "-v verbose" echo "-h show usage information" echo "-n do not write module files" + echo "-a strip blank lines more aggressively" echo "-i dir try to read files from directory dir" echo "-d dir write module to directory dir" - echo "-m module strip only the specified module" + echo "-x suffix append suffix to the module file name" + echo "-m modules strip only the specified modules. For a list of modules" + echo " use : as a separator" echo "file1 ... input files to parse (RFCs, I-Ds, ...)" } @@ -57,65 +68,90 @@ do_strip () { $CMD "$FILE" | \ tr -d '\015' | \ - grep -i -v '^[ ]*Internet[ \-]Draft' | \ - $AWK -vtest="$test" -vdir="$dir" -vsingle="$single" ' + $AWK -vtest="$test" -vdir="$dir" -vsingle="$single" -vsuffix="$suffix" -vverbose="$verbose" -vaggressive="$aggressive" ' + + BEGIN { + if (length(single) != 0) { + single = ":"single":" + } + else { + single = "" + } + } + + END { + if (single != "" && single != ":") { + gsub(":", " ", single) + print "WARNING: Module(s) not found:" single + } + } # start of module /^[ \t]*[A-Za-z0-9-]* *(PIB-)?DEFINITIONS *(::=)? *(BEGIN)? *$/ { module = $1 - skip = 9 - skipped = -1 + collect = 1 macro = 0 + skip = 0 n = 0 } - # process each line - { - # at the end of a page we go back one line (which is expected to - # be a separator line), and start the counter skipped to skip the - # next few lines. - if ($0 ~ /\[[pP]age [iv0-9]*\] */) { - # some drafts do not use that separator line. so keep it if - # there are non-blank characters. - if (!(line[n] ~ /^[ \t]*$/)) { print "WARNING: the line ::"line[n]":: should be a separator before a page break. It was kept. " ; n-- } - skipped = 0 + # at the end of a page we go back one line (which is expected to + # be a separator line), and start the counter skipped to skip the + # next few lines. + /\[[pP]age [iv0-9]*\] */ { + # some drafts do not use that separator line. so keep it if + # there are non-blank characters. + if (!aggressive && n && collect) { + if (!(line[n-1] == "")) + print "WARNING: the line ::"line[n-1]":: should be a separator before a page break. It was kept. "; + else n--; + skip = 3 } + collect = 0 + next + } - # if we are skipping... - if (skipped >= 0) { - skipped++ + /^[ \t]*(::=|DESCRIPTION|SYNTAX|MAX-ACCESS|MIN-ACCESS|ACCESS|STATUS|REFERENCE|INDEX|AUGMENTS|DEFVAL|UNITS|DISPLAY|")/ { + skip = 0 + if (collect && aggressive) + if (line[n-1] == "") n-- + } - # if we have skipped enough lines to the top of the next page... - if (skipped >= skip) { - skipped = -1 - } else { - - # finish skipping, if we find a non-empty line, but not before - # we have skipped four lines. remember the miminum of lines - # we have ever skipped to keep empty lines in a modules that - # appear near the top of a page. - if ((skipped >= 4) && ($0 ~ /[^ \t]/)) { - if (skipped < skip) { skip = skipped } - skipped = -1 - } + # a blank line - suppress multiple + /^[ \t\r]*$/ { + if (collect && (skip == 0)) { + if (aggressive && n) { + if (line[n-1] != "" && line[n-1] !~ /,[ \t\r]*$/) line[n++] = "" } + else line[n++] = "" } + if (skip > 0) skip--; + next + } - # so, if we are not skipping and inside a module, remember the line. - if ((skipped == -1) && (length(module) > 0)) { - line[n++] = $0 + # collect non-blank line when inside mib module + /[^ \f\t]/ { + if (length(module) > 0) { + if (!collect) + collect = 1 # page header, stop skipping + else if (skip == 0) + line[n++] = $0 } + if (skip > 0) skip--; } # remember when we enter a macro definition /^[ \t]*[A-Za-z0-9-]* *MACRO *::=/ { macro = 1 + skip = 0 } # end of module /^[ \t]*END[ \t]*$/ { + skip = 0 if (macro == 0) { - if ((length(single) == 0) || (single == module)) { + if (single == "" || match(single, ":"module":")) { + sub(":"module, "", single) strip = 99 for (i=0 ; i < n ; i++) { # find the minimum column that contains non-blank characters @@ -129,17 +165,21 @@ do_strip () { if (test != "1") { if (dir) { - f = dir"/"module + f = dir"/"module suffix } else { - f = module + f = module suffix } for (i=0 ; i < n ; i++) { print substr(line[i], strip) >f } } + if (verbose) { + print module ": " n " lines." + } - print module ": " n " lines." } + else + print "NOTE: " module ": ignored." module = "" } else { macro = 0 @@ -150,16 +190,22 @@ do_strip () { -while $GETOPTS Vhnm:i:d: c ; do +while $GETOPTS Vvhnam:i:d:x: c ; do case $c in + v) verbose=1 + ;; n) test=1 ;; + a) aggressive=1 + ;; m) single=$OPTARG ;; i) indir=$OPTARG ;; d) dir=$OPTARG ;; + x) suffix=$OPTARG + ;; h) do_usage exit 0 ;;