Annotation of embedaddon/iftop/edline.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * edline.c:
                      3:  * Text input on a line of the screen.
                      4:  *
                      5:  */
                      6: 
                      7: static const char rcsid[] = "$Id: edline.c,v 1.2 2002/11/04 12:27:35 chris Exp $";
                      8: 
                      9: #include <ctype.h>
                     10: #include <curses.h>
                     11: #include <string.h>
                     12: 
                     13: #include "iftop.h"
                     14: 
                     15: static int min(const int a, const int b) {
                     16:     return a < b ? a : b;
                     17: }
                     18: 
                     19: /* edline:
                     20:  * Display on line linenum of the screen the prompt and allow the user to input
                     21:  * a line of text, whose initial value is as supplied. */
                     22: char *edline(int linenum, const char *prompt, const char *initial) {
                     23:     int xstart, slen, off = 0, pos, i, c;
                     24:     char *str;
                     25:     
                     26:     xstart = strlen(prompt) + 2;
                     27: 
                     28:     if (initial) {
                     29:         str = xmalloc(slen = strlen(initial) * 2 + 1);
                     30:         strcpy(str, initial);
                     31:     } else {
                     32:         str = xmalloc(slen = 256);
                     33:         *str = 0;
                     34:     }
                     35: 
                     36:     pos = strlen(str);
                     37: 
                     38:     do {
                     39:         c = getch();
                     40:         switch (c) {
                     41:             case KEY_DL:
                     42:             case 21:    /* ^U */
                     43:                 *str = 0;
                     44:                 pos = 0;
                     45:                 break;
                     46: 
                     47:             case KEY_LEFT:
                     48:                 --pos;
                     49:                 if (pos < 0) {
                     50:                     beep();
                     51:                     pos = 0;
                     52:                 }
                     53:                 break;
                     54: 
                     55:             case KEY_RIGHT:
                     56:                 ++pos;
                     57:                 if (pos > strlen(str)) {
                     58:                     beep();
                     59:                     pos = strlen(str);
                     60:                 }
                     61:                 break;
                     62: 
                     63:             case KEY_HOME:
                     64:             case 1:         /* ^A */
                     65:                 pos = 0;
                     66:                 break;
                     67: 
                     68:             case KEY_END:
                     69:             case 5:         /* ^E */
                     70:                 pos = strlen(str);
                     71:                 break;
                     72: 
                     73:             case KEY_DC:
                     74:                 if (pos == strlen(str))
                     75:                     beep();
                     76:                 else
                     77:                     memmove(str + pos, str + pos + 1, strlen(str + pos + 1) + 1);
                     78:                 break;
                     79: 
                     80:             case KEY_BACKSPACE:
                     81:                 if (pos == 0)
                     82:                     beep();
                     83:                 else {
                     84:                     memmove(str + pos - 1, str + pos, strlen(str + pos) + 1);
                     85:                     --pos;
                     86:                 }
                     87:                 break;
                     88: 
                     89:             case 23:    /* ^W */
                     90:                 for (i = pos; i > 0; --i)
                     91:                     if (!isspace((int)str[i])) break;
                     92:                 for (; i > 0; --i)
                     93:                     if (isspace((int)str[i])) break;
                     94:                 if (i != pos) {
                     95:                     memmove(str + i, str + pos, strlen(str + pos) + 1);
                     96:                     pos = i;
                     97:                 }
                     98:                 break;
                     99: 
                    100:             case ERR:
                    101:                 break;
                    102: 
                    103:             default:
                    104:                 if (isprint(c) && c != '\t') {
                    105:                     if (strlen(str) == slen - 1)
                    106:                         str = xrealloc(str, slen *= 2);
                    107:                     memmove(str + pos + 1, str + pos, strlen(str + pos) + 1);
                    108:                     str[pos++] = (char)c;
                    109:                 } else
                    110:                     beep();
                    111:                 break;
                    112:         }
                    113: 
                    114:         /* figure out the offset to use for the string */
                    115:         off = 0;
                    116:         if (pos > COLS - xstart - 1)
                    117:             off = pos - (COLS - xstart - 1);
                    118:         
                    119:         /* display the string */
                    120:         mvaddstr(linenum, 0, prompt);
                    121:         addstr("> ");
                    122:         addnstr(str + off, min(strlen(str + off), COLS - xstart - 1));
                    123:         clrtoeol();
                    124:         move(linenum, xstart + pos - off);
                    125:         refresh();
                    126:     } while (c != KEY_ENTER && c != '\r' && c != '\x1b' && c != 7 /* ^G */);
                    127: 
                    128:     if (c == KEY_ENTER || c == '\r')
                    129:         /* Success */
                    130:         return str;
                    131:     else {
                    132:         xfree(str);
                    133:         return NULL;
                    134:     }
                    135: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>