#! /bin/sed -nf

# Remove C and C++ comments, by Brian Hiles (brian_hiles@rocketmail.com)

# Sped up (and bugfixed to some extent) by Paolo Bonzini (bonzini@gnu.org)
# Works its way through the line, copying to hold space the text up to the
# first special character (/, ", ').  The original version went exactly a
# character at a time, hence the greater speed of this one.  But the concept
# and especially the trick of building the line in hold space are entirely
# merit of Brian.

:loop

# This line is sufficient to remove C++ comments!
/^\/\// s,.*,,

/^$/ {
    x
    p
    n
    b loop
}  
/^"/ {
    :double
    /^$/ {
        x
        p
        n
        /^"/ b break
        b double
    }

    H
    x
    s,\n\(.[^\"]*\).*,\1,
    x
    s,.[^\"]*,,

    /^"/ b break
    /^\\/ {
        H
        x
        s,\n\(.\).*,\1,
        x
        s/.//
    }
    b double
}  

/^'/ {
    :single
    /^$/ {
        x
        p
        n
        /^'/ b break
        b single
    }
    H
    x
    s,\n\(.[^\']*\).*,\1,
    x
    s,.[^\']*,,

    /^'/ b break
    /^\\/ {
        H
        x
        s,\n\(.\).*,\1,
        x
        s/.//
    }
    b single
}  

/^\/\*/ {
    s/.//
    :ccom
    s,^.[^*]*,,
    /^$/ n
    /^\*\// {
        s/..//
        b loop
    }
    b ccom
}  

:break
H  
x  
s,\n\(.[^"'/]*\).*,\1,
x  
s/.[^"'/]*//
b loop

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