#! /bin/sed -nf
# filename: italbold.sed
# author: Eric Pement - pemente@northpark.edu
# modified by Paolo Bonzini to remove GNU sed 3.02.80 features
# and to show how to use `w' to output to stderr.
# date: January 7, 2001
#
# purpose:
# To take input files with two different "toggle switches" such as
# the _underscore_ and *asterisk*, and convert them into something like
# italic and boldface in the output.
#
# In this script, I've used HTML to illustrate the procedure, but
# the script can be altered to change the toggle switches, the output
# (maybe printer codes?), or both. Note especially my use of the hold
# space to maintain "state". If "I" appears anywhere in the hold
# space, Italic is currently ON and the next match of "_" should turn
# it off. If "I" is not present in the hold space, it means Italic is
# currently OFF, and the next match of an underscore should turn it
# back ON. A similar principle is used with the Bold flag, using "B"
# to indicate that Boldface is currently ON and no "B" to mean OFF.
#
# ERROR HANDLING:
# This script contains an error-checking routine on lines 64-82, to
# check for unmatched toggle switches. It writes to standard output,
# which may make this script unsuitable for some applications. Sed has
# no way to write to stderr. If you don't like this routine, delete all
# the commands after line 63.
#
# Copyleft 2000 by Eric Pement. This file may be freely distributed.
# Copyleft terms at http://www.dsl.org/copyleft/non-software-copyleft.shtml
# For more help with sed, see http://www.faqs.org/faqs/editor-faq/sed
#
: ital
/_/ { x
/I/{
# An underscore is found, and "Italic ON" (I) was in the former
# hold space. Delete the flag, turn the next "_" into HTML ""
# code, and return to the top to find more underscores.
s/I//
x
s|_||
b ital
}
# Else turn the "I" flag ON, insert and go above.
s/^/I/
x
s|_||
b ital
}
# Now do the same with B and asterisks
: bold
/\*/ { x
/B/{
s/B//
x
s|\*||
b bold
}
s/^/B/
x
s|\*||
b bold
}
p
$! b
# Error-checking routine
g
/./ {
s/^/>>\
+==============================================+\
| |\
| ERROR!! |/
s/I/\
| Italic was turned ON but never turned OFF! |/
s/B/\
| Bold was turned ON but never turned OFF! |/
s/$/\
| |\
+==============================================+/
# If /proc is supported, `w /proc/self/fd/2' writes to stderr
# For portability, we just use p
p
}
#----end of script----