#! /bin/sed -nf

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

# taken from https://bash.cyberciti.biz/academic/sed-remove-c-cpp-comments/

# Sped up (and bugfixed to some extent) by Paolo Bonzini (bonzini.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

# ezsh: commented out because it removes '//' and everything after that in string literals
# 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

devTools/stripComments.sed