smistrip
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:4k
- #!/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
- /^[ tr]*$/ {
- if (collect)
- if (line[n-1] != "" && line[n-1] !~ /,[ tr]*$/) line[n++] = ""
- next
- }
- # collect non-blank line when inside mib module
- /[^ ft]/ {
- 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[ tr]*$/ {
- 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