version 1.23, 2009/05/05 19:35:30 |
version 1.24, 2010/04/25 09:11:54 |
|
|
static unsigned char complete_command(char *, int); |
static unsigned char complete_command(char *, int); |
static unsigned char complete_local(char *, int); |
static unsigned char complete_local(char *, int); |
static unsigned char complete_remote(char *, int); |
static unsigned char complete_remote(char *, int); |
|
static void ftpvis(char *, size_t, const char *, size_t); |
|
|
static int |
static int |
comparstr(const void *a, const void *b) |
comparstr(const void *a, const void *b) |
|
|
static unsigned char |
static unsigned char |
complete_ambiguous(char *word, int list, StringList *words) |
complete_ambiguous(char *word, int list, StringList *words) |
{ |
{ |
char insertstr[MAXPATHLEN]; |
char insertstr[MAXPATHLEN * 2]; |
char *lastmatch; |
char *lastmatch; |
int i, j; |
int i, j; |
size_t matchlen, wordlen; |
size_t matchlen, wordlen; |
|
|
return (CC_ERROR); /* no choices available */ |
return (CC_ERROR); /* no choices available */ |
|
|
if (words->sl_cur == 1) { /* only once choice available */ |
if (words->sl_cur == 1) { /* only once choice available */ |
(void)strlcpy(insertstr, words->sl_str[0], sizeof insertstr); |
char *p = words->sl_str[0] + wordlen; |
if (el_insertstr(el, insertstr + wordlen) == -1) |
ftpvis(insertstr, sizeof(insertstr), p, strlen(p)); |
|
if (el_insertstr(el, insertstr) == -1) |
return (CC_ERROR); |
return (CC_ERROR); |
else |
else |
return (CC_REFRESH); |
return (CC_REFRESH); |
|
|
matchlen = j; |
matchlen = j; |
} |
} |
if (matchlen > wordlen) { |
if (matchlen > wordlen) { |
(void)strlcpy(insertstr, lastmatch, matchlen+1); |
ftpvis(insertstr, sizeof(insertstr), |
if (el_insertstr(el, insertstr + wordlen) == -1) |
lastmatch + wordlen, matchlen); |
|
if (el_insertstr(el, insertstr) == -1) |
return (CC_ERROR); |
return (CC_ERROR); |
else |
else |
/* |
/* |
|
|
} |
} |
|
|
return (CC_ERROR); |
return (CC_ERROR); |
|
} |
|
|
|
/* |
|
* Copy characters from src into dst, \ quoting characters that require it. |
|
*/ |
|
static void |
|
ftpvis(char *dst, size_t dstlen, const char *src, size_t srclen) |
|
{ |
|
size_t di, si; |
|
|
|
/* paranoia paranoia everybody's trying to get me */ |
|
if (dstlen == 0) |
|
return; |
|
if (srclen == 0) { |
|
dst[0] = '\0'; |
|
return; |
|
} |
|
|
|
di = si = 0; |
|
while (src[si] != '\0' && di < dstlen && si < srclen) { |
|
switch (src[si]) { |
|
case '\\': |
|
case ' ': |
|
case '\t': |
|
case '\r': |
|
case '\n': |
|
case '"': |
|
/* Need room for two characters and NUL, avoiding |
|
* incomplete escape sequences at end of dst. */ |
|
if (di >= dstlen - 3) |
|
break; |
|
dst[di++] = '\\'; |
|
/* FALLTHROUGH */ |
|
default: |
|
dst[di] = src[si++]; |
|
if (di < dstlen) |
|
di++; |
|
} |
|
} |
|
dst[di] = '\0'; |
} |
} |
|
|
#endif /* !SMALL */ |
#endif /* !SMALL */ |