home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol126 / roff44.c < prev    next >
C/C++ Source or Header  |  1984-04-29  |  5KB  |  190 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. /*July 4, 1983*/
  16. #include "roff4.h"
  17.  
  18. /**************************************************
  19. handles case of leading blanks or tabs; empty lines 
  20. ***************************************************/
  21. leadbl (line)
  22. char *line;
  23. {int i, j, white;
  24. brk();
  25. /* figure out white space Nov 13*/
  26. for (white=0, i=0; line[i] == ' ' || line[i] == '\t'; i++ )
  27.     {if(line[i]==' ') white++;
  28.     else white=min(RMVAL,TABSIZ*(1+white/TABSIZ));
  29.     }
  30. if ( line[i] != NEWLINE ) TIVAL += white;
  31. /* move line to left */
  32. for(j=0;(line[j]=line[i])!='\0';j++,i++);
  33. }
  34. /*****************************************
  35.         puts out page header
  36. ******************************************/
  37. phead()
  38. {CURPAG = NEWPAG++;
  39. if(PAGESTOP)
  40.     {bdos(2,7);    /*ring bell*/
  41.     bdos(1);    /*wait til char typed at console*/
  42.     }
  43. PLINENO=0;FPLINENO=0;
  44. if (M1VAL > 0 )
  45.       { VLINENO = M1VAL-1;
  46.     if (CURPAG % 2) puttl3 ( OHEAD, OH2, OH3, CURPAG );
  47.     else puttl3 ( EHEAD, EH2, EH3, CURPAG );
  48.       }
  49. VLINENO = M1VAL+M2VAL; FVLINENO=0;
  50. if DEBUG fprintf(STDERR,"\nVLINENO=%d", VLINENO);
  51. }
  52. /**************************************
  53.         puts out page footer
  54. ***************************************/
  55. pfoot()
  56. {VLINENO = BOTTOM+M3VAL; FVLINENO=0;
  57. if ( M4VAL > 0 )
  58.       { if(CURPAG % 2)puttl3 ( OFOOT,OF2,OF3, CURPAG );
  59.     else puttl3(EFOOT,EF2,EF3,CURPAG);
  60.     VLINENO = PLVAL;FVLINENO=0;
  61.     if (FFEED) putchar(FORMF);
  62.     else padv();
  63.     whole();
  64.     PLINENO = 0;FPLINENO=0;/*printer at start of new page*/
  65.       }
  66. }
  67. /**********************************************
  68.     space n lines or to bottom of the page
  69. ***********************************************/
  70. space (n)
  71. int n;
  72. {if DEBUG
  73.  fprintf(STDERR,"\nSPACE %d line(s), LINENO= %d", n, VLINENO);
  74. brk();    /* flush out last unfilled line */
  75. if (VLINENO >= BOTTOM)    return;    /* end of page */
  76. if (!VLINENO) phead();    /* top of page */
  77. VLINENO += n;
  78. if DEBUG fprintf(STDERR,"\n    LINENO = %d", VLINENO);
  79. if (VLINENO >= BOTTOM) pfoot(); /* print footer if bottom */
  80. }
  81. /*******************************************************/
  82. text (line)
  83. char *line;
  84. {char wrdbuf [LSZ];
  85. int i, j, k;
  86. char *p1, *p2;
  87. if DEBUG fprintf(STDERR,"\n\nTEXT:<%s>", line);
  88. if (line[0] == BLANK || line[0]==NEWLINE || line[0] == TAB)
  89.     leadbl (line);
  90. if (CEVAL > 0)
  91.       { center(line);
  92.     put(line);
  93.     CEVAL--;
  94.       }
  95. else if(line[0]==NEWLINE) space(LSVAL);
  96. else if(!FILL) put(line);
  97. else while (WE_HAVE_A_WORD == getwrd (line, wrdbuf))
  98.     putwrd (wrdbuf);
  99. }
  100. /******************************************************
  101.     put out a line of text with correct indentation
  102.     underlining if specified
  103. *******************************************************/
  104. put (line)
  105. char *line;
  106. {int i,fs,minfs;
  107. if (VLINENO == 0 || VLINENO >= BOTTOM )    phead();
  108. fs=(VLINENO-OLDLN)*FRVAL;
  109. minfs=OLDBOT-OUTTOP; if(!(OLDBOT&&OUTTOP)) minfs++;
  110. while(fs<minfs) {fs+=FRVAL; VLINENO++;}
  111. need(0);
  112. putline(line);
  113. TIVAL = INVAL;
  114. VLINENO += LSVAL;
  115. if DEBUG fprintf(STDERR,"\nLINENO=%d, LSVAL=%d",VLINENO,LSVAL);
  116. if (VLINENO >= BOTTOM)    pfoot();
  117. }
  118. /***********************************************************
  119. concatenates the word onto the end of OUTBUF for filled text
  120. ************************************************************/
  121. putwrd (wrdbuf)    /*Nov 22: SENTENCE*/
  122. char *wrdbuf;
  123. {int i, j, k;
  124. char s[MAXLINE], ch;
  125. int line_len, new_out_width, wid;
  126. int nextra;
  127. if DEBUG fprintf(STDERR,"\nwrdbuf = <%s>",wrdbuf);
  128. skip_blanks (wrdbuf); trunc_bl (wrdbuf);
  129. wid =1+SENTENCE+strln3(wrdbuf,TRUE,1);/*sets WTOP,WBOT*/
  130. line_len = RMVAL - TIVAL;
  131. new_out_width = OUTW+wid;
  132. if (new_out_width > min (line_len, MAXLINE-1))
  133.       { nextra = min(line_len, MAXLINE-1)-OUTW+1;
  134.     if(OUTBUF[OUTPOS-2]==BLANK) nextra++;
  135.     if(JUSTIFY) spread(OUTBUF,nextra,OUTWRDS);
  136.     brk();
  137.       }
  138. OUTW += wid;
  139. OUTcat(wrdbuf);
  140. OUTSP(); if(SENTENCE) OUTSP();
  141. OUTWRDS++;
  142. if(WTOP<OUTTOP) OUTTOP=WTOP;
  143. if(WBOT>OUTBOT) OUTBOT=WBOT;
  144. }
  145. /**********************************************************
  146.     a new putline routine; sends line to  OUTPUT2
  147. ***********************************************************/
  148. putline (line)
  149. char *line;
  150. {char c;
  151. blanks(TIVAL);
  152. for(;c=*line;line++) putout(c);
  153. putout('\0');
  154. printout();
  155. }
  156. /****************************************/
  157. OUTcat(str)    /*appends string to OUTBUF*/
  158. char *str;
  159. {while(OUTBUF[OUTPOS]=*(str++))
  160.     OUTPOS++;
  161. }
  162. /****************************************/
  163. OUTSP()        /*appends BLANK to OUTBUF*/
  164. {OUTBUF[OUTPOS++]=BLANK;
  165. OUTBUF[OUTPOS]='\0';
  166. }
  167. /****************************************/
  168. gloss()    /*prints on STDOUT a glossary of .tr chars*/
  169. {int i;
  170. char line[20],tcs;
  171. put("GLOSSARY:");
  172. put("USE     <GET>");
  173. tcs=TCVAL;
  174. TCVAL |= 128; /*set most significant bit*/
  175. for(i=1;i<19;i++) line[i]=' ';
  176. line[0]=tcs;
  177. line[8]='<';
  178. line[9]=TCVAL;
  179. line[11]='>';
  180. line[12]='\0';
  181. for(i=' ';i<127;i++)
  182.     {if(TPTR[i-' '])
  183.         {line[1]=line[10]=i;
  184.         put(line);
  185.         }
  186.     }
  187. TCVAL=tcs;
  188. SPACE(HUGE);
  189. }
  190.