option.c (2962B)
1 /* 2 * MySmartUSB MK3 Interface 3 * 4 * @copyright: Copyright (c) 2012, Dominik Schmidt 5 * @author: Dominik Schmidt <das1993@hotmail.com> 6 * @version: 0.0.0 7 * @license: CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/) 8 * 9 */ 10 #include <log.h> 11 #include <stdio.h> 12 #include <option.h> 13 #include <cmd_dispatch.h> 14 #include <stdlib.h> 15 #include <string.h> 16 struct conf configuration={.device="/dev/ttyUSB0", .log_level=LOG_LEVEL_INFO, .color=1}; 17 struct global_option global_options[]={ 18 {.type=GLOPT_DECR, .data=&configuration.log_level, .opt={.long_option="--verbose", .short_option="-v", .arg_length=0, .usage=""}}, 19 {.type=GLOPT_INCR, .data=&configuration.log_level, .opt={.long_option="--quiet", .short_option="-q", .arg_length=0, .usage=""}}, 20 {.type=GLOPT_SET, .data=&configuration.device, .opt={.long_option="--device", .short_option="-d", .arg_length=1, .usage="/dev/ttyXY"}}, 21 {.type=GLOPT_COUNT} 22 }; 23 int optionAddCommand(struct conf *config, struct command_def *cmd_def, char **argv){ 24 static unsigned int cmdlist_cnt; 25 26 array_grow((void **) &config->cmdlist.data,&config->cmdlist.arr,sizeof(struct command_exec *)); 27 if(cmd_def==NULL){ 28 config->cmdlist.data[cmdlist_cnt]=NULL; 29 } 30 else{ 31 config->cmdlist.data[cmdlist_cnt]=newCommand(cmd_def); 32 config->cmdlist.data[cmdlist_cnt]->data=argv; 33 } 34 cmdlist_cnt++; 35 return 0; 36 } 37 int optionExecGlobal(struct conf *config, struct global_option *opt, char **argv){ 38 switch(opt->type){ 39 case GLOPT_INCR: 40 *(int *)opt->data=(*(int *)opt->data)+1; 41 break; 42 case GLOPT_DECR: 43 *(int *)opt->data=(*(int *)opt->data)-1; 44 break; 45 case GLOPT_SET: 46 *(char **)opt->data=argv[0]; 47 break; 48 } 49 return 0; 50 } 51 struct global_option *getGlOptByOpt(char *opt){ 52 struct global_option *opt_ptr=global_options; 53 while(opt_ptr->type!=GLOPT_COUNT){ 54 if(strcmp(opt_ptr->opt.long_option, opt)==0||strcmp(opt_ptr->opt.short_option, opt)==0){ 55 return opt_ptr; 56 } 57 opt_ptr++; 58 } 59 return NULL; 60 } 61 int parseArguments(int argc, char **argv, struct conf *config){ 62 unsigned int i=0; 63 struct command_def *cmd_def; 64 struct global_option *glopt; 65 array_initiate((void **)&config->cmdlist.data,&config->cmdlist.arr, sizeof(struct command_exec)); 66 for(i=0;i<argc;i++){ 67 cmd_def=getCmdDefByOpt(argv[i]); 68 glopt=getGlOptByOpt(argv[i]); 69 if(cmd_def!=NULL){ 70 optionAddCommand(config,cmd_def,&argv[i+1]); 71 i+=cmd_def->opt.arg_length; 72 if(cmd_def->request_mymode==1){ 73 config->need_mymode=1; 74 } 75 } 76 else if(glopt!=NULL){ 77 if(glopt->opt.arg_length<=(argc-i+1)){ 78 optionExecGlobal(config, glopt, &argv[i+1]); 79 } 80 i+=glopt->opt.arg_length; 81 } 82 else{ 83 char buf[50]; 84 sprintf(buf, "Option %s unknown", argv[i]); 85 do_log("parseArguments", buf, LOG_LEVEL_ERROR, LOG_TYPE_NORMAL); 86 config->print_usage=1; 87 return -1; 88 } 89 if(i>=argc){ 90 do_log("parseArguments", "Too few Arguments omitted", LOG_LEVEL_ERROR, LOG_TYPE_NORMAL); 91 return -2; 92 } 93 } 94 optionAddCommand(config, NULL, NULL); 95 return 0; 96 }