Annotation of researchv9/X11/src/X.V11R1/util/makedepend/include.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * $Header: include.c,v 1.3 87/08/14 18:14:41 toddb Exp $
                      3:  *
                      4:  * $Log:       include.c,v $
                      5:  * Revision 1.3  87/08/14  18:14:41  toddb
                      6:  * Add the routine inc_clean().  This will "un-mark" all nodes after traversal,
                      7:  * so that during traversal, no node is printed more than once.
                      8:  * 
                      9:  * Revision 1.2  87/08/06  17:40:34  toddb
                     10:  * Bug in removing .. (removedotdot).
                     11:  * 
                     12:  * Revision 1.1  87/08/06  17:34:55  toddb
                     13:  * Initial revision
                     14:  * 
                     15:  * Revision 1.1  87/04/08  16:40:43  rich
                     16:  * Initial revision
                     17:  * 
                     18:  * Revision 1.1  86/04/15  08:34:26  toddb
                     19:  * Initial revision
                     20:  * 
                     21:  */
                     22: #include "def.h"
                     23: 
                     24: extern struct  inclist inclist[ MAXFILES ],
                     25:                        *inclistp;
                     26: extern char    *includedirs[ ];
                     27: extern char    *notdotdot[ ];
                     28: extern boolean show_where_not;
                     29: 
                     30: struct inclist *inc_path(file, include, dot)
                     31:        register char   *file,
                     32:                        *include;
                     33:        boolean dot;
                     34: {
                     35:        static char     path[ BUFSIZ ];
                     36:        register char           **pp, *p;
                     37:        register struct inclist *ip;
                     38:        struct stat     st;
                     39:        boolean found = FALSE;
                     40: 
                     41:        /*
                     42:         * Check all previously found include files for a path that
                     43:         * has already been expanded.
                     44:         */
                     45:        for (ip = inclist; ip->i_file; ip++)
                     46:                if (strcmp(ip->i_incstring, include) == 0) {
                     47:                        found = TRUE;
                     48:                        break;
                     49:                }
                     50: 
                     51:        /*
                     52:         * If the path was surrounded by "", then check the absolute
                     53:         * path provided.
                     54:         */
                     55:        if (!found && dot) {
                     56:                if (stat(include, &st) == 0) {
                     57:                        ip = newinclude(include, include);
                     58:                        found = TRUE;
                     59:                }
                     60:                else if (show_where_not)
                     61:                        log("\tnot in %s\n", include);
                     62:        }
                     63: 
                     64:        /*
                     65:         * See if this include file is in the directory of the
                     66:         * file being compiled.
                     67:         */
                     68:        if (!found) {
                     69:                for (p=file+strlen(file); p>file; p--)
                     70:                        if (*p == '/')
                     71:                                break;
                     72:                if (p == file)
                     73:                        strcpy(path, include);
                     74:                else {
                     75:                        strncpy(path, file, (p-file) + 1);
                     76:                        path[ (p-file) + 1 ] = '\0';
                     77:                        strcpy(path + (p-file) + 1, include);
                     78:                }
                     79:                remove_dotdot(path);
                     80:                if (stat(path, &st) == 0) {
                     81:                        ip = newinclude(path, include);
                     82:                        found = TRUE;
                     83:                }
                     84:                else if (show_where_not)
                     85:                        log("\tnot in %s\n", path);
                     86:        }
                     87: 
                     88:        /*
                     89:         * Check the include directories specified. (standard include dir
                     90:         * should be at the end.)
                     91:         */
                     92:        if (!found)
                     93:                for (pp = includedirs; *pp; pp++) {
                     94:                        sprintf(path, "%s/%s", *pp, include);
                     95:                        remove_dotdot(path);
                     96:                        if (stat(path, &st) == 0) {
                     97:                                ip = newinclude(path, include);
                     98:                                found = TRUE;
                     99:                                break;
                    100:                        }
                    101:                        else if (show_where_not)
                    102:                                log("\tnot in %s\n", path);
                    103:                }
                    104: 
                    105:        if (!found) {
                    106:                /*
                    107:                 * If we've announced where it's not include it anyway so
                    108:                 * it gets on the dependency list.
                    109:                 */
                    110:                if (show_where_not)
                    111:                        ip = newinclude(include, include);
                    112:                else
                    113:                        ip = NULL;
                    114:        }
                    115:        return(ip);
                    116: }
                    117: 
                    118: /*
                    119:  * Ocaisionally, pathnames are created that look like ../x/../y
                    120:  * Any of the 'x/..' sequences within the name can be eliminated.
                    121:  * (but only if 'x' is not a symbolic link!!)
                    122:  */
                    123: remove_dotdot(path)
                    124:        char    *path;
                    125: {
                    126:        register char   *end, *from, *to, **cp;
                    127:        char            *components[ MAXFILES ],
                    128:                        newpath[ BUFSIZ ];
                    129:        boolean         component_copied;
                    130: 
                    131:        /*
                    132:         * slice path up into components.
                    133:         */
                    134:        to = newpath;
                    135:        if (*path == '/')
                    136:                *to++ = '/';
                    137:        *to = '\0';
                    138:        cp = components;
                    139:        for (from=end=path; *end; end++)
                    140:                if (*end == '/') {
                    141:                        while (*end == '/')
                    142:                                *end++ = '\0';
                    143:                        if (*from)
                    144:                                *cp++ = from;
                    145:                        from = end;
                    146:                }
                    147:        *cp++ = from;
                    148:        *cp = NULL;
                    149: 
                    150:        /*
                    151:         * Now copy the path, removing all 'x/..' components.
                    152:         */
                    153:        cp = components;
                    154:        component_copied = FALSE;
                    155:        while(*cp) {
                    156:                if (!isdot(*cp) && !isdotdot(*cp) && isdotdot(*(cp+1))) {
                    157:                        if (issymbolic(newpath, *cp))
                    158:                                goto dont_remove;
                    159:                        cp++;
                    160:                } else {
                    161:                dont_remove:
                    162:                        if (component_copied)
                    163:                                *to++ = '/';
                    164:                        component_copied = TRUE;
                    165:                        for (from = *cp; *from; )
                    166:                                *to++ = *from++;
                    167:                        *to = '\0';
                    168:                }
                    169:                cp++;
                    170:        }
                    171:        *to++ = '\0';
                    172: 
                    173:        /*
                    174:         * copy the reconstituted path back to our pointer.
                    175:         */
                    176:        strcpy(path, newpath);
                    177: }
                    178: 
                    179: isdot(p)
                    180:        register char   *p;
                    181: {
                    182:        if(p && *p++ == '.' && *p++ == '\0')
                    183:                return(TRUE);
                    184:        return(FALSE);
                    185: }
                    186: 
                    187: isdotdot(p)
                    188:        register char   *p;
                    189: {
                    190:        if(p && *p++ == '.' && *p++ == '.' && *p++ == '\0')
                    191:                return(TRUE);
                    192:        return(FALSE);
                    193: }
                    194: 
                    195: issymbolic(dir, component)
                    196:        register char   *dir, *component;
                    197: {
                    198:        struct stat     st;
                    199:        char    buf[ BUFSIZ ], **pp;
                    200: 
                    201:        sprintf(buf, "%s%s%s", dir, *dir ? "/" : "", component);
                    202:        for (pp=notdotdot; *pp; pp++)
                    203:                if (strcmp(*pp, buf) == 0)
                    204:                        return (TRUE);
                    205:        if (lstat(buf, &st) == 0
                    206:        && (st.st_mode & S_IFMT) == S_IFLNK) {
                    207:                *pp++ = copy(buf);
                    208:                if (pp >= &notdotdot[ MAXDIRS ])
                    209:                        log_fatal("out of .. dirs, increase MAXDIRS\n");
                    210:                return(TRUE);
                    211:        }
                    212:        return(FALSE);
                    213: }
                    214: 
                    215: /*
                    216:  * Add an include file to the list of those included by 'file'.
                    217:  */
                    218: struct inclist *newinclude(newfile, incstring)
                    219:        register char   *newfile, *incstring;
                    220: {
                    221:        register struct inclist *ip;
                    222: 
                    223:        /*
                    224:         * First, put this file on the global list of include files.
                    225:         */
                    226:        ip = inclistp++;
                    227:        if (inclistp == inclist + MAXFILES - 1)
                    228:                log_fatal("out of space: increase MAXFILES\n");
                    229:        ip->i_file = copy(newfile);
                    230:        if (incstring == NULL)
                    231:                ip->i_incstring = ip->i_file;
                    232:        else
                    233:                ip->i_incstring = copy(incstring);
                    234: 
                    235:        return(ip);
                    236: }
                    237: 
                    238: included_by(ip, newfile)
                    239:        register struct inclist *ip, *newfile;
                    240: {
                    241:        register i;
                    242: 
                    243:        if (ip == NULL)
                    244:                return;
                    245:        /*
                    246:         * Put this include file (newfile) on the list of files included
                    247:         * by 'file'.  If 'file' is NULL, then it is not an include
                    248:         * file itself (i.e. was probably mentioned on the command line).
                    249:         * If it is already on the list, don't stick it on again.
                    250:         */
                    251:        if (ip->i_list == NULL)
                    252:                ip->i_list = (struct inclist **)
                    253:                        malloc(sizeof(struct inclist *) * ++ip->i_listlen);
                    254:        else {
                    255:                for (i=0; i<ip->i_listlen; i++)
                    256:                        if (ip->i_list[ i ] == newfile) {
                    257:                                log("%s includes %s more than once!\n",
                    258:                                        ip->i_file, newfile->i_file);
                    259:                                log("Already have\n");
                    260:                                for (i=0; i<ip->i_listlen; i++)
                    261:                                        log("\t%s\n", ip->i_list[i]->i_file);
                    262:                                return;
                    263:                        }
                    264:                ip->i_list = (struct inclist **) realloc(ip->i_list,
                    265:                        sizeof(struct inclist *) * ++ip->i_listlen);
                    266:        }
                    267:        ip->i_list[ ip->i_listlen-1 ] = newfile;
                    268: }
                    269: 
                    270: inc_clean ()
                    271: {
                    272:        register struct inclist *ip;
                    273: 
                    274:        for (ip = inclist; ip < inclistp; ip++) {
                    275:                ip->i_marked = FALSE;
                    276:        }
                    277: }

unix.superglobalmegacorp.com

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