This commit is contained in:
		| @ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * $Id: getopt.c 285 2008-07-23 03:59:57Z baconevi $ |  * $Id: getopt.c 286 2008-07-23 14:11:17Z baconevi $ | ||||||
|  *  |  *  | ||||||
|  * {License} |  * {License} | ||||||
|  */ |  */ | ||||||
| @ -128,7 +128,7 @@ ase_cint_t ase_getopt (int argc, ase_char_t* const* argv, ase_opt_t* opt) | |||||||
|  |  | ||||||
| /* Code based on Unununium project (http://unununium.org/) */ | /* Code based on Unununium project (http://unununium.org/) */ | ||||||
|  |  | ||||||
| ase_cint_t ase_getopt_long (int argc, ase_char_t* const* argv, ase_opt_t* opt) | ase_cint_t ase_getopt (int argc, ase_char_t* const* argv, ase_opt_t* opt) | ||||||
| { | { | ||||||
| 	static int lastidx,lastofs; | 	static int lastidx,lastofs; | ||||||
| 	ase_char_t* tmp; | 	ase_char_t* tmp; | ||||||
| @ -136,10 +136,12 @@ ase_cint_t ase_getopt_long (int argc, ase_char_t* const* argv, ase_opt_t* opt) | |||||||
| 	if (opt->ind == 0) opt->ind = 1; | 	if (opt->ind == 0) opt->ind = 1; | ||||||
|  |  | ||||||
| again: | again: | ||||||
| 	if (opt->ind > argc || !argv[opt->ind] || | 	if (opt->ind > argc || !argv[opt->ind] ||  | ||||||
| 	    *argv[opt->ind] != ASE_T('-') || argv[opt->ind][1] == AES_T('\0')) return -1; | 	    argv[opt->ind][0] != ASE_T('-') ||  | ||||||
|  | 	    argv[opt->ind][1] == AES_T('\0')) return -1; | ||||||
|  |  | ||||||
| 	if (argv[opt->ind][1] == ASE_T('-') && argv[opt->ind][2]==ASE_T('\0'))  | 	if (argv[opt->ind][1] == ASE_T('-') &&  | ||||||
|  | 	    argv[opt->ind][2] == ASE_T('\0'))  | ||||||
| 	{ | 	{ | ||||||
| 		++opt->ind; | 		++opt->ind; | ||||||
| 		return -1; | 		return -1; | ||||||
| @ -147,53 +149,74 @@ again: | |||||||
|  |  | ||||||
| 	if (argv[opt->ind][1] == ASE_T('-'))  | 	if (argv[opt->ind][1] == ASE_T('-'))  | ||||||
| 	{	 | 	{	 | ||||||
|  | 		/* a long option */ | ||||||
|  |  | ||||||
| 		ase_char_t* arg = argv[opt->ind] + 2; | 		ase_char_t* arg = argv[opt->ind] + 2; | ||||||
| 		const struct option* o; | 		const struct option* o; | ||||||
|  |  | ||||||
| 		/* TODO: rewrite it.. */ | 		/* TODO: rewrite it.. */ | ||||||
| 		char* max=strchr(arg,'='); | 		/*char* max=strchr(arg,'='); | ||||||
| 		if (max == ASE_NULL) max = arg + strlen(arg); | 		if (max == ASE_NULL) max = arg + strlen(arg);*/ | ||||||
|  | 		ase_char_t* max = arg; | ||||||
|  | 		while (*max != ASE_T('\0') && *max != ASE_T('=')) max++; | ||||||
|  |  | ||||||
| 		for (o=longopts; o->name; ++o)  | 		//for (o = longopts; o->name != ASE_NULL; o++)  | ||||||
|  | 		for (o = opt->lopt; o->name != ASE_NULL; o++)  | ||||||
| 		{ | 		{ | ||||||
| 			if (!strncmp (o->name, arg, max - arg))  | 			//if (!strncmp (o->name, arg, max - arg))  | ||||||
|  | 			if (ase_strxcmp (arg, max-arg, o->name) != 0) continue; | ||||||
|  |  | ||||||
|  | 			/* match */ | ||||||
|  | 			//if (longindex != ASE_NULL) *longindex =o - longopts; | ||||||
|  | 			if (longindex != ASE_NULL) opt->lidx = o - opt->lopt; | ||||||
|  | 			if (o->has_arg > 0)  | ||||||
| 			{ | 			{ | ||||||
| 				/* match */ | 				if (*max == ASE_T('='))  | ||||||
| 				if (longindex) *longindex=o-longopts; |  | ||||||
| 				if (o->has_arg>0)  |  | ||||||
| 				{ | 				{ | ||||||
| 					if (*max == '=') opt->arg=max+1; | 					opt->arg = max + 1; | ||||||
| 					else  | 				} | ||||||
| 					{ | 				else  | ||||||
| 						opt->arg=argv[opt->ind+1]; | 				{ | ||||||
| 						if (!opt->arg && o->has_arg==1)  | 					opt->arg = argv[opt->ind+1]; | ||||||
| 						{	/* no argument there */ | 					if (!opt->arg && o->has_arg == 1)  | ||||||
| 							if (*optstring==':') return ':'; | 					{	/* no argument there */ | ||||||
| 							write(2,"argument required: `",20); | 						if (*opt->str == ASE_T(':'))  | ||||||
| 							write(2,arg,(size_t)(max-arg)); | 							return ASE_T(':'); | ||||||
| 							write(2,"'.\n",3); |  | ||||||
| 							++opt->ind; | 						/* | ||||||
| 							return '?'; | 						write(2,"argument required: `",20); | ||||||
| 						} | 						write(2,arg,(size_t)(max-arg)); | ||||||
| 						++opt->ind; | 						write(2,"'.\n",3); | ||||||
| 					} | 						*/ | ||||||
|  | 						opt->ind++; | ||||||
|  | 						return ASE_T('?'); | ||||||
|  | 					} | ||||||
|  | 					opt->ind++; | ||||||
| 				} | 				} | ||||||
| 				++opt->ind; |  | ||||||
| 				if (o->flag) |  | ||||||
| 					*(o->flag)=o->val; |  | ||||||
| 				else |  | ||||||
| 					return o->val; |  | ||||||
| 				return 0; |  | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|  | 			opt->ind++; | ||||||
|  |  | ||||||
|  | 			if (o->flag) | ||||||
|  | 				*(o->flag)=o->val; | ||||||
|  | 			else | ||||||
|  | 				return o->val; | ||||||
|  |  | ||||||
|  | 			return 0; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if (*optstring==':') return ':'; | 		if (*opt->str == ASE_T(':')) return ASE_T(':'); | ||||||
|  |  | ||||||
|  | 		/* | ||||||
| 		write(2,"invalid option `",16); | 		write(2,"invalid option `",16); | ||||||
| 		write(2,arg,(size_t)(max-arg)); | 		write(2,arg,(size_t)(max-arg)); | ||||||
| 		write(2,"'.\n",3); | 		write(2,"'.\n",3); | ||||||
| 		++opt->ind; | 		*/ | ||||||
| 		return '?'; |  | ||||||
|  | 		opt->ind++; | ||||||
|  | 		return ASE_T('?'); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (lastidx!=opt->ind) { | 	if (lastidx!=opt->ind) { | ||||||
| 		lastidx=opt->ind; lastofs=0; | 		lastidx=opt->ind; lastofs=0; | ||||||
| 	} | 	} | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user