#include "global.h" #include "build.h" #include "vp.h" #include "version.h" /* FILEVERSION and FIXVERSION */ #include /* atoi */ #include bool remove_symfile_onexit = false; bool onesearch; /* one search only in line mode */ char *reflines; /* symbol reference lines file */ char **parse_options(int *argc, char **argv) { int opt; int longind; char path[PATHLEN + 1]; /* file path */ char *s; int argcc = *argc; struct option lopts[] = { {"help", 0, NULL, 'h'}, {"version", 0, NULL, 'V'}, {0, 0, 0, 0 } }; while((opt = getopt_long(argcc, argv, "hVbcCdeF:f:I:i:kLl0:1:2:3:4:5:6:7:8:9:P:p:qRs:TUuvX", lopts, &longind)) != -1) { switch(opt) { case '?': usage(); myexit(1); break; case 'X': remove_symfile_onexit = true; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': /* The input fields numbers for line mode operation */ field = opt - '0'; if(strlen(optarg) > PATHLEN) { postfatal("\ cscope: pattern too long, cannot be > \ %d characters\n", PATLEN); } strcpy(input_line, optarg); break; case 'b': /* only build the cross-reference */ buildonly = true; linemode = true; break; case 'c': /* ASCII characters only in crossref */ compress = false; break; case 'C': /* turn on caseless mode for symbol searches */ caseless = true; egrepcaseless(caseless); /* simulate egrep -i flag */ break; case 'd': /* consider crossref up-to-date */ isuptodate = true; break; case 'e': /* suppress ^E prompt between files */ editallprompt = false; break; case 'h': longusage(); myexit(1); break; case 'k': /* ignore DFLT_INCDIR */ kernelmode = true; break; case 'L': onesearch = true; /* FALLTHROUGH */ case 'l': linemode = true; break; case 'v': verbosemode = true; break; case 'V': fprintf(stderr, PROGRAM_NAME ": version %d%s\n", FILEVERSION, FIXVERSION); myexit(0); break; case 'q': /* quick search */ invertedindex = true; break; case 'T': /* truncate symbols to 8 characters */ trun_syms = true; break; case 'u': /* unconditionally build the cross-reference */ unconditional = true; break; case 'U': /* assume some files have changed */ fileschanged = true; break; case 'R': recurse_dir = true; break; case 'f': /* alternate cross-reference file */ reffile = optarg; if(strlen(reffile) > sizeof(path) - 3) { postfatal("\ cscope: reffile too long, cannot \ be > %d characters\n", sizeof(path) - 3); /* NOTREACHED */ } strcpy(path, reffile); s = path + strlen(path); strcpy(s, ".in"); /*coverity[overwrite_var]*/ invname = strdup(path); strcpy(s, ".po"); /*coverity[overwrite_var]*/ invpost = strdup(path); break; case 'F': /* symbol reference lines file */ reflines = optarg; break; case 'i': /* file containing file names */ namefile = optarg; break; case 'I': /* #include file directory */ includedir(optarg); break; case 'p': /* file path components to display */ dispcomponents = atoi(optarg); break; case 'P': /* prepend path to file names */ prependpath = optarg; break; case 's': /* additional source file directory */ sourcedir(optarg); break; } } /* * This adjusts argv so that we only see the remaining * args. Its ugly, but we need to do it so that the rest * of the main routine doesn't get all confused */ *argc = *argc - optind; return argv + optind; }