#include "r.h" extern int hollerith; char outbuf[80]; int outp = 0; int cont = 0; int contchar = '&'; char comment[320]; int comptr = 0; int indent = 0; outdon() { outbuf[outp] = '\0'; if (outp > 0) fprintf(outfil, "%s\n", outbuf); outp = cont = 0; } putcom(s) char *s; { if (printcom) { ptc('c'); outtab(); pts(s); outdon(); } } outcode(xp) char *xp; { register c, c1, j; char *q, *p; p = (char *) xp; /* shut lint up */ if (cont == 0 && comptr > 0) /* flush comment if not on continuation */ flushcom(); while( (c = *p++) ){ c1 = *p; if (type[c] == LET || type[c] == DIG) { pts(p-1); break; } switch(c){ case '"': case '\'': j = 0; for (q=p; *q; q++) { if (*q == '\\') q++; j++; } if (outp+j+2 > 71) contcard(); if (hollerith) { outnum(--j); ptc('h'); } else ptc(c); while (*p != c) { if (*p == '\\') p++; ptc(*p++); } if (!hollerith) ptc(c); p++; break; case '$': case '\\': if (strlen(p-1)+outp > 71) contcard(); if (c1 == '"' || c1 == '\'') { ptc(c1); p++; } else for (p--; *p; p++) ptc(*p); break; case '%': outp = 0; while (*p) ptc(*p++); break; case '>': if( c1=='=' ){ pts(".ge."); p++; } else pts(".gt."); break; case '<': if( c1=='=' ){ pts(".le."); p++; } else if( c1=='>' ){ pts(".ne."); p++; } else pts(".lt."); break; case '=': if( c1=='=' ){ pts(".eq."); p++; } else ptc('='); break; case '!': case '^': if( c1=='=' ){ pts(".ne."); p++; } else pts(".not."); break; case '&': if( c1=='&' ) p++; pts(".and."); break; case '|': if( c1=='|' ) p++; pts(".or."); break; case '\t': outtab(); break; case '\n': ptc(' '); break; default: ptc(c); break; } } } ptc(c) char c; { if( outp > 71 ) contcard(); outbuf[outp++] = c; } pts(s) char *s; { if (strlen(s)+outp > 71) contcard(); while(*s) ptc(*s++); } contcard(){ int n; outbuf[outp] = '\0'; fprintf(outfil, "%s\n", outbuf); n = 6; if (printcom) { n += INDENT * indent + 1; if (n > 35) n = 35; } for( outp=0; outp 19) error("more than 19 continuation cards"); } outtab(){ int n; n = 6; if (printcom) { n += INDENT * indent; if (n > 35) n = 35; } while (outp < n) ptc(' '); } outnum(n) int n; { int a; if( a = n/10 ) outnum(a); ptc(n%10 + '0'); } outcont(n) int n; { transfer = 0; if (n == 0 && outp == 0) return; if( n > 0 ) outnum(n); outcode("\tcontinue"); outdon(); } outgoto(n) int n; { if (transfer != 0) return; outcode("\tgoto "); outnum(n); outdon(); } flushcom() { int i, j; if (printcom == 0) comptr = 0; else if (cont == 0 && comptr > 0) { for (i=j=0; i < comptr; i++) if (comment[i] == '\n') { comment[i] = '\0'; fprintf(outfil, "%s\n", &comment[j]); j = i + 1; } comptr = 0; } }