home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD1.bin / gnu / src / baseline / jove-4.14.6.lha / jove-4.14.6 / macvert.c < prev    next >
C/C++ Source or Header  |  1993-06-08  |  3KB  |  154 lines

  1. /***************************************************************************
  2.  * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
  3.  * is 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. /* Macvert converts old style macro files to the new style.  The old
  9.    style macros were binary files, the new ones are text files suitable
  10.    for loading with the "source" command of JOVE. */
  11.  
  12. #include <stdio.h>
  13.  
  14. extern int
  15.     read(),
  16.     write();
  17.  
  18. static void
  19.     output_new_definition();
  20.  
  21. static int    mac_fd;
  22.  
  23. static void
  24. mac_io(fcn, ptr, nbytes)
  25. int    (*fcn)();
  26. char    *ptr;
  27. int    nbytes;
  28. {
  29.     int    nio;
  30.  
  31.     if ((nio = (*fcn)(mac_fd, ptr, nbytes)) != nbytes)
  32.         fprintf(stderr, "[Macro %s error: %d got %d]",
  33.              (fcn == read) ? "read" : "write",
  34.              nbytes,
  35.              nio);
  36. }
  37.  
  38. #define NEWWAY    1
  39. #define OLDWAY    0
  40.  
  41. static int    int_how = NEWWAY;
  42.  
  43. /* Formatting int's the old way or the new "improved" way? */
  44.  
  45. #ifdef notdef
  46. #if    defined(vax) || defined(pdp11)
  47.  
  48. static long
  49. ntohl(x)
  50. register long x;
  51. {
  52.     return    (((x >>  0) & 0377) << 24) |
  53.         (((x >>  8) & 0377) << 16) |
  54.         (((x >> 16) & 0377) <<  8) |
  55.         (((x >> 24) & 0377) <<  0);
  56. }
  57.  
  58. #else
  59.  
  60. static long
  61. ntohl(x)
  62. register long x;
  63. {
  64.     return x;
  65. }
  66.  
  67. #endif
  68. #endif
  69.  
  70. static int
  71. int_fmt(i)
  72. int    i;
  73. {
  74.     if (int_how == NEWWAY) {
  75.         /* Note: using ntohl() for an int is not portable! */
  76.         return (int) ntohl((long) i);
  77.     }
  78.     return i;
  79. }
  80.  
  81. static void
  82. read_and_write_macros(filein)
  83. char    *filein;
  84. {
  85.     int    namelen,
  86.         bodylen,
  87.         tmp;
  88.     char    macname[256],
  89.         macbuf[1024];
  90.  
  91.     if ((mac_fd = open(filein, 0)) == -1)
  92.         fprintf(stderr, "Cannot open %s\n", filein);
  93.  
  94.     while (read(mac_fd, (char *) &tmp, sizeof tmp) == (sizeof tmp)) {
  95. retry:
  96.         bodylen = int_fmt(tmp);
  97.         if (bodylen <= 0 || bodylen > 10000) {
  98.             if (int_how == NEWWAY) {
  99.                 int_how = OLDWAY;
  100.                 goto retry;
  101.             } else {
  102.                 fprintf(stderr, "I don't think \"%s\" is an old style JOVE macro file\n", filein);
  103.                 exit(1);
  104.             }
  105.         }
  106.         mac_io(read, (char *) &namelen, (int) (sizeof namelen));
  107.         namelen = int_fmt(namelen);
  108.         mac_io(read, macname, namelen);
  109.         mac_io(read, macbuf, bodylen);
  110.         output_new_definition(macname, macbuf, bodylen);
  111.     }
  112. }
  113.  
  114. static void
  115. pr_putc(c)
  116. int    c;
  117. {
  118.     if (c == '\\' || c == '^')
  119.         putchar('\\');
  120.      else if (c < ' ' || c == '\177') {
  121.         putchar('^');
  122.         c = (c == '\177') ? '?' : (c + '@');
  123.     }
  124.     putchar(c);
  125. }
  126.  
  127. static void
  128. output_new_definition(name, body, bodylen)
  129. char    *name,
  130.     *body;
  131. int    bodylen;
  132. {
  133.     int    i;
  134.  
  135.     fprintf(stdout, "define-macro %s ", name);
  136.     for (i = 0; i < bodylen; i++)
  137.         pr_putc(body[i]);
  138.     putchar('\n');
  139. }
  140.  
  141. int
  142. main(argc, argv)
  143. int    argc;
  144. char    *argv[];
  145. {
  146.     if (argc != 2) {
  147.         fprintf(stderr, "usage: macvert <old-style-macro-file>\n");
  148.         exit(1);
  149.     }
  150.  
  151.     read_and_write_macros(argv[1]);
  152.     return 0;
  153. }
  154.