rip function from body of makefilelist()
This commit is contained in:
parent
85f86a774a
commit
6038edb16c
332
source/dir.c
332
source/dir.c
@ -61,6 +61,8 @@ unsigned long nsrcdirs; /* number of source directories */
|
|||||||
unsigned long nsrcfiles; /* number of source files */
|
unsigned long nsrcfiles; /* number of source files */
|
||||||
unsigned long msrcfiles = SRCINC; /* maximum number of source files */
|
unsigned long msrcfiles = SRCINC; /* maximum number of source files */
|
||||||
|
|
||||||
|
static bool firstbuild = true;
|
||||||
|
|
||||||
static char **incnames; /* #include directory names without view pathing */
|
static char **incnames; /* #include directory names without view pathing */
|
||||||
static unsigned long mincdirs = DIRINC; /* maximum number of #include directories */
|
static unsigned long mincdirs = DIRINC; /* maximum number of #include directories */
|
||||||
static unsigned long msrcdirs; /* maximum number of source directories */
|
static unsigned long msrcdirs; /* maximum number of source directories */
|
||||||
@ -78,6 +80,166 @@ static void addsrcdir(char *dir);
|
|||||||
static void addincdir(char *name, char *path);
|
static void addincdir(char *name, char *path);
|
||||||
static void scan_dir(const char *dirfile, bool recurse);
|
static void scan_dir(const char *dirfile, bool recurse);
|
||||||
static void makevpsrcdirs(void);
|
static void makevpsrcdirs(void);
|
||||||
|
static void read_listfile(FILE * listfile);
|
||||||
|
|
||||||
|
static
|
||||||
|
void read_listfile(FILE * names) {
|
||||||
|
char line[PATHLEN * 10];
|
||||||
|
char path[PATHLEN + 1];
|
||||||
|
char dir[PATHLEN + 1];
|
||||||
|
char *s;
|
||||||
|
/* get the names in the file */
|
||||||
|
while(fgets(line, 10 * PATHLEN, names) != NULL) {
|
||||||
|
char *point_in_line = line + (strlen(line) - 1);
|
||||||
|
size_t length_of_name = 0;
|
||||||
|
int unfinished_option = 0;
|
||||||
|
bool done = false;
|
||||||
|
|
||||||
|
/* Kill away \n left at end of fgets()'d string: */
|
||||||
|
if(*point_in_line == '\n') *point_in_line = '\0';
|
||||||
|
|
||||||
|
/* Parse whitespace-terminated strings in line: */
|
||||||
|
point_in_line = line;
|
||||||
|
while(sscanf(point_in_line, "%" PATHLEN_STR "s", path) == 1) {
|
||||||
|
/* Have to store this length --- inviewpath() will
|
||||||
|
* modify path, later! */
|
||||||
|
length_of_name = strlen(path);
|
||||||
|
|
||||||
|
if(*path == '-') { /* if an option */
|
||||||
|
if(unfinished_option) {
|
||||||
|
/* Can't have another option directly after an
|
||||||
|
* -I or -p option with no name after it! */
|
||||||
|
fprintf(stderr,
|
||||||
|
PROGRAM_NAME
|
||||||
|
": Syntax error in namelist file %s: unfinished -I or -p option\n",
|
||||||
|
namefile);
|
||||||
|
unfinished_option = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int i = path[1];
|
||||||
|
switch(i) {
|
||||||
|
case 'c': /* ASCII characters only in crossref */
|
||||||
|
compress = false;
|
||||||
|
break;
|
||||||
|
case 'k': /* ignore DFLT_INCDIR */
|
||||||
|
kernelmode = true;
|
||||||
|
break;
|
||||||
|
case 'q': /* quick search */
|
||||||
|
invertedindex = true;
|
||||||
|
break;
|
||||||
|
case 'T': /* truncate symbols to 8 characters */
|
||||||
|
trun_syms = true;
|
||||||
|
break;
|
||||||
|
case 'I': /* #include file directory */
|
||||||
|
case 'p': /* file path components to display */
|
||||||
|
/* coverity[overwrite_var] */
|
||||||
|
s = path + 2; /* for "-Ipath" */
|
||||||
|
if(*s == '\0') { /* if "-I path" */
|
||||||
|
unfinished_option = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* this code block used several times in here
|
||||||
|
* --> make it a macro to avoid unnecessary
|
||||||
|
* duplication */
|
||||||
|
#define HANDLE_OPTION_ARGUMENT(i, s) \
|
||||||
|
switch(i) { \
|
||||||
|
case 'I': /* #include file directory */ \
|
||||||
|
if(firstbuild == true) { \
|
||||||
|
/* expand $ and ~ */ \
|
||||||
|
shellpath(dir, sizeof(dir), (s)); \
|
||||||
|
includedir(dir); \
|
||||||
|
} \
|
||||||
|
unfinished_option = 0; \
|
||||||
|
done = true; \
|
||||||
|
break; \
|
||||||
|
case 'p': /* file path components to display */ \
|
||||||
|
if(*(s) < '0' || *(s) > '9') { \
|
||||||
|
fprintf(stderr, \
|
||||||
|
"csope: -p option in file %s: missing or invalid numeric value\n", \
|
||||||
|
namefile); \
|
||||||
|
} \
|
||||||
|
dispcomponents = atoi(s); \
|
||||||
|
unfinished_option = 0; \
|
||||||
|
done = true; \
|
||||||
|
break; \
|
||||||
|
default: \
|
||||||
|
done = false; \
|
||||||
|
} /* switch(i) */
|
||||||
|
|
||||||
|
/* ... and now call it for the first time */
|
||||||
|
HANDLE_OPTION_ARGUMENT(i, s)
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr,
|
||||||
|
PROGRAM_NAME
|
||||||
|
": only -I, -c, -k, -p, and -T options can be in file %s\n",
|
||||||
|
namefile);
|
||||||
|
} /* switch(i) */
|
||||||
|
} /* if('-') */
|
||||||
|
else if(*path == '"') {
|
||||||
|
/* handle quoted filenames... */
|
||||||
|
size_t in = 1, out = 0;
|
||||||
|
char *newpath = malloc(PATHLEN + 1);
|
||||||
|
|
||||||
|
while(in < PATHLEN && point_in_line[in] != '\0') {
|
||||||
|
if(point_in_line[in] == '"') {
|
||||||
|
newpath[out] = '\0';
|
||||||
|
/* Tell outer loop to skip over this entire
|
||||||
|
* quoted string */
|
||||||
|
length_of_name = in + 1;
|
||||||
|
break; /* found end of quoted string */
|
||||||
|
} else if(point_in_line[in] == '\\' && in < PATHLEN - 1 &&
|
||||||
|
(point_in_line[in + 1] == '"' ||
|
||||||
|
point_in_line[in + 1] == '\\')) {
|
||||||
|
/* un-escape \" or \\ sequence */
|
||||||
|
newpath[out++] = point_in_line[in + 1];
|
||||||
|
in += 2;
|
||||||
|
} else {
|
||||||
|
newpath[out++] = point_in_line[in++];
|
||||||
|
}
|
||||||
|
} /* while(in) */
|
||||||
|
if(in >= PATHLEN) { /* safeguard against almost-overflow */
|
||||||
|
newpath[out] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If an -I or -p arguments was missing before,
|
||||||
|
* treat this name as the argument: */
|
||||||
|
HANDLE_OPTION_ARGUMENT(unfinished_option, newpath);
|
||||||
|
if(!done) {
|
||||||
|
/* coverity[overwrite_var] */
|
||||||
|
if((s = inviewpath(newpath)) != NULL) {
|
||||||
|
addsrcfile(s);
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, PROGRAM_NAME ": cannot find file %s\n", newpath);
|
||||||
|
errorsfound = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(newpath);
|
||||||
|
} /* if(quoted name) */
|
||||||
|
else {
|
||||||
|
/* ... so this is an ordinary file name, unquoted */
|
||||||
|
|
||||||
|
/* If an -I or -p arguments was missing before,
|
||||||
|
* treat this name as the argument: */
|
||||||
|
HANDLE_OPTION_ARGUMENT(unfinished_option, path);
|
||||||
|
if(!done) {
|
||||||
|
if((s = inviewpath(path)) != NULL) {
|
||||||
|
addsrcfile(s);
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, PROGRAM_NAME ": cannot find file %s\n", path);
|
||||||
|
errorsfound = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} /* else(ordinary name) */
|
||||||
|
|
||||||
|
point_in_line += length_of_name;
|
||||||
|
while(isspace((unsigned char)*point_in_line))
|
||||||
|
point_in_line++;
|
||||||
|
} /* while(sscanf(line)) */
|
||||||
|
} /* while(fgets(line)) */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* make the view source directory list */
|
/* make the view source directory list */
|
||||||
static
|
static
|
||||||
@ -340,24 +502,18 @@ void includedir(char *dirlist) {
|
|||||||
|
|
||||||
/* make the source file list */
|
/* make the source file list */
|
||||||
void makefilelist(void) {
|
void makefilelist(void) {
|
||||||
static bool firstbuild = true; /* first time through */
|
char *file;
|
||||||
FILE *names; /* name file pointer */
|
|
||||||
char dir[PATHLEN + 1];
|
|
||||||
char path[PATHLEN + 1];
|
|
||||||
char line[PATHLEN * 10];
|
|
||||||
char *file;
|
|
||||||
char *s;
|
|
||||||
|
|
||||||
makevpsrcdirs(); /* make the view source directory list */
|
makevpsrcdirs(); /* make the view source directory list */
|
||||||
|
|
||||||
/* if -i was NOT given and there are source file arguments */
|
/* if -i was NOT given and there are source file arguments */
|
||||||
if(namefile == NULL && fileargc > 0) {
|
if(namefile == NULL && fileargc > 0) {
|
||||||
|
|
||||||
/* put them in a list that can be expanded */
|
/* put them in a list that can be expanded */
|
||||||
for(unsigned i = 0; i < fileargc; i++) {
|
for(unsigned i = 0; i < fileargc; i++) {
|
||||||
file = fileargv[i];
|
file = fileargv[i];
|
||||||
if(infilelist(file) == false) {
|
if(infilelist(file) == false) {
|
||||||
if((s = inviewpath(file)) != NULL) {
|
char * s = inviewpath(file);
|
||||||
|
if (s) {
|
||||||
addsrcfile(s);
|
addsrcfile(s);
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, PROGRAM_NAME ": cannot find file %s\n", file);
|
fprintf(stderr, PROGRAM_NAME ": cannot find file %s\n", file);
|
||||||
@ -381,6 +537,7 @@ void makefilelist(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Came here --> there is a file of source file names */
|
/* Came here --> there is a file of source file names */
|
||||||
|
FILE *names; /* name file pointer */
|
||||||
|
|
||||||
if(strcmp(namefile, "-") == 0)
|
if(strcmp(namefile, "-") == 0)
|
||||||
names = stdin;
|
names = stdin;
|
||||||
@ -389,161 +546,14 @@ void makefilelist(void) {
|
|||||||
myexit(1);
|
myexit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get the names in the file */
|
read_listfile(names);
|
||||||
while(fgets(line, 10 * PATHLEN, names) != NULL) {
|
|
||||||
char *point_in_line = line + (strlen(line) - 1);
|
|
||||||
size_t length_of_name = 0;
|
|
||||||
int unfinished_option = 0;
|
|
||||||
bool done = false;
|
|
||||||
|
|
||||||
/* Kill away \n left at end of fgets()'d string: */
|
if(names == stdin) {
|
||||||
if(*point_in_line == '\n') *point_in_line = '\0';
|
|
||||||
|
|
||||||
/* Parse whitespace-terminated strings in line: */
|
|
||||||
point_in_line = line;
|
|
||||||
while(sscanf(point_in_line, "%" PATHLEN_STR "s", path) == 1) {
|
|
||||||
/* Have to store this length --- inviewpath() will
|
|
||||||
* modify path, later! */
|
|
||||||
length_of_name = strlen(path);
|
|
||||||
|
|
||||||
if(*path == '-') { /* if an option */
|
|
||||||
if(unfinished_option) {
|
|
||||||
/* Can't have another option directly after an
|
|
||||||
* -I or -p option with no name after it! */
|
|
||||||
fprintf(stderr,
|
|
||||||
PROGRAM_NAME
|
|
||||||
": Syntax error in namelist file %s: unfinished -I or -p option\n",
|
|
||||||
namefile);
|
|
||||||
unfinished_option = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int i = path[1];
|
|
||||||
switch(i) {
|
|
||||||
case 'c': /* ASCII characters only in crossref */
|
|
||||||
compress = false;
|
|
||||||
break;
|
|
||||||
case 'k': /* ignore DFLT_INCDIR */
|
|
||||||
kernelmode = true;
|
|
||||||
break;
|
|
||||||
case 'q': /* quick search */
|
|
||||||
invertedindex = true;
|
|
||||||
break;
|
|
||||||
case 'T': /* truncate symbols to 8 characters */
|
|
||||||
trun_syms = true;
|
|
||||||
break;
|
|
||||||
case 'I': /* #include file directory */
|
|
||||||
case 'p': /* file path components to display */
|
|
||||||
/* coverity[overwrite_var] */
|
|
||||||
s = path + 2; /* for "-Ipath" */
|
|
||||||
if(*s == '\0') { /* if "-I path" */
|
|
||||||
unfinished_option = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* this code block used several times in here
|
|
||||||
* --> make it a macro to avoid unnecessary
|
|
||||||
* duplication */
|
|
||||||
#define HANDLE_OPTION_ARGUMENT(i, s) \
|
|
||||||
switch(i) { \
|
|
||||||
case 'I': /* #include file directory */ \
|
|
||||||
if(firstbuild == true) { \
|
|
||||||
/* expand $ and ~ */ \
|
|
||||||
shellpath(dir, sizeof(dir), (s)); \
|
|
||||||
includedir(dir); \
|
|
||||||
} \
|
|
||||||
unfinished_option = 0; \
|
|
||||||
done = true; \
|
|
||||||
break; \
|
|
||||||
case 'p': /* file path components to display */ \
|
|
||||||
if(*(s) < '0' || *(s) > '9') { \
|
|
||||||
fprintf(stderr, \
|
|
||||||
"csope: -p option in file %s: missing or invalid numeric value\n", \
|
|
||||||
namefile); \
|
|
||||||
} \
|
|
||||||
dispcomponents = atoi(s); \
|
|
||||||
unfinished_option = 0; \
|
|
||||||
done = true; \
|
|
||||||
break; \
|
|
||||||
default: \
|
|
||||||
done = false; \
|
|
||||||
} /* switch(i) */
|
|
||||||
|
|
||||||
/* ... and now call it for the first time */
|
|
||||||
HANDLE_OPTION_ARGUMENT(i, s)
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr,
|
|
||||||
PROGRAM_NAME
|
|
||||||
": only -I, -c, -k, -p, and -T options can be in file %s\n",
|
|
||||||
namefile);
|
|
||||||
} /* switch(i) */
|
|
||||||
} /* if('-') */
|
|
||||||
else if(*path == '"') {
|
|
||||||
/* handle quoted filenames... */
|
|
||||||
size_t in = 1, out = 0;
|
|
||||||
char *newpath = malloc(PATHLEN + 1);
|
|
||||||
|
|
||||||
while(in < PATHLEN && point_in_line[in] != '\0') {
|
|
||||||
if(point_in_line[in] == '"') {
|
|
||||||
newpath[out] = '\0';
|
|
||||||
/* Tell outer loop to skip over this entire
|
|
||||||
* quoted string */
|
|
||||||
length_of_name = in + 1;
|
|
||||||
break; /* found end of quoted string */
|
|
||||||
} else if(point_in_line[in] == '\\' && in < PATHLEN - 1 &&
|
|
||||||
(point_in_line[in + 1] == '"' ||
|
|
||||||
point_in_line[in + 1] == '\\')) {
|
|
||||||
/* un-escape \" or \\ sequence */
|
|
||||||
newpath[out++] = point_in_line[in + 1];
|
|
||||||
in += 2;
|
|
||||||
} else {
|
|
||||||
newpath[out++] = point_in_line[in++];
|
|
||||||
}
|
|
||||||
} /* while(in) */
|
|
||||||
if(in >= PATHLEN) { /* safeguard against almost-overflow */
|
|
||||||
newpath[out] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If an -I or -p arguments was missing before,
|
|
||||||
* treat this name as the argument: */
|
|
||||||
HANDLE_OPTION_ARGUMENT(unfinished_option, newpath);
|
|
||||||
if(!done) {
|
|
||||||
/* coverity[overwrite_var] */
|
|
||||||
if((s = inviewpath(newpath)) != NULL) {
|
|
||||||
addsrcfile(s);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, PROGRAM_NAME ": cannot find file %s\n", newpath);
|
|
||||||
errorsfound = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(newpath);
|
|
||||||
} /* if(quoted name) */
|
|
||||||
else {
|
|
||||||
/* ... so this is an ordinary file name, unquoted */
|
|
||||||
|
|
||||||
/* If an -I or -p arguments was missing before,
|
|
||||||
* treat this name as the argument: */
|
|
||||||
HANDLE_OPTION_ARGUMENT(unfinished_option, path);
|
|
||||||
if(!done) {
|
|
||||||
if((s = inviewpath(path)) != NULL) {
|
|
||||||
addsrcfile(s);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, PROGRAM_NAME ": cannot find file %s\n", path);
|
|
||||||
errorsfound = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} /* else(ordinary name) */
|
|
||||||
|
|
||||||
point_in_line += length_of_name;
|
|
||||||
while(isspace((unsigned char)*point_in_line))
|
|
||||||
point_in_line++;
|
|
||||||
} /* while(sscanf(line)) */
|
|
||||||
} /* while(fgets(line)) */
|
|
||||||
|
|
||||||
if(names == stdin)
|
|
||||||
clearerr(stdin);
|
clearerr(stdin);
|
||||||
else
|
} else {
|
||||||
fclose(names);
|
fclose(names);
|
||||||
|
}
|
||||||
|
|
||||||
firstbuild = false;
|
firstbuild = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user