home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 1 / GoldFishApril1994_CD1.img / d1xx / d190 / nethack / een.zoo / makedefs.c < prev    next >
C/C++ Source or Header  |  1988-07-25  |  16KB  |  740 lines

  1. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  2. /* makedefs.c - NetHack version 2.3 */
  3.  
  4. static    char    SCCS_Id[] = "@(#)makedefs.c     2.3\t88/02/18";
  5.  
  6. #include    <stdio.h>
  7. #include    "config.h"
  8.  
  9. #ifdef MSDOS
  10. # ifndef AMIGA
  11. #  define freopen _freopen
  12. # endif
  13. # undef  exit
  14. # define alloc     malloc
  15. # define RDMODE  "r"
  16. # define WRMODE  "w"
  17. #else
  18. # define RDMODE  "r+"
  19. # define WRMODE  "w+"
  20. #endif
  21.  
  22. #ifdef AMIGA        /* Get back normal stdio. Compiler dependent. */
  23. # define stdin        (&Cbuffs[0])
  24. # define stdout     (&Cbuffs[1])
  25. # undef puts
  26. # undef printf
  27. # define remove(n)  unlink(n)
  28. #endif
  29.  
  30. #ifdef newobj
  31. #   undef newobj
  32. #endif
  33.  
  34. /* construct definitions of object constants */
  35. #define OBJ_FILE    "objects.h"
  36. #define ONAME_FILE    "onames.h"
  37. #define TRAP_FILE    "trap.h"
  38. #define DATE_FILE    "date.h"
  39. #define RUMOR_FILE    "rumors"
  40. #define DATA_FILE    "data"
  41.  
  42. char    inline[256], outline[256];
  43.  
  44. main(argc, argv)
  45.     int    argc;
  46.     char    *argv[];
  47. {
  48.     char    *option;
  49.  
  50.     if(argc == 2) {
  51.         option = argv[1];
  52.         switch (option[1]) {
  53.  
  54.         case 'o':
  55.         case 'O':       do_objs();
  56.                 break;
  57.         case 't':
  58.         case 'T':       do_traps();
  59.                 break;
  60.         case 'r':
  61.         case 'R':       do_rumors();
  62.                 break;
  63.  
  64.         case 'd':       do_data();
  65.                 break;
  66.  
  67.         case 'D':       do_date();
  68.                 break;
  69.         default:
  70.                 fprintf(stderr, "Unknown option '%c'.\n", option[1]);
  71.                 exit(1);
  72.         }
  73.         exit(0);
  74.     } else    fprintf(stderr, "Bad arg count (%d).\n", argc-1);
  75.     exit(1);
  76. }
  77.  
  78. do_traps() {
  79. int    ntrap, getpid();
  80. char    tmpfile[30];
  81. FILE    *freopen();
  82.  
  83.     sprintf(tmpfile, "makedefs.%d", getpid());
  84.     if(freopen(tmpfile, WRMODE, stdout) == NULL) {
  85.  
  86.         perror(tmpfile);
  87.         exit(1);
  88.     }
  89.     if(freopen(TRAP_FILE, RDMODE, stdin) == NULL) {
  90.  
  91.         perror(TRAP_FILE);
  92.         exit(1);
  93.     }
  94.  
  95.     while(gets(inline) != NULL) {
  96.  
  97.         puts(inline);
  98.         if(!strncmp(inline, "/* DO NOT REMOVE THIS LINE */", 29)) break;
  99.     }
  100.     ntrap = 10;
  101.     printf("\n");
  102. #ifdef NEWTRAPS
  103.     printf("#define\tMGTRP\t\t%d\n", ntrap++);
  104.     printf("#define\tSQBRD\t\t%d\n", ntrap++);
  105. #endif
  106. #ifdef SPIDERS
  107.     printf("#define\tWEB\t\t%d\n", ntrap++);
  108. #endif
  109. #ifdef NEWCLASS
  110.     printf("#define\tSPIKED_PIT\t%d\n", ntrap++);
  111.     printf("#define\tLEVEL_TELEP\t%d\n", ntrap++);
  112. #endif
  113. #ifdef SPELLS
  114.     printf("#define\tANTI_MAGIC\t%d\n", ntrap++);
  115. #endif
  116. #ifdef KAA
  117.     printf("#define\tRUST_TRAP\t%d\n", ntrap++);
  118. # ifdef RPH
  119.     printf("#define\tPOLY_TRAP\t%d\n", ntrap++);
  120. # endif
  121. #endif
  122. #ifdef SAC
  123.     printf("#define\tLANDMINE\t%d\n", ntrap++);
  124. #endif /* SAC */
  125.     printf("\n#define\tTRAPNUM\t%d\n", ntrap);
  126.     fclose(stdin);
  127.     fclose(stdout);
  128. #ifdef MSDOS
  129.     remove(TRAP_FILE);
  130. #endif
  131.     rename(tmpfile, TRAP_FILE);
  132. }
  133.  
  134.  
  135. struct    hline {
  136.     struct    hline    *next;
  137.     char    *line;
  138. }    *f_line;
  139.  
  140. do_rumors(){
  141. struct    hline    *c_line;
  142. char    infile[30];
  143. FILE    *freopen();
  144.  
  145.     if(freopen(RUMOR_FILE, WRMODE, stdout) == NULL) {
  146.  
  147.         perror(RUMOR_FILE);
  148.         exit(1);
  149.     }
  150. #ifdef AMIGA
  151.     sprintf(infile, "%s.base", RUMOR_FILE);
  152. #else
  153. # ifdef MSDOS
  154.     sprintf(infile, "%s.bas", RUMOR_FILE);
  155. # else
  156.     sprintf(infile, "%s.base", RUMOR_FILE);
  157. # endif
  158. #endif
  159.     if(freopen(infile, RDMODE, stdin) == NULL) {
  160.  
  161.         perror(infile);
  162.         exit(1);
  163.     }
  164.  
  165.     while(gets(inline) != NULL)     puts(inline);
  166.  
  167. #ifdef KAA
  168.     sprintf(infile, "%s.kaa", RUMOR_FILE);
  169.     if(freopen(infile, RDMODE, stdin) == NULL)      perror(infile);
  170.  
  171.     while(gets(inline) != NULL)     puts(inline);
  172. #endif
  173.  
  174. #ifdef NEWCLASS
  175.     sprintf(infile, "%s.mrx", RUMOR_FILE);
  176.     if(freopen(infile, RDMODE, stdin) == NULL)      perror(infile);
  177.  
  178.     while(gets(inline) != NULL)     puts(inline);
  179. #endif
  180.     fclose(stdin);
  181.     fclose(stdout);
  182. }
  183.  
  184. do_date(){
  185. int    getpid();
  186. long    clock, time();
  187. char    tmpfile[30], cbuf[30], *c, *ctime();
  188. FILE    *freopen();
  189.  
  190.     sprintf(tmpfile, "makedefs.%d", getpid());
  191.     if(freopen(tmpfile, WRMODE, stdout) == NULL) {
  192.  
  193.         perror(tmpfile);
  194.         exit(1);
  195.     }
  196.     if(freopen(DATE_FILE, RDMODE, stdin) == NULL) {
  197.  
  198.         perror(DATE_FILE);
  199.         exit(1);
  200.     }
  201.  
  202.     while(gets(inline) != NULL) {
  203.  
  204.         if(!strncmp(inline, "char datestring[] = ", 20)) break;
  205.         puts(inline);
  206.     }
  207.     time(&clock);
  208.     strcpy(cbuf, ctime(&clock));
  209.     for(c = cbuf; *c != '\n'; c++); *c = 0; /* strip off the '\n' */
  210.     printf("char datestring[] = %c%s%c;\n", '"', cbuf, '"');
  211.  
  212.     fclose(stdin);
  213.     fclose(stdout);
  214. #ifdef MSDOS
  215.     remove(DATE_FILE);
  216. #endif
  217.     rename(tmpfile, DATE_FILE);
  218. }
  219.  
  220. do_data(){
  221. int    getpid();
  222. char    tmpfile[30];
  223. FILE    *freopen();
  224.  
  225.     sprintf(tmpfile, "%s.base", DATA_FILE);
  226.     if(freopen(tmpfile, RDMODE, stdin) == NULL) {
  227.  
  228.         perror(tmpfile);
  229.         exit(1);
  230.     }
  231.     if(freopen(DATA_FILE, WRMODE, stdout) == NULL) {
  232.  
  233.         perror(DATA_FILE);
  234.         exit(1);
  235.     }
  236.  
  237.     while(gets(inline) != NULL) {
  238.         /* note missing space v */
  239.         if (! strcmp(inline, "\ta dark part of a room"))
  240.         printf(" \ta dark part of a room\n");
  241.         else
  242. #ifdef KOPS
  243.         if(!strcmp(inline, "K\ta kobold"))
  244.         printf("K\ta Keystone Kop\n");
  245.         else
  246. #endif
  247. #ifdef KAA
  248.         if(!strcmp(inline, "Q\ta quasit"))
  249.         printf("Q\ta quantum mechanic\n");
  250.         else
  251. #endif
  252. #ifdef ROCKMOLE
  253.         if(!strcmp(inline, "r\ta giant rat"))
  254.         printf("r\ta rockmole (or a giant rat)\n");
  255.         else
  256. #endif
  257. #ifdef SPIDERS
  258.         if(!strcmp(inline, "s\ta scorpion"))
  259.         printf("s\ta giant spider\n");
  260.         else if (!strcmp(inline, "\"\tan amulet"))
  261.         printf("\"\tan amulet (or a web)\n");
  262.         else
  263. #endif
  264. #ifdef    SINKS
  265.         if (!strcmp(inline, "#\ta corridor"))
  266.         printf("#\ta corridor (or a kitchen sink)\n");
  267.         else
  268. #endif
  269. #ifdef    SPELLS
  270.         if (!strcmp(inline, "+\ta door"))
  271.         printf("+\ta door (or a spell book)\n");
  272.         else
  273. #endif
  274. #ifdef    FOUNTAINS
  275.         if(!strcmp(inline, "}\twater filled area")) {
  276.         puts(inline);
  277.         printf("{\ta fountain\n");
  278.         } else
  279. #endif
  280. #ifdef NEWCLASS
  281.         if(!strcmp(inline, "^\ta trap")) {
  282.         puts(inline);
  283.         printf("\\\tan opulent throne.\n");
  284.         } else
  285. #endif
  286.         puts(inline);
  287.     }
  288. #ifdef SAC
  289.     printf("3\ta soldier;\n");
  290.     printf("\tThe soldiers  of Yendor are  well-trained in the art of war,\n");
  291.     printf("\tmany  trained by  the wizard himself.  Some say the soldiers\n");
  292.     printf("\tare explorers  who were  unfortunate enough  to be captured,\n");
  293.     printf("\tand  put under the wizard's spell.  Those who have  survived\n");
  294.     printf("\tencounters  with  soldiers   say  they  travel  together  in\n");
  295.     printf("\tplatoons,  and are fierce fighters.  Because of the  load of\n");
  296.     printf("\ttheir  combat gear,  however,  one can usually run away from\n");
  297.     printf("\tthem, and doing so is considered a wise thing.\n");
  298. #endif
  299. #ifdef RPH
  300.     printf("8\tthe medusa;\n");
  301.     printf("\tThis hideous  creature from  ancient Greek myth was the doom\n");
  302.     printf("\tof many a valiant adventurer.  It is said that one gaze from\n");
  303.     printf("\tits eyes  could turn a man to stone.  One bite from the nest\n");
  304.     printf("\tof  snakes which  crown its head could  cause instant death.\n");
  305.     printf("\tThe only  way to kill this  monstrosity is to turn its  gaze\n");
  306.     printf("\tback upon itself.\n");
  307. #endif
  308. #ifdef KAA
  309.     printf("9\ta giant;\n");
  310.     printf("\tGiants have always walked the earth, though they are rare in\n");
  311.     printf("\tthese times.  They range in size from  little over nine feet\n");
  312.     printf("\tto a towering twenty feet or more.  The larger ones use huge\n");
  313.     printf("\tboulders as weapons, hurling them over large distances.  All\n");
  314.     printf("\ttypes of giants share a love for men  -  roasted, boiled, or\n");
  315.     printf("\tfried.  Their table manners are legendary.\n");
  316. #endif
  317.     fclose(stdin);
  318.     fclose(stdout);
  319. }
  320.  
  321. #define LINSZ    1000
  322. #define STRSZ    40
  323.  
  324. int    fd;
  325. struct    objdef {
  326.  
  327.     struct    objdef    *next;
  328.     char    string[STRSZ];
  329. }    *more, *current;
  330.  
  331. do_objs(){
  332. register int index = 0;
  333. register int propct = 0;
  334. #ifdef SPELLS
  335. register int nspell = 0;
  336. #endif
  337. FILE    *freopen();
  338. register char *sp;
  339. char    *limit();
  340. int skip;
  341.  
  342.     fd = open(OBJ_FILE, 0);
  343.     if(fd < 0) {
  344.         perror(OBJ_FILE);
  345.         exit(1);
  346.     }
  347.  
  348.     if(freopen(ONAME_FILE, WRMODE, stdout) == NULL) {
  349.         perror(ONAME_FILE);
  350.         exit(1);
  351.     }
  352.  
  353.     current = 0; newobj();
  354.     skipuntil("objects[] = {");
  355.  
  356.     while(getentry(&skip)) {
  357.         if(!*(current->string)){
  358.             if (skip) index++;
  359.             continue;
  360.         }
  361.         for(sp = current->string; *sp; sp++)
  362.             if(*sp == ' ' || *sp == '\t' || *sp == '-')
  363.                 *sp = '_';
  364.  
  365.         /* Do not process duplicates caused by #ifdef/#else pairs. */
  366.         /* M. Stephenson                       */
  367.         if (! duplicate()) {
  368.  
  369.             if(!strncmp(current->string, "RIN_", 4))
  370.                 propct = specprop(current->string+4, propct);
  371.             for(sp = current->string; *sp; sp++) capitalize(sp);
  372.             /* avoid trouble with stupid C preprocessors */
  373.             if(!strncmp(current->string, "WORTHLESS_PIECE_OF_", 19))
  374.             printf("/* #define\t%s\t%d */\n", current->string, index++);
  375.             else  {
  376. #ifdef SPELLS
  377.             if(!strncmp(current->string, "SPE_", 4))  nspell++;
  378.             printf("#define\t%s\t%d\n", limit(current->string), index++);
  379. #else
  380.             if(strncmp(current->string, "SPE_", 4))
  381.                 printf("#define\t%s\t%d\n", limit(current->string), index++);
  382. #endif
  383.             }
  384.             newobj();
  385.         }
  386.     }
  387.     printf("\n#define CORPSE                  DEAD_HUMAN\n");
  388. #ifdef KOPS
  389.     printf("#define DEAD_KOP                DEAD_KOBOLD\n");
  390. #endif
  391. #ifdef SPIDERS
  392.     printf("#define DEAD_GIANT_SPIDER       DEAD_GIANT_SCORPION\n");
  393. #endif
  394. #ifdef ROCKMOLE
  395.     printf("#define DEAD_ROCKMOLE           DEAD_GIANT_RAT\n");
  396. #endif
  397. #ifndef KAA
  398.     printf("#define DEAD_QUASIT             DEAD_QUANTUM_MECHANIC\n");
  399.     printf("#define DEAD_VIOLET_FUNGI       DEAD_VIOLET_FUNGUS\n");
  400. #endif
  401.     printf("#define LAST_GEM        (JADE+1)\n");
  402.     printf("#define LAST_RING       %d\n", propct);
  403. #ifdef SPELLS
  404.     printf("#define MAXSPELL        %d\n", nspell+1);
  405. #endif
  406.     printf("#define NROFOBJECTS     %d\n", index-1);
  407.     exit(0);
  408. }
  409.  
  410. static    char    temp[32];
  411.  
  412. char *
  413. limit(name)     /* limit a name to 30 characters length */
  414.     char    *name;
  415. {
  416.     strncpy(temp, name, 30);
  417.     temp[30] = 0;
  418.     return(temp);
  419. }
  420.  
  421. newobj()
  422. {
  423.     extern    long    *alloc();
  424.  
  425.     more = current;
  426.     current = (struct objdef *)alloc(sizeof(struct objdef));
  427.     current->next = more;
  428. }
  429.  
  430. struct inherent {
  431.  
  432.     char    *attrib,
  433.         *monsters;
  434. }    abilities[] = { "Regeneration", "TVi",
  435.             "See_invisible", "I",
  436.             "Poison_resistance", "abcghikqsuvxyADFQSVWXZ&",
  437.             "Fire_resistance", "gD&",
  438.             "Cold_resistance", "gFY",
  439.             "Shock_resistance", "g;",
  440.             "Teleportation", "LNt",
  441.             "Teleport_control", "t",
  442.             "", "" };
  443.  
  444. specprop(name, count)
  445.  
  446.     char    *name;
  447.     int    count;
  448. {
  449.     int    i;
  450.     char    *tname, *limit();
  451.  
  452.     tname = limit(name);
  453.     capitalize(tname);
  454.     for(i = 0; strlen(abilities[i].attrib); i++)
  455.         if(!strcmp(abilities[i].attrib, tname)) {
  456.  
  457.         printf("#define\tH%s\tu.uprops[%d].p_flgs\n", tname, count);
  458.         printf("#define\t%s\t((H%s) || index(\"%s\", u.usym))\n",
  459.             tname, tname, abilities[i].monsters);
  460.         return(++count);
  461.         }
  462.  
  463.     printf("#define\t%s\tu.uprops[%d].p_flgs\n", tname, count);
  464.     return(++count);
  465. }
  466.  
  467. char line[LINSZ], *lp = line, *lp0 = line, *lpe = line;
  468. int xeof;
  469.  
  470. readline(){
  471. register int n = read(fd, lp0, (line+LINSZ)-lp0);
  472.     if(n < 0){
  473.         printf("Input error.\n");
  474.         exit(1);
  475.     }
  476.     if(n == 0) xeof++;
  477.     lpe = lp0+n;
  478. }
  479.  
  480. char
  481. nextchar(){
  482.     if(lp == lpe){
  483.         readline();
  484.         lp = lp0;
  485.     }
  486.     return((lp == lpe) ? 0 : *lp++);
  487. }
  488.  
  489. skipuntil(s) char *s; {
  490. register char *sp0, *sp1;
  491. loop:
  492.     while(*s != nextchar())
  493.         if(xeof) {
  494.             printf("Cannot skipuntil %s\n", s);
  495.             exit(1);
  496.         }
  497.     if(strlen(s) > lpe-lp+1){
  498.         register char *lp1, *lp2;
  499.         lp2 = lp;
  500.         lp1 = lp = lp0;
  501.         while(lp2 != lpe) *lp1++ = *lp2++;
  502.         lp2 = lp0;    /* save value */
  503.         lp0 = lp1;
  504.         readline();
  505.         lp0 = lp2;
  506.         if(strlen(s) > lpe-lp+1) {
  507.             printf("error in skipuntil");
  508.             exit(1);
  509.         }
  510.     }
  511.     sp0 = s+1;
  512.     sp1 = lp;
  513.     while(*sp0 && *sp0 == *sp1) sp0++, sp1++;
  514.     if(!*sp0){
  515.         lp = sp1;
  516.         return(1);
  517.     }
  518.     goto loop;
  519. }
  520.  
  521. getentry(skip) int *skip; {
  522. int inbraces = 0, inparens = 0, stringseen = 0, commaseen = 0;
  523. int prefix = 0;
  524. char ch;
  525. #define NSZ    10
  526. char identif[NSZ], *ip;
  527.     current->string[0] = current->string[4] = 0;
  528.     /* read until {...} or XXX(...) followed by ,
  529.        skip comment and #define lines
  530.        deliver 0 on failure
  531.      */
  532.     while(1) {
  533.         ch = nextchar();
  534.     swi:
  535.         if(letter(ch)){
  536.             ip = identif;
  537.             do {
  538.                 if(ip < identif+NSZ-1) *ip++ = ch;
  539.                 ch = nextchar();
  540.             } while(letter(ch) || digit(ch));
  541.             *ip = 0;
  542.             while(ch == ' ' || ch == '\t') ch = nextchar();
  543.             if(ch == '(' && !inparens && !stringseen)
  544.                 if(!strcmp(identif, "WAND") ||
  545.                    !strcmp(identif, "RING") ||
  546.                    !strcmp(identif, "POTION") ||
  547.                    !strcmp(identif, "SPELL") ||
  548.                    !strcmp(identif, "SCROLL"))
  549.                 (void) strncpy(current->string, identif, 3),
  550.                 current->string[3] = '_',
  551.                 prefix = 4;
  552.         }
  553.         switch(ch) {
  554.         case '/':
  555.             /* watch for comment */
  556.             if((ch = nextchar()) == '*')
  557.                 skipuntil("*/");
  558.             goto swi;
  559.         case '{':
  560.             inbraces++;
  561.             continue;
  562.         case '(':
  563.             inparens++;
  564.             continue;
  565.         case '}':
  566.             inbraces--;
  567.             if(inbraces < 0) return(0);
  568.             continue;
  569.         case ')':
  570.             inparens--;
  571.             if(inparens < 0) {
  572.                 printf("too many ) ?");
  573.                 exit(1);
  574.             }
  575.             continue;
  576.         case '\n':
  577.             /* watch for #define at begin of line */
  578.             if((ch = nextchar()) == '#'){
  579.                 register char pch;
  580.                 /* skip until '\n' not preceded by '\\' */
  581.                 do {
  582.                     pch = ch;
  583.                     ch = nextchar();
  584.                 } while(ch != '\n' || pch == '\\');
  585.                 continue;
  586.             }
  587.             goto swi;
  588.         case ',':
  589.             if(!inparens && !inbraces){
  590.                 if(prefix && !current->string[prefix]) {
  591. #ifndef SPELLS
  592.                 *skip = strncmp(current->string, "SPE_", 4);
  593. #else
  594.                 *skip = 1;
  595. #endif
  596.                 current->string[0] = 0;
  597.                 }
  598.                 if(stringseen) return(1);
  599.                 printf("unexpected ,\n");
  600.                 exit(1);
  601.             }
  602.             commaseen++;
  603.             continue;
  604.         case '\'':
  605.             if((ch = nextchar()) == '\\') ch = nextchar();
  606.             if(nextchar() != '\''){
  607.                 printf("strange character denotation?\n");
  608.                 exit(1);
  609.             }
  610.             continue;
  611.         case '"':
  612.             {
  613.                 register char *sp = current->string + prefix;
  614.                 register char pch;
  615.                 register int store = (inbraces || inparens)
  616.                     && !stringseen++ && !commaseen;
  617.                 do {
  618.                     pch = ch;
  619.                     ch = nextchar();
  620.                     if(store && sp < current->string+STRSZ)
  621.                         *sp++ = ch;
  622.                 } while(ch != '"' || pch == '\\');
  623.                 if(store) *--sp = 0;
  624.                 continue;
  625.             }
  626.         }
  627.     }
  628. }
  629.  
  630. duplicate() {
  631.  
  632.     char    s[STRSZ];
  633.     register char    *c;
  634.     register struct objdef    *testobj;
  635.  
  636.     strcpy (s, current->string);
  637.     for(c = s; *c != 0; c++) capitalize(c);
  638.  
  639.     for(testobj = more; testobj != 0; testobj = testobj->next)
  640.         if(! strcmp(s, testobj->string)) return(1);
  641.  
  642.     return(0);
  643. }
  644.  
  645. capitalize(sp) register char *sp; {
  646.     if('a' <= *sp && *sp <= 'z') *sp += 'A'-'a';
  647. }
  648.  
  649. letter(ch) register char ch; {
  650.     return( ('a' <= ch && ch <= 'z') ||
  651.         ('A' <= ch && ch <= 'Z') );
  652. }
  653.  
  654. digit(ch) register char ch; {
  655.     return( '0' <= ch && ch <= '9' );
  656. }
  657.  
  658. /* a copy of the panic code from hack.pri.c, edited for standalone use */
  659.  
  660. boolean panicking = 0;
  661.  
  662. panic(str,a1,a2,a3,a4,a5,a6)
  663. char *str;
  664. {
  665.     if(panicking++) exit(1);    /* avoid loops - this should never happen*/
  666.     fputs(" ERROR:  ", stdout);
  667.     printf(str,a1,a2,a3,a4,a5,a6);
  668. #ifdef DEBUG
  669. # ifdef UNIX
  670.     if(!fork())
  671.         abort();        /* generate core dump */
  672. # endif
  673. #endif
  674.     exit(1);
  675. }
  676.  
  677. /* #if defined(SYSV) || defined(GENIX) */
  678. #ifdef SYSV
  679. # define XXX
  680. #endif
  681. #ifdef GENIX
  682. # define XXX
  683. #endif
  684.  
  685. #ifdef XXX
  686. rename(oldname, newname)
  687.     char    *oldname, *newname;
  688. {
  689.     if (strcmp(oldname, newname)) {
  690.  
  691.         unlink(newname);
  692.         link(oldname, newname);
  693.         unlink(oldname);
  694.     }
  695. }
  696. #endif
  697. #undef XXX
  698.  
  699. #ifdef AMIGA
  700. #   undef MSDOS /* Watch out! */
  701. #endif
  702.  
  703. #ifdef MSDOS
  704. /* Get around bug in freopen when opening for writing    */
  705. /* Supplied by Nathan Glasser (nathan@mit-eddie)        */
  706. #undef freopen
  707. FILE *_freopen(fname, fmode, fp)
  708. char *fname, *fmode;
  709. FILE *fp;
  710. {
  711.     if (!strncmp(fmode,"w",1))
  712.     {
  713.     FILE *tmpfp;
  714.  
  715.     if ((tmpfp = fopen(fname,fmode)) == NULL)
  716.         return(NULL);
  717.     if (dup2(fileno(tmpfp),fileno(fp)) < 0)
  718.         return(NULL);
  719.     fclose(tmpfp);
  720.     return(fp);
  721.     }
  722.     else
  723.     return(freopen(fname,fmode,fp));
  724. }
  725.  
  726. # ifdef __TURBOC__
  727. int getpid() {
  728.     return(1);
  729. }
  730. # endif
  731. #endif
  732.  
  733. #ifdef AMIGA
  734. int getpid() {
  735.     return(1);
  736. }
  737. # endif
  738.  
  739.  
  740.