Annotation of 43BSDTahoe/new/mkmf/src/dlist.c, revision 1.1.1.1

1.1       root        1: /* $Header: dlist.c,v 1.1 85/04/23 13:56:29 nicklin Exp $ */
                      2: 
                      3: /*
                      4:  * Author: Peter J. Nicklin
                      5:  */
                      6: #include <stdio.h>
                      7: #include "Mkmf.h"
                      8: #include "dlist.h"
                      9: #include "hash.h"
                     10: #include "null.h"
                     11: #include "slist.h"
                     12: #include "yesno.h"
                     13: 
                     14: static HASHBLK *printtag = NULL;       /* include files already printed */
                     15: static int COLUMN;                     /* last column printed */
                     16: 
                     17: /*
                     18:  * dlappend() adds a dependency chain block to the end of a list of
                     19:  * dependency chain blocks. Each dependency chain block consists of a pointer
                     20:  * to a source file name block contained in a singly-linked list, and a pointer
                     21:  * to the head of the dependent list of included files. Returns a pointer to
                     22:  * the dependency chain block, or a null pointer if out of memory.
                     23:  */
                     24: DLBLK *
                     25: dlappend(srctyp, srcblk, incblk, dlist)
                     26:        int srctyp;                     /* source file type */
                     27:        SLBLK *srcblk;                  /* pointer to the source file block */
                     28:        INCBLK *incblk;                 /* included file dependency chain */
                     29:        DLIST *dlist;                   /* pointer to list head block */
                     30: {
                     31:        char *malloc();                 /* memory allocator */
                     32:        DLBLK *dblk;                    /* pointer to dependency list block */
                     33: 
                     34:        if (dlist == NULL)
                     35:                return(NULL);
                     36:        if ((dblk = (DLBLK *) malloc(sizeof(DLBLK))) == NULL)
                     37:                {
                     38:                warn("out of memory");
                     39:                return(NULL);
                     40:                }
                     41:        dblk->d_src = srcblk;
                     42:        dblk->d_type = srctyp;
                     43:        dblk->d_incl = incblk;
                     44:        dblk->d_next = NULL;
                     45:        if (dlist->d_tail == NULL)
                     46:                {
                     47:                dlist->d_head = dlist->d_tail = dblk;
                     48:                }
                     49:        else    {
                     50:                dlist->d_tail = dlist->d_tail->d_next = dblk;
                     51:                }
                     52:        return(dblk);
                     53: }
                     54: 
                     55: 
                     56: 
                     57: /*
                     58:  * dlinit() returns a pointer to the head block of a dependency list, or
                     59:  * null pointer if out of memory.
                     60:  */
                     61: DLIST *
                     62: dlinit()
                     63: {
                     64:        char *malloc();                 /* memory allocator */
                     65:        DLIST *dlist;                   /* pointer to list head block */
                     66: 
                     67:        if ((dlist = (DLIST *) malloc(sizeof(DLIST))) == NULL)
                     68:                {
                     69:                warn("out of memory");
                     70:                return(NULL);
                     71:                }
                     72:        dlist->d_head = dlist->d_tail = NULL;
                     73:        return(dlist);
                     74: }
                     75: 
                     76: 
                     77: 
                     78: /*
                     79:  * dlprint() appends the object-include file dependencies to the end of
                     80:  * a makefile. Transitive closure is checked by making suring that an
                     81:  * object-include file dependency is not generated if the source file is
                     82:  * included in another file.
                     83:  */
                     84: void
                     85: dlprint(dlist, ofp)
                     86:        DLIST *dlist;                   /* dependency list */
                     87:        FILE *ofp;                      /* output stream */
                     88: {
                     89:        DLBLK *dblk;                    /* pointer to dependency list block */
                     90:        HASHBLK *lookupinclude();       /* look up include name in hash table */
                     91:        INCBLK *iblk;                   /* cur. include file hash table blk */
                     92:        void putinchain();              /* output nested subinclude filenames */
                     93:        void putobjd();                 /* output object file name */
                     94:        void rmprinttag();              /* remove "already printed" tags */
                     95: 
                     96:        fprintf(ofp, "%s\n", DEPENDMARK);
                     97:        for (dblk=dlist->d_head; dblk != NULL; dblk=dblk->d_next)
                     98:                {
                     99:                if (lookupinclude(dblk->d_src->key, dblk->d_type) == NULL)
                    100:                        {
                    101:                        putobjd(dblk->d_src, ofp);
                    102:                        for (iblk=dblk->d_incl; iblk != NULL; iblk=iblk->i_next)
                    103:                                {
                    104:                                putinchain(iblk->i_hblk, ofp);
                    105:                                }
                    106:                        fprintf(ofp, "\n");
                    107:                        rmprinttag();
                    108:                        }
                    109:                }
                    110: }
                    111: 
                    112: 
                    113: 
                    114: /*
                    115:  * putinchain() outputs a chain of nested include file names. It changes
                    116:  * the sign of each chain block h_val field as it traverses the chain to
                    117:  * detect looping.
                    118:  */
                    119: static void
                    120: putinchain(htb, ofp)
                    121:        HASHBLK *htb;                   /* hash table blk including chain */
                    122:        FILE *ofp;                      /* output stream */
                    123: {
                    124:        INCBLK *iblk;                   /* cur. include file hash table blk */
                    125:        void putinclude();              /* output include file pathname */
                    126:        void putinchain();              /* output nested subinclude file names*/
                    127: 
                    128:        putinclude(htb, ofp);
                    129:        htb->h_val = -htb->h_val;
                    130:        for (iblk=htb->h_sub; iblk != NULL; iblk=iblk->i_next)
                    131:                {
                    132:                if (iblk->i_hblk->h_val < 0)
                    133:                        {
                    134:                        if (iblk->i_loop == NO)
                    135:                                {
                    136:                                warn2("recursive include nesting of \"%s\" in \"%s\"",
                    137:                                      iblk->i_hblk->h_def, htb->h_def);
                    138:                                iblk->i_loop = YES;
                    139:                                }
                    140:                        continue;
                    141:                        }
                    142:                putinchain(iblk->i_hblk, ofp);
                    143:                }
                    144:        htb->h_val = -htb->h_val;
                    145: }
                    146: 
                    147: 
                    148: 
                    149: #define MAXLINE                80
                    150: #define        TABSIZE         8
                    151: 
                    152: /*
                    153:  * putinclude() writes an include file pathname to stream ofp if
                    154:  * if it has not already been written on the current dependency line.
                    155:  * and adds the hash block containing the file pathname to the
                    156:  * "already printed" printtag list. The last block on the list
                    157:  * points back onto itself rather than at NULL so that the non-NULL
                    158:  * tag will indicate that the filename has already been seen.
                    159:  */
                    160: static void
                    161: putinclude(htb, ofp)
                    162:        HASHBLK *htb;                   /* include file hash block */
                    163:        FILE *ofp;                      /* output stream */
                    164: {
                    165:        if (htb->h_tag == NULL)
                    166:                {
                    167:                COLUMN += htb->h_val + 1;
                    168:                if (COLUMN >= (MAXLINE - 2))
                    169:                        {
                    170:                        fprintf(ofp, " \\\n\t%s", htb->h_def);
                    171:                        COLUMN = htb->h_val + TABSIZE;
                    172:                        }
                    173:                else    {
                    174:                        fprintf(ofp, " %s", htb->h_def);
                    175:                        }
                    176:                /* add to "already printed" filenames */
                    177:                htb->h_tag = (printtag == NULL) ? htb :printtag;
                    178:                printtag = htb;
                    179:                }
                    180: }
                    181: 
                    182: 
                    183: 
                    184: /*
                    185:  * putobjd() writes an object file dependency name.
                    186:  */
                    187: static void
                    188: putobjd(srcblk, ofp)
                    189:        SLBLK *srcblk;                  /* source file name list block */
                    190:        FILE *ofp;                      /* output stream */
                    191: {
                    192:        extern char OBJSFX[];           /* object file name suffix */
                    193:        int strlen();                   /* string length */
                    194:        void putobj();                  /* output object file name */
                    195: 
                    196:        COLUMN = strlen(srcblk->key) + strlen(OBJSFX) + 1;
                    197:        putobj(srcblk->key, ofp);
                    198:        fprintf(ofp, ":");
                    199: }
                    200: 
                    201: 
                    202: 
                    203: /*
                    204:  * rmprinttag() removes the chain of tags indicating that an include
                    205:  * file dependency has already been printed for the current source file.
                    206:  */
                    207: static void
                    208: rmprinttag()
                    209: {
                    210:        register HASHBLK *curhtb;       /* current hash table block */
                    211:        register HASHBLK *nxthtb;       /* next hash table block */
                    212: 
                    213:        for (curhtb = printtag; curhtb != NULL; curhtb = nxthtb)
                    214:                {
                    215:                nxthtb = curhtb->h_tag;
                    216:                curhtb->h_tag = NULL;
                    217:                }
                    218:        printtag = NULL;
                    219: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.