home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume1 / 8712 / mkmf / 2 / src / editmf.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-07-13  |  3.4 KB  |  155 lines

  1. /* $Header: editmf.c,v 1.4 85/05/02 07:51:40 nicklin Exp $ */
  2.  
  3. /*
  4.  * Author: Peter J. Nicklin
  5.  */
  6. #include <ctype.h>
  7. #include <signal.h>
  8. #include <stdio.h>
  9. #include "Mkmf.h"
  10. #include "dlist.h"
  11. #include "hash.h"
  12. #include "macro.h"
  13. #include "null.h"
  14. #include "slist.h"
  15. #include "system.h"
  16. #include "yesno.h"
  17.  
  18. static char *Mftemp;            /* temporary makefile */
  19.  
  20. /*
  21.  * editmf() replaces macro definitions within a makefile.
  22.  */
  23. void
  24. editmf(mfname, mfpath)
  25.     char *mfname;            /* makefile name */
  26.     char *mfpath;            /* makefile template pathname */
  27. {
  28.     register char *bp;        /* buffer pointer */
  29.     extern char IOBUF[];        /* I/O buffer line */
  30.     extern int DEPEND;        /* dependency analysis? */
  31.     extern SLIST *EXTLIST;        /* external header file name list */
  32.     extern SLIST *HEADLIST;        /* header file name list */
  33.     extern SLIST *LIBLIST;        /* library pathname list */
  34.     extern SLIST *SRCLIST;        /* source file name list */
  35.     extern HASH *MDEFTABLE;        /* macro definition table */
  36.     char *findmacro();        /* is the line a macro definition? */
  37.     char *getlin();            /* get a line from input stream */
  38.     char *mktemp();            /* make file name */
  39.     char mnam[MACRONAMSIZE];    /* macro name buffer */
  40.     DLIST *dlp;            /* dependency list */
  41.     DLIST *mkdepend();        /* generate object-include file deps */
  42.     FILE *ifp;            /* input stream */
  43.     FILE *mustfopen();        /* must open file or die */
  44.     FILE *ofp;            /* output stream */
  45.     HASHBLK *htb;            /* hash table block */
  46.     HASHBLK *htlookup();        /* find hash table entry */
  47.     int cleanup();            /* remove temporary makefile and exit */
  48.     void dlprint();            /* print dependency list */
  49.     void purgcontinue();        /* get rid of continuation lines */
  50.     void putmacro();        /* put macro defs from table */
  51.     void putlin();            /* put a makefile line */
  52.     void putobjmacro();        /* put object file name macro def */
  53.     void putslmacro();        /* put macro defs from linked list */
  54.  
  55.     ifp = mustfopen(mfpath, "r");
  56.     Mftemp = mktemp("mkmfXXXXXX");
  57.  
  58.     signal(SIGHUP, cleanup);
  59.     signal(SIGINT, cleanup);
  60.     signal(SIGQUIT, cleanup);
  61.  
  62.     ofp = mustfopen(Mftemp, "w");
  63.     if (DEPEND)
  64.         {
  65.         dlp = mkdepend();
  66.         }
  67.  
  68.     while (getlin(ifp) != NULL)
  69.         {
  70.         if (DEPEND && EQUAL(IOBUF, DEPENDMARK))
  71.             break;
  72.         for (bp = IOBUF; *bp == ' '; bp++)
  73.             continue;
  74.         if (isalnum(*bp) && findmacro(mnam, bp) != NULL)
  75.             {
  76.             if ((htb = htlookup(mnam, MDEFTABLE)) != NULL)
  77.                 {
  78.                 if (htb->h_val == VREADWRITE)
  79.                     {
  80.                     putmacro(htb->h_def, ofp);
  81.                     purgcontinue(ifp);
  82.                     }
  83.                 else    {
  84.                     putlin(ofp);
  85.                     }
  86.                 }
  87.             else if (EQUAL(mnam, MHEADERS))
  88.                 {
  89.                 putslmacro(HEADLIST, ofp);
  90.                 purgcontinue(ifp);
  91.                 }
  92.             else if (EQUAL(mnam, MOBJECTS))
  93.                 {
  94.                 putobjmacro(ofp);
  95.                 purgcontinue(ifp);
  96.                 }
  97.             else if (EQUAL(mnam, MSOURCE))
  98.                 {
  99.                 putslmacro(SRCLIST, ofp);
  100.                 purgcontinue(ifp);
  101.                 }
  102.             else if (EQUAL(mnam, MEXTERNALS))
  103.                 {
  104.                 if (DEPEND)
  105.                     {
  106.                     putslmacro(EXTLIST, ofp);
  107.                     purgcontinue(ifp);
  108.                     }
  109.                 else    {
  110.                     putlin(ofp);
  111.                     }
  112.                 }
  113.             else if (EQUAL(mnam, MLIBLIST) && LIBLIST != NULL)
  114.                 {
  115.                 putslmacro(LIBLIST, ofp);
  116.                 purgcontinue(ifp);
  117.                 }
  118.             else    {
  119.                 putlin(ofp);
  120.                 }
  121.             }
  122.         else    {
  123.             putlin(ofp);
  124.             }
  125.         }
  126.     fclose(ifp);
  127.     if (DEPEND)
  128.         {
  129.         dlprint(dlp, ofp);
  130.         }
  131.     fclose(ofp);
  132.  
  133.     signal(SIGHUP, SIG_IGN);
  134.     signal(SIGINT, SIG_IGN);
  135.     signal(SIGQUIT, SIG_IGN);
  136.  
  137.     RENAME(Mftemp, mfname);
  138. }
  139.  
  140.  
  141.  
  142. /*
  143.  * cleanup() removes the temporary makefile and dependency file, and
  144.  * calls exit(1).
  145.  */
  146. cleanup()
  147. {
  148.     signal(SIGHUP, cleanup);
  149.     signal(SIGINT, cleanup);
  150.     signal(SIGQUIT, cleanup);
  151.  
  152.     unlink(Mftemp);
  153.     exit(1);
  154. }
  155.