#! /usr/bin/gawk -f # Last edited on 2001-01-22 07:54:44 by stolfi BEGIN { abort = -1; usage = ( "renumber-evt-lines \\\n" \ " [ -v paragSync=NUM ] \\\n" \ " [ -v onlyZeros=BOOL ] \\\n" \ " [ -v lineDigits=BOOL ] \\\n" \ " < INFILE > OUTFILE" \ ); # Renumbers lines in an EVT-formatted file. # If `paragSync' is nonzero, synchronizes the # line numbers to a multiple of 10 plus one # after every paragraph break. # If `onlyZeros' is true, renumbers only the # lines that have line number equal to zero. paragSync += 0; if (paragSync == 0) { paragSync = 1; } if (lineDigits == "") { lineDigits = 4; } if (onlyZeros == "") { onlyZeros = 0; } okind = "T"; secnum = 0; linenum = 0; } /^([#][#] *|)<[a-zA-Z0-9]+> *(|[{][^{}<>]*[}]) *$/ { if (! match($0, /<[a-zA-Z0-9]*>/)) { printf "line %d: bad page/chapter header\n", NR >> "/dev/stderr"; exit 1; } osec = substr($0, 2, RLENGTH-2); kind = ""; olnum = 0; print; next; } /^[#]/ { print; next; } /^ *$/ { print "#"; next; } /^[<]/ { if (! match($0, /^<[a-zA-Z0-9.;]*>/)) { printf "line %d: bad locator\n", NR >> "/dev/stderr"; exit 1; } loc = substr($0, 2, RLENGTH-2); lin = substr($0, RLENGTH+1); if (match(loc, /[;][A-Z]$/)) { tran = substr(loc, RSTART,2); loc = substr(loc,1,RSTART-1); } else { tran = ""; } gsub(/^[ ]+/, "", lin); gsub(/[ ]+$/, "", lin); if (loc == "") { sec = osec; kind = "P"; lnum = olnum + 1; } else { nf = split(loc, fld, /[.]/); if (nf != 3) { printf "line %d: wrong num of fields in locator\n", NR >> "/dev/stderr"; exit 1; } sec = fld[1]; if (sec != osec) { olnum = 0; } kind = fld[2]; if ((onlyZeros) && (fld[3] + 0 != 0)) { lnum = fld[3]; } else { lnum = olnum + 1; } } loc = sprintf("<%s.%s.%0*d%s>", sec, kind, lineDigits, lnum, tran); osec = sec; okind = kind; olnum = lnum; printf "%-18s %s\n", loc, lin; if (match(lin, /[=]/)) { olnum = int((olnum + paragSync - 1)/paragSync) * paragSync; } next; } // { printf "line %d: neither text nor comment\n", NR >> "/dev/stderr"; exit 1; }