home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / compiler / small_c / cb / sources / fmt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-09-12  |  11.5 KB  |  483 lines

  1. /*
  2. ** fmt.c -- text formatter
  3. **
  4. ** Copyrignt 1982 J. E. Hendrix.  All rights reserved.
  5. */
  6.  
  7. #include <stdio.h>
  8. #include "tools.h"
  9. #define NOCCARGC
  10. #define KILL 14  /* control-N */
  11. #define INSIZE 396
  12. #define MAXOUT 579
  13. #define COMMAND '.'
  14. #define PAGENUM '#'
  15. #define TTLDELIM '/'
  16. #define MRGCHAR '|'
  17. #define SUBCHAR '/'
  18. #define SUPCHAR '\\'
  19. #define BLANK '~'
  20. #define DEFM1 1
  21. #define DEFM2 2
  22. #define DEFM3 2
  23. #define DEFM4 9
  24. /**** LM is effectively one greater ****/
  25. #define DEFLM 9
  26. #define DEFRM 73
  27. #define DEFMP 2
  28. #define PAGELEN 66
  29. #define HUGE 32000
  30. #define NDIM 5
  31. #define NWIDTH 4
  32.  
  33. int
  34.   ttymode, /* tty mode if YES */
  35.   itsub,   /* italic subs for underlines */
  36.   ulsub,   /* underline subs for italics */
  37.   pass,    /* pass counter */
  38.   fill,    /* fill if YES */
  39.   just,    /* justify if YES */
  40.   lsval,   /* line spacing */
  41.   inval,   /* indent value */
  42.   lmval,   /* left margin value */
  43.   rmval,   /* right margin value */
  44.   pagekill,/* kill page if YES */
  45.   pospec,  /* page offset specification */
  46.   poval,   /* page offset for current page */
  47.   tival,   /* temporary indent */
  48.   ceval,   /* number of lines to center */
  49.   ulval,   /* number of lines to underline */
  50.   bfval,   /* number of lines to boldface */
  51.   itval,   /* number of lines to italicize */
  52.   dwval,   /* number of lines to double-wide */
  53.   dwact,   /* double-wide is active */
  54.   bfstrikes,  /* number of boldface strikes */
  55.   cuact,   /* continuous underline active if > 0 */
  56.   mpcnt,   /* lines printed since last .mp page break */
  57.   mpval,   /* minimum lines required for paragraphs */
  58.   sqval,   /* squeeze indents */
  59.   bline,   /* blank line flag */
  60.   curpag,  /* current page number */
  61.   newpag,  /* next page number */
  62.   lineno,  /* next line to be printed */
  63.   plval,   /* page length in lines */
  64.   m1val,   /* margin before and including header */
  65.   m2val,   /* margin after header */
  66.   m3val,   /* margin after last text line */
  67.   m4val,   /* bottom margin including footer */
  68.   bottom,  /* last live line on page */
  69.   outp,    /* last character position in outbuf */
  70.   outw,    /* width of text in outbuf */
  71.   outwds,  /* number of words in outbuf */
  72.   pause,   /* pause on page breaks if YES */
  73.   ready,   /* prompt "ready printer..." if YES */
  74.   show,    /* show source file names */
  75.   begin,   /* beginning page to print */
  76.   end,     /* ending page to print */
  77.   bcopy,   /* beginning copy */
  78.   ecopy,   /* ending copy */
  79.   mrgfd,   /* merge file fd */
  80.   sentend, /* YES for plausible end of sentence */
  81.   dir;     /* direction for spreading blanks */
  82.  
  83. char
  84.        sbpref[]={27,'S',49,1},  /* nontty subscript prefix */
  85.        sbsuff[]={27,'T', 1,0},  /* nontty subscript suffix */
  86.        sppref[]={27,'S',48,1},  /* nontty superscript prefix */
  87.        spsuff[]={27,'T', 1,0},  /* nontty superscript suffix */
  88.       *ulon, *uloff,
  89.        ulpref[]={27,'-',49,1},  /* nontty underline prefix */
  90.        ulsuff[]={27,'-',48,1},  /* nontty underline suffix */
  91.       *bfon, *bfoff,
  92.        bfpref[]={27,'E',1,0},   /* nontty boldface prefix */
  93.        bfsuff[]={27,'F',1,0},   /* nontty boldface suffix */
  94.       *dson, *dsoff,
  95.        dspref[]={27,'G',1,0},   /* nontty dbl strike prefix */
  96.        dssuff[]={27,'H',1,0},   /* nontty dbl strike suffix */
  97.       *iton, *itoff,
  98.        itpref[]={27,'4',1,0},   /* nontty italics prefix */
  99.        itsuff[]={27,'5',1,0},   /* nontty italics suffix */
  100.       *dwon, *dwoff,
  101.        dwpref[]={27,'W',49,1},  /* nontty dbl wide prefix */
  102.        dwsuff[]={27,'W',48,1};  /* nontty dbl wide suffix */
  103.  
  104. char
  105.    cmd,      /* command character */
  106.    mrg,      /* merge field delimiter */
  107.    blank,    /* literal blank character */
  108.   *ulskips,  /* specific characters to skip underlining */
  109.   *oheader,  /* odd page header */
  110.   *eheader,  /* even page header */
  111.   *ofooter,  /* odd page footer */
  112.   *efooter,  /* even page footer */
  113.   *outbuf,   /* output buffer */
  114.   *ttlbuf,   /* buffer for titles */
  115.   *mrgbuf,   /* buffer for merged text */
  116.   *inbuf,    /* input buffer */
  117.   *wrdbuf,   /* space for one word */
  118.   *nbrstr;   /* number string */
  119.  
  120. main(argc, argv) int argc, *argv; {
  121.   oheader=malloc((MAXLINE+1));
  122.   eheader=malloc((MAXLINE+1));
  123.   ofooter=malloc((MAXLINE+1));
  124.   efooter=malloc((MAXLINE+1));
  125.   mrgbuf=malloc((MAXLINE+1));
  126.   outbuf=malloc(MAXOUT);
  127.   ttlbuf=malloc(MAXOUT);
  128.   wrdbuf=malloc(MAXOUT);
  129.   inbuf=malloc(INSIZE);
  130.   nbrstr=malloc(NDIM);
  131.   nbrstr[NWIDTH]=NULL;
  132.   doargs(argc, argv);
  133.   mpcnt=99;
  134.   pass=0;
  135.   if(mrgfd) {
  136.     while(fgets(mrgbuf, (MAXLINE+1), mrgfd) && (pass < ecopy)) {
  137.       if(++pass < bcopy) continue;
  138.       trim(mrgbuf);
  139.       nextpass();
  140.       }
  141.     }
  142.   else if(ecopy == HUGE) nextpass();
  143.   else for(pass = bcopy; pass <= ecopy; ++pass) nextpass();
  144.   fclose(stdout);
  145.   }
  146.  
  147. /*
  148. ** nextpass -- make next pass on stdin text
  149. */
  150. nextpass() {
  151.   char c, str[6];
  152.   init();
  153.   if(mrgfd || ecopy != HUGE) {
  154.     cseek(stdin, 0, 0);
  155.     left(itod(pass, str, 6));
  156.     fputs("copy ", stderr);
  157.     fputs(str, stderr);
  158.     fputs("   ", stderr);
  159.     }
  160.   c=NULL;
  161.   if(((pass <= bcopy) || (pause==YES)) &&
  162.      ready && isatty(stdout)) {
  163.     fputs("ready printer... ", stderr);
  164.     c=fgetc(stderr);
  165.     }
  166.   if(c!=KILL) {
  167.     process(stdin);
  168.     if((lineno > 0)|(outp > -1)) space(HUGE);
  169.     }
  170.   else fputc('\n', stderr);
  171.   }
  172.  
  173. /*
  174. ** process -- process text from fd
  175. */
  176. process(fd) int fd; {
  177.   while(fgets(inbuf, INSIZE, fd)!=NULL) {
  178.     poll(YES);
  179.     trim(inbuf);
  180.     if((fd==stderr)&(inbuf[0]==cmd)&(inbuf[1]==NULL))
  181.       return;
  182.     if(inbuf[0]==cmd) command(inbuf);
  183.     else {
  184.       if(merge()==NO) continue;
  185.       text(inbuf);
  186.       }
  187.     }
  188.   }
  189.  
  190. /*
  191. ** include -- process included text (nexting allowed)
  192. */
  193. include() {
  194.   int i, fd;
  195.   char fname[INSIZE];
  196.   i=0;
  197.   while((inbuf[i]!=' ')&(inbuf[i]!=NULL)) ++i;
  198.   getwrd(inbuf, &i, fname);
  199.   if((fd=fopen(fname, "r"))==NULL) cant(fname);
  200.   lout(fname, stderr);
  201.   if(show) {
  202.     brk();
  203.     put(fname);
  204.     brk();
  205.    }
  206.   process(fd);
  207.   fclose(fd);
  208.   }
  209.  
  210. /*
  211. ** prompt -- prompt operator for input
  212. */
  213. prompt() {
  214.   fputs("\7enter: ", stderr);
  215.   fputs(inbuf+3, stderr);
  216.   fputc('\n', stderr);
  217.   process(stderr);
  218.   }
  219.  
  220. /*
  221. ** init -- initialize parameters
  222. */
  223. init() {
  224.   cmd=COMMAND;
  225.   mrg=MRGCHAR;
  226.   blank=BLANK;
  227.   sentend=NO;
  228.   fill=just=YES;
  229.   lsval=1;
  230.   inval=tival=sqval=0;
  231.   lmval=DEFLM;
  232.   rmval=DEFRM;
  233.   bfval=itval=ceval=ulval=cuact=0;
  234.   curpag=0;
  235.   newpag=1;
  236.   lineno=0;
  237.   mpval=DEFMP;
  238.   bline=NO; /** prevents a blank first page **/
  239.   plval=PAGELEN;
  240.   m1val=DEFM1;
  241.   m2val=DEFM2;
  242.   m3val=DEFM3;
  243.   m4val=DEFM4;
  244.   bottom=plval-m3val-m4val;
  245.   oheader[0]=eheader[0]=NULL;
  246.   ofooter[0]=efooter[0]=NULL;
  247.   outp=-1;
  248.   outw=outwds=0;
  249.   dir=0;
  250.   }
  251.  
  252. /*
  253. ** command -- process commands
  254. */
  255. command(buf) char buf[]; {
  256.   int argtyp, spval, val;
  257.   if(buf[1] == cmd) return;   /* comment */
  258.   val=getval(buf, &argtyp);
  259.   switch((toupper(buf[1]) << 8) + toupper(buf[2])) {
  260.     default: {
  261.       fputs("\7note: ", stderr);
  262.       fputs(buf, stderr);
  263.       fputc('\n', stderr);
  264.       return;
  265.       }
  266.     case 'FI': {
  267.       brk();
  268.       fill=YES;
  269.       break;
  270.       }
  271.     case 'NF': {
  272.       brk();
  273.       fill=NO;
  274.       break;
  275.       }
  276.     case 'JU': {
  277.       brk();
  278.       just=YES;
  279.       break;
  280.       }
  281.     case 'NJ': {
  282.       brk();
  283.       just=NO;
  284.       break;
  285.       }
  286.     case 'BR':{
  287.       brk();
  288.       break;
  289.       }
  290.     case 'LS': {
  291.       setvalue(&lsval, val, argtyp, 1, 1, HUGE);
  292.       break;
  293.       }
  294.     case 'HE': {
  295.       gettl(buf, oheader);
  296.       gettl(buf, eheader);
  297.       break;
  298.       }
  299.     case 'OH': {
  300.       gettl(buf, oheader);
  301.       break;
  302.       }
  303.     case 'EH': {
  304.       gettl(buf, eheader);
  305.       break;
  306.       }
  307.     case 'FO': {
  308.       gettl(buf, ofooter);
  309.       gettl(buf, efooter);
  310.       break;
  311.       }
  312.     case 'OF': {
  313.       gettl(buf, ofooter);
  314.       break;
  315.       }
  316.     case 'EF': {
  317.       gettl(buf, efooter);
  318.       break;
  319.       }
  320.     case 'SP': {
  321.       setvalue(&spval, val, argtyp, 1, 0, HUGE);
  322.       space(spval);
  323.       bline=YES;
  324.       break;
  325.       }
  326.     case 'BP': {
  327.       if((lineno > 0)|(outp > -1)) space(HUGE);
  328.       setvalue(&curpag, val, argtyp, newpag, -HUGE, HUGE);
  329.       newpag=curpag;
  330.       break;
  331.       }
  332.     case 'PL': {
  333.       if(val==0) {
  334.         lineno=1;
  335.         plval=0;
  336.         }
  337.       else {
  338.         setvalue(&plval, val, argtyp,
  339.             PAGELEN, m1val+m2val+m3val+m4val+1, HUGE);
  340.         bottom=plval-m3val-m4val;
  341.         }
  342.       break;
  343.       }
  344.     case 'IN': {
  345.       brk();
  346.       setvalue(&inval, val, argtyp, 0, -lmval, rmval-lmval-1);
  347.       break;
  348.       }
  349.     case 'LM': {
  350.       brk();
  351.       setvalue(&lmval, val-1, argtyp, DEFLM, 0, rmval-1);
  352.       break;
  353.       }
  354.     case 'RM': {
  355.       setvalue(&rmval, val, argtyp, DEFRM, lmval+1, HUGE);
  356.       break;
  357.       }
  358.     case 'TI': {
  359.       brk();
  360.       setvalue(&tival, val, argtyp, 0,
  361.           -(lmval+inval), rmval-(lmval+inval)-1);
  362.       break;
  363.       }
  364.     case 'SQ': {
  365.       brk();
  366.       setvalue(&sqval, val, argtyp, 0, 0, HUGE);
  367.       break;
  368.       }
  369.     case 'CE': {
  370.       brk();
  371.       setvalue(&ceval, val, argtyp, 1, 0, HUGE);
  372.       break;
  373.       }
  374.     case 'BF': {
  375.       setvalue(&bfval, val, argtyp, 1, 0, HUGE);
  376.       ulval=0;
  377.       break;
  378.       }
  379.     case 'IT': {
  380.       setvalue(&itval, val, argtyp, 1, 0, HUGE);
  381.       break;
  382.       }
  383.     case 'DW': {
  384.       setvalue(&dwval, val, argtyp, 1, 0, HUGE);
  385.       break;
  386.       }
  387.     case 'UL': {
  388.       setvalue(&ulval, val, argtyp, 1, 0, HUGE);
  389.       cuact=0;
  390.       ulskips=" ()[]{}\t\b,.;:?!_'\"";
  391.       bfval=0;
  392.       break;
  393.       }
  394.     case 'CU': {
  395.       setvalue(&ulval, val, argtyp, 1, 0, HUGE);
  396.       if(ulval==0) cuact=0;
  397.       else cuact=1;    /* becomes 2 after next putwrd */
  398.       if(ttymode) ulskips=" \t\b";
  399.       else        ulskips= "\t\b";
  400.       break;
  401.       }
  402.     case 'NU': {
  403.       ulval=cuact=0;
  404.       break;
  405.       }
  406.     case 'MP': {
  407.       setvalue(&mpval, val, argtyp, DEFMP, 0, HUGE);
  408.       break;
  409.       }
  410.     case 'NE': {
  411.       if(((bottom-lineno) < val) & (lineno > 0))
  412.         space(HUGE);
  413.       break;
  414.       }
  415.     case 'RS': {
  416.       if(((bottom-lineno) < val) & (lineno > 0))
  417.         space(HUGE);
  418.       space(val);
  419.       break;
  420.       }
  421.     case 'SO': {
  422.       include();
  423.       break;
  424.       }
  425.     case 'PR': {
  426.       prompt();
  427.       break;
  428.       }
  429.     case 'CC': {
  430.       val=0;
  431.       getwrd(buf, &val, wrdbuf);
  432.       if(getwrd(buf, &val, wrdbuf)==1) cmd=wrdbuf[0];
  433.       break;
  434.       }
  435.     case 'MC': {
  436.       val=0;
  437.       getwrd(buf, &val, wrdbuf);
  438.       if(getwrd(buf, &val, wrdbuf)==1) mrg=wrdbuf[0];
  439.       break;
  440.       }
  441.     case 'BC': {
  442.       val=0;
  443.       getwrd(buf, &val, wrdbuf);
  444.       if(getwrd(buf, &val, wrdbuf)==1) blank=wrdbuf[0];
  445.       break;
  446.       }
  447.     case 'M1': {
  448.       setvalue(&m1val, val, argtyp, DEFM1, 0, HUGE);
  449.       break;
  450.       }
  451.     case 'M2': {
  452.       setvalue(&m2val, val, argtyp, DEFM2, 0, HUGE);
  453.       break;
  454.       }
  455.     case 'M3': {
  456.       setvalue(&m3val, val, argtyp, DEFM3, 0, HUGE);
  457.       bottom=plval-m3val-m4val;
  458.       break;
  459.       }
  460.     case 'M4': {
  461.       setvalue(&m4val, val, argtyp, DEFM4, 0, HUGE);
  462.       bottom=plval-m3val-m4val;
  463.       break;
  464.       }
  465.     case 'PO': {
  466.       setvalue(&pospec, val, argtyp, 0, 0, HUGE);
  467.       break;
  468.       }
  469.     }
  470.   }
  471.  
  472. #include "fmt2.c"
  473. #include "fmt3.c"
  474. #include "scopy.c"
  475. #include "getwrd.c"
  476. #include "cant.c"
  477. #include "page.c"
  478. #include "index.c"
  479. #include "same.c"
  480. #include "trim.c"
  481. #include "out.c"
  482.  
  483.