home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_100 / 145_01 / roff44.c < prev    next >
Text File  |  1979-12-31  |  6KB  |  211 lines

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