home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / editc80 / ed5.c < prev    next >
C/C++ Source or Header  |  1984-06-15  |  3KB  |  191 lines

  1. /* Screen editor:  output format module
  2.  *
  3.  * Source: ed5.c
  4.  * Version: May 15, 1981.
  5.  */
  6.  
  7. /* define globals */
  8.  
  9. #include ed1.h
  10.  
  11. /* variables global to this module -----
  12.  
  13. int fmttab;        maximal tab length
  14. int fmtdev;        device flag -- YES/NO = LIST/CONSOLE
  15. int fmtwidth;        devide width.  LISTW/SCRNW1
  16.  
  17. fmtcol[i] is the first column at which buf[i] is printed.
  18. fmtsub() and fmtlen() assume fmtcol[] is valid on entry.
  19.  
  20. int fmtcol[MAXLEN1];
  21.  
  22. ----- */
  23.  
  24. /* direct output from this module to either the console or
  25.  * the list device.
  26.  */
  27.  
  28. fmtassn(listflag) int listflag;
  29. {
  30.     if (listflag==YES) {
  31.         fmtdev=YES;
  32.         fmtwidth=LISTW;
  33.     }
  34.     else {
  35.         fmtdev=NO;
  36.         fmtwidth=SCRNW1;
  37.     }
  38. }
  39.  
  40. /* adjust fmtcol[] to prepare for calls on
  41.  * fmtout() and fmtlen()
  42.  *
  43.  * NOTE:  this routine is needed as an efficiency
  44.  *        measure.  Without fmtadj(), calls on
  45.  *        fmtlen() become too slow.
  46.  */
  47.  
  48. fmtadj(buf,minind,maxind) char *buf; int minind,maxind;
  49. {
  50. int k;
  51.     /* line always starts at left margin */
  52.     fmtcol[0]=0;
  53.     /* start scanning at minind */
  54.     k=minind;
  55.     while (k<maxind) {
  56.         if (buf[k]==CR) {
  57.             break;
  58.         }
  59.         fmtcol[k+1]=fmtcol[k]+fmtlench(buf[k],fmtcol[k]);
  60.         k++;
  61.     }
  62. }
  63.  
  64. /* return column at which at which buf[i] will be printed */
  65.  
  66. fmtlen(buf,i) char *buf; int i;
  67. {
  68.     return(fmtcol[i]);
  69. }
  70.  
  71. /* print buf[i] ... buf[j-1] on current device so long as
  72.  * characters will not be printed in last column.
  73.  */
  74.  
  75. fmtsubs(buf,i,j) char *buf; int i, j;
  76. {
  77. int k;
  78.     if (fmtcol[i]>=fmtwidth) {
  79.         return;
  80.     }
  81.     outxy(fmtcol[i],outgety());    /* position cursor */
  82.     while (i<j) {
  83.         if (buf[i]==CR) {
  84.             break;
  85.         }
  86.         if (fmtcol[i+1]>fmtwidth) {
  87.             break;
  88.         }
  89.         fmtoutch(buf[i],fmtcol[i]);
  90.         i++;
  91.     }
  92.     outdeol();    /* clear rest of line */
  93. }
  94.  
  95. /* print string which ends with CR or EOS to current device.
  96.  * truncate the string if it is too long.
  97.  */
  98.  
  99. fmtsout(buf,offset) char *buf; int offset;
  100. {
  101. char c;
  102. int col,k;
  103.     col=0;
  104.     while (c= *buf++) {
  105.         if (c==CR) {
  106.             break;
  107.         }
  108.         k=fmtlench(c,col);
  109.         if ((col+k+offset)>fmtwidth) {
  110.             break;
  111.         }
  112.         fmtoutch(c,col);
  113.         col=col+k;
  114.     }
  115. }
  116.  
  117. /* return length of char c at column col */
  118.  
  119. fmtlench(c,col) char c; int col;
  120. {
  121.     if (c==TAB) {
  122.         /* tab every fmttab columns */
  123.         return(fmttab-(col%fmttab));
  124.     }
  125.     else if (c<32) {
  126.         /* control char */
  127.         return(2);
  128.     }
  129.     else {
  130.         return(1);
  131.     }
  132. }
  133.  
  134. /* output one character to current device.
  135.  * convert tabs to blanks.
  136.  */
  137.  
  138. fmtoutch(c,col) char c; int col;
  139. {
  140. int k;
  141.     if (c==TAB) {
  142.         k=fmtlench(TAB,col);
  143.         while ((k--)>0) {
  144.             fmtdevch(' ');
  145.         }
  146.     }
  147.     else if (c<32) {
  148.         fmtdevch('^');
  149.         fmtdevch(c+64);
  150.     }
  151.     else {
  152.         fmtdevch(c);
  153.     }
  154. }
  155.  
  156. /* output character to current device */
  157.  
  158. fmtdevch(c) char c;
  159. {
  160.     if (fmtdev==YES) {
  161.         syslout(c);
  162.     }
  163.     else {
  164.         outchar(c);
  165.     }
  166. }
  167.  
  168. /* output a CR and LF to the current device */
  169.  
  170. fmtcrlf()
  171. {
  172.     if (fmtdev==YES) {
  173.         syslout(CR);
  174.         syslout(LF);
  175.     }
  176.     else {
  177.         /* kludge: this should be in out module */
  178.         /* make sure out module knows position */
  179.         outxy(0,SCRNL1);
  180.         syscout(CR);
  181.         syscout(LF);
  182.     }
  183. }
  184.  
  185. /* set tabs at every n columns */
  186.  
  187. fmtset(n) int n;
  188. {
  189.     fmttab=max(1,n);
  190. }
  191.