#! /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
# <i>italic</i> and <b>boldface</b> 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 "</i>"
        # code, and return to the top to find more underscores.
        s/I//
        x
        s|_|</i>|
        b ital
    }
    # Else turn the "I" flag ON, insert <i> and go above.
    s/^//
    x
    s|_|<i>|
    b ital
}  

# Now do the same with B and asterisks
:bold
/\*/ {
    x
    /B/ {
        s/B//
        x
        s|\*|</b>|
        b bold
    }
    s/^/B/
    x
    s|\*|<b>|
    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----

### colorized by sedsed, a debugger and code formatter for sed scripts
### original script: http://sed.sf.net/grabbag/scripts/italbold.sed