Home > Net >  How to get the arguments from getopt to work together
How to get the arguments from getopt to work together

Time:10-19

I want to be able to use every argument (-S, -s, -f) and them be able to be used together. -S prints the files in the folder and their size... -s prints the files if they are >= the file size provided by the argument -f finds all the files with the given substring.

How would I get these to work together? Right now, my code does all of this separately.

while((c = getopt(argc, argv, "Ss:f:")) != -1){
    switch(c){
        case 'S':
        // No clue how to make them work together.
            printf("Case: S\n");
            printf("option -%c with argument '%s'\n", c, argv[optind]);
            printDIR(cwd, case_S);
            break;
        case 's':
            printf("Case: s\n");
            printf("option -%c with argument '%s'\n", c, optarg);
            printDIR(cwd, case_s);
            break;
        case 'f':
            printf("Case: f\n");
            printf("option -%c with argument '%s'\n", c, optarg);
            printDIR(cwd, case_f);
            break;
        default:
            printf("...");
    }
}

printDIR is a pointer function which is why I have cwd(which is the directory) and case_S and so on.

I want to be able to say... './search -S -s 1024 -f tar'. This should recursively search the current directory and print the size of the file if it is >= 1024 and if the file has the substring 'tar' in it. But I also want it to work even if I don't provide all arguments.

This is my first time trying anything like this so I'm new to trying to make UNIX commands and using getopt args.

CodePudding user response:

Converting parts of some of my comments into an answer.

You should process the options without doing any actions. Only when you've finished processing the options, with no errors, do you think about doing anything like calling printDIR(). You'll probably need more arguments to the function, or use global variables.

You'd have a flag such as:

int recursive = 0;

which you would set to 1 if the search was to be recursive. And int minimum_size = 0; and modify it with -s 1024. And const char *filter = ""; and then modify that with -s tar. Etc. Often, these are global variables — but if you can avoid that by passing them to the function, that is better.

Your function might then become:

int printDIR(const char *cwd, int recursive, int minimum, const char *filter);

and you'd call it with the appropriately set local variables. Note that you should check the conversion from string to integer before calling printDIR().

If there are non-option arguments, you'd process them after the option handling with:

for (int i = optind; i < argc; i  )
    printDIR(argv[i], recursive, minimum_size, filter);
  • Related