MySmartUSB-MK3-Interface

git clone git://xatko.vsos.ethz.ch/MySmartUSB-MK3-Interface.git
Log | Files | Refs

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 }