home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol126 / roff42.c < prev    next >
C/C++ Source or Header  |  1984-04-29  |  7KB  |  310 lines

  1. /********************************************************/
  2. /*                            */
  3. /*            ROFF4, Version 1.50            */
  4. /*                            */
  5. /* (C) 1983 by    Ernest E. Bergmann            */
  6. /*        Physics, Building #16            */
  7. /*        Lehigh Univerisity            */
  8. /*        Bethlehem, Pa. 18015            */
  9. /*                            */
  10. /* Permission is hereby granted for all commercial and    */
  11. /* non-commercial reproduction and distribution of this    */
  12. /* material provided this notice is included.        */
  13. /*                            */
  14. /********************************************************/
  15. /*June 27, 1983*/
  16. #include "roff4.h"
  17.  
  18. insert()    /*takes a command line in LINE and adds its
  19.         entry to the table; no space check is made of
  20.         TRTBL*/
  21. {int *pw;
  22. char *pc,*s2,*s3,*fnd;
  23. pw=TREND;
  24. *pw=SLINK;
  25. pc=pw+1;
  26. gettl3(LINE,pc,&s2,&s3);
  27. if(fnd=find2(pc,SLINK))
  28.     {fprintf(STDERR,"%cWarning: <%s> was defined to be <%s>\n",BELL,pc,fnd);
  29.     fprintf(STDERR,"...now it is defined to be <%s>\n",s2);
  30.     }
  31. SLINK=TREND;
  32. TREND=s3;
  33. }
  34. /****************************************/
  35. showit()    /* displays the list of entries in the string
  36.         substitution table pointed to by HEAD. */
  37. {int *pw;
  38. char *pc;
  39. fprintf(STDERR,"ENTRIES:\n");
  40. pw=SLINK;
  41. while(pw)
  42.     {fprintf(STDERR,"%u: ",pw);
  43.     pc=pw+1;
  44.     fprintf(STDERR,"<%s>",pc);
  45.     pc += strlen(pc); pc++;
  46.     if(*pc) fprintf(STDERR," <%s>\n",pc);
  47.     else fprintf(STDERR," <>\n"); /*'C' bug*/
  48.     pw=*pw;
  49.     }
  50. dashes();
  51. }
  52. /****************************************/
  53. putback(c)    /*cf K & P, p256*/
  54. char c;
  55. {if(++BINP >= BACKSIZE)
  56.     {printf(STDERR,"Too many characters pushed back\n");
  57.     exit();
  58.     }
  59. BACKBUF[BINP]=c;
  60. }
  61. /****************************************/
  62. int ngetc(iobuf)    /*cf K & P p256*/
  63. struct _buf *iobuf;    /*filters \r followed by \n,msb*/
  64. {char c,kgetc();
  65. if(BINP) c=BACKBUF[BINP];
  66. else    {if(KEYBD) c=kgetc();
  67.     else c=0x7f&getc(iobuf);
  68.     BACKBUF[BINP=1]=c;
  69.     }
  70. if((c!=CPMEOF)&&c!=EOF) BINP--;
  71. if(c=='\r')
  72.     {c=ngetc(iobuf);
  73.     if(c!='\n')
  74.         {putback(c);
  75.         return('\r');
  76.         }
  77.     }
  78. return(c);
  79. }
  80. /****************************************/
  81. char kgetc()    /*like getc(),from keyboard, line-buffered*/
  82. {int i;
  83. if(!*KPTR)
  84.     {fprintf(STDERR,"%c",KEYBD);
  85.     gets(KLINE);
  86.     i=strlen(KLINE);
  87.     KLINE[i++]='\n';
  88.     KLINE[i]='\0';
  89.     KPTR=KLINE;
  90.     }
  91. return(*(KPTR++));
  92. }
  93. /****************************************/
  94. pbstr(s)    /*put back string on input;cf K&P,p257*/
  95. char s[LSZ];
  96. {int i;
  97. for(i=strlen(s);i>0;) putback(s[--i]);
  98. }
  99. /****************************************/
  100. minsert()    /*takes a .DM and following lines and places
  101.         the information in the table;  no macro
  102.         definition nesting permitted*/
  103. {char c, *pc,*pc2;
  104. int *pw1;
  105. /*pass over command and following white space*/
  106. for(pc=LINE,c=*pc; (c!=' ')&&(c!='\n')&&(c!='\t'); pc++)
  107.     c=*pc;
  108. for(; (c==' ')||(c=='\t'); pc++) c=*pc;
  109. if(c=='\n') {fprintf(STDERR,".DM is UNnamed\n"); }
  110. else    {pw1=TREND;
  111.     *(pw1++)=MLINK;
  112.     MLINK=TREND;
  113.     TREND=pw1;
  114.     while(class(c)==BLACK)
  115.         {*(TREND++)=c;
  116.         c=*(pc++);
  117.         }
  118.     }
  119. *(TREND++)='\0';
  120. while(fgets2(LINE,IOBUF))    /*until EOF or CPMEOF*/
  121.     {pw1=LINE;
  122.     if((*LINE==COMMAND)&&(comtyp(LINE)==EM)) break;
  123.     else    {transfer(&pw1,&TREND,0);
  124.         *(TREND-1)='\n';
  125.         }
  126.     }
  127. *(TREND++)='\0';
  128. }
  129. /****************************************/
  130. showm()    /*lists macro definitions*/
  131. {int *pw;
  132. char *pc;
  133. fprintf(STDERR,"MACROS DEFINED:\n");
  134. pw=MLINK;
  135. while(pw)
  136.     {pc = pw+1;
  137.     fprintf(STDERR,"%u  .%s\n",pw,pc);
  138.     pc +=strlen(pc); pc++;
  139.     fprintf(STDERR,"%s\n",pc);
  140.     pw=*pw;
  141.     }
  142. dashes();
  143. }
  144. /****************************************/
  145. char *macq(line)    /*looks up name to see if it is a macro
  146.             definition.  If it is, returns the
  147.             corresponding string, else returns
  148.             FALSE.
  149.             */
  150. char *line;
  151. {char c,*pc,wb[LSZ],*find2();
  152. pc=wb;
  153. while(class(c=*(++line))==BLACK) *(pc++)=c;
  154. *pc='\0';
  155. return(find2(wb,MLINK));
  156. }
  157. /****************************************/
  158. char *find2(s,link)    /*finds or doesn't find s in table
  159.             of substitutions pointed to by link*/
  160. char *s;
  161. int *link;
  162. {char *pc;
  163. while(link)
  164.     {if(!strcmp(s,link+1))
  165.         {pc=link+1;
  166.         pc += strlen(pc);
  167.         pc++;
  168.         return(pc);
  169.         }
  170.     link=*link;
  171.     }
  172. return(FALSE);
  173. }
  174. /****************************************/
  175. /*from ndio.c*/
  176. #define CON_INPUT 1            /* BDOS call to read console       */
  177. #define CON_OUTPUT 2            /* BDOS call to write to console   */
  178. #define CON_STATUS 11            /* BDOS call to interrogate status */
  179.  
  180. #define CONTROL_C 3            /* Quit character           */
  181. #define INPIPE 2            /* bit setting to indicate directed
  182.                        input from a temp. pipe fil     */
  183. #define VERBOSE 2            /* bit setting to indicate output is to
  184.                        go to console AND directed output */
  185. #define DIRECTED_OUT 1
  186. #define CONS_TOO 2
  187. #define CPM_LIST_OUT 4
  188. #define PRINTER_OUT 8
  189. #define ROBOTYPE_OUT 16
  190. #define CONSOLE_ONLY 0
  191.  
  192. /* 
  193.     The "dioinit" function must be called at the beginning of the
  194.     "main" function:
  195. */
  196.  
  197. dioflush()
  198. {
  199.     if (_doflag)
  200.     {
  201.         putc(CPMEOF,_dobuf);
  202.         fflush(_dobuf);
  203.         fclose(_dobuf);
  204.         if (OK != strcmp ("TEMPOUT.$$$", sav_out_file))
  205.               { unlink (sav_out_file);
  206.             rename ("TEMPOUT.$$$", sav_out_file);
  207.               }
  208.         rename("tempout.$$$","tempin.$$$");
  209.     }
  210. }
  211.  
  212. /*
  213.     This version of "putchar" replaces the regular version when using
  214.     directed I/O:
  215. */
  216.  
  217. putchar(c)
  218. char c;
  219. {
  220.     if (_doflag & DIRECTED_OUT)
  221.     {
  222.         if (c == '\n') putc('\r',_dobuf);
  223.         if(putc(c,_dobuf) == ERROR)
  224.         {
  225.             fprintf(STDERR,"File output error; disk full?\n");
  226.             exit();
  227.         }
  228.     }
  229.  
  230.     if (_doflag==0 || _doflag & CONS_TOO)
  231.     {
  232.     if (bdos(CON_STATUS) && bdos(CON_INPUT) == CONTROL_C) exit();
  233.     if (c == '\n') bdos(CON_OUTPUT,'\r');
  234.     bdos(CON_OUTPUT,c);
  235.     }
  236.  
  237.     if (_doflag & CPM_LIST_OUT)
  238.     {
  239.         bdos(5,c);
  240.         if (c=='\n') bdos(5,'\r');
  241.     }
  242.     if (_doflag & PRINTER_OUT)
  243.     {
  244.         bdos(5,c);
  245.     }
  246.     if (_doflag & ROBOTYPE_OUT)
  247.     {
  248.         fprintf(STDERR,"sending ROBO <%c>    ",c);
  249.     }
  250. }
  251. /****************************************/
  252. #define argc *argcp
  253. dioinit(argcp,argv)
  254. int *argcp;
  255. char **argv;
  256. {
  257.     int i,j, argcount;
  258.     int n;    /* this keeps track of location in argument */
  259.  
  260.     _doflag = FALSE;  /* No directed /O by default   */
  261.     _nullpos = &argv[argc];
  262.     argcount = 1;
  263.  
  264.     for (i = 1; i < argc; i++)    /* Scan the command line for > and )*/
  265.     {
  266.         n=0;    /* start with first character */
  267. getmore:    switch(argv[i][n++]) {
  268.  
  269.            case '+': 
  270.             _doflag |= VERBOSE;
  271.             goto getmore;
  272.            case ')':
  273.             _doflag |= CPM_LIST_OUT;
  274.             goto getmore;
  275.            case '}':
  276.             _doflag |= PRINTER_OUT;
  277.             goto getmore;
  278.            case ']':
  279.             _doflag |= ROBOTYPE_OUT;
  280.             goto getmore;
  281.             
  282.          foo:   case '>':/*Check for directed output*/
  283.             if (!argv[i][n]) 
  284.             {
  285.             barf:   fprintf(STDERR,"Bad redirection/pipe specifier");
  286.                 exit();
  287.             }
  288.             strcpy (sav_out_file, &argv[i][n] );
  289.             if (fcreat("TEMPOUT.$$$", _dobuf) == ERROR)
  290.             {
  291.                 fprintf(STDERR,"\nCan't create <%s>\n",
  292.                                                      "TEMPOUT.$$$");
  293.                    exit();
  294.             }
  295.             _doflag++;
  296.  
  297.          movargv:    argc = argcount;
  298.             argv[argc] = 0;
  299.             break;
  300.  
  301.             default:    /* handle normal arguments: */
  302.                 if (n!=1) goto movargv;
  303.             argcount++;
  304.         }
  305.     }
  306. }
  307.  
  308.  
  309. #undef argc
  310.