static void parse_and_put_prompt(const char *prmt_ptr)
{
cmdedit_prompt = prmt_ptr;
- cmdedit_prmt_len = strlen(prmt_ptr);
+ cmdedit_prmt_len = unicode_strlen(prmt_ptr);
put_prompt();
}
#else
char c;
char *pbuf;
- cmdedit_prmt_len = 0;
+ /*cmdedit_prmt_len = 0; - already is */
cbuf[1] = '\0'; /* never changes */
}
case '[': case ']':
if (c == flg_not_length) {
- flg_not_length = (flg_not_length == '[' ? ']' : '[');
+ /* Toggle '['/']' hex 5b/5d */
+ flg_not_length ^= 6;
continue;
}
break;
cbuf[0] = c;
cur_prmt_len = strlen(pbuf);
prmt_len += cur_prmt_len;
- if (flg_not_length != ']')
+ if (flg_not_length != ']') {
+#if 0 /*ENABLE_UNICODE_SUPPORT - won't work, pbuf is one BYTE string here. FIXME */
+ cmdedit_prmt_len += unicode_strlen(pbuf);
+#else
cmdedit_prmt_len += cur_prmt_len;
+#endif
+ }
prmt_mem_ptr = strcat(xrealloc(prmt_mem_ptr, prmt_len+1), pbuf);
free(free_me);
} /* while */
S.sent_ESC_br6n = 0;
if (cursor == 0) { /* otherwise it may be bogus */
int col = ((ic >> 32) & 0x7fff) - 1;
- if (col > cmdedit_prmt_len) {
+ /*
+ * Is col > cmdedit_prmt_len?
+ * If yes (terminal says cursor is farther to the right
+ * of where we think it should be),
+ * the prompt wasn't printed starting at col 1,
+ * there was additional text before it.
+ */
+ if ((int)(col - cmdedit_prmt_len) > 0) {
+ /* Fix our understanding of current x position */
cmdedit_x += (col - cmdedit_prmt_len);
while (cmdedit_x >= cmdedit_termw) {
cmdedit_x -= cmdedit_termw;
char read_key_buffer[KEYCODE_BUFFER_SIZE];
const char *matched_history_line;
const char *saved_prompt;
+ unsigned saved_prmt_len;
int32_t ic;
matched_history_line = NULL;
/* Save and replace the prompt */
saved_prompt = cmdedit_prompt;
+ saved_prmt_len = cmdedit_prmt_len;
goto set_prompt;
while (1) {
free((char*)cmdedit_prompt);
set_prompt:
cmdedit_prompt = xasprintf("(reverse-i-search)'%s': ", match_buf);
- cmdedit_prmt_len = strlen(cmdedit_prompt);
+ cmdedit_prmt_len = unicode_strlen(cmdedit_prompt);
goto do_redraw;
}
}
free((char*)cmdedit_prompt);
cmdedit_prompt = saved_prompt;
- cmdedit_prmt_len = strlen(cmdedit_prompt);
+ cmdedit_prmt_len = saved_prmt_len;
redraw(cmdedit_y, command_len - cursor);
return ic;
setlocale(LC_CTYPE, LANG ? LANG : "");
/* In unicode, this is a one character string */
-// can use unicode_strlen(string) too, but otherwise unicode_strlen() is unused
- width = mbstowcs(NULL, unicode_0x394, INT_MAX);
+ width = unicode_strlen(unicode_0x394);
unicode_status = (width == 1 ? UNICODE_ON : UNICODE_OFF);
}
/* The rest is mostly same for libc and for "homegrown" support */
-#if 0 // UNUSED
size_t FAST_FUNC unicode_strlen(const char *string)
{
size_t width = mbstowcs(NULL, string, INT_MAX);
return strlen(string);
return width;
}
-#endif
size_t FAST_FUNC unicode_strwidth(const char *string)
{