From 00062612f58a9d2ffdfd613821f30bbb1b967a06 Mon Sep 17 00:00:00 2001 From: rexy712 Date: Sun, 16 Dec 2018 06:56:18 -0800 Subject: [PATCH] Cleaned up option management in cmd.c and moved a restore operation from rexbacklight.c to restore.c --- include/restore.h | 1 + src/cmd.c | 61 +++++++++++++++++++--------------------------- src/common.c | 15 +++++++----- src/restore.c | 8 ++++++ src/rexbacklight.c | 37 +++++++++++++--------------- 5 files changed, 60 insertions(+), 62 deletions(-) diff --git a/include/restore.h b/include/restore.h index 9d230c7..138bdd3 100644 --- a/include/restore.h +++ b/include/restore.h @@ -26,6 +26,7 @@ void save_restore_file(struct string_array* devices); int restore_to_delta(struct arg_values* curr, RJP_value** root, int* try_restore); +void prep_restore(struct arg_values* a); RJP_value* find_matching_json_device(const char* name, RJP_value* root); RJP_value* read_restore_file(const char* file); diff --git a/src/cmd.c b/src/cmd.c index 522fe72..4e1ce30 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -71,7 +71,7 @@ #define DEC_DESC "decrease backlight device by specified value" #define RESTORE_DESC "reassign previously saved device values" -int strcmp_handle_null(const char* one, const char* two){ +static inline int strcmp_handle_null(const char* one, const char* two){ if(!one) return 1; if(!two) @@ -79,46 +79,34 @@ int strcmp_handle_null(const char* one, const char* two){ return strcmp(one, two); } -#define CHECK_SHORT_OPTION(opt, arg) (!strcmp(opt##_SHORT_OPT, arg)) -#define CHECK_LONG_OPTION(opt, arg) (!strcmp(opt##_LONG_OPT, arg)) -#define CHECK_XBACK_OPTION(opt, arg) (!strcmp(opt##_XBACK_OPT, arg)) +#define CHECK_SHORT_OPTION(opt, arg) (!strcmp_handle_null(opt##_SHORT_OPT, arg)) +#define CHECK_LONG_OPTION(opt, arg) (!strcmp_handle_null(opt##_LONG_OPT, arg)) +#define CHECK_XBACK_OPTION(opt, arg) (!strcmp_handle_null(opt##_XBACK_OPT, arg)) #ifdef XBACKLIGHT_COMPAT_OPTIONS - -#define CHECK_OPTION(opt, arg) (!strcmp_handle_null(opt##_LONG_OPT, arg) || !strcmp_handle_null(opt##_SHORT_OPT, arg) || !strcmp_handle_null(opt##_XBACK_OPT, arg)) -struct cmd_arg rexbacklight_args[] = { - {DEVICE_LONG_OPT, DEVICE_SHORT_OPT, DEVICE_XBACK_OPT, DEVICE_DESC}, - {NO_OPT, NO_OPT, SET_XBACK_OPT, SET_DESC}, - {NO_OPT, NO_OPT, INC_XBACK_OPT, INC_DESC}, - {NO_OPT, NO_OPT, DEC_XBACK_OPT, DEC_DESC}, - {FADE_LONG_OPT, FADE_SHORT_OPT, FADE_XBACK_OPT, FADE_DESC}, - {STEPS_LONG_OPT, STEPS_SHORT_OPT, STEPS_XBACK_OPT, STEPS_DESC}, - {GET_LONG_OPT, GET_SHORT_OPT, GET_XBACK_OPT, GET_DESC}, - {LIST_LONG_OPT, LIST_SHORT_OPT, LIST_XBACK_OPT, LIST_DESC}, -#ifdef ENABLE_RESTORE_FILE - {RESTORE_LONG_OPT, RESTORE_SHORT_OPT, RESTORE_XBACK_OPT, RESTORE_DESC}, -#endif - {HELP_LONG_OPT, HELP_SHORT_OPT, HELP_XBACK_OPT, HELP_DESC}, - {VERSION_LONG_OPT, NO_OPT, VERSION_XBACK_OPT, VERSION_DESC} -}; - + #define OPTION(x) {x##_LONG_OPT, x##_SHORT_OPT, x##_XBACK_OPT, x##_DESC} + #define CHECK_OPTION(opt, arg) (CHECK_LONG_OPTION(opt, arg) || CHECK_SHORT_OPTION(opt, arg) || CHECK_XBACK_OPTION(opt, arg)) #else //XBACKLIGHT_COMPAT_OPTIONS - -#define CHECK_OPTION(opt, arg) (!strcmp_handle_null(opt##_LONG_OPT, arg) || !strcmp_handle_null(opt##_SHORT_OPT, arg)) -struct cmd_arg rexbacklight_args[] = { - {DEVICE_LONG_OPT, DEVICE_SHORT_OPT, DEVICE_DESC}, - {FADE_LONG_OPT, FADE_SHORT_OPT, FADE_DESC}, - {STEPS_LONG_OPT, STEPS_SHORT_OPT, STEPS_DESC}, - {GET_LONG_OPT, GET_SHORT_OPT, GET_DESC}, - {LIST_LONG_OPT, LIST_SHORT_OPT, LIST_DESC}, -#ifdef ENABLE_RESTORE_FILE - {RESTORE_LONG_OPT, RESTORE_SHORT_OPT, RESTORE_DESC}, -#endif - {HELP_LONG_OPT, HELP_SHORT_OPT, HELP_DESC}, - {VERSION_LONG_OPT, NO_OPT, VERSION_DESC} -}; + #define OPTION(x) {x##_LONG_OPT, x##_SHORT_OPT, x##_DESC} + #define CHECK_OPTION(opt, arg) (CHECK_LONG_OPTION(opt, arg) || CHECK_SHORT_OPTION(opt, arg)) #endif //XBACKLIGHT_COMPAT_OPTIONS +struct cmd_arg rexbacklight_args[] = { + OPTION(DEVICE), + OPTION(SET), + OPTION(INC), + OPTION(DEC), + OPTION(FADE), + OPTION(STEPS), + OPTION(GET), + OPTION(LIST), +#ifdef ENABLE_RESTORE_FILE + OPTION(RESTORE), +#endif + OPTION(HELP), + OPTION(VERSION) +}; + int rexbacklight_args_length = sizeof(rexbacklight_args) / sizeof(rexbacklight_args[0]); //Clean up a cmd_arg struct @@ -312,6 +300,7 @@ struct arg_values process_cmd_args(int argc, char** argv){ } #undef CHECK_OPTION #undef UNRECOGNIZED_OPTION +#undef OPTION //Process an operation int process_op(struct arg_values* arg, float min, float current, float max){ diff --git a/src/common.c b/src/common.c index 20da2c5..8fbf34e 100644 --- a/src/common.c +++ b/src/common.c @@ -35,6 +35,9 @@ void io_error_2(const char* error, const char* type, const char* name, const cha void io_error_3(const char* error, const char* type, const char* name, const char* name2, const char* name3){ fprintf(stderr, "Unable to %s %s '%s%s%s'!\n", error, type, name, name2, name3); } +void mem_error(void){ + fprintf(stderr, "Failed to allocate memory! Unable to continue!\n"); +} //Clean up a string array void free_string_array(struct string_array* s){ @@ -44,10 +47,6 @@ void free_string_array(struct string_array* s){ free(s->list); } -void mem_error(void){ - fprintf(stderr, "Failed to allocate memory! Unable to continue!\n"); -} - _Noreturn void version(void){ printf("%s version %s\n", executable_name(), REXBACKLIGHT_VERSION); exit(return_value); @@ -76,11 +75,15 @@ _Noreturn void usage(int exit_val){ if(rexbacklight_args[i].xopt){ if(printed) printf("|"); + else + printed = 1; printf("%s", rexbacklight_args[i].xopt); } #endif //XBACKLIGHT_COMPAT_OPTIONS - printf("\n"); - printf(" %s\n", rexbacklight_args[i].desc); + if(printed){ + printf("\n"); + printf(" %s\n", rexbacklight_args[i].desc); + } } printf("\n"); printf("Arguments:\n"); diff --git a/src/restore.c b/src/restore.c index 868808f..d01dff8 100644 --- a/src/restore.c +++ b/src/restore.c @@ -112,6 +112,14 @@ int restore_to_delta(struct arg_values* curr, RJP_value** root, int* try_restore curr->delta = rjp_value_dfloat(match); return 1; } +void prep_restore(struct arg_values* a){ + RJP_value* root = 0; + int try_restore = 1; + for(struct arg_values* curr = a;curr;curr = curr->next){ + restore_to_delta(curr, &root, &try_restore); + } + rjp_free_value(root); +} void save_restore_file(struct string_array* devices){ RJP_value* root = rjp_init_json(); diff --git a/src/rexbacklight.c b/src/rexbacklight.c index f4b226a..db61ae1 100644 --- a/src/rexbacklight.c +++ b/src/rexbacklight.c @@ -31,30 +31,38 @@ #include "config.h" #ifdef ENABLE_RESTORE_FILE -#include #include "restore.h" #endif +///////////////////////////////////////////////////////////////////////////////////////////// + #ifdef REXBACKLIGHT + //This is where backlight devices can be found in sysfs const char* device_dir(void){return "/sys/class/backlight/";} //name of the program being run so that we print the correct name in the usage const char* executable_name(void){return "rexbacklight";} //location of the restore file in the home directory const char* restore_file_suffix(void){return "/.config/rexbacklight.json";} + #elif defined(REXLEDCTL) + //This is where led devices can be found in sysfs const char* device_dir(void){return "/sys/class/leds/";} const char* executable_name(void){return "rexledctl";} const char* restore_file_suffix(void){return "/.config/rexledctl.json";} + #else #error "UNDEFINED PROGRAM NAME!" #endif + const char* brightness_file(void){return "brightness";} const char* max_brightness_file(void){return "max_brightness";} +///////////////////////////////////////////////////////////////////////////////////////////// + //Get a list of led/backlight devices in sysfs struct string_array get_device_sources(void){ DIR* fd; @@ -80,7 +88,7 @@ struct string_array get_device_sources(void){ for(arr.size = 0;(dir = readdir(fd));){ int slen; //ignore '.' and '..' - if(!strncmp(dir->d_name, ".", 1) || !strncmp(dir->d_name, "..", 2)){ + if(!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")){ continue; } @@ -138,6 +146,7 @@ float get_brightness(const char* file){ fclose(bright); return atof(buff); } + //return milliseconds since last boot double get_time(void){ struct timespec t; @@ -257,20 +266,6 @@ void extract_next_arg(struct arg_values* dest, struct arg_values* src){ dest->next->next = NULL; } -#ifdef ENABLE_RESTORE_FILE -//convert all restore operations to set operations -void prep_restore(struct arg_values* a){ - RJP_value* root = 0; - int try_restore = 1; - for(struct arg_values* curr = a;curr;curr = curr->next){ - restore_to_delta(curr, &root, &try_restore); - } - rjp_free_value(root); -} -#else -#define prep_restore(x) -#endif - //remove all args in src which have the specified operation and append them to dest struct arg_values* extract_operation(int operation, struct arg_values* dest, struct arg_values* src){ struct arg_values* curr_dest = dest; @@ -286,7 +281,7 @@ struct arg_values* extract_operation(int operation, struct arg_values* dest, str return curr_dest; } -//If devices were specified, this function will run +//Run requested operation on a per device basis void run_device_operations(struct arg_values* a){ struct arg_values* curr; struct arg_values current_op_args = {0}; @@ -302,8 +297,10 @@ void run_device_operations(struct arg_values* a){ free_cmd_args(¤t_op_args); //assignment +#ifdef ENABLE_RESTORE_FILE curr = extract_operation(OP_RESTORE, ¤t_op_args, a); prep_restore(current_op_args.next); +#endif extract_operation(OP_SET | OP_INC | OP_DEC, curr, a); return_value = do_assignment(current_op_args.next); free_cmd_args(¤t_op_args); @@ -344,7 +341,7 @@ int main(int argc, char** argv){ //If there are no led/backlights, we can't do anything if(device_names.size == 0){ #ifdef REXBACKLIGHT - fprintf(stderr, "No backlights devices found!\n"); + fprintf(stderr, "No backlight devices found!\n"); #elif defined(REXLEDCTL) fprintf(stderr, "No led devices found!\n"); #endif @@ -375,13 +372,13 @@ int main(int argc, char** argv){ return RETVAL_INVALID_DIR; } - //Run selected operation + //on a global operation, populate list with all devices if(!args.next){ populate_args(&args, &device_names); } run_device_operations(&args); #ifdef ENABLE_RESTORE_FILE - save_restore_file(&device_names); + save_restore_file(&device_names); #endif free_string_array(&device_names);