void makefilelist(void) { static BOOL firstbuild = YES; /* first time through */ FILE *names; /* name file pointer */ char dir[PATHLEN + 1]; char path[PATHLEN + 1]; struct stat statstruct; char *file; char *s; int i, j; /* if there are source file arguments */ if (fileargc > 0) { /* put them in a list that can be expanded */ for (i = 0; i < fileargc; ++i) { file = fileargv[i]; if (infilelist(file) == NO) { if (vpaccess(file, READ) == 0) { addsrcfile(file); } else { (void) fprintf(stderr, "cscope: cannot find file %s\n", file); errorsfound = YES; } } } return; } /* see if a file name file exists */ if (namefile == NULL && vpaccess(NAMEFILE, READ) == 0) { namefile = NAMEFILE; } /* if there is a file of source file names */ if (namefile != NULL) { if ((names = vpfopen(namefile, "r")) == NULL) { cannotopen(namefile); myexit(1); } /* get the names in the file */ while (fscanf(names, "%s", path) == 1) { if (*path == '-') { /* if an option */ i = path[1]; switch (i) { case 'q': /* quick search */ invertedindex = YES; break; case 'T': /* truncate symbols to 8 characters */ truncatesyms = YES; break; case 'I': /* #include file directory */ case 'p': /* file path components to */ /* display */ s = path + 2; /* for "-Ipath" */ if (*s == '\0') { /* if "-I path" */ (void) fscanf(names, "%s", path); s = path; } switch (i) { case 'I': /* #include file directory */ if (firstbuild == YES) { /* expand $ and ~ */ shellpath(dir, sizeof (dir), s); includedir(dir); } break; case 'p': /* file path components */ /* to display */ if (*s < '0' || *s > '9') { (void) fprintf(stderr, "cscope: -p option " "in file %s: " "missing or " "invalid numeric " "value\n", namefile); } dispcomponents = atoi(s); break; } break; default: (void) fprintf(stderr, "cscope: only -I, -p, and -T " "options can be in file %s\n", namefile); } } else if (vpaccess(path, READ) == 0) { addsrcfile(path); } else { (void) fprintf(stderr, "cscope: cannot find file %s\n", path); errorsfound = YES; } } (void) fclose(names); firstbuild = NO; return; } /* make a list of all the source files in the directories */ for (i = 0; i < nsrcdirs; ++i) { s = srcdirs[i]; getsrcfiles(s, s); if (*s != '/') { /* if it isn't a full path name */ /* compute its path from any higher view path nodes */ for (j = 1; j < vpndirs; ++j) { (void) sprintf(dir, "%s/%s", vpdirs[j], s); /* make sure it is a directory */ if (stat(compath(dir), &statstruct) == 0 && S_ISDIR(statstruct.st_mode)) { getsrcfiles(dir, s); } } } } }
/* main(). */ int main(int argc, char *argv[]) { textline *lines = NULL; char **arg; int ret = 0; int count, i; readoptions(argc, argv); if (optind == argc) { err("nothing to do."); exit(EXIT_FAILURE); } for (arg = argv + optind ; (thefilename = *arg) != NULL ; ++arg) { if (!(thefile = fopen(thefilename, "rb"))) { perror(thefilename); ++ret; continue; } if (!readelfhdr() || !readproghdrs() || !readsecthdrs()) { fclose(thefile); ++ret; continue; } describeehdr(stdout); if (ldepls && proghdrs) { if ((count = getlibraries(&lines))) { outputlist(stdout, lines, count, "Dependencies: "); free(lines); } } if (srcfls && secthdrs) { if ((count = getsrcfiles(&lines))) { qsort(lines, count, sizeof *lines, linesorter); outputlist(stdout, lines, count, "Source files: "); free(lines); } } makenumberfmts(); if (phdrls && proghdrs) { printf("Program header table entries: %d", elffhdr.e_phnum); if (dooffs) printf(" (%lX - %lX)", (unsigned long)elffhdr.e_phoff, (unsigned long)elffhdr.e_phoff + elffhdr.e_phnum * elffhdr.e_phentsize); putchar('\n'); lines = gettextlines(elffhdr.e_phnum); for (i = 0 ; i < elffhdr.e_phnum ; ++i) { append(lines + i, "%2d ", i); describephdr(lines + i, proghdr + i); } formatlist(stdout, lines, elffhdr.e_phnum); free(lines); } if (shdrls && secthdrs) { printf("Section header table entries: %d", elffhdr.e_shnum); if (dooffs) printf(" (%lX - %lX)", (unsigned long)elffhdr.e_shoff, (unsigned long)elffhdr.e_shoff + elffhdr.e_shnum * elffhdr.e_shentsize); putchar('\n'); lines = gettextlines(elffhdr.e_shnum); for (i = 0 ; i < elffhdr.e_shnum ; ++i) { append(lines + i, "%2d ", i); describeshdr(lines + i, secthdr + i); } formatlist(stdout, lines, elffhdr.e_shnum); free(lines); } fclose(thefile); free(proghdr); free(secthdr); free(sectstr); } return ret; }