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