Deleted Added
full compact
16,20c16
< * 3. All advertising materials mentioning features or use of this software
< * must display the following acknowledgement:
< * This product includes software developed by the University of
< * California, Berkeley and its contributors.
< * 4. Neither the name of the University nor the names of its contributors
---
> * 3. Neither the name of the University nor the names of its contributors
36c32
< * $NetBSD: chared.c,v 1.13 2001/04/13 01:04:19 lukem Exp $
---
> * $NetBSD: chared.c,v 1.24 2005/08/01 23:00:15 christos Exp $
43c39
< __FBSDID("$FreeBSD: head/lib/libedit/chared.c 84334 2001-10-01 23:00:29Z obrien $");
---
> __FBSDID("$FreeBSD: head/lib/libedit/chared.c 148834 2005-08-07 20:55:59Z stefanf $");
52a49,50
> private void ch__clearmacro(EditLine *);
>
60c58
< cv_undo(EditLine *el,int action, size_t size, char *ptr)
---
> cv_undo(EditLine *el)
63,70c61,75
< vu->action = action;
< vu->ptr = ptr;
< vu->isize = size;
< (void) memcpy(vu->buf, vu->ptr, size);
< #ifdef DEBUG_UNDO
< (void) fprintf(el->el_errfile, "Undo buffer \"%s\" size = +%d -%d\n",
< vu->ptr, vu->isize, vu->dsize);
< #endif
---
> c_redo_t *r = &el->el_chared.c_redo;
> unsigned int size;
>
> /* Save entire line for undo */
> size = el->el_line.lastchar - el->el_line.buffer;
> vu->len = size;
> vu->cursor = el->el_line.cursor - el->el_line.buffer;
> memcpy(vu->buf, el->el_line.buffer, size);
>
> /* save command info for redo */
> r->count = el->el_state.doingarg ? el->el_state.argument : 0;
> r->action = el->el_chared.c_vcmd.action;
> r->pos = r->buf;
> r->cmd = el->el_state.thiscmd;
> r->ch = el->el_state.thisch;
72a78,84
> /* cv_yank():
> * Save yank/delete data for paste
> */
> protected void
> cv_yank(EditLine *el, const char *ptr, int size)
> {
> c_kill_t *k = &el->el_chared.c_kill;
73a86,90
> memcpy(k->buf, ptr, size +0u);
> k->last = k->buf + size;
> }
>
>
82,83c99,102
< if (el->el_line.lastchar + num >= el->el_line.limit)
< return; /* can't go past end of buffer */
---
> if (el->el_line.lastchar + num >= el->el_line.limit) {
> if (!ch_enlargebufs(el, num +0u))
> return; /* can't go past end of buffer */
> }
103a123,127
> if (el->el_map.current != el->el_map.emacs) {
> cv_undo(el);
> cv_yank(el, el->el_line.cursor, num);
> }
>
107,109d130
< if (el->el_map.current != el->el_map.emacs)
< cv_undo(el, INSERT, (size_t)num, el->el_line.cursor);
<
117a139,153
> /* c_delafter1():
> * Delete the character after the cursor, do not yank
> */
> protected void
> c_delafter1(EditLine *el)
> {
> char *cp;
>
> for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++)
> *cp = cp[1];
>
> el->el_line.lastchar--;
> }
>
>
127a164,168
> if (el->el_map.current != el->el_map.emacs) {
> cv_undo(el);
> cv_yank(el, el->el_line.cursor - num, num);
> }
>
131,134d171
< if (el->el_map.current != el->el_map.emacs)
< cv_undo(el, INSERT, (size_t)num,
< el->el_line.cursor - num);
<
144a182,196
> /* c_delbefore1():
> * Delete the character before the cursor, do not yank
> */
> protected void
> c_delbefore1(EditLine *el)
> {
> char *cp;
>
> for (cp = el->el_line.cursor - 1; cp <= el->el_line.lastchar; cp++)
> *cp = cp[1];
>
> el->el_line.lastchar--;
> }
>
>
151c203
< return (isalpha((unsigned char)p) || isdigit((unsigned char)p) || strchr("*?_-.[]~=", p) != NULL);
---
> return (isalnum(p) || strchr("*?_-.[]~=", p) != NULL);
156c208
< * Return type of word for p according to vi
---
> * Return if p is part of a word according to vi
161,165c213,217
< if (isspace((unsigned char) p))
< return 0;
< if ((unsigned char) p == '_' || isalnum((unsigned char) p))
< return 1;
< return 2;
---
> if (isalnum(p) || p == '_')
> return 1;
> if (isgraph(p))
> return 2;
> return 0;
169,170c221,222
< /* c___isword():
< * Return if p is part of a space-delimited word (!isspace)
---
> /* cv__isWord():
> * Return if p is part of a big word according to vi
173,174c225
< c___isword(p)
< int p;
---
> cv__isWord(int p)
176c227
< return !isspace((unsigned char) p);
---
> return (!isspace(p));
238c289
< if (el->el_chared.c_vcmd.action != (DELETE|INSERT))
---
> if (n || el->el_chared.c_vcmd.action != (DELETE|INSERT))
255c306
< cv_prev_word(EditLine *el, char *p, char *low, int n, int (*wtest)(int))
---
> cv_prev_word(char *p, char *low, int n, int (*wtest)(int))
258a310
> p--;
260,267c312,313
< p--;
< /*
< * vi historically deletes with cb only the word preserving the
< * leading whitespace! This is not what 'b' does..
< */
< if (el->el_chared.c_vcmd.action != (DELETE|INSERT))
< while ((p > low) && isspace((unsigned char) *p))
< p--;
---
> while ((p > low) && isspace((unsigned char) *p))
> p--;
271,273d316
< p++;
< while (isspace((unsigned char) *p))
< p++;
274a318
> p++;
325c369
< int oaction;
---
> int action = el->el_chared.c_vcmd.action;
327c371
< if (el->el_chared.c_vcmd.action & INSERT)
---
> if (action & INSERT)
330,332d373
< oaction = el->el_chared.c_vcmd.action;
< el->el_chared.c_vcmd.action = NOP;
<
333a375
> /* sanity */
336,345c378,379
<
< if (el->el_line.cursor > el->el_chared.c_vcmd.pos) {
< size = (int) (el->el_line.cursor - el->el_chared.c_vcmd.pos);
< c_delbefore(el, size);
< el->el_line.cursor = el->el_chared.c_vcmd.pos;
< re_refresh_cursor(el);
< } else if (el->el_line.cursor < el->el_chared.c_vcmd.pos) {
< size = (int)(el->el_chared.c_vcmd.pos - el->el_line.cursor);
< c_delafter(el, size);
< } else {
---
> size = el->el_line.cursor - el->el_chared.c_vcmd.pos;
> if (size == 0)
347c381,394
< c_delafter(el, size);
---
> el->el_line.cursor = el->el_chared.c_vcmd.pos;
> if (action & YANK) {
> if (size > 0)
> cv_yank(el, el->el_line.cursor, size);
> else
> cv_yank(el, el->el_line.cursor + size, -size);
> } else {
> if (size > 0) {
> c_delafter(el, size);
> re_refresh_cursor(el);
> } else {
> c_delbefore(el, -size);
> el->el_line.cursor += size;
> }
349,365c396
< switch (oaction) {
< case DELETE|INSERT:
< el->el_chared.c_undo.action = DELETE|INSERT;
< break;
< case DELETE:
< el->el_chared.c_undo.action = INSERT;
< break;
< case NOP:
< case INSERT:
< default:
< EL_ABORT((el->el_errfile, "Bad oaction %d\n", oaction));
< break;
< }
<
<
< el->el_chared.c_undo.ptr = el->el_line.cursor;
< el->el_chared.c_undo.dsize = size;
---
> el->el_chared.c_vcmd.action = NOP;
395c426
< cv__endword(char *p, char *high, int n)
---
> cv__endword(char *p, char *high, int n, int (*wtest)(int))
396a428,429
> int test;
>
403,409c436,438
< if (isalnum((unsigned char) *p))
< while ((p < high) && isalnum((unsigned char) *p))
< p++;
< else
< while ((p < high) && !(isspace((unsigned char) *p) ||
< isalnum((unsigned char) *p)))
< p++;
---
> test = (*wtest)((unsigned char) *p);
> while ((p < high) && (*wtest)((unsigned char) *p) == test)
> p++;
420a450,451
> c_macro_t *ma = &el->el_chared.c_macro;
>
428c459
< el->el_line.limit = &el->el_line.buffer[EL_BUFSIZ - 2];
---
> el->el_line.limit = &el->el_line.buffer[EL_BUFSIZ - EL_LEAVE];
434,437c465,472
< el->el_chared.c_undo.action = NOP;
< el->el_chared.c_undo.isize = 0;
< el->el_chared.c_undo.dsize = 0;
< el->el_chared.c_undo.ptr = el->el_line.buffer;
---
> el->el_chared.c_undo.len = -1;
> el->el_chared.c_undo.cursor = 0;
> el->el_chared.c_redo.buf = (char *) el_malloc(EL_BUFSIZ);
> if (el->el_chared.c_redo.buf == NULL)
> return (-1);
> el->el_chared.c_redo.pos = el->el_chared.c_redo.buf;
> el->el_chared.c_redo.lim = el->el_chared.c_redo.buf + EL_BUFSIZ;
> el->el_chared.c_redo.cmd = ED_UNASSIGNED;
441d475
< el->el_chared.c_vcmd.ins = el->el_line.buffer;
458,462c492,495
< el->el_chared.c_macro.nline = NULL;
< el->el_chared.c_macro.level = -1;
< el->el_chared.c_macro.macro = (char **) el_malloc(EL_MAXMACRO *
< sizeof(char *));
< if (el->el_chared.c_macro.macro == NULL)
---
> ma->level = -1;
> ma->offset = 0;
> ma->macro = (char **) el_malloc(EL_MAXMACRO * sizeof(char *));
> if (ma->macro == NULL)
471c504
< ch_reset(EditLine *el)
---
> ch_reset(EditLine *el, int mclear)
476,479c509,510
< el->el_chared.c_undo.action = NOP;
< el->el_chared.c_undo.isize = 0;
< el->el_chared.c_undo.dsize = 0;
< el->el_chared.c_undo.ptr = el->el_line.buffer;
---
> el->el_chared.c_undo.len = -1;
> el->el_chared.c_undo.cursor = 0;
483d513
< el->el_chared.c_vcmd.ins = el->el_line.buffer;
495c525,527
< el->el_chared.c_macro.level = -1;
---
> if (mclear)
> ch__clearmacro(el);
> }
497c529,535
< el->el_history.eventno = 0;
---
> private void
> ch__clearmacro(el)
> EditLine *el;
> {
> c_macro_t *ma = &el->el_chared.c_macro;
> while (ma->level >= 0)
> el_free((ptr_t)ma->macro[ma->level--]);
538c576,577
< el->el_line.limit = &newbuffer[newsz - EL_LEAVE];
---
> /* don't set new size until all buffers are enlarged */
> el->el_line.limit = &newbuffer[sz - EL_LEAVE];
567,569d605
<
< el->el_chared.c_undo.ptr = el->el_line.buffer +
< (el->el_chared.c_undo.ptr - oldbuf);
570a607,615
>
> newbuffer = el_realloc(el->el_chared.c_redo.buf, newsz);
> if (!newbuffer)
> return 0;
> el->el_chared.c_redo.pos = newbuffer +
> (el->el_chared.c_redo.pos - el->el_chared.c_redo.buf);
> el->el_chared.c_redo.lim = newbuffer +
> (el->el_chared.c_redo.lim - el->el_chared.c_redo.buf);
> el->el_chared.c_redo.buf = newbuffer;
574a620,621
> /* Safe to set enlarged buffer size */
> el->el_line.limit = &el->el_line.buffer[newsz - EL_LEAVE];
588a636,640
> el_free((ptr_t) el->el_chared.c_redo.buf);
> el->el_chared.c_redo.buf = NULL;
> el->el_chared.c_redo.pos = NULL;
> el->el_chared.c_redo.lim = NULL;
> el->el_chared.c_redo.cmd = ED_UNASSIGNED;
590a643
> ch_reset(el, 1);
593d645
< ch_reset(el);
641c693
< c_gets(EditLine *el, char *buf)
---
> c_gets(EditLine *el, char *buf, const char *prompt)
644c696,697
< int len = 0;
---
> int len;
> char *cp = el->el_line.buffer;
646,648c699,717
< for (ch = 0; ch == 0;) {
< if (el_getc(el, &ch) != 1)
< return (ed_end_of_file(el, 0));
---
> if (prompt) {
> len = strlen(prompt);
> memcpy(cp, prompt, len + 0u);
> cp += len;
> }
> len = 0;
>
> for (;;) {
> el->el_line.cursor = cp;
> *cp = ' ';
> el->el_line.lastchar = cp + 1;
> re_refresh(el);
>
> if (el_getc(el, &ch) != 1) {
> ed_end_of_file(el, 0);
> len = -1;
> break;
> }
>
649a719
>
652,660c722,724
< if (len > 1) {
< *el->el_line.cursor-- = '\0';
< el->el_line.lastchar = el->el_line.cursor;
< buf[len--] = '\0';
< } else {
< el->el_line.buffer[0] = '\0';
< el->el_line.lastchar = el->el_line.buffer;
< el->el_line.cursor = el->el_line.buffer;
< return (CC_REFRESH);
---
> if (len <= 0) {
> len = -1;
> break;
662,664c726,727
< re_refresh(el);
< ch = 0;
< break;
---
> cp--;
> continue;
668a732
> buf[len] = ch;
672c736
< if (len >= EL_BUFSIZ)
---
> if (len >= EL_BUFSIZ - 16)
676,677c740
< *el->el_line.cursor++ = ch;
< el->el_line.lastchar = el->el_line.cursor;
---
> *cp++ = ch;
679,681c742
< re_refresh(el);
< ch = 0;
< break;
---
> continue;
682a744
> break;
684,685c746,750
< buf[len] = ch;
< return (len);
---
>
> el->el_line.buffer[0] = '\0';
> el->el_line.lastchar = el->el_line.buffer;
> el->el_line.cursor = el->el_line.buffer;
> return len;