home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / games / hack / makedefs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-05-02  |  4.5 KB  |  225 lines

  1. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  2. /* makedefs.c - version 1.0.2 */
  3.  
  4. #include <stdio.h>
  5.  
  6. /* construct definitions of object constants */
  7. #define    LINSZ    1000
  8. #define    STRSZ    40
  9.  
  10. int fd;
  11. char string[STRSZ];
  12.  
  13. main(argc, argv)
  14.     int argc;
  15.     char **argv;
  16. {
  17. register int index = 0;
  18. register int propct = 0;
  19. register char *sp;
  20.     if (argc != 2) {
  21.         (void)fprintf(stderr, "usage: makedefs file\n");
  22.         exit(1);
  23.     }
  24.     if ((fd = open(argv[1], 0)) < 0) {
  25.         perror(argv[1]);
  26.         exit(1);
  27.     }
  28.     skipuntil("objects[] = {");
  29.     while(getentry()) {
  30.         if(!*string){
  31.             index++;
  32.             continue;
  33.         }
  34.         for(sp = string; *sp; sp++)
  35.             if(*sp == ' ' || *sp == '\t' || *sp == '-')
  36.                 *sp = '_';
  37.         if(!strncmp(string, "RIN_", 4)){
  38.             capitalize(string+4);
  39.             printf("#define    %s    u.uprops[%d].p_flgs\n",
  40.                 string+4, propct++);
  41.         }
  42.         for(sp = string; *sp; sp++) capitalize(sp);
  43.         /* avoid trouble with stupid C preprocessors */
  44.         if(!strncmp(string, "WORTHLESS_PIECE_OF_", 19))
  45.             printf("/* #define %s    %d */\n", string, index);
  46.         else
  47.             printf("#define    %s    %d\n", string, index);
  48.         index++;
  49.     }
  50.     printf("\n#define    CORPSE    DEAD_HUMAN\n");
  51.     printf("#define    LAST_GEM    (JADE+1)\n");
  52.     printf("#define    LAST_RING    %d\n", propct);
  53.     printf("#define    NROFOBJECTS    %d\n", index-1);
  54.     exit(0);
  55. }
  56.  
  57. char line[LINSZ], *lp = line, *lp0 = line, *lpe = line;
  58. int eof;
  59.  
  60. readline(){
  61. register int n = read(fd, lp0, (line+LINSZ)-lp0);
  62.     if(n < 0){
  63.         printf("Input error.\n");
  64.         exit(1);
  65.     }
  66.     if(n == 0) eof++;
  67.     lpe = lp0+n;
  68. }
  69.  
  70. char
  71. nextchar(){
  72.     if(lp == lpe){
  73.         readline();
  74.         lp = lp0;
  75.     }
  76.     return((lp == lpe) ? 0 : *lp++);
  77. }
  78.  
  79. skipuntil(s) char *s; {
  80. register char *sp0, *sp1;
  81. loop:
  82.     while(*s != nextchar())
  83.         if(eof) {
  84.             printf("Cannot skipuntil %s\n", s);
  85.             exit(1);
  86.         }
  87.     if(strlen(s) > lpe-lp+1){
  88.         register char *lp1, *lp2;
  89.         lp2 = lp;
  90.         lp1 = lp = lp0;
  91.         while(lp2 != lpe) *lp1++ = *lp2++;
  92.         lp2 = lp0;    /* save value */
  93.         lp0 = lp1;
  94.         readline();
  95.         lp0 = lp2;
  96.         if(strlen(s) > lpe-lp+1) {
  97.             printf("error in skipuntil");
  98.             exit(1);
  99.         }
  100.     }
  101.     sp0 = s+1;
  102.     sp1 = lp;
  103.     while(*sp0 && *sp0 == *sp1) sp0++, sp1++;
  104.     if(!*sp0){
  105.         lp = sp1;
  106.         return(1);
  107.     }
  108.     goto loop;
  109. }
  110.  
  111. getentry(){
  112. int inbraces = 0, inparens = 0, stringseen = 0, commaseen = 0;
  113. int prefix = 0;
  114. char ch;
  115. #define    NSZ    10
  116. char identif[NSZ], *ip;
  117.     string[0] = string[4] = 0;
  118.     /* read until {...} or XXX(...) followed by ,
  119.        skip comment and #define lines
  120.        deliver 0 on failure
  121.      */
  122.     while(1) {
  123.         ch = nextchar();
  124.     swi:
  125.         if(letter(ch)){
  126.             ip = identif;
  127.             do {
  128.                 if(ip < identif+NSZ-1) *ip++ = ch;
  129.                 ch = nextchar();
  130.             } while(letter(ch) || digit(ch));
  131.             *ip = 0;
  132.             while(ch == ' ' || ch == '\t') ch = nextchar();
  133.             if(ch == '(' && !inparens && !stringseen)
  134.                 if(!strcmp(identif, "WAND") ||
  135.                    !strcmp(identif, "RING") ||
  136.                    !strcmp(identif, "POTION") ||
  137.                    !strcmp(identif, "SCROLL"))
  138.                 (void) strncpy(string, identif, 3),
  139.                 string[3] = '_',
  140.                 prefix = 4;
  141.         }
  142.         switch(ch) {
  143.         case '/':
  144.             /* watch for comment */
  145.             if((ch = nextchar()) == '*')
  146.                 skipuntil("*/");
  147.             goto swi;
  148.         case '{':
  149.             inbraces++;
  150.             continue;
  151.         case '(':
  152.             inparens++;
  153.             continue;
  154.         case '}':
  155.             inbraces--;
  156.             if(inbraces < 0) return(0);
  157.             continue;
  158.         case ')':
  159.             inparens--;
  160.             if(inparens < 0) {
  161.                 printf("too many ) ?");
  162.                 exit(1);
  163.             }
  164.             continue;
  165.         case '\n':
  166.             /* watch for #define at begin of line */
  167.             if((ch = nextchar()) == '#'){
  168.                 register char pch;
  169.                 /* skip until '\n' not preceded by '\\' */
  170.                 do {
  171.                     pch = ch;
  172.                     ch = nextchar();
  173.                 } while(ch != '\n' || pch == '\\');
  174.                 continue;
  175.             }
  176.             goto swi;
  177.         case ',':
  178.             if(!inparens && !inbraces){
  179.                 if(prefix && !string[prefix])
  180.                     string[0] = 0;
  181.                 if(stringseen) return(1);
  182.                 printf("unexpected ,\n");
  183.                 exit(1);
  184.             }
  185.             commaseen++;
  186.             continue;
  187.         case '\'':
  188.             if((ch = nextchar()) == '\\') ch = nextchar();
  189.             if(nextchar() != '\''){
  190.                 printf("strange character denotation?\n");
  191.                 exit(1);
  192.             }
  193.             continue;
  194.         case '"':
  195.             {
  196.                 register char *sp = string + prefix;
  197.                 register char pch;
  198.                 register int store = (inbraces || inparens)
  199.                     && !stringseen++ && !commaseen;
  200.                 do {
  201.                     pch = ch;
  202.                     ch = nextchar();
  203.                     if(store && sp < string+STRSZ)
  204.                         *sp++ = ch;
  205.                 } while(ch != '"' || pch == '\\');
  206.                 if(store) *--sp = 0;
  207.                 continue;
  208.             }
  209.         }
  210.     }
  211. }
  212.  
  213. capitalize(sp) register char *sp; {
  214.     if('a' <= *sp && *sp <= 'z') *sp += 'A'-'a';
  215. }
  216.  
  217. letter(ch) register char ch; {
  218.     return( ('a' <= ch && ch <= 'z') ||
  219.         ('A' <= ch && ch <= 'Z') );
  220. }
  221.  
  222. digit(ch) register char ch; {
  223.     return( '0' <= ch && ch <= '9' );
  224. }
  225.