1 30 31 package jbet; 32 33 44 45 class MyGetopt { 46 47 49 public static final int NO_ARG = 0; public static final int OPTIONAL_ARG = 1; public static final int REQUIRED_ARG = 2; 53 String [] args; 54 int argind; 55 String opts; 56 57 59 public int optind; public String error; public String optarg; 63 MyLongOpt [] longs; 64 65 69 public MyGetopt (String _opts, String [] _args) { 70 this(_opts, _args, new MyLongOpt [0] ); 71 } 72 73 80 public MyGetopt (String _opts, String [] _args, MyLongOpt [] _longs) { 81 opts = _opts; 82 args = _args; 83 longs = _longs; 84 optind = argind = 0; 85 } 86 87 91 public int getopt() { 92 optarg = null; 93 94 if (optind == args.length) 95 return -1; 96 97 if ( argind == args[optind].length() ) { 98 argind = 0; 99 optind++; 100 } 101 102 if (optind == args.length) return -1; 104 105 if ( argind == 0 && args[optind].startsWith("--") ) { 106 String longopt; 107 String arg = args[optind]; 108 optind++; argind=0; 109 int eqind = arg.indexOf('='); 110 if (eqind == -1) 111 longopt = arg.substring(2); 112 else 113 longopt = arg.substring(2, eqind); 114 115 for (int i = 0; i < longs.length; i++) 116 if ( longopt.equals( longs[i].name ) ) { 117 switch (longs[i].type) { 118 case NO_ARG: 119 if (eqind != -1) { 120 error = "unexpected arguement for --" + longopt; 121 return '?'; 122 } else 123 return longs[i].ret; 124 125 case OPTIONAL_ARG: 126 if (eqind == -1) 127 optarg = null; 128 else 129 optarg = arg.substring(eqind+1); 130 return longs[i].ret; 131 132 case REQUIRED_ARG: 133 if (eqind == -1) { 134 if (optind == args.length) { 135 error = "option incomplete: " + longopt; 136 return opts.charAt(0) == ':' ? ':' : '?' ; 137 } 138 optarg = args[optind]; 139 optind++; 140 } else 141 optarg = arg.substring(eqind+1); 142 return longs[i].ret; 143 } 144 } 145 error = "invalid option: " + arg; 146 return '?'; 147 } 148 149 150 if (argind == 0) { 151 if (args[optind].charAt(argind) == '-') 152 argind++; 153 else { 154 optarg = args[optind]; 155 optind++; 156 return 1; 157 } 158 } 159 160 char opt = args[optind].charAt(argind); 161 argind++; 162 if ( !( ('a'<=opt && opt<='z') || ('A'<=opt && opt<='Z')) ) { 163 error = "invalid option: " + opt; 164 return '?'; 165 } 166 167 for (int i = 0; i < opts.length(); i++) 168 if ( opts.charAt(i)==opt ) { 169 if ( i+1 < opts.length() && opts.charAt(i+1)==':' ) { 170 if ( i+2 < opts.length() && opts.charAt(i+2)==':' ) { 171 optarg = null; 172 if ( argind <= args[optind].length() ) { 173 optarg = args[optind].substring(argind); 174 argind = 0; 175 optind++; 176 } 177 return opt; 178 } 179 if ( argind == args[optind].length() ) { 180 argind = 0; 181 optind++; 182 if (optind == args.length) { 183 error = "option incomplete: " + opt; 184 return opts.charAt(0) == ':' ? ':' : '?' ; 185 } 186 optarg = args[optind]; 187 optind++; 188 return opt; 189 } else { 190 optarg = args[optind].substring(argind); 191 argind = 0; 192 optind++; 193 return opt; 194 } 195 } else { 196 return opt; 197 } 198 } 199 200 error = "invalid option: " + opt; 201 return '?'; 202 } 204 } 205 206 | Popular Tags |