From a2df70871ff2494610edf71f7c7c74b785a69cd6 Mon Sep 17 00:00:00 2001 From: ja7 Date: Mon, 17 Jun 2002 14:57:34 +0000 Subject: [PATCH] Added support for adding tab completions to any command with out a build in completion function. add the folowing line to allow tab completion on element set name f2locations to the elements command register_tab elements f2locations som small clean up of the tabcompletions added completion on filenames to the set_apdufile set_marcdump . and ! commands now uses strncasecmp when findding stuff to complete on. eg format xml "tabcomplets to" format XML Extended authentication command to allow 2 arguments and send userid and password in the Z_IdAuthentication_idPass structure --- client/client.c | 191 ++++++++++++++++++++++++++++++++++---------------- client/tabcomplete.c | 18 ++++- client/tabcomplete.h | 3 +- 3 files changed, 148 insertions(+), 64 deletions(-) diff --git a/client/client.c b/client/client.c index b1147d6..6fa0c04 100644 --- a/client/client.c +++ b/client/client.c @@ -2,7 +2,7 @@ * Copyright (c) 1995-2002, Index Data * See the file LICENSE for details. * - * $Id: client.c,v 1.158 2002-06-10 11:07:57 adam Exp $ + * $Id: client.c,v 1.159 2002-06-17 14:57:34 ja7 Exp $ */ #include @@ -72,6 +72,7 @@ static int kilobytes = 1024; static char* yazCharset = 0; static char* yazLang = 0; + static char last_cmd[32] = "?"; static FILE *marcdump = 0; static char *refid = NULL; @@ -106,7 +107,8 @@ int rl_attempted_completion_over = 0; void process_cmd_line(char* line); char ** readline_completer(char *text, int start, int end); char *command_generator(const char *text, int state); - +char** curret_global_list=NULL; +int cmd_register_tab(char* arg); ODR getODROutputStream() { @@ -431,6 +433,15 @@ int cmd_authentication(char *arg) au.which = Z_IdAuthentication_open; au.u.open = user; } + if (r == 2) + { + auth = &au; + au.which = Z_IdAuthentication_idPass; + au.u.idPass = &idPass; + idPass.groupId = NULL; + idPass.userId = user; + idPass.password = group; + } if (r == 3) { auth = &au; @@ -2355,7 +2366,8 @@ int cmd_register_oid(char* args) { return 1; } -int cmd_push_command(char* arg) { +int cmd_push_command(char* arg) +{ #if HAVE_READLINE_HISTORY_H if(strlen(arg)>1) add_history(arg); @@ -2365,11 +2377,13 @@ int cmd_push_command(char* arg) { return 1; } -void source_rcfile() { +void source_rcfile() +{ /* Look for a $HOME/.yazclientrc and source it if it exists */ struct stat statbuf; char buffer[1000]; char* homedir=getenv("HOME"); + if(!homedir) return; sprintf(buffer,"%s/.yazclientrc",homedir); @@ -2539,61 +2553,66 @@ void wait_and_handle_responce() static int cmd_help (char *line); +typedef char *(*completerFunctionType)(const char *text, int state); + static struct { char *cmd; int (*fun)(char *arg); char *ad; - char *(*rl_completerfunction)(const char *text, int state); + completerFunctionType rl_completerfunction; + //char *(*rl_completerfunction)(const char *text, int state); int complete_filenames; + char **local_tabcompletes; } cmd[] = { - {"open", cmd_open, "('tcp'|'ssl')':[':'][/]",NULL,0}, - {"quit", cmd_quit, "",NULL,0}, - {"find", cmd_find, "",NULL,0}, - {"delete", cmd_delete, "",NULL,0}, - {"base", cmd_base, "",NULL,0}, - {"show", cmd_show, "['+'<#recs>['+']]",NULL,0}, - {"scan", cmd_scan, "",NULL,0}, - {"sort", cmd_sort, " ...",NULL,0}, - {"sort+", cmd_sort_newset, " ...",NULL,0}, - {"authentication", cmd_authentication, "",NULL,0}, - {"lslb", cmd_lslb, "",NULL,0}, - {"ssub", cmd_ssub, "",NULL,0}, - {"mspn", cmd_mspn, "",NULL,0}, - {"status", cmd_status, "",NULL,0}, - {"setnames", cmd_setnames, "",NULL,0}, - {"cancel", cmd_cancel, "",NULL,0}, - {"format", cmd_format, "",complete_format,0}, - {"schema", cmd_schema, "",complete_schema,0}, - {"elements", cmd_elements, "",NULL,0}, - {"close", cmd_close, "",NULL,0}, - {"attributeset", cmd_attributeset, "",complete_attributeset,0}, - {"querytype", cmd_querytype, "",complete_querytype,0}, - {"refid", cmd_refid, "",NULL,0}, - {"itemorder", cmd_itemorder, "ill|item ",NULL,0}, - {"update", cmd_update, "",NULL,0}, - {"packagename", cmd_packagename, "",NULL,0}, - {"proxy", cmd_proxy, "[('tcp'|'ssl')][':']",NULL,0}, - {"charset", cmd_charset, "",NULL,0}, - {"lang", cmd_lang, "",NULL,0}, - {".", cmd_source, "",NULL,1}, - {"!", cmd_subshell, "Subshell command",NULL,0}, - {"set_apdufile", cmd_set_apdufile, "",NULL,0}, - {"set_marcdump", cmd_set_marcdump," ",NULL,0}, - {"set_cclfields", cmd_set_cclfields,"",NULL,1}, - {"register_oid",cmd_register_oid," ",NULL,0}, - {"push_command",cmd_push_command,"",command_generator,0}, + {"open", cmd_open, "('tcp'|'ssl')':[':'][/]",NULL,0,NULL}, + {"quit", cmd_quit, "",NULL,0,NULL}, + {"find", cmd_find, "",NULL,0,NULL}, + {"delete", cmd_delete, "",NULL,0,NULL}, + {"base", cmd_base, "",NULL,0,NULL}, + {"show", cmd_show, "['+'<#recs>['+']]",NULL,0,NULL}, + {"scan", cmd_scan, "",NULL,0,NULL}, + {"sort", cmd_sort, " ...",NULL,0,NULL}, + {"sort+", cmd_sort_newset, " ...",NULL,0,NULL}, + {"authentication", cmd_authentication, "",NULL,0,NULL}, + {"lslb", cmd_lslb, "",NULL,0,NULL}, + {"ssub", cmd_ssub, "",NULL,0,NULL}, + {"mspn", cmd_mspn, "",NULL,0,NULL}, + {"status", cmd_status, "",NULL,0,NULL}, + {"setnames", cmd_setnames, "",NULL,0,NULL}, + {"cancel", cmd_cancel, "",NULL,0,NULL}, + {"format", cmd_format, "",complete_format,0,NULL}, + {"schema", cmd_schema, "",complete_schema,0,NULL}, + {"elements", cmd_elements, "",NULL,0,NULL}, + {"close", cmd_close, "",NULL,0,NULL}, + {"attributeset", cmd_attributeset, "",complete_attributeset,0,NULL}, + {"querytype", cmd_querytype, "",complete_querytype,0,NULL}, + {"refid", cmd_refid, "",NULL,0,NULL}, + {"itemorder", cmd_itemorder, "ill|item ",NULL,0,NULL}, + {"update", cmd_update, "",NULL,0,NULL}, + {"packagename", cmd_packagename, "",NULL,0,NULL}, + {"proxy", cmd_proxy, "[('tcp'|'ssl')][':']",NULL,0,NULL}, + {"charset", cmd_charset, "",NULL,0,NULL}, + {"lang", cmd_lang, "",NULL,0,NULL}, + {".", cmd_source, "",NULL,1,NULL}, + {"!", cmd_subshell, "Subshell command",NULL,1,NULL}, + {"set_apdufile", cmd_set_apdufile, "",NULL,1,NULL}, + {"set_marcdump", cmd_set_marcdump," ",NULL,1,NULL}, + {"set_cclfiele", cmd_set_cclfields," ",NULL,1,NULL}, + {"register_oid", cmd_register_oid," ",NULL,0,NULL}, + {"push_command", cmd_push_command,"",command_generator,0,NULL}, + {"register_tab", cmd_register_tab," ",command_generator,0,NULL}, /* Server Admin Functions */ - {"adm-reindex", cmd_adm_reindex, "",NULL,0}, - {"adm-truncate", cmd_adm_truncate, "('database'|'index')",NULL,0}, - {"adm-create", cmd_adm_create, "",NULL,0}, - {"adm-drop", cmd_adm_drop, "('database'|'index')",NULL,0}, - {"adm-import", cmd_adm_import, " ",NULL,0}, - {"adm-refresh", cmd_adm_refresh, "",NULL,0}, - {"adm-commit", cmd_adm_commit, "",NULL,0}, - {"adm-shutdown", cmd_adm_shutdown, "",NULL,0}, - {"adm-startup", cmd_adm_startup, "",NULL,0}, - {"help", cmd_help, "", NULL}, - {0,0,0,0,0} + {"adm-reindex", cmd_adm_reindex, "",NULL,0,NULL}, + {"adm-truncate", cmd_adm_truncate, "('database'|'index')",NULL,0,NULL}, + {"adm-create", cmd_adm_create, "",NULL,0,NULL}, + {"adm-drop", cmd_adm_drop, "('database'|'index')",NULL,0,NULL}, + {"adm-import", cmd_adm_import, " ",NULL,0,NULL}, + {"adm-refresh", cmd_adm_refresh, "",NULL,0,NULL}, + {"adm-commit", cmd_adm_commit, "",NULL,0,NULL}, + {"adm-shutdown", cmd_adm_shutdown, "",NULL,0,NULL}, + {"adm-startup", cmd_adm_startup, "",NULL,0,NULL}, + {"help", cmd_help, "", NULL,0,NULL}, + {0,0,0,0,0,0} }; static int cmd_help (char *line) @@ -2636,6 +2655,48 @@ static int cmd_help (char *line) return 1; } +int cmd_register_tab(char* arg) { + + char command[101], tabargument[101]; + int i, res; + int num_of_tabs; + char** tabslist; + + if (sscanf (arg, "%100s %100s", command, tabargument) < 1) { + return 0; + }; + + /* locate the amdn in the list */ + for (i = 0; cmd[i].cmd; i++) { + if (!strncmp(cmd[i].cmd, command, strlen(command))) { + break; + } + } + + if(!cmd[i].cmd) { + fprintf(stderr,"Unknown command %s\n",command); + return 1; + }; + + + + if(!cmd[i].local_tabcompletes) { + cmd[i].local_tabcompletes = calloc(1,sizeof(char**)); + }; + + num_of_tabs=0; + + tabslist = cmd[i].local_tabcompletes; + for(;tabslist && *tabslist;tabslist++) { + num_of_tabs++; + }; + + cmd[i].local_tabcompletes=realloc(cmd[i].local_tabcompletes,(num_of_tabs+2)*sizeof(char**)); + tabslist=cmd[i].local_tabcompletes; + tabslist[num_of_tabs]=strdup(tabargument); + tabslist[num_of_tabs+1]=NULL; +} + void process_cmd_line(char* line) { int i,res; @@ -2718,6 +2779,8 @@ char *command_generator(const char *text, int state) char ** readline_completer(char *text, int start, int end) { #if HAVE_READLINE_READLINE_H + completerFunctionType completerToUse; + if(start == 0) { #if HAVE_READLINE_RL_COMPLETION_MATCHES char** res=rl_completion_matches(text, @@ -2746,23 +2809,31 @@ char ** readline_completer(char *text, int start, int end) { } } + if(!cmd[i].cmd) return NULL; + - if(!cmd[i].complete_filenames) - rl_attempted_completion_over = 1; - if(cmd[i].rl_completerfunction) { + curret_global_list = cmd[i].local_tabcompletes; + + completerToUse = cmd[i].rl_completerfunction; + if(completerToUse==NULL) /* if no pr. command completer is defined use the default completer */ + completerToUse = default_completer; + + if(completerToUse) { #ifdef HAVE_READLINE_RL_COMPLETION_MATCHES char** res= rl_completion_matches(text, - cmd[i].rl_completerfunction); + completerToUse); #else char** res= completion_matches(text, - (CPFunction*)cmd[i].rl_completerfunction); + (CPFunction*)completerToUse); #endif - rl_attempted_completion_over = 1; - return res; + if(!cmd[i].complete_filenames) + rl_attempted_completion_over = 1; + return res; } else { - rl_attempted_completion_over = 1; + if(!cmd[i].complete_filenames) + rl_attempted_completion_over = 1; return 0; } } diff --git a/client/tabcomplete.c b/client/tabcomplete.c index 20caa12..db4552c 100644 --- a/client/tabcomplete.c +++ b/client/tabcomplete.c @@ -2,7 +2,7 @@ * Copyright (c) 2002, Index Data * See the file LICENSE for details. * - * $Id: tabcomplete.c,v 1.4 2002-02-24 12:24:40 adam Exp $ + * $Id: tabcomplete.c,v 1.5 2002-06-17 14:57:34 ja7 Exp $ */ #include @@ -12,6 +12,8 @@ #include #include "tabcomplete.h" +extern char** curret_global_list; + /* ***************************************************************************** * * generic compleater @@ -19,13 +21,15 @@ * *****************************************************************************/ char* complete_from_list(char* completions[], const char *text, int state) -{ +{ static int idx; + + if(!completions) return NULL; if(state==0) { idx = 0; } for(; completions[idx]; ++ idx) { - if(!strncmp(completions[idx],text,strlen(text))) { + if(!strncasecmp(completions[idx],text,strlen(text))) { ++idx; /* skip this entry on the next run */ return (char*)strdup(completions[idx-1]); }; @@ -122,6 +126,14 @@ char* complete_attributeset(const char* text, int state) return res; } + +char* default_completer(const char* text, int state) +{ + return complete_from_list(curret_global_list,text,state); +} + + + /* * Local variables: * tab-width: 4 diff --git a/client/tabcomplete.h b/client/tabcomplete.h index 3e3d354..d1552bf 100644 --- a/client/tabcomplete.h +++ b/client/tabcomplete.h @@ -2,7 +2,7 @@ * Copyright (c) 2002, Index Data * See the file LICENSE for details. * - * $Id: tabcomplete.h,v 1.2 2002-01-30 14:51:45 adam Exp $ + * $Id: tabcomplete.h,v 1.3 2002-06-17 14:57:34 ja7 Exp $ */ /* @@ -14,6 +14,7 @@ char* complete_querytype(const char* text, int state); char* complete_format(const char* text, int state); char* complete_schema(const char* text, int state); char* complete_attributeset(const char* text, int state); +char* default_completer(const char* text, int state); /* * Local variables: -- 1.7.10.4