From e4b58545b5874d28a1edcaef7c5b3c723745443b Mon Sep 17 00:00:00 2001 From: rexy712 Date: Sat, 13 Jan 2018 16:32:16 -0800 Subject: [PATCH] Improved argument handling --- makefile | 4 +- src/rexbacklight.c | 118 ++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 114 insertions(+), 8 deletions(-) diff --git a/makefile b/makefile index 3e6aebe..70b1a3a 100644 --- a/makefile +++ b/makefile @@ -2,8 +2,8 @@ all: rexbacklight rexbacklight: src/rexbacklight.c - gcc -std=c11 -O2 -Wall -Wextra -pedantic src/rexbacklight.c -o rexbacklight - strip --strip-all rexbacklight + gcc -std=c11 -g -Wall -Wextra -pedantic src/rexbacklight.c -o rexbacklight +# strip --strip-all rexbacklight .PHONY: install install: diff --git a/src/rexbacklight.c b/src/rexbacklight.c index 4ab9aa4..04cb521 100644 --- a/src/rexbacklight.c +++ b/src/rexbacklight.c @@ -170,16 +170,122 @@ int process_arg(char* arg, float min, float current, float max){ return current; } +#define OP_INC 1 +#define OP_DEC 2 +#define OP_SET 4 +#define OP_GET 128 +#define OP_NONE 0 +struct arg_values{ + struct arg_values* next; + + //Specific device to control + //NULL means all devices + const char* device; + + //What value to put in the backlight file + int delta; + + //How many seconds to transition + int fade_duration; + + unsigned char operation; +}; + +void free_cmd_args(struct arg_values* a){ + if(!a->next) + return; + free_cmd_args(a->next); + free(a->next); +} + +struct arg_values process_cmd_args(int argc, char** argv){ + struct arg_values ret = {0}; + struct arg_values* curr = &ret; + //Skip argv[0] + for(int i = 1;i < argc;i++){ + if(!strncmp(argv[i], "--", 2)){ + if(!strcmp(argv[i] + 2, "get")){ + curr->operation |= OP_GET; + continue; + + }else if(!strcmp(argv[i] + 2, "fade")){ + if(i == argc){ + fprintf(stderr, "Missing argument to %s\n\n", argv[i]); + free_cmd_args(&ret); + usage(-5); + } + curr->fade_duration = strtol(argv[++i], NULL, 0); + continue; + } + + else if(!strcmp(argv[i] + 2, "device")){ + if(i == argc){ + fprintf(stderr, "Missing argument to %s\n\n", argv[i]); + free_cmd_args(&ret); + usage(-5); + } + curr->next = calloc(1, sizeof(struct arg_values)); + curr = curr->next; + curr->device = argv[++i]; + continue; + } + else if(!strcmp(argv[i] + 2, "help")){ + free_cmd_args(&ret); + usage(0); + } + + else{ + fprintf(stderr, "Unrecognized command line option '%s'\n\n", argv[i]); + free_cmd_args(&ret); + usage(-5); + } + } + + else{ + switch(argv[i][0]){ + case '=': + curr->operation = OP_SET; + break; + case '-': + curr->operation = OP_DEC; + break; + case '+': + curr->operation = OP_INC; + break; + default: + fprintf(stderr, "Unrecognized command line option '%s'\n\n", argv[i]); + free_cmd_args(&ret); + usage(-5); + } + curr->delta = atof(&argv[i][1]); + } + } + if(!ret.operation){ + if(!ret.next){ + fprintf(stderr, "No operation requested!\n\n"); + usage(-1); + } + for(curr = ret.next;curr;curr = curr->next){ + if(!curr->operation){ + fprintf(stderr, "No operation requested for device %s!\n\n", curr->device); + usage(-1); + } + } + }else{ + for(curr = ret.next;curr;curr = curr->next){ + if(!curr->operation) + curr->operation = ret.operation; + } + } + return ret; +} + //argv[1] shall be [+-=]|min|max|off int main(int argc, char** argv){ const char* backlight_file = "brightness"; const char* max_backlight_file = "max_brightness"; - //Make sure we have an argument and it is at least 2 characters long - if(argc < 2 || !strcmp(argv[1], "--help")) - usage(0); - else if(strlen(argv[1]) < 2) - usage(-1); + struct arg_values args = process_cmd_args(argc, argv); //Acquire a list of backlight devices in sysfs struct string_array backlight_names = get_backlight_sources(); @@ -215,7 +321,7 @@ int main(int argc, char** argv){ fclose(bright); } free_string_array(&backlight_names); - + free_cmd_args(&args); //Return to start directory if(chdir(starting_dir)){ free(starting_dir);