/* * Determine if complete is ambiguous. If unique, insert. * If no choices, error. If unambiguous prefix, insert that. * Otherwise, list choices. words is assumed to be filtered * to only contain possible choices. * Args: * word word which started the match * list list by default * words stringlist containing possible matches */ static unsigned char complete_ambiguous(char *word, int list, StringList *words) { char insertstr[MAXPATHLEN * 2]; char *lastmatch; int i, j; size_t matchlen, wordlen; wordlen = strlen(word); if (words->sl_cur == 0) return (CC_ERROR); /* no choices available */ if (words->sl_cur == 1) { /* only once choice available */ char *p = words->sl_str[0] + wordlen; ftpvis(insertstr, sizeof(insertstr), p, strlen(p)); if (el_insertstr(el, insertstr) == -1) return (CC_ERROR); else return (CC_REFRESH); } if (!list) { matchlen = 0; lastmatch = words->sl_str[0]; matchlen = strlen(lastmatch); for (i = 1 ; i < words->sl_cur ; i++) { for (j = wordlen ; j < strlen(words->sl_str[i]); j++) if (lastmatch[j] != words->sl_str[i][j]) break; if (j < matchlen) matchlen = j; } if (matchlen > wordlen) { ftpvis(insertstr, sizeof(insertstr), lastmatch + wordlen, matchlen - wordlen); if (el_insertstr(el, insertstr) == -1) return (CC_ERROR); else /* * XXX: really want CC_REFRESH_BEEP */ return (CC_REFRESH); } } putc('\n', ttyout); qsort(words->sl_str, words->sl_cur, sizeof(char *), comparstr); list_vertical(words); return (CC_REDISPLAY); }
/* * Determine if complete is ambiguous. If unique, insert. * If no choices, error. If unambiguous prefix, insert that. * Otherwise, list choices. words is assumed to be filtered * to only contain possible choices. * Args: * word word which started the match * dolist list by default * words stringlist containing possible matches * Returns a result as per el_set(EL_ADDFN, ...) */ static unsigned char complete_ambiguous(EditLine *el, char *word, int dolist, StringList *words) { char insertstr[MAXPATHLEN]; char *lastmatch, *p; size_t i, j, matchlen, wordlen; wordlen = strlen(word); if (words->sl_cur == 0) return CC_ERROR; /* no choices available */ if (words->sl_cur == 1) { /* only once choice available */ p = words->sl_str[0] + wordlen; if (*p == '\0') /* at end of word? */ return CC_REFRESH; ftpvis(insertstr, sizeof(insertstr), p, strlen(p)); if (el_insertstr(el, insertstr) == -1) return CC_ERROR; else return CC_REFRESH; } if (!dolist) { matchlen = 0; lastmatch = words->sl_str[0]; matchlen = strlen(lastmatch); for (i = 1; i < words->sl_cur; i++) { for (j = wordlen; j < strlen(words->sl_str[i]); j++) if (lastmatch[j] != words->sl_str[i][j]) break; if (j < matchlen) matchlen = j; } if (matchlen >= wordlen) { ftpvis(insertstr, sizeof(insertstr), lastmatch + wordlen, matchlen - wordlen); if (el_insertstr(el, insertstr) == -1) return CC_ERROR; else return CC_REFRESH_BEEP; } } (void)putc('\n', ttyout); qsort(words->sl_str, words->sl_cur, sizeof(char *), comparstr); list_vertical(words); return CC_REDISPLAY; }