00001
00018
00019
00020
00021
00022
00023
00024
00025 #include <julius/juliuslib.h>
00026
00031 static USEROPT *useropt_root = NULL;
00032
00044 static USEROPT *
00045 useropt_new()
00046 {
00047 USEROPT *new;
00048
00049 new = (USEROPT *)mymalloc(sizeof(USEROPT));
00050 new->optstr = NULL;
00051 new->desc = NULL;
00052 new->argnum = 0;
00053 new->reqargnum = 0;
00054 new->next = NULL;
00055
00056 return new;
00057 }
00058
00070 static void
00071 useropt_free(USEROPT *x)
00072 {
00073 if (x->optstr) free(x->optstr);
00074 if (x->desc) free(x->desc);
00075 free(x);
00076 }
00077
00089 void
00090 useropt_free_all()
00091 {
00092 USEROPT *x, *tmp;
00093
00094 x = useropt_root;
00095 while(x) {
00096 tmp = x->next;
00097 useropt_free(x);
00098 x = tmp;
00099 }
00100 useropt_root = NULL;
00101 }
00102
00128 boolean
00129 j_add_option(char *fmt, int argnum, int reqargnum, char *desc, boolean (*func)(Jconf *jconf, char *arg[], int argnum))
00130 {
00131 USEROPT *new;
00132
00133 if (fmt[0] != '-') {
00134 jlog("ERROR: j_add_option: option string must start with \'-\': %s\n", fmt);
00135 return FALSE;
00136 }
00137 if (argnum < reqargnum) {
00138 jlog("ERROR: j_add_option: number of required argument (%d) larger than total (%d)\n", reqargnum, argnum);
00139 return FALSE;
00140 }
00141
00142
00143 new = useropt_new();
00144
00145 new->optstr = strcpy((char *)mymalloc(strlen(fmt)+1), fmt);
00146
00147 new->argnum = argnum;
00148
00149
00150 new->reqargnum = reqargnum;
00151
00152 new->desc = strcpy((char*)mymalloc(strlen(desc)+1),desc);
00153
00154
00155 new->func = func;
00156
00157
00158 new->next = useropt_root;
00159 useropt_root = new;
00160
00161 return TRUE;
00162 }
00163
00164
00186 int
00187 useropt_exec(Jconf *jconf, char *argv[], int argc, int *n)
00188 {
00189 USEROPT *x;
00190 int narg, i;
00191
00192 for(x=useropt_root;x;x=x->next) {
00193 if (strmatch(argv[*n], x->optstr)) {
00194 i = *n + 1;
00195 while(i < argc && (argv[i][0] != '-' || (argv[i][1] >= '0' && argv[i][1] <= '9'))) i++;
00196
00197 narg = i - *n - 1;
00198 if (narg > x->argnum || narg < x->reqargnum) {
00199 if (x->reqargnum != x->argnum) {
00200 jlog("ERROR: useropt_exec: \"%s\" should have at least %d argument(s)\n", x->optstr, x->reqargnum);
00201 } else {
00202 jlog("ERROR: useropt_exec: \"%s\" should have %d argument(s)\n", x->optstr, x->argnum);
00203 }
00204 return -1;
00205 }
00206
00207 if ((*(x->func))(jconf, &(argv[(*n)+1]), narg) == FALSE) {
00208 jlog("ERROR: useropt_exec: \"%s\" function returns FALSE\n", x->optstr);
00209 return -1;
00210 }
00211 *n += narg;
00212 return 1;
00213 }
00214 }
00215
00216 return 0;
00217 }
00218
00232 void
00233 useropt_show_desc(FILE *fp)
00234 {
00235 USEROPT *x;
00236 int i;
00237
00238 if (! useropt_root) return;
00239 fprintf(fp, "\n Additional options for application:\n");
00240 for(x=useropt_root;x;x=x->next) {
00241 fprintf(fp, " [%s", x->optstr);
00242 for(i=0;i<x->reqargnum;i++) fprintf(fp, " arg");
00243 for(i=x->reqargnum;i<x->argnum;i++) fprintf(fp, " (arg)");
00244 fprintf(fp, "]\t%s\n", x->desc);
00245 }
00246 }
00247
00248