Cleaned up option management in cmd.c and moved a restore operation from rexbacklight.c to restore.c

This commit is contained in:
rexy712 2018-12-16 06:56:18 -08:00
parent eab07e49cf
commit 00062612f5
5 changed files with 60 additions and 62 deletions

View File

@ -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);

View File

@ -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){

View File

@ -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,12 +75,16 @@ _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
if(printed){
printf("\n");
printf(" %s\n", rexbacklight_args[i].desc);
}
}
printf("\n");
printf("Arguments:\n");
printf(" =<percentage>\n");

View File

@ -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();

View File

@ -31,30 +31,38 @@
#include "config.h"
#ifdef ENABLE_RESTORE_FILE
#include <rjp.h>
#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(&current_op_args);
//assignment
#ifdef ENABLE_RESTORE_FILE
curr = extract_operation(OP_RESTORE, &current_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(&current_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,7 +372,7 @@ 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);
}