#!/bin/sh
#
# smistrip --
#
#	Extract MIB modules from text files, like RFCs or I-Ds.
#
# This is variant of smistrip from libsmi-0.2, modified to be somewhat
# more aggressive in suppressing blank lines, and support the -x option.
#
# Copyright (c) 1999 Frank Strauss, Technical University of Braunschweig.
# Modified by Niels Baggesen
#
# See the file "COPYING" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# $Id: smistrip,v 5.2.2.1 2005/02/08 20:07:35 nba Exp $
#
# NOTE, that this script relies on awk (tested with GNU awk) and getopts
# (shell builtin like in bash or standalone).
#

AWK=awk
[ `uname` != SunOS ] || AWK=/usr/bin/nawk
GETOPTS=getopts
VERSION=0.3-cvs


do_version () {
    echo "smistrip $VERSION"
}



do_usage () {
    echo "Usage: smistrip [-Vhn] [-d dir] [-s suffix] [-m modules] file ..."
    echo "-V         show version and license information"
    echo "-v         verbose"
    echo "-h         show usage information"
    echo "-n         do not write module files"
    echo "-d dir     write module to directory dir"
    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 "file ...   input files to parse (RFCs, I-Ds, ...)"
}



do_strip () {
    cat $1 | $AWK -v test="$test" -v dir="$dir" -v single="$single" -v suffix="$suffix" -v verbose="$verbose" '

    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-]* *DEFINITIONS *::= *BEGIN/ {
	module = $1
	collect = 1
	macro = 0
	n = 0
    }

    # page footer - start skipping
    /\[Page [iv0-9]*\] */ {
        collect = 0
	next
    }

    /^[ \t]*(::=|DESCRIPTION|SYNTAX|MAX-ACCESS|MIN-ACCESS|ACCESS|STATUS|REFERENCE|INDEX|AUGMENTS|DEFVAL|UNITS|DISPLAY|")/ {
	if (collect)
	    if (line[n-1] == "") n--
    }

    # a blank line - suppress multiple
    /^[ \t\r]*$/ {
        if (collect)
	    if (line[n-1] != "" && line[n-1] !~ /,[ \t\r]*$/) line[n++] = ""    
	next
    }

    # collect non-blank line when inside mib module
    /[^ \f\t]/ {
	if (length(module) > 0) {
	    if (!collect)
		collect = 1	# page header, stop skipping
	    else
		line[n++] = $0
	}
    }

    # remember when we enter a macro definition
    / *MACRO *::=/ {
	macro = 1
    }

    # end of module
    /^[ \t]*END[ \t\r]*$/ {
	if (macro)
	    macro = 0
	else 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
		# in order to cut a blank prefix off.
		p = match(line[i], "[^ ]")
		if (p < strip && length(line[i]) > p) strip = p
	    }

	    if (test != "1") {
		if (dir)
		    f = dir "/" module suffix
		else
		    f = module suffix
		for (i = 0 ; i < n ; i++)
		    print substr(line[i], strip) >f
	    }

	    if (verbose) {
		print module ": " n " lines."
	    }
	    module = ""
	    collect = 0
	}
	else
	    print "NOTE: " module ": ignored."
    }
    '
}


while $GETOPTS Vvhnm:d:x: c ; do
    case $c in
	v)	verbose=1
		;;
	n)	test=1
		;;
	m)	single=$OPTARG
		;;
	d)	dir=$OPTARG
		;;
	x)	suffix=$OPTARG
		;;
	h)	do_usage
		exit 0
		;;
	V)	do_version
		exit 0
		;;
	*)	do_usage
		exit 1
		;;
    esac
done

shift `expr $OPTIND - 1`

if [ $# -eq 0 ] ; then
    do_strip -
else 
    for f in $@ ; do
	do_strip $f
    done
fi

exit 0
