154210Sbostic /*- 254210Sbostic * Copyright (c) 1992 The Regents of the University of California. 354210Sbostic * All rights reserved. 454210Sbostic * 554210Sbostic * This code is derived from software contributed to Berkeley by 654210Sbostic * Christos Zoulas of Cornell University. 754210Sbostic * 854210Sbostic * %sccs.include.redist.c% 954210Sbostic */ 1054210Sbostic 11*54624Schristos #if !defined(lint) && !defined(SCCSID) 12*54624Schristos static char sccsid[] = "@(#)chared.c 5.2 (Berkeley) 07/03/92"; 13*54624Schristos #endif /* not lint && not SCCSID */ 1454210Sbostic 1554210Sbostic /* 16*54624Schristos * chared.c: Character editor utilities 1754210Sbostic */ 1854210Sbostic #include "sys.h" 1954210Sbostic 2054210Sbostic #include <stdlib.h> 2154210Sbostic #include "el.h" 2254210Sbostic 2354210Sbostic /* cv_undo(): 2454210Sbostic * Handle state for the vi undo command 2554210Sbostic */ 2654210Sbostic protected void 2754210Sbostic cv_undo(el, action, size, ptr) 2854210Sbostic EditLine *el; 2954210Sbostic int action, size; 3054210Sbostic char *ptr; 3154210Sbostic { 3254210Sbostic c_undo_t *vu = &el->el_chared.c_undo; 3354210Sbostic vu->action = action; 3454210Sbostic vu->ptr = ptr; 3554210Sbostic vu->isize = size; 3654210Sbostic (void) memcpy(vu->buf, vu->ptr, size); 3754210Sbostic #ifdef DEBUG_UNDO 3854210Sbostic (void) fprintf(el->el_errfile, "Undo buffer \"%s\" size = +%d -%d\n", 3954210Sbostic vu->ptr, vu->isize, vu->dsize); 4054210Sbostic #endif 4154210Sbostic } 4254210Sbostic 4354210Sbostic 4454210Sbostic /* c_insert(): 4554210Sbostic * Insert num characters 4654210Sbostic */ 4754210Sbostic protected void 4854210Sbostic c_insert(el, num) 4954210Sbostic EditLine *el; 5054210Sbostic int num; 5154210Sbostic { 5254210Sbostic char *cp; 5354210Sbostic 5454210Sbostic if (el->el_line.lastchar + num >= el->el_line.limit) 5554210Sbostic return; /* can't go past end of buffer */ 5654210Sbostic 5754210Sbostic if (el->el_line.cursor < el->el_line.lastchar) { 5854210Sbostic /* if I must move chars */ 5954210Sbostic for (cp = el->el_line.lastchar; cp >= el->el_line.cursor; cp--) 6054210Sbostic cp[num] = *cp; 6154210Sbostic } 6254210Sbostic el->el_line.lastchar += num; 6354210Sbostic } /* end c_insert */ 6454210Sbostic 6554210Sbostic 6654210Sbostic /* c_delafter(): 6754210Sbostic * Delete num characters after the cursor 6854210Sbostic */ 6954210Sbostic protected void 7054210Sbostic c_delafter(el, num) 7154210Sbostic EditLine *el; 7254210Sbostic int num; 7354210Sbostic { 7454210Sbostic 7554210Sbostic if (el->el_line.cursor + num > el->el_line.lastchar) 7654210Sbostic num = el->el_line.lastchar - el->el_line.cursor; 7754210Sbostic 7854210Sbostic if (num > 0) { 7954210Sbostic char *cp; 8054210Sbostic 8154210Sbostic if (el->el_map.current != el->el_map.emacs) 8254210Sbostic cv_undo(el, INSERT, num, el->el_line.cursor); 8354210Sbostic 8454210Sbostic for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++) 8554210Sbostic *cp = cp[num]; 8654210Sbostic 8754210Sbostic el->el_line.lastchar -= num; 8854210Sbostic } 8954210Sbostic } 9054210Sbostic 9154210Sbostic 9254210Sbostic /* c_delbefore(): 9354210Sbostic * Delete num characters before the cursor 9454210Sbostic */ 9554210Sbostic protected void 9654210Sbostic c_delbefore(el, num) 9754210Sbostic EditLine *el; 9854210Sbostic int num; 9954210Sbostic { 10054210Sbostic 10154210Sbostic if (el->el_line.cursor - num < el->el_line.buffer) 10254210Sbostic num = el->el_line.cursor - el->el_line.buffer; 10354210Sbostic 10454210Sbostic if (num > 0) { 10554210Sbostic char *cp; 10654210Sbostic 10754210Sbostic if (el->el_map.current != el->el_map.emacs) 10854210Sbostic cv_undo(el, INSERT, num, el->el_line.cursor - num); 10954210Sbostic 11054210Sbostic for (cp = el->el_line.cursor - num; cp <= el->el_line.lastchar; cp++) 11154210Sbostic *cp = cp[num]; 11254210Sbostic 11354210Sbostic el->el_line.lastchar -= num; 11454210Sbostic } 11554210Sbostic } 11654210Sbostic 11754210Sbostic 11854210Sbostic /* ce__isword(): 11954210Sbostic * Return if p is part of a word according to emacs 12054210Sbostic */ 12154210Sbostic protected int 12254210Sbostic ce__isword(p) 12354210Sbostic int p; 12454210Sbostic { 12554210Sbostic return isalpha(p) || isdigit(p) || strchr("*?_-.[]~=", p) != NULL; 12654210Sbostic } 12754210Sbostic 12854210Sbostic 12954210Sbostic /* cv__isword(): 13054210Sbostic * Return if p is part of a word according to vi 13154210Sbostic */ 13254210Sbostic protected int 13354210Sbostic cv__isword(p) 13454210Sbostic int p; 13554210Sbostic { 13654210Sbostic return !isspace(p); 13754210Sbostic } 13854210Sbostic 13954210Sbostic 14054210Sbostic /* c__prev_word(): 14154210Sbostic * Find the previous word 14254210Sbostic */ 14354210Sbostic protected char * 14454210Sbostic c__prev_word(p, low, n, wtest) 14554210Sbostic register char *p, *low; 14654210Sbostic register int n; 14754210Sbostic int (*wtest) __P((int)); 14854210Sbostic { 14954210Sbostic p--; 15054210Sbostic 15154210Sbostic while (n--) { 15254210Sbostic while ((p >= low) && !(*wtest)((unsigned char) *p)) 15354210Sbostic p--; 15454210Sbostic while ((p >= low) && (*wtest)((unsigned char) *p)) 15554210Sbostic p--; 15654210Sbostic } 15754210Sbostic 15854210Sbostic /* cp now points to one character before the word */ 15954210Sbostic p++; 16054210Sbostic if (p < low) 16154210Sbostic p = low; 16254210Sbostic /* cp now points where we want it */ 16354210Sbostic return p; 16454210Sbostic } 16554210Sbostic 16654210Sbostic 16754210Sbostic /* c__next_word(): 16854210Sbostic * Find the next word 16954210Sbostic */ 17054210Sbostic protected char * 17154210Sbostic c__next_word(p, high, n, wtest) 17254210Sbostic register char *p, *high; 17354210Sbostic register int n; 17454210Sbostic int (*wtest) __P((int)); 17554210Sbostic { 17654210Sbostic while (n--) { 17754210Sbostic while ((p < high) && !(*wtest)((unsigned char) *p)) 17854210Sbostic p++; 17954210Sbostic while ((p < high) && (*wtest)((unsigned char) *p)) 18054210Sbostic p++; 18154210Sbostic } 18254210Sbostic if (p > high) 18354210Sbostic p = high; 18454210Sbostic /* p now points where we want it */ 18554210Sbostic return p; 18654210Sbostic } 18754210Sbostic 18854210Sbostic /* cv_next_word(): 18954210Sbostic * Find the next word vi style 19054210Sbostic */ 19154210Sbostic protected char * 19254210Sbostic cv_next_word(el, p, high, n, wtest) 19354210Sbostic EditLine *el; 19454210Sbostic register char *p, *high; 19554210Sbostic register int n; 19654210Sbostic int (*wtest) __P((int)); 19754210Sbostic { 19854210Sbostic int test; 19954210Sbostic 20054210Sbostic while (n--) { 20154210Sbostic test = (*wtest)((unsigned char) *p); 20254210Sbostic while ((p < high) && (*wtest)((unsigned char) *p) == test) 20354210Sbostic p++; 20454210Sbostic /* 20554210Sbostic * vi historically deletes with cw only the word preserving the 20654210Sbostic * trailing whitespace! This is not what 'w' does.. 20754210Sbostic */ 20854210Sbostic if (el->el_chared.c_vcmd.action != (DELETE|INSERT)) 20954210Sbostic while ((p < high) && isspace((unsigned char) *p)) 21054210Sbostic p++; 21154210Sbostic } 21254210Sbostic 21354210Sbostic /* p now points where we want it */ 21454210Sbostic if (p > high) 21554210Sbostic return high; 21654210Sbostic else 21754210Sbostic return p; 21854210Sbostic } 21954210Sbostic 22054210Sbostic 22154210Sbostic /* cv_prev_word(): 22254210Sbostic * Find the previous word vi style 22354210Sbostic */ 22454210Sbostic protected char * 22554210Sbostic cv_prev_word(el, p, low, n, wtest) 22654210Sbostic EditLine *el; 22754210Sbostic register char *p, *low; 22854210Sbostic register int n; 22954210Sbostic int (*wtest) __P((int)); 23054210Sbostic { 23154210Sbostic int test; 23254210Sbostic 23354210Sbostic while (n--) { 23454210Sbostic p--; 23554210Sbostic /* 23654210Sbostic * vi historically deletes with cb only the word preserving the 23754210Sbostic * leading whitespace! This is not what 'b' does.. 23854210Sbostic */ 23954210Sbostic if (el->el_chared.c_vcmd.action != (DELETE|INSERT)) 24054210Sbostic while ((p > low) && isspace((unsigned char) *p)) 24154210Sbostic p--; 24254210Sbostic test = (*wtest)((unsigned char) *p); 24354210Sbostic while ((p >= low) && (*wtest)((unsigned char) *p) == test) 24454210Sbostic p--; 24554210Sbostic p++; 24654210Sbostic while (isspace((unsigned char) *p)) 24754210Sbostic p++; 24854210Sbostic } 24954210Sbostic 25054210Sbostic /* p now points where we want it */ 25154210Sbostic if (p < low) 25254210Sbostic return low; 25354210Sbostic else 25454210Sbostic return p; 25554210Sbostic } 25654210Sbostic 25754210Sbostic 25854210Sbostic #ifdef notdef 25954210Sbostic /* c__number(): 26054210Sbostic * Ignore character p points to, return number appearing after that. 26154210Sbostic * A '$' by itself means a big number; "$-" is for negative; '^' means 1. 26254210Sbostic * Return p pointing to last char used. 26354210Sbostic */ 26454210Sbostic protected char * 26554210Sbostic c__number(p, num, dval) 26654210Sbostic char *p; /* character position */ 26754210Sbostic int *num; /* Return value */ 26854210Sbostic int dval; /* dval is the number to subtract from like $-3 */ 26954210Sbostic { 27054210Sbostic register int i; 27154210Sbostic register int sign = 1; 27254210Sbostic 27354210Sbostic if (*++p == '^') { 27454210Sbostic *num = 1; 27554210Sbostic return p; 27654210Sbostic } 27754210Sbostic if (*p == '$') { 27854210Sbostic if (*++p != '-') { 27954210Sbostic *num = 0x7fffffff; /* Handle $ */ 28054210Sbostic return --p; 28154210Sbostic } 28254210Sbostic sign = -1; /* Handle $- */ 28354210Sbostic ++p; 28454210Sbostic } 28554210Sbostic for (i = 0; isdigit((unsigned char) *p); i = 10 * i + *p++ - '0') 28654210Sbostic continue; 28754210Sbostic *num = (sign < 0 ? dval - i : i); 28854210Sbostic return --p; 28954210Sbostic } 29054210Sbostic #endif 29154210Sbostic 29254210Sbostic /* cv_delfini(): 29354210Sbostic * Finish vi delete action 29454210Sbostic */ 29554210Sbostic protected void 29654210Sbostic cv_delfini(el) 29754210Sbostic EditLine *el; 29854210Sbostic { 29954210Sbostic register int size; 30054210Sbostic int oaction; 30154210Sbostic 30254210Sbostic if (el->el_chared.c_vcmd.action & INSERT) 30354210Sbostic el->el_map.current = el->el_map.key; 30454210Sbostic 30554210Sbostic oaction = el->el_chared.c_vcmd.action; 30654210Sbostic el->el_chared.c_vcmd.action = NOP; 30754210Sbostic 30854210Sbostic if (el->el_chared.c_vcmd.pos == 0) 30954210Sbostic return; 31054210Sbostic 31154210Sbostic 31254210Sbostic if (el->el_line.cursor > el->el_chared.c_vcmd.pos) { 31354210Sbostic size = (int) (el->el_line.cursor - el->el_chared.c_vcmd.pos); 31454210Sbostic c_delbefore(el, size); 31554210Sbostic el->el_line.cursor = el->el_chared.c_vcmd.pos; 31654210Sbostic re_refresh_cursor(el); 31754210Sbostic } 31854210Sbostic else if (el->el_line.cursor < el->el_chared.c_vcmd.pos) { 31954210Sbostic size = (int)(el->el_chared.c_vcmd.pos - el->el_line.cursor); 32054210Sbostic c_delafter(el, size); 32154210Sbostic } 32254210Sbostic else { 32354210Sbostic size = 1; 32454210Sbostic c_delafter(el, size); 32554210Sbostic } 32654210Sbostic switch (oaction) { 32754210Sbostic case DELETE|INSERT: 32854210Sbostic el->el_chared.c_undo.action = DELETE|INSERT; 32954210Sbostic break; 33054210Sbostic case DELETE: 33154210Sbostic el->el_chared.c_undo.action = INSERT; 33254210Sbostic break; 33354210Sbostic case NOP: 33454210Sbostic case INSERT: 33554210Sbostic default: 33654210Sbostic abort(); 33754210Sbostic break; 33854210Sbostic } 33954210Sbostic 34054210Sbostic 34154210Sbostic el->el_chared.c_undo.ptr = el->el_line.cursor; 34254210Sbostic el->el_chared.c_undo.dsize = size; 34354210Sbostic } 34454210Sbostic 34554210Sbostic 34654210Sbostic #ifdef notdef 34754210Sbostic /* ce__endword(): 34854210Sbostic * Go to the end of this word according to emacs 34954210Sbostic */ 35054210Sbostic protected char * 35154210Sbostic ce__endword(p, high, n) 35254210Sbostic char *p, *high; 35354210Sbostic int n; 35454210Sbostic { 35554210Sbostic p++; 35654210Sbostic 35754210Sbostic while (n--) { 35854210Sbostic while ((p < high) && isspace((unsigned char) *p)) 35954210Sbostic p++; 36054210Sbostic while ((p < high) && !isspace((unsigned char) *p)) 36154210Sbostic p++; 36254210Sbostic } 36354210Sbostic 36454210Sbostic p--; 36554210Sbostic return p; 36654210Sbostic } 36754210Sbostic #endif 36854210Sbostic 36954210Sbostic 37054210Sbostic /* cv__endword(): 37154210Sbostic * Go to the end of this word according to vi 37254210Sbostic */ 37354210Sbostic protected char * 37454210Sbostic cv__endword(p, high, n) 37554210Sbostic char *p, *high; 37654210Sbostic int n; 37754210Sbostic { 37854210Sbostic p++; 37954210Sbostic 38054210Sbostic while (n--) { 38154210Sbostic while ((p < high) && isspace((unsigned char) *p)) 38254210Sbostic p++; 38354210Sbostic 38454210Sbostic if (isalnum((unsigned char) *p)) 38554210Sbostic while ((p < high) && isalnum((unsigned char) *p)) 38654210Sbostic p++; 38754210Sbostic else 38854210Sbostic while ((p < high) && !(isspace((unsigned char) *p) || 38954210Sbostic isalnum((unsigned char) *p))) 39054210Sbostic p++; 39154210Sbostic } 39254210Sbostic p--; 39354210Sbostic return p; 39454210Sbostic } 39554210Sbostic 39654210Sbostic /* ch_init(): 39754210Sbostic * Initialize the character editor 39854210Sbostic */ 39954210Sbostic protected int 40054210Sbostic ch_init(el) 40154210Sbostic EditLine *el; 40254210Sbostic { 40354210Sbostic el->el_line.buffer = (char *) el_malloc(EL_BUFSIZ); 40454210Sbostic (void) memset(el->el_line.buffer, 0, EL_BUFSIZ); 40554210Sbostic el->el_line.cursor = el->el_line.buffer; 40654210Sbostic el->el_line.lastchar = el->el_line.buffer; 40754210Sbostic el->el_line.limit = &el->el_line.buffer[EL_BUFSIZ - 2]; 40854210Sbostic 40954210Sbostic el->el_chared.c_undo.buf = (char *) el_malloc(EL_BUFSIZ); 41054210Sbostic (void) memset(el->el_chared.c_undo.buf, 0, EL_BUFSIZ); 41154210Sbostic el->el_chared.c_undo.action = NOP; 41254210Sbostic el->el_chared.c_undo.isize = 0; 41354210Sbostic el->el_chared.c_undo.dsize = 0; 41454210Sbostic el->el_chared.c_undo.ptr = el->el_line.buffer; 41554210Sbostic 41654210Sbostic el->el_chared.c_vcmd.action = NOP; 41754210Sbostic el->el_chared.c_vcmd.pos = el->el_line.buffer; 41854210Sbostic el->el_chared.c_vcmd.ins = el->el_line.buffer; 41954210Sbostic 42054210Sbostic el->el_chared.c_kill.buf = (char *) el_malloc(EL_BUFSIZ); 42154210Sbostic (void) memset(el->el_chared.c_kill.buf, 0, EL_BUFSIZ); 42254210Sbostic el->el_chared.c_kill.mark = el->el_line.buffer; 42354210Sbostic el->el_chared.c_kill.last = el->el_chared.c_kill.buf; 42454210Sbostic 42554210Sbostic el->el_map.current = el->el_map.key; 42654210Sbostic 42754210Sbostic el->el_state.inputmode = MODE_INSERT; /* XXX: save a default */ 42854210Sbostic el->el_state.doingarg = 0; 42954210Sbostic el->el_state.metanext = 0; 43054210Sbostic el->el_state.argument = 1; 43154210Sbostic el->el_state.lastcmd = ED_UNASSIGNED; 43254210Sbostic 433*54624Schristos el->el_chared.c_macro.nline = NULL; 43454210Sbostic el->el_chared.c_macro.level = -1; 43554210Sbostic el->el_chared.c_macro.macro = (char **) el_malloc(EL_MAXMACRO * 43654210Sbostic sizeof(char *)); 43754210Sbostic return 0; 43854210Sbostic } 43954210Sbostic 44054210Sbostic /* ch_reset(): 44154210Sbostic * Reset the character editor 44254210Sbostic */ 44354210Sbostic protected void 44454210Sbostic ch_reset(el) 44554210Sbostic EditLine *el; 44654210Sbostic { 44754210Sbostic el->el_line.cursor = el->el_line.buffer; 44854210Sbostic el->el_line.lastchar = el->el_line.buffer; 44954210Sbostic 45054210Sbostic el->el_chared.c_undo.action = NOP; 45154210Sbostic el->el_chared.c_undo.isize = 0; 45254210Sbostic el->el_chared.c_undo.dsize = 0; 45354210Sbostic el->el_chared.c_undo.ptr = el->el_line.buffer; 45454210Sbostic 45554210Sbostic el->el_chared.c_vcmd.action = NOP; 45654210Sbostic el->el_chared.c_vcmd.pos = el->el_line.buffer; 45754210Sbostic el->el_chared.c_vcmd.ins = el->el_line.buffer; 45854210Sbostic 45954210Sbostic el->el_chared.c_kill.mark = el->el_line.buffer; 46054210Sbostic 46154210Sbostic el->el_map.current = el->el_map.key; 46254210Sbostic 46354210Sbostic el->el_state.inputmode = MODE_INSERT; /* XXX: save a default */ 46454210Sbostic el->el_state.doingarg = 0; 46554210Sbostic el->el_state.metanext = 0; 46654210Sbostic el->el_state.argument = 1; 46754210Sbostic el->el_state.lastcmd = ED_UNASSIGNED; 46854210Sbostic 46954210Sbostic el->el_chared.c_macro.level = -1; 47054210Sbostic 47154210Sbostic el->el_history.eventno = 0; 47254210Sbostic } 47354210Sbostic 47454210Sbostic 47554210Sbostic /* ch_end(): 47654210Sbostic * Free the data structures used by the editor 47754210Sbostic */ 47854210Sbostic protected void 47954210Sbostic ch_end(el) 48054210Sbostic EditLine *el; 48154210Sbostic { 48254210Sbostic el_free((ptr_t) el->el_line.buffer); 48354210Sbostic el->el_line.buffer = NULL; 48454210Sbostic el->el_line.limit = NULL; 48554210Sbostic el_free((ptr_t) el->el_chared.c_undo.buf); 48654210Sbostic el->el_chared.c_undo.buf = NULL; 48754210Sbostic el_free((ptr_t) el->el_chared.c_kill.buf); 48854210Sbostic el->el_chared.c_kill.buf = NULL; 48954210Sbostic el_free((ptr_t) el->el_chared.c_macro.macro); 49054210Sbostic el->el_chared.c_macro.macro = NULL; 49154210Sbostic ch_reset(el); 49254210Sbostic } 49354210Sbostic 49454210Sbostic 49554210Sbostic /* el_insertstr(): 49654210Sbostic * Insert string at cursorI 49754210Sbostic */ 49854210Sbostic public int 49954210Sbostic el_insertstr(el, s) 50054210Sbostic EditLine *el; 50154210Sbostic char *s; 50254210Sbostic { 50354210Sbostic int len; 50454210Sbostic 50554210Sbostic if ((len = strlen(s)) == 0) 50654210Sbostic return -1; 50754210Sbostic if (el->el_line.lastchar + len >= el->el_line.limit) 50854210Sbostic return -1; 50954210Sbostic 51054210Sbostic c_insert(el, len); 51154210Sbostic while (*s) 51254210Sbostic *el->el_line.cursor++ = *s++; 51354210Sbostic return 0; 51454210Sbostic } 51554210Sbostic 51654210Sbostic 51754210Sbostic /* el_deletestr(): 51854210Sbostic * Delete num characters before the cursor 51954210Sbostic */ 52054210Sbostic public void 52154210Sbostic el_deletestr(el, n) 52254210Sbostic EditLine *el; 52354210Sbostic int n; 52454210Sbostic { 52554210Sbostic if (n <= 0) 52654210Sbostic return; 52754210Sbostic 52854210Sbostic if (el->el_line.cursor < &el->el_line.buffer[n]) 52954210Sbostic return; 53054210Sbostic 53154210Sbostic c_delbefore(el, n); /* delete before dot */ 53254210Sbostic el->el_line.cursor -= n; 53354210Sbostic if (el->el_line.cursor < el->el_line.buffer) 53454210Sbostic el->el_line.cursor = el->el_line.buffer; 53554210Sbostic } 53654210Sbostic 53754210Sbostic /* c_gets(): 53854210Sbostic * Get a string 53954210Sbostic */ 54054210Sbostic protected int 54154210Sbostic c_gets(el, buf) 54254210Sbostic EditLine *el; 54354210Sbostic char *buf; 54454210Sbostic { 54554210Sbostic char ch; 54654210Sbostic int len = 0; 54754210Sbostic 54854210Sbostic for (ch = 0; ch == 0;) { 54954210Sbostic if (el_getc(el, &ch) != 1) 55054210Sbostic return ed_end_of_file(el, 0); 55154210Sbostic switch (ch) { 55254210Sbostic case 0010: /* Delete and backspace */ 55354210Sbostic case 0177: 55454210Sbostic if (len > 1) { 55554210Sbostic *el->el_line.cursor-- = '\0'; 55654210Sbostic el->el_line.lastchar = el->el_line.cursor; 55754210Sbostic buf[len--] = '\0'; 55854210Sbostic } 55954210Sbostic else { 56054210Sbostic el->el_line.buffer[0] = '\0'; 56154210Sbostic el->el_line.lastchar = el->el_line.buffer; 56254210Sbostic el->el_line.cursor = el->el_line.buffer; 56354210Sbostic return CC_REFRESH; 56454210Sbostic } 56554210Sbostic re_refresh(el); 56654210Sbostic ch = 0; 56754210Sbostic break; 56854210Sbostic 56954210Sbostic case 0033: /* ESC */ 57054210Sbostic case '\r': /* Newline */ 57154210Sbostic case '\n': 57254210Sbostic break; 57354210Sbostic 57454210Sbostic default: 57554210Sbostic if (len >= EL_BUFSIZ) 57654210Sbostic term_beep(el); 57754210Sbostic else { 57854210Sbostic buf[len++] = ch; 57954210Sbostic *el->el_line.cursor++ = ch; 58054210Sbostic el->el_line.lastchar = el->el_line.cursor; 58154210Sbostic } 58254210Sbostic re_refresh(el); 58354210Sbostic ch = 0; 58454210Sbostic break; 58554210Sbostic } 58654210Sbostic } 58754210Sbostic buf[len] = ch; 58854210Sbostic return len; 58954210Sbostic } 59054210Sbostic 59154210Sbostic 59254210Sbostic /* c_hpos(): 59354210Sbostic * Return the current horizontal position of the cursor 59454210Sbostic */ 59554210Sbostic protected int 59654210Sbostic c_hpos(el) 59754210Sbostic EditLine *el; 59854210Sbostic { 59954210Sbostic char *ptr; 60054210Sbostic 60154210Sbostic /* 60254210Sbostic * Find how many characters till the beginning of this line. 60354210Sbostic */ 60454210Sbostic if (el->el_line.cursor == el->el_line.buffer) 60554210Sbostic return 0; 60654210Sbostic else { 60754210Sbostic for (ptr = el->el_line.cursor - 1; 60854210Sbostic ptr >= el->el_line.buffer && *ptr != '\n'; 60954210Sbostic ptr--) 61054210Sbostic continue; 61154210Sbostic return el->el_line.cursor - ptr - 1; 61254210Sbostic } 61354210Sbostic } 614