diff -ubNr --exclude-from=/home/azzit/diffrc/ion.conf ion-20011109-pristine/libtu/include/libtu/output.h ion-20011109-query_function/libtu/include/libtu/output.h --- ion-20011109-pristine/libtu/include/libtu/output.h Mon Jan 14 10:39:00 2002 +++ ion-20011109-query_function/libtu/include/libtu/output.h Thu Jan 17 00:07:57 2002 @@ -12,6 +12,8 @@ #include "types.h" +typedef void WarnHandler(const char *); +extern WarnHandler *set_warn_handler(WarnHandler *handler); extern void verbose(const char *p, ...); extern void verbose_v(const char *p, va_list args); diff -ubNr --exclude-from=/home/azzit/diffrc/ion.conf ion-20011109-pristine/libtu/include/libtu/tokenizer.h ion-20011109-query_function/libtu/include/libtu/tokenizer.h --- ion-20011109-pristine/libtu/include/libtu/tokenizer.h Mon Jan 14 10:39:00 2002 +++ ion-20011109-query_function/libtu/include/libtu/tokenizer.h Wed Jan 16 21:11:14 2002 @@ -123,7 +123,9 @@ TOKZ_IGNORE_NEXTLINE=0x1, TOKZ_READ_COMMENTS=0x2, TOKZ_PARSER_INDENT_MODE=0x04, - TOKZ_ERROR_TOLERANT=0x8 + TOKZ_ERROR_TOLERANT=0x8, + TOKZ_READ_FROM_BUFFER=0x10, + TOKZ_DEFAULT_OPTION=0x20 }; @@ -163,6 +165,12 @@ Token ungettok; } Tokenizer_FInfo; +typedef struct _Tokenizer_Buffer{ + char *data; + int len; + int pos; +} Tokenizer_Buffer; + typedef struct _Tokenizer{ FILE *file; char *name; @@ -170,6 +178,8 @@ int ungetc; Token ungettok; + Tokenizer_Buffer buffer; + int flags; const struct _ConfOpt **optstack; int nest_lvl; @@ -184,6 +194,7 @@ extern Tokenizer *tokz_open(const char *fname); extern Tokenizer *tokz_open_file(FILE *file, const char *fname); +extern Tokenizer *tokz_prepare_buffer(char *buffer, int len); extern void tokz_close(Tokenizer *tokz); extern bool tokz_get_token(Tokenizer *tokz, Token *tok); extern void tokz_unget_token(Tokenizer *tokz, Token *tok); diff -ubNr --exclude-from=/home/azzit/diffrc/ion.conf ion-20011109-pristine/libtu/output.c ion-20011109-query_function/libtu/output.c --- ion-20011109-pristine/libtu/output.c Mon Jan 14 10:39:00 2002 +++ ion-20011109-query_function/libtu/output.c Thu Jan 17 00:25:28 2002 @@ -26,11 +26,14 @@ static bool verbose_mode=FALSE; static int verbose_indent_lvl=0; static bool progname_enable=TRUE; +static WarnHandler *current_warn_handler=NULL; #define INDENTATOR_LENGTH 4 static char indentator[]={' ', ' ', ' ', ' '}; +static void do_dispatch_message(const char *message); + void verbose(const char *p, ...) { @@ -100,7 +103,20 @@ */ #define CALL_V(NAME, ARGS) \ - va_list args; va_start(args, p); NAME ARGS; va_end(args); + do { va_list args; va_start(args, p); NAME ARGS; va_end(args); } while(0) + +#define DO_DISPATCH(NAME, ARGS) \ + do {\ + char *msg;\ + if ((msg=NAME ARGS)!=NULL) {\ + do_dispatch_message(msg);\ + free(msg);\ + } else if ((msg=errmsg_err())!=NULL) {\ + do_dispatch_message(msg);\ + free(msg);\ + } else \ + do_dispatch_message("Oops. Error string compilation failed.");\ + } while(0) #ifndef LIBTU_NO_ERRMSG @@ -144,60 +160,30 @@ void warn_v(const char *p, va_list args) { - put_prog_name(); - vfprintf(stderr, p, args); - putc('\n', stderr); + DO_DISPATCH(errmsg_v, (p, args)); } void warn_obj_line_v(const char *obj, int line, const char *p, va_list args) { - put_prog_name(); - if(obj!=NULL){ - if(line>0) - fprintf(stderr, TR("%s:%d: "), obj, line); - else - fprintf(stderr, "%s: ", obj); - }else{ - if(line>0) - fprintf(stderr, TR("%d: "), line); - } - vfprintf(stderr, p, args); - putc('\n', stderr); + DO_DISPATCH(errmsg_obj_line_v, (obj, line, p, args)); } void warn_err() { - put_prog_name(); - fprintf(stderr, "%s\n", strerror(errno)); + DO_DISPATCH(errmsg_err, ()); } void warn_err_obj(const char *obj) { - put_prog_name(); - if(obj!=NULL) - fprintf(stderr, "%s: %s\n", obj, strerror(errno)); - else - fprintf(stderr, "%s\n", strerror(errno)); + DO_DISPATCH(errmsg_err_obj, (obj)); } void warn_err_obj_line(const char *obj, int line) { - put_prog_name(); - if(obj!=NULL){ - if(line>0) - fprintf(stderr, TR("%s:%d: %s\n"), obj, line, strerror(errno)); - else - fprintf(stderr, "%s: %s\n", obj, strerror(errno)); - }else{ - if(line>0) - fprintf(stderr, TR("%d: %s\n"), line, strerror(errno)); - else - fprintf(stderr, TR("%s\n"), strerror(errno)); - } - + DO_DISPATCH(errmsg_err_obj_line, (obj, line)); } @@ -240,7 +226,6 @@ return res; } - char *errmsg_obj_line_v(const char *obj, int line, const char *p, va_list args) { char *res1=NULL, *res2, *res3; @@ -253,7 +238,7 @@ if(line>0) asprintf(&res1, TR("%d: "), line); } - asprintf(&res2, p, args); + vasprintf(&res2, p, args); if(res1!=NULL){ if(res2==NULL) return NULL; @@ -310,12 +295,14 @@ void die(const char *p, ...) { + set_warn_handler(NULL); CALL_V(die_v, (p, args)); } void die_v(const char *p, va_list args) { + set_warn_handler(NULL); warn_v(p, args); exit(EXIT_FAILURE); } @@ -323,18 +310,21 @@ void die_obj(const char *obj, const char *p, ...) { + set_warn_handler(NULL); CALL_V(die_obj_v, (obj, p, args)); } void die_obj_line(const char *obj, int line, const char *p, ...) { + set_warn_handler(NULL); CALL_V(die_obj_line_v, (obj, line, p, args)); } void die_obj_v(const char *obj, const char *p, va_list args) { + set_warn_handler(NULL); warn_obj_v(obj, p, args); exit(EXIT_FAILURE); } @@ -342,6 +332,7 @@ void die_obj_line_v(const char *obj, int line, const char *p, va_list args) { + set_warn_handler(NULL); warn_obj_line_v(obj, line, p, args); exit(EXIT_FAILURE); } @@ -349,6 +340,7 @@ void die_err() { + set_warn_handler(NULL); warn_err(); exit(EXIT_FAILURE); } @@ -356,6 +348,7 @@ void die_err_obj(const char *obj) { + set_warn_handler(NULL); warn_err_obj(obj); exit(EXIT_FAILURE); } @@ -363,6 +356,31 @@ void die_err_obj_line(const char *obj, int line) { + set_warn_handler(NULL); warn_err_obj_line(obj, line); exit(EXIT_FAILURE); } + + +static void default_warn_handler(const char *message) +{ + put_prog_name(); + fprintf(stderr, "%s", message); + putc('\n', stderr); +} + +static void do_dispatch_message(const char *message) +{ + if (current_warn_handler!=NULL) + current_warn_handler(message); + else + default_warn_handler(message); +} + +WarnHandler *set_warn_handler(WarnHandler *handler) +{ + WarnHandler *old=current_warn_handler; + current_warn_handler=handler; + return old; +} + diff -ubNr --exclude-from=/home/azzit/diffrc/ion.conf ion-20011109-pristine/libtu/parser.c ion-20011109-query_function/libtu/parser.c --- ion-20011109-pristine/libtu/parser.c Mon Jan 14 10:39:00 2002 +++ ion-20011109-query_function/libtu/parser.c Wed Jan 16 21:11:14 2002 @@ -216,6 +216,7 @@ int init_nest_lvl; bool had_error; int errornest=0; + bool is_default=FALSE; /* Allocate tokz->optstack if it does not yet exist (if it does, * we have been called from an option handler) @@ -283,11 +284,15 @@ TOK_IDENT_VAL(tokens+0)); if(options==NULL) options=lookup_option(common_opts, TOK_IDENT_VAL(tokens+0)); + if(options==NULL && (tokz->flags&TOKZ_DEFAULT_OPTION)){ + options=lookup_option(tokz->optstack[tokz->nest_lvl], "#default"); + is_default=(options!=NULL); + } if(options==NULL){ had_error=TRUE; tokz_warn_error(tokz, tokens->line, E_TOKZ_UNKNOWN_OPTION); - }else{ + }else if(!is_default) { had_error=!check_args(tokz, tokens, ntokens, options->argfmt); } diff -ubNr --exclude-from=/home/azzit/diffrc/ion.conf ion-20011109-pristine/libtu/tokenizer.c ion-20011109-query_function/libtu/tokenizer.c --- ion-20011109-pristine/libtu/tokenizer.c Mon Jan 14 10:39:00 2002 +++ ion-20011109-query_function/libtu/tokenizer.c Wed Jan 16 21:11:14 2002 @@ -112,6 +112,12 @@ if(tokz->ungetc!=-1){ c=tokz->ungetc; tokz->ungetc=-1; + }else if (tokz->flags&TOKZ_READ_FROM_BUFFER) { + assert(tokz->buffer.data!=NULL); + if (tokz->buffer.pos==tokz->buffer.len) + c=EOF; + else + c=tokz->buffer.data[tokz->buffer.pos++]; }else{ c=getc(tokz->file); } @@ -578,6 +584,7 @@ { int c, c2, e; + if (!(tokz->flags&TOKZ_READ_FROM_BUFFER)) assert(tokz->file!=NULL); tok_free(tok); @@ -804,6 +811,9 @@ tokz->nest_lvl=0; tokz->filestack_n=0; tokz->filestack=NULL; + tokz->buffer.data=0; + tokz->buffer.len=0; + tokz->buffer.pos=0; return tokz; } @@ -838,6 +848,27 @@ return tokz; } +Tokenizer *tokz_prepare_buffer(char *buffer, int len) +{ + Tokenizer *tokz; + char old=0; + + tokz=tokz_create(); + if (len>0) { + old=buffer[len-1]; + buffer[len-1]='\0'; + } + + tokz->flags|=TOKZ_READ_FROM_BUFFER; + tokz->buffer.data=scopy(buffer); + tokz->buffer.len=len>0 ? len : strlen(tokz->buffer.data); + tokz->buffer.pos=0; + + if (old>0) + buffer[len-1]=old; + + return tokz; +} /* * File close diff -ubNr --exclude-from=/home/azzit/diffrc/ion.conf ion-20011109-pristine/src/function.c ion-20011109-query_function/src/function.c --- ion-20011109-pristine/src/function.c Mon Jan 14 10:39:00 2002 +++ ion-20011109-query_function/src/function.c Thu Jan 17 00:26:48 2002 @@ -202,7 +202,7 @@ } -int complete_simplemainfunc(char *nam, char ***cp_ret, char **beg) +int complete_mainfunc(char *nam, char ***cp_ret, char **beg) { char *name; char **cp; @@ -219,9 +219,6 @@ if((name=func->name)==NULL) continue; - if(func->argtypes!=NULL && strcmp(func->argtypes, "")) - continue; - if(l && strncmp(name, nam, l)) continue; diff -ubNr --exclude-from=/home/azzit/diffrc/ion.conf ion-20011109-pristine/src/function.h ion-20011109-query_function/src/function.h --- ion-20011109-pristine/src/function.h Mon Jan 14 10:39:00 2002 +++ ion-20011109-query_function/src/function.h Wed Jan 16 21:13:40 2002 @@ -37,6 +37,6 @@ extern WFunction *lookup_func(const char *name, int funtab); -extern int complete_simplemainfunc(char *nam, char ***cp_ret, char **beg); +extern int complete_mainfunc(char *nam, char ***cp_ret, char **beg); #endif /* INCLUDED_FUNCTION_H */ diff -ubNr --exclude-from=/home/azzit/diffrc/ion.conf ion-20011109-pristine/src/query.c ion-20011109-query_function/src/query.c --- ion-20011109-pristine/src/query.c Mon Jan 14 10:39:00 2002 +++ ion-20011109-query_function/src/query.c Thu Jan 17 00:09:53 2002 @@ -8,6 +8,11 @@ #include #include #include + +#include +#include +#include + #include "common.h" #include "global.h" #include "frame.h" @@ -358,25 +363,72 @@ /*{{{ Misc. */ +/* ugly hack to know what we operate on in opt_default() */ +static WThing *function_thing=NULL; +static char *last_error_message=NULL; -void handler_function(WThing *thing, char *fn, char *userdata) +static void function_warn_handler(const char *message) +{ + if (last_error_message!=NULL) + free(last_error_message); + last_error_message=scopy(message); +} + +static bool opt_default(Tokenizer *tokz, int n, Token *toks) { + WThing *thing=function_thing; WFunction *func; + char *name=TOK_IDENT_VAL(&(toks[0])); - func=lookup_func(fn, FUNTAB_MAIN); + func=lookup_func(name, FUNTAB_MAIN); - if(func==NULL){ - FWARN(("Unknown function '%s' or not in FUNTAB_MAIN.", fn)); - return; + if(func==NULL) { + FWARN(("Unknown function '%s' or not in FUNTAB_MAIN.", name)); + return FALSE; } - if(func->argtypes!=NULL && strcmp(func->argtypes, "")!=0){ - FWARN(("Only simple functions (no arguments)" - " can be called currently.")); - return; + if (!check_args(tokz, toks, n, func->argtypes)){ + FWARN(("Argument check for function '%s' failed. Prototype is '%s'.", name, func->argtypes)); + return FALSE; } - func->callhnd(thing, func, 0, NULL); + func->callhnd(thing, func, n-1, &(toks[1])); + return TRUE; +} + +static ConfOpt command_opts[]={ + {"#default", NULL, opt_default, NULL}, + {NULL, NULL, NULL, NULL} +}; + + +void handler_function(WThing *thing, char *fn, char *userdata) +{ + WarnHandler *old_warn_handler; + Tokenizer *tokz; + bool retval=FALSE; + + function_thing=thing; + old_warn_handler=set_warn_handler(function_warn_handler); + + tokz=tokz_prepare_buffer(fn, -1); + tokz->flags|=TOKZ_DEFAULT_OPTION; + retval=parse_config_tokz(tokz, command_opts); + tokz_close(tokz); + + set_warn_handler(old_warn_handler); + if (retval==FALSE){ + if (last_error_message!=NULL) + FWARN(("%s", last_error_message)); + else + FWARN(("An unknown error occurred while trying to parse your request")); + } + + function_thing=NULL; + if (last_error_message!=NULL){ + free(last_error_message); + last_error_message=NULL; + } } @@ -401,7 +453,7 @@ void query_function(WFrame *frame) { do_query_edln(frame, handler_function, - "Function name:", NULL, complete_simplemainfunc); + "Function name:", NULL, complete_mainfunc); }