Improved argument handling
This commit is contained in:
parent
016ac44bb1
commit
e4b58545b5
4
makefile
4
makefile
@ -2,8 +2,8 @@
|
|||||||
all: rexbacklight
|
all: rexbacklight
|
||||||
|
|
||||||
rexbacklight: src/rexbacklight.c
|
rexbacklight: src/rexbacklight.c
|
||||||
gcc -std=c11 -O2 -Wall -Wextra -pedantic src/rexbacklight.c -o rexbacklight
|
gcc -std=c11 -g -Wall -Wextra -pedantic src/rexbacklight.c -o rexbacklight
|
||||||
strip --strip-all rexbacklight
|
# strip --strip-all rexbacklight
|
||||||
|
|
||||||
.PHONY: install
|
.PHONY: install
|
||||||
install:
|
install:
|
||||||
|
|||||||
@ -170,16 +170,122 @@ int process_arg(char* arg, float min, float current, float max){
|
|||||||
return current;
|
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
|
//argv[1] shall be [+-=]<percentage>|min|max|off
|
||||||
int main(int argc, char** argv){
|
int main(int argc, char** argv){
|
||||||
const char* backlight_file = "brightness";
|
const char* backlight_file = "brightness";
|
||||||
const char* max_backlight_file = "max_brightness";
|
const char* max_backlight_file = "max_brightness";
|
||||||
|
|
||||||
//Make sure we have an argument and it is at least 2 characters long
|
struct arg_values args = process_cmd_args(argc, argv);
|
||||||
if(argc < 2 || !strcmp(argv[1], "--help"))
|
|
||||||
usage(0);
|
|
||||||
else if(strlen(argv[1]) < 2)
|
|
||||||
usage(-1);
|
|
||||||
|
|
||||||
//Acquire a list of backlight devices in sysfs
|
//Acquire a list of backlight devices in sysfs
|
||||||
struct string_array backlight_names = get_backlight_sources();
|
struct string_array backlight_names = get_backlight_sources();
|
||||||
@ -215,7 +321,7 @@ int main(int argc, char** argv){
|
|||||||
fclose(bright);
|
fclose(bright);
|
||||||
}
|
}
|
||||||
free_string_array(&backlight_names);
|
free_string_array(&backlight_names);
|
||||||
|
free_cmd_args(&args);
|
||||||
//Return to start directory
|
//Return to start directory
|
||||||
if(chdir(starting_dir)){
|
if(chdir(starting_dir)){
|
||||||
free(starting_dir);
|
free(starting_dir);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user