linebuf++;
/* end of buf, we match all inst */
- if (isendofline(*linebuf) || iscomment(*linebuf))
+ if (*linebuf == '\0' || isendofline(*linebuf) || iscomment(*linebuf))
return 0;
/* garbage after inst */
/* end of inst */
if (token == NULL) {
- n = snprintf(helpbuf, sizeof(helpbuf), "[RETURN]\n");
+ n = snprintf(helpbuf, sizeof(helpbuf), "[Return]\n");
if (n > 0)
write_buf(opaque, helpbuf, n);
continue;
else
iterate = 1;
+ /* store the incomplete token in tmpbuf */
+ n = preparse.comp_tok_len + 1;
+ if (n > sizeof(tmpbuf))
+ n = sizeof(tmpbuf);
+ snprintf(tmpbuf, n, "%s", preparse.comp_tok_buf);
+
if (iterate == 1 &&
- token->ops->complete_start(token, &preparse.opaque) < 0) {
+ token->ops->complete_start(token, tmpbuf,
+ &preparse.opaque) < 0) {
/* cancel iteration, complete_start() returned
* a negative value, meaning no completion */
iterate = 0;
while (token->ops->complete_iterate(token,
&preparse.opaque,
tmpbuf,
- sizeof(tmpbuf)) == 0) {
+ sizeof(tmpbuf)) >= 0) {
debug_printf(" choice <%s>\n", tmpbuf);
token->ops->complete_iterate == NULL)
continue;
+ /* store the incomplete token in tmpbuf */
+ n = preparse.comp_tok_len + 1;
+ if (n > sizeof(tmpbuf))
+ n = sizeof(tmpbuf);
+ snprintf(tmpbuf, n, "%s", preparse.comp_tok_buf);
+
/* non completable */
- if (token->ops->complete_start(token, &preparse.opaque) < 0) {
+ if (token->ops->complete_start(token, tmpbuf,
+ &preparse.opaque) < 0) {
if (token->ops->complete_end != NULL)
token->ops->complete_end(token,
&preparse.opaque);
debug_printf("Completion %s\n", tmpbuf);
/* we kept at least the room for one char */
- /* XXX to be updated for non-final completion */
if (ret == 0)
strcat(tmpbuf, " ");
if (completion_len >= dstsize)
completion_len = dstsize - 1;
strncpy(dst, completion_buf + preparse.comp_tok_len,
- completion_len);
- dst[completion_len] = '\0';
+ completion_len - preparse.comp_tok_len);
+ dst[completion_len - preparse.comp_tok_len] = '\0';
return CMDLINE_COMPLETE_APPEND;
}