File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / iftop / edline.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 16:57:34 2012 UTC (12 years, 3 months ago) by misho
Branches: iftop, MAIN
CVS tags: v1_0rc4, v0_17p0, v0_17, HEAD
iftop

    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.1.1.1 2012/02/21 16:57:34 misho 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>