#! /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 sed script debugger/indenter/tokenizer/HTMLizer
### original script: http://pcsiwa.rett.polimi.it/~paolob/seders/scripts/remccoms3.sed