+#define BUFFERLENGTH 8192
+#define REDSTRING " "
+
+typedef enum TypeOut {
+ Char,
+ NewLine,
+ Tag,
+ Paragraph,
+ None
+} TypeOut;
+
+
+static void
+pushout( FILE *out, TypeOut type, int value ) {
+ static TypeOut PrevType=None;
+ static int prevvalue=0;
+ static int newlinecount=0;
+
+ if ( type == Char ) {
+ if ( !(( PrevType==Tag || PrevType==None || PrevType==NewLine ) && ( value == ' ' || value == '\t' )) ) {
+ newlinecount=0;
+ fputc(value ,out);
+ }
+ prevvalue = value;
+ } else if ( type == NewLine ) {
+ if ( newlinecount < 2 )
+ fputc('\n', out);
+ newlinecount++;
+ } else if ( type != PrevType ) {
+ switch(type) {
+ case Tag:
+ if ( !(PrevType==None || PrevType==NewLine || ( PrevType==Char && ( prevvalue == ' ' || prevvalue == '\t' || prevvalue == '\n' ) )) ) {
+ newlinecount=0;
+ fputc(' ', out);
+ }
+ break;
+ case Paragraph:
+ pushout(out, NewLine, 0);
+ fwrite(REDSTRING, sizeof(char), strlen(REDSTRING), out);
+ newlinecount=0;
+ break;
+ default:
+ printf("Unknown type: %d", type);
+ exit(1);
+ }
+ }
+ PrevType = type;
+}
+
+static void
+pushoutstr(FILE *out, char *buf, int len) {
+ char *ptr=buf;
+ while( ptr-buf<len ) {
+ pushout(out, Char, (int)(*ptr));
+ ptr++;
+ }
+}