home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume8 / jove / part02 / fmt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-02-02  |  4.7 KB  |  328 lines

  1. /************************************************************************
  2.  * This program is Copyright (C) 1986 by Jonathan Payne.  JOVE is       *
  3.  * provided to you without charge, and with no warranty.  You may give  *
  4.  * away copies of JOVE, including sources, provided that this notice is *
  5.  * included in all the files.                                           *
  6.  ************************************************************************/
  7.  
  8. #include "jove.h"
  9. #include "io.h"
  10. #include "termcap.h"
  11.  
  12. #include <varargs.h>
  13.  
  14. char    mesgbuf[MESG_SIZE];
  15.  
  16. /* VARARGS2 */
  17.  
  18. format(buf, len, fmt, ap)
  19. char    *buf,
  20.     *fmt;
  21. va_list    ap;
  22. {
  23.     File    strbuf,
  24.         *sp = &strbuf;
  25.  
  26.      sp->f_ptr = sp->f_base = buf;
  27.     sp->f_fd = -1;        /* Not legit for files */
  28.     sp->f_cnt = len;
  29.     sp->f_flags = F_STRING;
  30.     sp->f_bufsize = len;
  31.  
  32.     doformat(sp, fmt, ap);
  33.     putc('\0', sp);
  34. }
  35.  
  36. static char    padc = ' ';
  37. static File    *curiop = 0;
  38.  
  39. static
  40. PPchar(c, str)
  41. int    c;
  42. char    *str;
  43. {
  44.     char    *cp = str;
  45.  
  46.     if (c == '\033')
  47.         strcpy(cp, "ESC");
  48.     else if (c < ' ')
  49.         sprintf(cp, "C-%c", c + '@');
  50.     else if (c == '\177')
  51.         strcpy(cp, "^?");
  52.     else
  53.         sprintf(cp, "%c", c);
  54. }
  55.  
  56. static
  57. putld(leftadj, width, d, base)
  58. long    d;
  59. {
  60.     int    length = 1;
  61.     long    tmpd = d;
  62.  
  63.     while (tmpd = (tmpd / base))
  64.         length++;
  65.     if (d < 0)
  66.         length++;
  67.     if (!leftadj)
  68.         pad(padc, width - length);
  69.     if (d < 0) {
  70.         putc('-', curiop);
  71.         d = -d;
  72.     }
  73.     outld(d, base);
  74.     if (leftadj)
  75.         pad(padc, width - length);
  76. }
  77.  
  78. static
  79. outld(d, base)
  80. long    d;
  81. {
  82.     long    n;
  83.  
  84.     if (n = (d / base))
  85.         outld(n, base);
  86.     putc((int) ('0' + (int) (d % base)), curiop);
  87. }
  88.  
  89. static
  90. puts(leftadj, width, str)
  91. char    *str;
  92. {
  93.     int    length;
  94.     register char    *cp,
  95.             c;
  96.  
  97.     if (str == 0)
  98. #if pyr
  99.         str = "";
  100. #else
  101.         str = "(null)";
  102. #endif
  103.     length = strlen(str);
  104.     cp = str;
  105.     if (!leftadj)
  106.         pad(' ', width - length);
  107.     while (c = *cp++)
  108.         putc(c, curiop);
  109.     if (leftadj)
  110.         pad(' ', width - length);
  111. }
  112.  
  113. static
  114. pad(c, amount)
  115. register int    c,
  116.         amount;
  117. {
  118.     while (--amount >= 0)
  119.         putc(c, curiop);
  120. }
  121.  
  122. static
  123. doformat(sp, fmt, ap)
  124. register File    *sp;
  125. register char    *fmt;
  126. va_list    ap;
  127. {
  128.     register char    c;
  129.     int    leftadj,
  130.         width;
  131.     File    *pushiop = curiop;
  132.  
  133.     curiop = sp;
  134.  
  135.     while (c = *fmt++) {
  136.         if (c != '%') {
  137.             putc(c, sp);
  138.             continue;
  139.         }
  140.  
  141.         padc = ' ';
  142.         leftadj = width = 0;
  143.         c = *fmt++;
  144.         if (c == '-') {
  145.             leftadj++;
  146.             c = *fmt++;
  147.         }
  148.         if (c == '0') {
  149.             padc = '0';
  150.             c = *fmt++;
  151.         }
  152.         while (c >= '0' && c <= '9') {
  153.             width = width * 10 + (c - '0');
  154.             c = *fmt++;
  155.         }
  156.         if (c == '*') {
  157.             width = va_arg(ap, int);
  158.             c = *fmt++;
  159.         }
  160.     reswitch:
  161.         /* At this point, fmt points at one past the format letter. */
  162.         switch (c) {
  163.         case '%':
  164.             putc('%', curiop);
  165.             break;
  166.     
  167.         case 'D':
  168.             putld(leftadj, width, va_arg(ap, long), 10);
  169.             break;
  170.     
  171.         case 'b':
  172.             {
  173.             Buffer    *b = va_arg(ap, Buffer *);
  174.  
  175.             puts(leftadj, width, b->b_name);
  176.             break;
  177.             }
  178.  
  179.         case 'c':
  180.             putc(va_arg(ap, int), curiop);
  181.             break;
  182.     
  183.         case 'd':
  184.             putld(leftadj, width, (long) va_arg(ap, int), 10);
  185.             break;
  186.     
  187.         case 'f':    /* current command name gets inserted here! */
  188.             puts(leftadj, width, LastCmd->Name);
  189.             break;
  190.  
  191.         case 'l':
  192.             c = Upper(*++fmt);
  193.             goto reswitch;
  194.     
  195.         case 'n':
  196.             if (va_arg(ap, int) != 1)
  197.                 puts(leftadj, width, "s");
  198.             break;
  199.  
  200.         case 'o':
  201.             putld(leftadj, width, (long) va_arg(ap, int), 8);
  202.             break;
  203.     
  204.         case 'p':
  205.             {
  206.                 char    cbuf[20];
  207.  
  208.                 PPchar(va_arg(ap, int), cbuf);
  209.                 puts(leftadj, width, cbuf);
  210.                 break;
  211.             }
  212.  
  213.         case 's':
  214.             puts(leftadj, width, va_arg(ap, char *));
  215.             break;
  216.         
  217.         default:
  218.             complain("Unknown format directive: \"%%%c\"", c);
  219.         }
  220.     }
  221.     curiop = pushiop;
  222. }
  223.  
  224. /* VARARGS1 */
  225.  
  226. char *
  227. sprint(fmt, va_alist)
  228. char    *fmt;
  229. va_dcl
  230. {
  231.     va_list    ap;
  232.     static char    line[100];
  233.  
  234.     va_start(ap);
  235.     format(line, sizeof line, fmt, ap);
  236.     va_end(ap);
  237.     return line;
  238. }
  239.  
  240. /* VARARGS1 */
  241.  
  242. printf(fmt, va_alist)
  243. char    *fmt;
  244. va_dcl
  245. {
  246.     va_list    ap;
  247.  
  248.     va_start(ap);
  249.     doformat(stdout, fmt, ap);
  250.     va_end(ap);
  251. }
  252.  
  253. /* VARARGS1 */
  254.  
  255. fprintf(fp, fmt, va_alist)
  256. File    *fp;
  257. char    *fmt;
  258. va_dcl
  259. {
  260.     va_list    ap;
  261.  
  262.     va_start(ap);
  263.     doformat(fp, fmt, ap);
  264.     va_end(ap);
  265. }
  266.  
  267. /* VARARGS2 */
  268.  
  269. sprintf(str, fmt, va_alist)
  270. char    *str,
  271.     *fmt;
  272. va_dcl
  273. {
  274.     va_list    ap;
  275.  
  276.     va_start(ap);
  277.     format(str, 130, fmt, ap);
  278.     va_end(ap);
  279. }
  280.  
  281. /* VARARGS1 */
  282.  
  283. s_mess(fmt, va_alist)
  284. char    *fmt;
  285. va_dcl
  286. {
  287.     va_list    ap;
  288.  
  289.     if (InJoverc)
  290.         return;
  291.     va_start(ap);
  292.     format(mesgbuf, sizeof mesgbuf, fmt, ap);
  293.     va_end(ap);
  294.     message(mesgbuf);
  295. }
  296.  
  297. /* VARARGS1 */
  298.  
  299. f_mess(fmt, va_alist)
  300. char    *fmt;
  301. va_dcl
  302. {
  303.     va_list    ap;
  304.  
  305.     va_start(ap);
  306.     format(mesgbuf, sizeof mesgbuf, fmt, ap);
  307.     va_end(ap);
  308.     DrawMesg(NO);
  309.     UpdMesg++;    /* Still needs updating (for convenience) */
  310. }
  311.  
  312. /* VARARGS1 */
  313.  
  314. add_mess(fmt, va_alist)
  315. char    *fmt;
  316. va_dcl
  317. {
  318.     int    mesg_len = strlen(mesgbuf);
  319.     va_list    ap;
  320.  
  321.     if (InJoverc)
  322.         return;
  323.     va_start(ap);
  324.     format(&mesgbuf[mesg_len], (sizeof mesgbuf) - mesg_len, fmt, ap);
  325.     va_end(ap);
  326.     message(mesgbuf);
  327. }
  328.