Improved argument handling

This commit is contained in:
rexy712 2018-01-13 16:32:16 -08:00
parent 016ac44bb1
commit e4b58545b5
2 changed files with 114 additions and 8 deletions

View File

@ -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:

View File

@ -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 [+-=]<percentage>|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);