home *** CD-ROM | disk | FTP | other *** search
/ Total Destruction / Total_Destruction.iso / addons / Lccwin32.exe / Lccwin32 / lccpub / src / output.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-11-11  |  4.7 KB  |  218 lines

  1. #include "c.h"
  2. #include <time.h>
  3.  
  4. int outfd = 1;
  5. int errfd = 2;
  6. #define ASMBUFSIZ 1024*4
  7. static char buf1[ASMBUFSIZ], buf2[512];    /* output buffers */
  8. static struct io {
  9.     int fd;                /* file descriptor */
  10.     char *bp;            /* buffer pointer */
  11.     char *buffer;            /* buffer proper */
  12.     char *limit;            /* high water limit */
  13. } Iob[] = {
  14.     0, 0, 0, 0,
  15.     1, buf1, buf1, buf1 + sizeof buf1 - 80,
  16.     2, buf2, buf2, buf2 + sizeof buf2 - 80
  17. }, *io[] = {
  18.     &Iob[0],            /* used by stringf */
  19.     &Iob[1],            /* output */
  20.     &Iob[2]                /* standard error & other files; used by fprint */
  21. };
  22. static int fd = 1;            /* current output file */
  23.  
  24. char *bp = buf1;            /* current output buffer pointer */
  25.  
  26. void outs(s) char *s; {
  27.     char *p;
  28.  
  29.     for (p = bp; (*p = *s++) != 0; p++)
  30.         ;
  31.     bp = p;
  32.     if (bp > io[fd]->limit)
  33.         outflush();
  34. }
  35. void print (char *fmt, ...) {
  36.     va_list ap;
  37.  
  38.     va_init(ap, fmt);
  39.     vprint(fmt, ap);
  40.     va_end(ap);
  41. }
  42. /* outputInit - initialize output system */
  43. void outputInit() {
  44.     io[1]->fd = outfd;
  45.     io[2]->fd = errfd;
  46. }
  47.  
  48. /* fprint - formatted output to file descriptor f */
  49. void fprint (int f, char *fmt, ...)
  50. {
  51.     va_list ap;
  52.  
  53.     va_init(ap, fmt);
  54.     vfprint(f, fmt, ap);
  55.     va_end(ap);
  56. }
  57. extern int GenerateAsm,outfd;
  58. extern clock_t AsmTime;
  59. #ifdef PEEPHOLE
  60. int SendToOptimizer(void)
  61. {
  62.     struct io *iop = io[fd];
  63.     int l;
  64.     bp--;
  65.     if (*bp != '\n') {
  66.         bp++;
  67.         *bp = '\n';
  68.     }
  69.     else *bp++;
  70.     l = ChangeBlock(iop->buffer,bp - iop->buffer);
  71.     bp = iop->buffer + l;
  72.     outflush();
  73.     return(0);
  74. }
  75. #endif
  76. extern FILE *AssemblerFile;
  77. /* outflush - flush output buffer */
  78. void outflush()
  79. {
  80.     struct io *iop = io[fd];
  81.     int l;
  82.     extern int inFunctionCode;
  83.  
  84.     assert(fd);
  85.     l = bp - iop->buffer;
  86.     if (l && fd == 1) {
  87.         if (GenerateAsm) {
  88.             fwrite(iop->buffer,1,l,AssemblerFile);
  89.         }
  90.         iop->buffer[l] = 0;
  91.         AsmReadBuffer(iop->buffer,l);
  92. //        if (IntermediateLanguageFile)
  93.             memset(iop->buffer,0,ASMBUFSIZ);
  94.     }
  95.     else if (bp != iop->buffer) {
  96. #if 0
  97.         if (iop->fd == 2) {
  98.             write(errfd,iop->buffer,l);
  99.         }
  100.         else
  101. #endif
  102.         write(iop->fd,iop->buffer,l);
  103.         if (iop->fd != 2) {
  104.             iop->buffer[l] = 0;
  105.             fprintf(stderr,"%s",iop->buffer);
  106.         }
  107.     }
  108.     bp = iop->bp = iop->buffer;
  109. }
  110.  
  111. /* stringf - formatted output to a saved string */
  112. char *stringf (char *fmt, ...) {
  113.     char buf[1024];
  114.     va_list ap;
  115.  
  116.     va_init(ap, fmt);
  117.     fd = 0;
  118.     io[1]->bp = bp;
  119.     bp = io[0]->bp = io[0]->buffer = buf;
  120.     io[0]->limit = buf + sizeof buf;
  121.     vprint(fmt, ap);
  122.     *bp = 0;
  123.     bp = io[1]->bp;
  124.     fd = 1;
  125.     va_end(ap);
  126.     return string(buf);
  127. }
  128.  
  129. /* vfprint - formatted output to file descriptor f */
  130. void vfprint(f, fmt, ap) int f; char *fmt; va_list ap;
  131. {
  132.     if (f == 1)
  133.         vprint(fmt, ap);
  134.     else {
  135.         fd = 2;
  136.         io[1]->bp = bp;
  137.         io[2]->fd = f == 2 ? errfd : f;
  138.         bp = io[2]->bp;
  139.         vprint(fmt, ap);
  140.         outflush();
  141.         bp = io[1]->bp;
  142.         fd = 1;
  143.     }
  144. }
  145.  
  146. /* vprint - formatted output to standard output */
  147. void vprint(fmt, ap) char *fmt; va_list ap; {
  148.     for (; *fmt; fmt++)
  149.         if (*fmt == '%')
  150.             switch (*++fmt) {
  151.             case 'c': { *bp++ = va_arg(ap, int);
  152.  } break;
  153.             case 'd': { int n = va_arg(ap, int);
  154.                     unsigned m;
  155.                     char buf[25], *s = buf + sizeof buf;
  156.                     *--s = 0;
  157.                     if (n == INT_MIN)
  158.                         m = (unsigned)INT_MAX + 1;
  159.                     else if (n < 0)
  160.                         m = -n;
  161.                     else
  162.                         m = n;
  163.                     do
  164.                         *--s = m%10 + '0';
  165.                     while ((m /= 10) != 0);
  166.                     if (n < 0)
  167.                         *--s = '-';
  168.                     outs(s);
  169.  } break;
  170.             case 'o': { unsigned n = va_arg(ap, unsigned);
  171.                     char buf[25], *s = buf + sizeof buf;
  172.                     *--s = 0;
  173.                     do
  174.                         *--s = (n&7) + '0';
  175.                     while ((n >>= 3) != 0);
  176.                     outs(s);
  177.  } break;
  178.             case 'x': { unsigned n = va_arg(ap, unsigned);
  179.                     char buf[25], *s = buf + sizeof buf;
  180.                     *--s = 0;
  181.                     do
  182.                         *--s = "0123456789abcdef"[n&0xf];
  183.                     while ((n >>= 4) != 0);
  184.                     outs(s);
  185.  } break;
  186.             case 's': { char *s = va_arg(ap, char *);
  187.                     if (s)
  188.                         outs(s);
  189.  } break;
  190.             case 'S': { char *s = va_arg(ap, char *);
  191.                     int n = va_arg(ap, int);
  192.                     if (s)
  193.                         while (n-- > 0)
  194.                             *bp++ = *s++;
  195.  } break;
  196.             case 'k': { int t = va_arg(ap, int);
  197.                     static char *tokens[] = {
  198. #define xx(a,b,c,d,e,f,g) g,
  199. #define yy(a,b,c,d,e,f,g) g,
  200. #include "token.h"
  201.                     };
  202.                     assert(tokens[t&0177]);
  203.                     outs(tokens[t&0177]);
  204.  } break;
  205.             case 't': { Type ty = va_arg(ap, Type);
  206.                     outtype(ty ? ty : voidtype);
  207.  } break;
  208.             case 'w': { Coordinate *p = va_arg(ap, Coordinate *);
  209.                     if (p->file && *p->file)
  210.                         print("%s ", p->file);
  211.                     print("%d", p->y); } break;
  212.             default:  *bp++ = *fmt; break;
  213.             }
  214.         else if ((*bp++ = *fmt) == '\n' && bp > io[fd]->limit)
  215.             outflush();
  216. }
  217.  
  218.