home *** CD-ROM | disk | FTP | other *** search
- #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<n; outbuf[outp++] = ' ' );
- outbuf[contfld-1] = contchar;
- cont++;
- if (cont > 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;
- }
- }
-