--- .//dll/fserv/fserv.c.orig Tue Jan 18 21:00:07 2000 +++ .//dll/fserv/fserv.c Tue Jan 18 21:00:19 2000 @@ -1162,7 +1162,7 @@ add_module_proc(HOOK_PROC, "Fserv", NULL, "*", MSG_LIST, 1, NULL, search_proc); add_module_proc(HOOK_PROC, "Fserv", NULL, "*", PUBLIC_OTHER_LIST, 1, NULL, search_proc); - add_completion_type("fsload", 3, FILE_COMPLETION); + add_completion_type("fsload", 3, FILE_COMPLETION,NULL); add_timer(0, empty_string, get_dllint_var("fserv_time"), 1, impress_me, NULL, NULL, -1, "fserv"); strcpy(FSstr, cparse(FS, NULL, NULL)); @@ -1177,4 +1177,4 @@ put_it("%s for help with this fserv, /fshelp", FSstr); return 0; } - \ No newline at end of file + --- .//dll/nap/nap.c.orig Wed Jan 19 14:17:52 2000 +++ .//dll/nap/nap.c Tue Jan 18 21:01:34 2000 @@ -2139,8 +2139,8 @@ add_module_proc(VAR_PROC, nap_name, "napster_format", NULL, STR_TYPE_VAR, 0, set_numeric_string, NULL); add_module_proc(VAR_PROC, nap_name, "napster_dir", NULL, STR_TYPE_VAR, 0, NULL, NULL); - add_completion_type("nload", 4, FILE_COMPLETION); - add_completion_type("nreload", 4, FILE_COMPLETION); + add_completion_type("nload", 4, FILE_COMPLETION,NULL); + add_completion_type("nreload", 4, FILE_COMPLETION,NULL); naphelp(NULL, NULL, NULL, NULL, NULL); sprintf(buffer, "$0+Napster %s by panasync - $2 $3", nap_version); --- .//include/module.h.orig Tue Jan 18 01:24:49 2000 +++ .//include/module.h Tue Jan 18 20:29:36 2000 @@ -633,7 +633,14 @@ CHECK_EXT_MAIL, DEFAULT_OUTPUT_FUNCTION, DEFAULT_STATUS_OUTPUT_FUNCTION, - NUMBER_OF_GLOBAL_FUNCTIONS + NUMBER_OF_GLOBAL_FUNCTIONS, + +/* window.c again */ + WINDOW_QUERY, + +/* input.c again */ + + OVERWRITE_TABKEY_COMP }; extern Function_ptr global_table[]; --- .//include/modval.h.orig Tue Jan 18 16:50:22 2000 +++ .//include/modval.h Tue Jan 18 20:28:58 2000 @@ -360,7 +360,8 @@ #define getnextnick(x, y, z, a) ((NickTab *) (global[GETNEXTNICK]((int)x, (char *)y, (char *)z, (char *)a))) #define getchannick(x, y) ((char *) (global[GETCHANNICK]((char *)x, (char *)y))) #define lookup_nickcompletion(x, y) ((NickList *) (global[LOOKUP_NICKCOMPLETION]((ChannelList *)x, (char *)y))) -#define add_completion_type(x, y, z) ((int) (global[ADD_COMPLETION_TYPE]((char *)x, (int)y, (enum completion)z))) +#define add_completion_type(x, y, z, a) ((int) (global[ADD_COMPLETION_TYPE]((char *)x, (int)y, (enum completion)z, a))) +#define overwrite_tabkey_comp(a,b) (global[OVERWRITE_TABKEY_COMP](a,b)) /* names.c */ #define is_channel(x) ((int) (global[IS_CHANNEL]((char *)x))) --- .//include/input.h.orig Tue Jan 18 16:23:49 2000 +++ .//include/input.h Thu Jan 20 17:05:28 2000 @@ -157,11 +157,15 @@ DCC_COMPLETION, LOAD_COMPLETION, SERVER_COMPLETION, - CDCC_COMPLETION + CDCC_COMPLETION, + CUSTOM_COMPLETION, + TABKEY_OVERWRITE }; - char *get_completions (enum completion, char *, int *, char **); - int add_completion_type (char *, int, enum completion); + char *get_completions (enum completion *, char *, int *, char **, char * (*)(int, char *, int *, char **)); + int add_completion_type (char *, int, enum completion, char * (*)(int, char *, int *, char **)); + +void overwrite_tabkey_comp(int (*)(int, char *, int *, char **), char * (*)(int, char *, int *, char **)); extern NickTab *tabkey_array; extern NickTab *autoreply_array; --- .//source/modules.c.orig Tue Jan 18 01:38:07 2000 +++ .//source/modules.c Tue Jan 18 20:53:49 2000 @@ -423,6 +423,7 @@ global_table[RECALCULATE_WINDOW_CURSOR] = (Function_ptr) recalculate_window_cursor; global_table[MAKE_WINDOW_CURRENT] = (Function_ptr) make_window_current; global_table[CLEAR_SCROLLBACK] = (Function_ptr) clear_scrollback; + global_table[WINDOW_QUERY] = (Function_ptr) window_query; global_table[RESET_DISPLAY_TARGET] = (Function_ptr) reset_display_target; global_table[SET_DISPLAY_TARGET] = (Function_ptr) set_display_target; @@ -475,6 +476,7 @@ global_table[GETCHANNICK] = (Function_ptr) getchannick; global_table[LOOKUP_NICKCOMPLETION] = (Function_ptr) lookup_nickcompletion; global_table[ADD_COMPLETION_TYPE] = (Function_ptr) add_completion_type; + global_table[OVERWRITE_TABKEY_COMP] = (Function_ptr) overwrite_tabkey_comp; /* names.c */ global_table[IS_CHANOP] = (Function_ptr) is_chanop; --- .//source/input.c.orig Tue Jan 18 15:58:30 2000 +++ .//source/input.c Thu Jan 20 20:10:02 2000 @@ -62,6 +62,9 @@ NickTab *tabkey_array = NULL, *autoreply_array = NULL; +int (*do_over_write_tabkey_complete)(int, char *, int *, char **) = NULL; +char * (*over_write_tabkey_complete_func)(int, char *, int *, char **) = NULL; + const int WIDTH = 10; @@ -2119,7 +2122,8 @@ struct _ext_name_type *next; char *name; int len; - enum completion type; + enum completion type; + char * (*comp_func)(int, char *, int *, char **); } Ext_Name_Type; Ext_Name_Type *ext_completion = NULL; @@ -2161,7 +2165,14 @@ return NULL; } -char *get_completions(enum completion type, char *possible, int *count, char **suggested) +void overwrite_tabkey_comp(int (*check)(int, char *, int *, char **) , char * (*overwrite)(int, char *, int *, char **) ) +{ + do_over_write_tabkey_complete = check; + over_write_tabkey_complete_func = overwrite; + return; +} + +char *get_completions(enum completion *t, char *possible, int *count, char **suggested, char * (*cf)(int, char *, int *, char **)) { char *booya = NULL; char *path = NULL; @@ -2169,6 +2180,7 @@ glob_t globbers; int numglobs = 0, i; int globtype = GLOB_MARK; +enum completion type = *t; #if defined(__EMX__) || defined(WINNT) if (possible && *possible) @@ -2191,6 +2203,18 @@ case TABKEY_COMPLETION: { NickTab *n = tabkey_array; + /* + * bad hack + * better idea would be to make this into a list + * and allow multiple modules to create over writes + * then, go to the first module that says it wants to + * do a tab_complete + */ + if ( do_over_write_tabkey_complete != NULL && over_write_tabkey_complete_func != NULL && do_over_write_tabkey_complete((int) type, possible, count, suggested) ) { + *t = TABKEY_OVERWRITE; + return over_write_tabkey_complete_func((int) type, possible, count, suggested); + } + /* put_it("opted not do!"); */ *count = 0; if (possible) { @@ -2377,6 +2401,18 @@ #endif break; } + case CUSTOM_COMPLETION: + { + char *c; + if ( cf == NULL ) { + return NULL; + /* put_it("CF IS NULL!"); */ + } + c = cf((int)type, possible, count ,suggested); + /* put_it(c); */ + return c; + break; + } default: return NULL; } @@ -2507,6 +2543,7 @@ int got_space = 0; char *get = NULL; Ext_Name_Type *extcomp = ext_completion; +char * (*cf)(int, char *, int *, char **) = NULL; /* * is this the != second word, then just complete from the @@ -2597,6 +2634,7 @@ case CDCC: if (wcount == 2 || wcount == 3) type = CDCC_COMPLETION; + break; } break; @@ -2609,6 +2647,7 @@ if (!my_strnicmp(p, extcomp->name, extcomp->len)) { type = extcomp->type; + cf = extcomp->comp_func; break; } } @@ -2628,7 +2667,7 @@ #endif do_more_tab: count = 0; - if ((get = get_completions(type, possible, &count, &suggested))) + if ((get = get_completions(&type, possible, &count, &suggested, cf))) { char buffer[BIG_BUFFER_SIZE+1]; char *p = NULL; @@ -2640,8 +2679,11 @@ p = extract(get_input(), 0, wcount - 2); else if (suggested && *suggested) p = m_3dup("/", suggested, ""); - if (type == TABKEY_COMPLETION) + + if (type == TABKEY_COMPLETION) snprintf(buffer, BIG_BUFFER_SIZE, "%s %s%s%s ", (p && *p == '/') ? p : "/m", get, (p && (*p != '/'))?space:empty_string, (p && (*p != '/'))?p:empty_string); + else if ( type == TABKEY_OVERWRITE ) + snprintf(buffer, BIG_BUFFER_SIZE, "%s",get); else { if (wcount == 1 && got_space) @@ -2729,10 +2771,11 @@ case SERVER_COMPLETION: case TABKEY_COMPLETION: case CHAN_COMPLETION: + case CUSTOM_COMPLETION: { char *n, *use = get; n = new_next_arg(use, &use); - count = 0; + count = 0; while (n && *n) { strmcat(buffer, n, BIG_BUFFER_SIZE); @@ -2750,6 +2793,7 @@ put_it("%s", convert_output_format(fget_string_var(FORMAT_COMPLETE_FSET),"%s", buffer)); break; } + case TABKEY_OVERWRITE: case NO_COMPLETION: break; default: @@ -2776,15 +2820,16 @@ return; } -int add_completion_type(char *name, int len, enum completion type) +int add_completion_type(char *name, int len, enum completion type, char * (*cf)(int, char *, int *, char **)) { -Ext_Name_Type *new; + Ext_Name_Type *new; if (!find_in_list((List **)&ext_completion, name, 0)) { new = (Ext_Name_Type *)new_malloc(sizeof(Ext_Name_Type)); new->name = m_strdup(name); new->len = len; new->type = type; + new->comp_func =cf; add_to_list((List **)&ext_completion, (List *)new); return 1; } --- .//source/functions.c.orig Tue Jan 18 16:44:28 2000 +++ .//source/functions.c Thu Jan 20 17:10:53 2000 @@ -7020,8 +7020,9 @@ #ifdef WANT_TABKEY char *ret, *possible; int count = 0; /* 6 */ +enum completion comp_type = 3; possible = next_arg(input, &input); - ret = get_completions(3, possible, &count, NULL); + ret = get_completions(&comp_type, possible, &count, NULL, NULL); return m_sprintf("%d %s", count, ret ? ret : empty_string); #else RETURN_EMPTY; @@ -7033,8 +7034,9 @@ #ifdef WANT_TABKEY char *ret, *possible; int count = 0;/* 4 */ +enum completion comp_type = 7; possible = next_arg(input, &input); - ret = get_completions(7, possible, &count, NULL); + ret = get_completions(&comp_type, possible, &count, NULL, NULL); return m_sprintf("%d %s", count, ret ? ret : empty_string); #else RETURN_EMPTY;