File: cmdline.c

package info (click to toggle)
silo 1.4.14%2Bgit20120819-1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 1,644 kB
  • sloc: ansic: 13,383; asm: 3,004; makefile: 351; sh: 102; perl: 85
file content (93 lines) | stat: -rw-r--r-- 2,080 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/* Prompt handling
   
   Copyright (C) 1996 Maurizio Plaza
   		 1996 Jakub Jelinek
		 2001 Ben Collins
   
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
   
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
   USA.  */

#include <silo.h>
#include <stringops.h>

char cbuff[CMD_LENG];
char passwdbuff[CMD_LENG];
extern int useconf;
extern int tab_ambiguous;

void silo_cmdinit(void)
{
    cbuff[0] = 0;
    passwdbuff[0] = 0;
}

void silo_cmdedit(void (*tabfunc)(void), int password)
{
    int x, c;
    char *buff = password ? passwdbuff : cbuff;

    for (x = 0; x < CMD_LENG - 1; x++) {
	if (buff[x] == 0)
	    break;
	else if (password)
	    prom_puts ("*", 1);
    }
    if (!password)
        prom_puts (buff, x);

    for (;;) {
	c = prom_getchar ();
	switch (c) {
	    case -1:
	    case '\n':
	    case '\r':
		goto break_both;

	    case '\t':
		if (tabfunc) (*tabfunc)();
		/* reset x */
		x = strlen(buff);
		break;

	    case '\b':
	    case 0x7F:
		tab_ambiguous = 0;
		if (x > 0) {
		    x--;
		    cbuff[x] = 0;
		    prom_puts ("\b \b", 3);
		}
		break;

	    default:
		if ((c & 0xE0) != 0) {
		    tab_ambiguous = 0;
		    if (x < CMD_LENG - 1) {
			buff[x] = c;
			buff[x + 1] = 0;
			/* For password input, we mask it out */
			prom_puts((password) ? "*" : buff + x, 1);
			x++;
		    }
		    if (x == 1 && !password && useconf) {
			if (cfg_get_flag (cbuff, "single-key"))
			    goto break_both;
		    }
		}
	}
    }
break_both:
    buff[x] = 0;
}