rip function from body of makefilelist()

This commit is contained in:
anon 2024-11-12 15:12:53 +01:00
parent 85f86a774a
commit 6038edb16c

View File

@ -61,6 +61,8 @@ unsigned long nsrcdirs; /* number of source directories */
unsigned long nsrcfiles; /* 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 unsigned long mincdirs = DIRINC; /* maximum number of #include 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 scan_dir(const char *dirfile, bool recurse);
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 */
static
@ -340,24 +502,18 @@ void includedir(char *dirlist) {
/* make the source file list */
void makefilelist(void) {
static bool firstbuild = true; /* first time through */
FILE *names; /* name file pointer */
char dir[PATHLEN + 1];
char path[PATHLEN + 1];
char line[PATHLEN * 10];
char *file;
char *s;
char *file;
makevpsrcdirs(); /* make the view source directory list */
/* if -i was NOT given and there are source file arguments */
if(namefile == NULL && fileargc > 0) {
/* put them in a list that can be expanded */
for(unsigned i = 0; i < fileargc; i++) {
file = fileargv[i];
if(infilelist(file) == false) {
if((s = inviewpath(file)) != NULL) {
char * s = inviewpath(file);
if (s) {
addsrcfile(s);
} else {
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 */
FILE *names; /* name file pointer */
if(strcmp(namefile, "-") == 0)
names = stdin;
@ -389,161 +546,14 @@ void makefilelist(void) {
myexit(1);
}
/* 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;
read_listfile(names);
/* 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)) */
if(names == stdin)
if(names == stdin) {
clearerr(stdin);
else
} else {
fclose(names);
}
firstbuild = false;
return;
}