1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#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;
}