summaryrefslogtreecommitdiff
path: root/src/editor.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/editor.c')
-rw-r--r--src/editor.c223
1 files changed, 132 insertions, 91 deletions
diff --git a/src/editor.c b/src/editor.c
index ac10d1f..6c17754 100644
--- a/src/editor.c
+++ b/src/editor.c
@@ -157,36 +157,48 @@ execute_edit_action (rp_input_line *line, KeySym ch, unsigned int modifier, char
static edit_status
editor_forward_char (rp_input_line *line)
{
- if (line->position < line->length)
+ if (line->position == line->length)
+ return EDIT_NO_OP;
+
+ if (RP_IS_UTF8_START (line->buffer[line->position]))
{
- line->position++;
- return EDIT_MOVE;
+ do
+ line->position++;
+ while (RP_IS_UTF8_CONT (line->buffer[line->position]));
}
else
- return EDIT_NO_OP;
+ line->position++;
+ return EDIT_MOVE;
}
static edit_status
editor_backward_char (rp_input_line *line)
{
- if (line->position > 0)
- {
- line->position--;
- return EDIT_MOVE;
- }
- else
+ if (line->position == 0)
return EDIT_NO_OP;
+
+ do
+ line->position--;
+ while (line->position > 0 && RP_IS_UTF8_CONT (line->buffer[line->position]));
+
+ return EDIT_MOVE;
}
static edit_status
editor_forward_word (rp_input_line *line)
{
- if (line->position < line->length)
- {
- for (; line->position < line->length && !isalnum (line->buffer[line->position]); line->position++);
- for (; line->position < line->length && isalnum (line->buffer[line->position]); line->position++);
- }
+ if (line->position == line->length)
+ return EDIT_NO_OP;
+
+ while (line->position < line->length
+ && !isalnum (line->buffer[line->position]))
+ line->position++;
+
+ while (line->position < line->length
+ && (isalnum (line->buffer[line->position])
+ || RP_IS_UTF8_CHAR (line->buffer[line->position])))
+ line->position++;
return EDIT_MOVE;
}
@@ -194,11 +206,16 @@ editor_forward_word (rp_input_line *line)
static edit_status
editor_backward_word (rp_input_line *line)
{
- if (line->position > 0)
- {
- for (; line->position > 0 && !isalnum (line->buffer[line->position - 1]); line->position--);
- for (; line->position > 0 && isalnum (line->buffer[line->position - 1]); line->position--);
- }
+ if (line->position == 0)
+ return EDIT_NO_OP;
+
+ while (line->position > 0 && !isalnum (line->buffer[line->position]))
+ line->position--;
+
+ while (line->position > 0
+ && (isalnum (line->buffer[line->position])
+ || RP_IS_UTF8_CHAR (line->buffer[line->position])))
+ line->position--;
return EDIT_MOVE;
}
@@ -206,77 +223,100 @@ editor_backward_word (rp_input_line *line)
static edit_status
editor_beginning_of_line (rp_input_line *line)
{
- if (line->position > 0)
- line->position = 0;
-
- return EDIT_MOVE;
+ if (line->position == 0)
+ return EDIT_NO_OP;
+ else
+ {
+ line->position = 0;
+ return EDIT_MOVE;
+ }
}
static edit_status
editor_end_of_line (rp_input_line *line)
{
- if (line->position < line->length)
- line->position = line->length;
-
- return EDIT_MOVE;
+ if (line->position == line->length)
+ return EDIT_NO_OP;
+ else
+ {
+ line->position = line->length;
+ return EDIT_MOVE;
+ }
}
static edit_status
editor_delete_char (rp_input_line *line)
{
- int i;
+ size_t diff = 0;
- if (line->position < line->length)
- {
- for (i = line->position; i < line->length; i++)
- line->buffer[i] = line->buffer[i + 1];
+ if (line->position == line->length)
+ return EDIT_NO_OP;
- line->length--;
- return EDIT_DELETE;
+ if (RP_IS_UTF8_START (line->buffer[line->position]))
+ {
+ do
+ diff++;
+ while (RP_IS_UTF8_CONT (line->buffer[line->position + diff]));
}
else
- return EDIT_NO_OP;
+ diff++;
+
+ memmove (&line->buffer[line->position],
+ &line->buffer[line->position + diff],
+ line->length - line->position + diff + 1);
+
+ line->length -= diff;
+
+ return EDIT_DELETE;
}
static edit_status
editor_backward_delete_char (rp_input_line *line)
{
- int i;
-
- if (line->position > 0)
- {
- for (i = line->position - 1; i < line->length; i++)
- line->buffer[i] = line->buffer[i + 1];
+ size_t diff = 1;
- line->position--;
- line->length--;
- return EDIT_DELETE;
- }
- else
+ if (line->position == 0)
return EDIT_NO_OP;
+
+ while (line->position - diff > 0
+ && RP_IS_UTF8_CONT (line->buffer[line->position - diff]))
+ diff++;
+
+ memmove (&line->buffer[line->position - diff],
+ &line->buffer[line->position],
+ line->length - line->position + 1);
+
+ line->position -= diff;
+ line->length -= diff;
+
+ return EDIT_DELETE;
}
static edit_status
editor_kill_word (rp_input_line *line)
{
- int i, diff;
+ size_t diff = 0;
+ if (line->position == line->length)
+ return EDIT_NO_OP;
- if (line->position < line->length)
- {
- for (i = line->position; i < line->length && !isalnum (line->buffer[i]); i++);
- for (; i < line->length && isalnum (line->buffer[i]); i++);
+ while (line->position + diff < line->length &&
+ !isalnum (line->buffer[line->position + diff]))
+ diff++;
- diff = i - line->position;
+ while (line->position + diff < line->length
+ && (isalnum (line->buffer[line->position + diff])
+ || RP_IS_UTF8_CHAR (line->buffer[line->position + diff])))
+ diff++;
- /* Add the word to the X11 selection. */
- set_nselection (&line->buffer[line->position], diff);
+ /* Add the word to the X11 selection. */
+ set_nselection (&line->buffer[line->position], diff);
- for (i = line->position; i <= line->length - diff; i++)
- line->buffer[i] = line->buffer[i + diff];
+ memmove (&line->buffer[line->position],
+ &line->buffer[line->position + diff],
+ line->length - line->position + diff + 1);
- line->length -= diff;
- }
+ line->length -= diff;
return EDIT_DELETE;
}
@@ -284,25 +324,29 @@ editor_kill_word (rp_input_line *line)
static edit_status
editor_backward_kill_word (rp_input_line *line)
{
- int i, diff;
+ size_t diff = 1;
- if (line->position > 0)
- {
- for (i = line->position; i > 0 && !isalnum (line->buffer[i - 1]); i--);
- for (; i > 0 && isalnum (line->buffer[i - 1]); i--);
+ if (line->position == 0)
+ return EDIT_NO_OP;
- diff = line->position - i;
+ while (line->position - diff > 0 &&
+ !isalnum (line->buffer[line->position - diff]))
+ diff++;
- line->position = i;
+ while (line->position - diff > 0
+ && (isalnum (line->buffer[line->position - diff])
+ || RP_IS_UTF8_CHAR (line->buffer[line->position - diff])))
+ diff++;
- /* Add the word to the X11 selection. */
- set_nselection (&line->buffer[line->position], diff);
+ /* Add the word to the X11 selection. */
+ set_nselection (&line->buffer[line->position - diff], diff);
- for (; i <= line->length - diff; i++)
- line->buffer[i] = line->buffer[i + diff];
+ memmove (&line->buffer[line->position - diff],
+ &line->buffer[line->position],
+ line->length - line->position + 1);
- line->length -= diff;
- }
+ line->position -= diff;
+ line->length -= diff;
return EDIT_DELETE;
}
@@ -310,14 +354,14 @@ editor_backward_kill_word (rp_input_line *line)
static edit_status
editor_kill_line (rp_input_line *line)
{
- if (line->position < line->length)
- {
- /* Add the line to the X11 selection. */
- set_selection (&line->buffer[line->position]);
+ if (line->position == line->length)
+ return EDIT_NO_OP;
- line->length = line->position;
- line->buffer[line->length] = 0;
- }
+ /* Add the line to the X11 selection. */
+ set_selection (&line->buffer[line->position]);
+
+ line->length = line->position;
+ line->buffer[line->length] = '\0';
return EDIT_DELETE;
}
@@ -326,14 +370,9 @@ editor_kill_line (rp_input_line *line)
static void
backward_kill_line (rp_input_line *line)
{
- int i;
-
- /* If we're at the beginning, we have nothing to do. */
- if (line->position <= 0)
- return;
-
- for (i = line->position; i<= line->length; i++)
- line->buffer[i - line->position] = line->buffer[i];
+ memmove (&line->buffer[0],
+ &line->buffer[line->position],
+ line->length - line->position + 1);
line->length -= line->position;
line->position = 0;
@@ -342,7 +381,7 @@ backward_kill_line (rp_input_line *line)
static edit_status
editor_backward_kill_line (rp_input_line *line)
{
- if (line->position <= 0)
+ if (line->position == 0)
return EDIT_NO_OP;
/* Add the line to the X11 selection. */
@@ -429,7 +468,7 @@ editor_no_action (rp_input_line *line UNUSED)
static edit_status
editor_insert (rp_input_line *line, char *keysym_buf)
{
- int nbytes;
+ size_t nbytes;
PRINT_DEBUG (("keysym_buf: '%s'\n", keysym_buf));
@@ -441,8 +480,10 @@ editor_insert (rp_input_line *line, char *keysym_buf)
line->buffer = xrealloc (line->buffer, line->size);
}
- memmove (&line->buffer[line->position + nbytes], &line->buffer[line->position], line->length - line->position);
- strncpy (&line->buffer[line->position], keysym_buf, nbytes);
+ memmove (&line->buffer[line->position + nbytes],
+ &line->buffer[line->position],
+ line->length - line->position + 1);
+ memcpy (&line->buffer[line->position], keysym_buf, nbytes);
line->length += nbytes;
line->position += nbytes;