
#include <stdio.h>

struct cmd_opt{
	int opt_o;
	int opt_q;
	int opt_d;
	int string_start;
	int string_num;
};


int cmdline(int argc,char* argv[],struct cmd_opt*o){
	char* p;
	int i=1;
	int opt_flag=0;
	
	//必ず-oと文字列が必要
	if(argc<3) return -1;
	
	o->opt_o=0;
	o->opt_q=0;
	o->opt_d=-1;
	o->string_start=0;
	o->string_num=0;
	
	p=argv[1];
	
	while(i<=argc){
		switch(*p){
		case '-':
		case '+':
		case '/':
			p++;
			opt_flag=1;
			break;
		default:
			break;
		}
		
		//オプション解析終了
		if(opt_flag==0){
			if(o->opt_o==0) return -1;
			if(o->opt_d==-1) return -1;
			o->string_start=i;
			o->string_num=argc-i;
			if(o->string_num==0) return -1;
			else return 0;
		}
		
		switch(*p){
		case 'o':
		case 'O':
			o->opt_o=1;
			break;

		case 'q':
		case 'Q':
			o->opt_q=1;
			break;

		case 'd':
		case 'D':
			p++;;
			if(*p==0){
				p=argv[++i];
			}
			if('0'>*p||*p>'2')
				return -1;
			o->opt_d=*p-'0';
			break;
		default:
			return -1;
			break;
		}
		p++;
		if(*p==0){
			p=argv[++i];
			opt_flag=0;
		}
	}
	return -1;
}

void put_usage(){
	printf("usage:cmdopt -o [-q] -d{0|1|2} 文字列 [文字列 ...]\n");
}

int main(int argc,char* argv[]){
	int ret;
	int i;
	
	struct cmd_opt o;
	
	ret=cmdline(argc,argv,&o);
	
	if(ret==-1){
		put_usage();
		return -1;
	}
	
	printf("[Option Info]\n");
	printf("o(output):%s\n",o.opt_o?"ON":"OFF");
	printf("q(output):%s\n",o.opt_q?"ON":"OFF");
	printf("d(output):%d\n",o.opt_d);
	
	printf("\n");
	printf("[Parameter Info]\n");
	printf("String Num:%d\n",o.string_num);
	for(i=1;i<=o.string_num;i++){
		printf("%d:%s\n",i,argv[i+o.string_start-1]);
	}
	return 0;
}


