Blame mibs/smistrip

Packit fcad23
#!/bin/sh
Packit fcad23
#
Packit fcad23
# smistrip --
Packit fcad23
#
Packit fcad23
#	Extract MIB modules from text files, like RFCs or I-Ds.
Packit fcad23
#
Packit fcad23
# This is variant of smistrip from libsmi-0.2, modified to be somewhat
Packit fcad23
# more aggressive in suppressing blank lines, and support the -x option.
Packit fcad23
#
Packit fcad23
# Copyright (c) 1999 Frank Strauss, Technical University of Braunschweig.
Packit fcad23
# Modified by Niels Baggesen
Packit fcad23
#
Packit fcad23
# See the file "COPYING" for information on usage and redistribution
Packit fcad23
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Packit fcad23
#
Packit fcad23
# $Id$
Packit fcad23
#
Packit fcad23
# NOTE, that this script relies on awk (tested with GNU awk) and getopts
Packit fcad23
# (shell builtin like in bash or standalone).
Packit fcad23
#
Packit fcad23
Packit fcad23
AWK=awk
Packit fcad23
[ `uname` != SunOS ] || AWK=/usr/bin/nawk
Packit fcad23
GETOPTS=getopts
Packit fcad23
VERSION=0.3-cvs
Packit fcad23
Packit fcad23
Packit fcad23
do_version () {
Packit fcad23
    echo "smistrip $VERSION"
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
Packit fcad23
do_usage () {
Packit fcad23
    echo "Usage: smistrip [-Vhn] [-d dir] [-s suffix] [-m modules] file ..."
Packit fcad23
    echo "-V         show version and license information"
Packit fcad23
    echo "-v         verbose"
Packit fcad23
    echo "-h         show usage information"
Packit fcad23
    echo "-n         do not write module files"
Packit fcad23
    echo "-d dir     write module to directory dir"
Packit fcad23
    echo "-x suffix  append suffix to the module file name"
Packit fcad23
    echo "-m modules strip only the specified modules. For a list of modules"
Packit fcad23
    echo "           use : as a separator"
Packit fcad23
    echo "file ...   input files to parse (RFCs, I-Ds, ...)"
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
Packit fcad23
do_strip () {
Packit fcad23
    expand $1 | sed 's/[ \r]*$//' | $AWK -v test="$test" -v dir="$dir" -v single="$single" -v suffix="$suffix" -v verbose="$verbose" '
Packit fcad23
Packit fcad23
    BEGIN {
Packit fcad23
	if (length(single) != 0) {
Packit fcad23
	    single = ":"single":"
Packit fcad23
	}
Packit fcad23
	else {
Packit fcad23
	    single = ""
Packit fcad23
	}
Packit fcad23
    }
Packit fcad23
Packit fcad23
    END {
Packit fcad23
	if (single != "" && single != ":") {
Packit fcad23
	    gsub(":", " ", single)
Packit fcad23
	    print "WARNING: Module(s) not found:" single
Packit fcad23
	}
Packit fcad23
    }
Packit fcad23
Packit fcad23
    # start of module
Packit fcad23
    /^[ \t]*[A-Za-z0-9-]* *DEFINITIONS( +IMPLICIT +TAGS)? *::= *BEGIN/ {
Packit fcad23
	module = $1
Packit fcad23
	collect = 1
Packit fcad23
	macro = 0
Packit fcad23
	n = 0
Packit fcad23
    }
Packit fcad23
Packit fcad23
    # page footer - start skipping
Packit fcad23
    /\[Page [iv0-9]*\] */ {
Packit fcad23
        collect = 0
Packit fcad23
	next
Packit fcad23
    }
Packit fcad23
Packit fcad23
    /^[ \t]*(::=|DESCRIPTION|SYNTAX|MAX-ACCESS|MIN-ACCESS|ACCESS|STATUS|REFERENCE|INDEX|AUGMENTS|DEFVAL|UNITS|DISPLAY|")/ {
Packit fcad23
	if (collect)
Packit fcad23
	    if (line[n-1] == "") n--
Packit fcad23
    }
Packit fcad23
Packit fcad23
    # a blank line - suppress multiple
Packit fcad23
    /^[ \t\r]*$/ {
Packit fcad23
        if (collect)
Packit fcad23
	    if (line[n-1] != "" && line[n-1] !~ /,[ \t\r]*$/) line[n++] = ""    
Packit fcad23
	next
Packit fcad23
    }
Packit fcad23
Packit fcad23
    # collect non-blank line when inside mib module
Packit fcad23
    /[^ \f\t]/ {
Packit fcad23
	if (length(module) > 0) {
Packit fcad23
	    if (!collect)
Packit fcad23
		collect = 1	# page header, stop skipping
Packit fcad23
	    else
Packit fcad23
		line[n++] = $0
Packit fcad23
	}
Packit fcad23
    }
Packit fcad23
Packit fcad23
    # remember when we enter a macro definition
Packit fcad23
    / *MACRO *::=/ {
Packit fcad23
	macro = 1
Packit fcad23
    }
Packit fcad23
Packit fcad23
    # end of module
Packit fcad23
    /^[ \t]*END[ \t\r]*$/ {
Packit fcad23
	if (macro)
Packit fcad23
	    macro = 0
Packit fcad23
	else if (single == "" || match(single, ":"module":")) {
Packit fcad23
	    sub(":"module, "", single)
Packit fcad23
	    strip = 99
Packit fcad23
	    for (i = 0 ; i < n ; i++) {
Packit fcad23
		# find the minimum column that contains non-blank characters
Packit fcad23
		# in order to cut a blank prefix off.
Packit fcad23
		p = match(line[i], "[^ ]")
Packit fcad23
		if (p < strip && length(line[i]) > p) strip = p
Packit fcad23
	    }
Packit fcad23
Packit fcad23
	    if (test != "1") {
Packit fcad23
		if (dir)
Packit fcad23
		    f = dir "/" module suffix
Packit fcad23
		else
Packit fcad23
		    f = module suffix
Packit fcad23
		for (i = 0 ; i < n ; i++)
Packit fcad23
		    print substr(line[i], strip) >f
Packit fcad23
	    }
Packit fcad23
Packit fcad23
	    if (verbose) {
Packit fcad23
		print module ": " n " lines."
Packit fcad23
	    }
Packit fcad23
	    module = ""
Packit fcad23
	    collect = 0
Packit fcad23
	}
Packit fcad23
	else
Packit fcad23
	    print "NOTE: " module ": ignored."
Packit fcad23
    }
Packit fcad23
    '
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
while $GETOPTS Vvhnm:d:x: c ; do
Packit fcad23
    case $c in
Packit fcad23
	v)	verbose=1
Packit fcad23
		;;
Packit fcad23
	n)	test=1
Packit fcad23
		;;
Packit fcad23
	m)	single=$OPTARG
Packit fcad23
		;;
Packit fcad23
	d)	dir=$OPTARG
Packit fcad23
		;;
Packit fcad23
	x)	suffix=$OPTARG
Packit fcad23
		;;
Packit fcad23
	h)	do_usage
Packit fcad23
		exit 0
Packit fcad23
		;;
Packit fcad23
	V)	do_version
Packit fcad23
		exit 0
Packit fcad23
		;;
Packit fcad23
	*)	do_usage
Packit fcad23
		exit 1
Packit fcad23
		;;
Packit fcad23
    esac
Packit fcad23
done
Packit fcad23
Packit fcad23
shift `expr $OPTIND - 1`
Packit fcad23
Packit fcad23
if [ $# -eq 0 ] ; then
Packit fcad23
    do_strip -
Packit fcad23
else 
Packit fcad23
    for f in $@ ; do
Packit fcad23
	do_strip $f
Packit fcad23
    done
Packit fcad23
fi
Packit fcad23
Packit fcad23
exit 0