163200Sbostic/*
263200Sbostic * Copyright (c) 1992 OMRON Corporation.
3*66427Sbostic * Copyright (c) 1992
4*66427Sbostic *	The Regents of the University of California.  All rights reserved.
563200Sbostic *
663200Sbostic * This code is derived from software contributed to Berkeley by
763200Sbostic * OMRON Corporation.
863200Sbostic *
963200Sbostic * %sccs.include.redist.c%
1063200Sbostic *
11*66427Sbostic *	@(#)getline.c-big	8.2 (Berkeley) 03/21/94
1263200Sbostic */
1363200Sbostic
1463200Sbostic/*
1563200Sbostic * getline -- getline function with EMACS like key operation
1663200Sbostic * by A.Fujita, FEB-01-1992
1763200Sbostic */
1863200Sbostic
1963200Sbostic#define MAXLINE 80
2063200Sbostic
2163200Sbosticstruct key_bind_table {
2263200Sbostic	int (*func)();
2363200Sbostic};
2463200Sbostic
2563200Sbosticchar linebuff[MAXLINE];
2663200Sbosticint  lineleft;
2763200Sbosticint  lineright = MAXLINE - 1;
2863200Sbosticint  cursole;
2963200Sbosticint  endline;
3063200Sbostic
3163200Sbosticint
3263200Sbosticnil_operation(c)
3363200Sbostic	char c;
3463200Sbostic{
3563200Sbostic	return(1);
3663200Sbostic}
3763200Sbostic
3863200Sbosticint
3963200Sbosticself_insert(c)
4063200Sbostic	char c;
4163200Sbostic{
4263200Sbostic	register int n;
4363200Sbostic
4463200Sbostic	if (cursole <= endline) {
4563200Sbostic		linebuff[cursole++] = c;
4663200Sbostic
4763200Sbostic		cnputc(c);
4863200Sbostic
4963200Sbostic		for (n = endline; n < MAXLINE; n++)
5063200Sbostic			cnputc(linebuff[n]);
5163200Sbostic		for (n = endline + 1; n < MAXLINE; n++)
5263200Sbostic			cnputc('\x08');			/* le: move the cursor left one column */
5363200Sbostic	}
5463200Sbostic
5563200Sbostic	return(1);
5663200Sbostic}
5763200Sbostic
5863200Sbostic/*
5963200Sbosticint
6063200Sbosticself_insert(c)
6163200Sbostic	char c;
6263200Sbostic{
6363200Sbostic	register int n;
6463200Sbostic
6563200Sbostic	if (cursole <= endline) {
6663200Sbostic		linebuff[cursole++] = c;
6763200Sbostic
6863200Sbostic		cnputc('\x1b');
6963200Sbostic		cnputc('[');
7063200Sbostic		cnputc('4');
7163200Sbostic		cnputc('h');
7263200Sbostic
7363200Sbostic		cnputc(c);
7463200Sbostic
7563200Sbostic		cnputc('\x1b');
7663200Sbostic		cnputc('[');
7763200Sbostic		cnputc('4');
7863200Sbostic		cnputc('l');
7963200Sbostic	}
8063200Sbostic
8163200Sbostic	return(1);
8263200Sbostic}
8363200Sbostic */
8463200Sbostic
8563200Sbosticint
8663200Sbosticaccept_line(c)
8763200Sbostic	char c;
8863200Sbostic{
8963200Sbostic	cnputc('\r');
9063200Sbostic	cnputc('\n');
9163200Sbostic
9263200Sbostic	return(0);
9363200Sbostic}
9463200Sbostic
9563200Sbosticint
9663200Sbosticbeginning_of_line(c)
9763200Sbostic	char c;
9863200Sbostic{
9963200Sbostic	while (cursole > lineleft) {
10063200Sbostic		linebuff[endline--] = linebuff[--cursole];
10163200Sbostic		cnputc('\x08');		/* le: move the cursor left one column */
10263200Sbostic	}
10363200Sbostic
10463200Sbostic	return(1);
10563200Sbostic}
10663200Sbostic
10763200Sbosticint
10863200Sbosticend_of_line(c)
10963200Sbostic	char c;
11063200Sbostic{
11163200Sbostic	while (endline < lineright) {
11263200Sbostic		linebuff[cursole++] = linebuff[++endline];
11363200Sbostic		cnputc('\x1b');		/* nd: move the cursor right one column */
11463200Sbostic		cnputc('[');
11563200Sbostic		cnputc('C');
11663200Sbostic	}
11763200Sbostic
11863200Sbostic	return(1);
11963200Sbostic}
12063200Sbostic
12163200Sbosticint
12263200Sbosticforward_char(c)
12363200Sbostic	char c;
12463200Sbostic{
12563200Sbostic	if (endline < lineright) {
12663200Sbostic		linebuff[cursole++] = linebuff[++endline];
12763200Sbostic		cnputc('\x1b');		/* nd: move the cursor right one column */
12863200Sbostic		cnputc('[');
12963200Sbostic		cnputc('C');
13063200Sbostic	}
13163200Sbostic
13263200Sbostic	return(1);
13363200Sbostic}
13463200Sbostic
13563200Sbosticint
13663200Sbosticbackward_char(c)
13763200Sbostic	char c;
13863200Sbostic{
13963200Sbostic	if (cursole > lineleft) {
14063200Sbostic		linebuff[endline--] = linebuff[--cursole];
14163200Sbostic		cnputc('\x08');
14263200Sbostic	}
14363200Sbostic
14463200Sbostic	return(1);
14563200Sbostic}
14663200Sbostic
14763200Sbosticint
14863200Sbosticdelete_char(c)
14963200Sbostic	char c;
15063200Sbostic{
15163200Sbostic	register int n;
15263200Sbostic
15363200Sbostic	if (cursole > lineleft || endline < lineright) {
15463200Sbostic		endline++;
15563200Sbostic		cnputc('\x1b');		/* dc: delete one character position at the cursor */
15663200Sbostic		cnputc('[');
15763200Sbostic		cnputc('P');
15863200Sbostic	}
15963200Sbostic}
16063200Sbostic
16163200Sbosticint
16263200Sbosticbackward_delete_char(c)
16363200Sbostic	char c;
16463200Sbostic{
16563200Sbostic	if (cursole > lineleft) {
16663200Sbostic		cursole--;
16763200Sbostic		cnputc('\x08');		/* le: move the cursor left one column */
16863200Sbostic		cnputc('\x1b');		/* dc: delete one character position at the cursor */
16963200Sbostic		cnputc('[');
17063200Sbostic		cnputc('P');
17163200Sbostic	}
17263200Sbostic
17363200Sbostic	return(1);
17463200Sbostic}
17563200Sbostic
17663200Sbosticint
17763200Sbostickill_line(c)
17863200Sbostic{
17963200Sbostic	register int n = lineright - endline;
18063200Sbostic
18163200Sbostic	while(endline < lineright) {
18263200Sbostic		endline++;
18363200Sbostic		cnputc('\x1b');		/* dc: delete one character position at the cursor */
18463200Sbostic		cnputc('[');
18563200Sbostic		cnputc('P');
18663200Sbostic	}
18763200Sbostic
18863200Sbostic	return(1);
18963200Sbostic}
19063200Sbostic
19163200Sbosticstruct key_bind_table keybind[] = {
19263200Sbostic{ nil_operation	},			/* 0x00 NUL */
19363200Sbostic{ beginning_of_line },			/* 0x01 SOH */
19463200Sbostic{ backward_char },			/* 0x02 STX */
19563200Sbostic{ nil_operation },			/* 0x03 ETX */
19663200Sbostic{ delete_char   },			/* 0x04 EOT */
19763200Sbostic{ end_of_line   },			/* 0x05 ENQ */
19863200Sbostic{ forward_char  },			/* 0x06 ACK */
19963200Sbostic{ nil_operation },			/* 0x07 BEL */
20063200Sbostic{ backward_delete_char },		/* 0x08 BS  */
20163200Sbostic{ nil_operation },			/* 0x09 HT  */
20263200Sbostic{ accept_line   },			/* 0x0A NL  */
20363200Sbostic{ kill_line     },			/* 0x0B VT  */
20463200Sbostic{ nil_operation },			/* 0x0C NP  */
20563200Sbostic{ accept_line   },			/* 0x0D CR  */
20663200Sbostic{ nil_operation },			/* 0x0E SO  */
20763200Sbostic{ nil_operation },			/* 0x0F SI  */
20863200Sbostic{ nil_operation	},			/* 0x10 DLE */
20963200Sbostic{ nil_operation },			/* 0x11 DC1 */
21063200Sbostic{ nil_operation },			/* 0x12 DC2 */
21163200Sbostic{ nil_operation },			/* 0x13 DC3 */
21263200Sbostic{ nil_operation },			/* 0x14 DC4 */
21363200Sbostic{ nil_operation },			/* 0x15 NAK */
21463200Sbostic{ nil_operation },			/* 0x16 SYN */
21563200Sbostic{ nil_operation },			/* 0x17 ETB */
21663200Sbostic{ nil_operation },			/* 0x18 CAN */
21763200Sbostic{ nil_operation },			/* 0x19 EM  */
21863200Sbostic{ nil_operation },			/* 0x1A SUB */
21963200Sbostic{ nil_operation },			/* 0x1B ESC */
22063200Sbostic{ nil_operation },			/* 0x1C FS  */
22163200Sbostic{ nil_operation },			/* 0x1D GS  */
22263200Sbostic{ nil_operation },			/* 0x1E RS  */
22363200Sbostic{ nil_operation },			/* 0x1F US  */
22463200Sbostic{ self_insert },			/* 0x20 ( ) */
22563200Sbostic{ self_insert },			/* 0x21 (!) */
22663200Sbostic{ self_insert },			/* 0x22 (") */
22763200Sbostic{ self_insert },			/* 0x23 (#) */
22863200Sbostic{ self_insert },			/* 0x24 ($) */
22963200Sbostic{ self_insert },			/* 0x25 (%) */
23063200Sbostic{ self_insert },			/* 0x26 (&) */
23163200Sbostic{ self_insert },			/* 0x27 (') */
23263200Sbostic{ self_insert },			/* 0x28 (() */
23363200Sbostic{ self_insert },			/* 0x29 ()) */
23463200Sbostic{ self_insert },			/* 0x2A (*) */
23563200Sbostic{ self_insert },			/* 0x2B (+) */
23663200Sbostic{ self_insert },			/* 0x2C (,) */
23763200Sbostic{ self_insert },			/* 0x2D (-) */
23863200Sbostic{ self_insert },			/* 0x2E (.) */
23963200Sbostic{ self_insert },			/* 0x2F (/) */
24063200Sbostic{ self_insert },			/* 0x30 (0) */
24163200Sbostic{ self_insert },			/* 0x31 (1) */
24263200Sbostic{ self_insert },			/* 0x32 (2) */
24363200Sbostic{ self_insert },			/* 0x33 (3) */
24463200Sbostic{ self_insert },			/* 0x34 (4) */
24563200Sbostic{ self_insert },			/* 0x35 (5) */
24663200Sbostic{ self_insert },			/* 0x36 (6) */
24763200Sbostic{ self_insert },			/* 0x37 (7) */
24863200Sbostic{ self_insert },			/* 0x38 (8) */
24963200Sbostic{ self_insert },			/* 0x39 (9) */
25063200Sbostic{ self_insert },			/* 0x3A (:) */
25163200Sbostic{ self_insert },			/* 0x3B (;) */
25263200Sbostic{ self_insert },			/* 0x3C (<) */
25363200Sbostic{ self_insert },			/* 0x3D (=) */
25463200Sbostic{ self_insert },			/* 0x3E (>) */
25563200Sbostic{ self_insert },			/* 0x3F (?) */
25663200Sbostic{ self_insert },			/* 0x40 (@) */
25763200Sbostic{ self_insert },			/* 0x41 (A) */
25863200Sbostic{ self_insert },			/* 0x42 (B) */
25963200Sbostic{ self_insert },			/* 0x43 (C) */
26063200Sbostic{ self_insert },			/* 0x44 (D) */
26163200Sbostic{ self_insert },			/* 0x45 (E) */
26263200Sbostic{ self_insert },			/* 0x46 (F) */
26363200Sbostic{ self_insert },			/* 0x47 (G) */
26463200Sbostic{ self_insert },			/* 0x48 (H) */
26563200Sbostic{ self_insert },			/* 0x49 (I) */
26663200Sbostic{ self_insert },			/* 0x4A (J) */
26763200Sbostic{ self_insert },			/* 0x4B (K) */
26863200Sbostic{ self_insert },			/* 0x4C (L) */
26963200Sbostic{ self_insert },			/* 0x4D (M) */
27063200Sbostic{ self_insert },			/* 0x4E (N) */
27163200Sbostic{ self_insert },			/* 0x4F (O) */
27263200Sbostic{ self_insert },			/* 0x50 (P) */
27363200Sbostic{ self_insert },			/* 0x51 (Q) */
27463200Sbostic{ self_insert },			/* 0x52 (R) */
27563200Sbostic{ self_insert },			/* 0x53 (S) */
27663200Sbostic{ self_insert },			/* 0x54 (T) */
27763200Sbostic{ self_insert },			/* 0x55 (U) */
27863200Sbostic{ self_insert },			/* 0x56 (V) */
27963200Sbostic{ self_insert },			/* 0x57 (W) */
28063200Sbostic{ self_insert },			/* 0x58 (X) */
28163200Sbostic{ self_insert },			/* 0x59 (W) */
28263200Sbostic{ self_insert },			/* 0x5A (Z) */
28363200Sbostic{ self_insert },			/* 0x5B ([) */
28463200Sbostic{ self_insert },			/* 0x5C (\) */
28563200Sbostic{ self_insert },			/* 0x5D (]) */
28663200Sbostic{ self_insert },			/* 0x5E (^) */
28763200Sbostic{ self_insert },			/* 0x5F (_) */
28863200Sbostic{ self_insert },			/* 0x60 (`) */
28963200Sbostic{ self_insert },			/* 0x61 (a) */
29063200Sbostic{ self_insert },			/* 0x62 (b) */
29163200Sbostic{ self_insert },			/* 0x63 (c) */
29263200Sbostic{ self_insert },			/* 0x64 (d) */
29363200Sbostic{ self_insert },			/* 0x65 (e) */
29463200Sbostic{ self_insert },			/* 0x66 (f) */
29563200Sbostic{ self_insert },			/* 0x67 (g) */
29663200Sbostic{ self_insert },			/* 0x68 (h) */
29763200Sbostic{ self_insert },			/* 0x69 (i) */
29863200Sbostic{ self_insert },			/* 0x6A (j) */
29963200Sbostic{ self_insert },			/* 0x6B (k) */
30063200Sbostic{ self_insert },			/* 0x6C (l) */
30163200Sbostic{ self_insert },			/* 0x6D (m) */
30263200Sbostic{ self_insert },			/* 0x6E (n) */
30363200Sbostic{ self_insert },			/* 0x6F (o) */
30463200Sbostic{ self_insert },			/* 0x70 (p) */
30563200Sbostic{ self_insert },			/* 0x71 (q) */
30663200Sbostic{ self_insert },			/* 0x72 (r) */
30763200Sbostic{ self_insert },			/* 0x73 (s) */
30863200Sbostic{ self_insert },			/* 0x74 (t) */
30963200Sbostic{ self_insert },			/* 0x75 (u) */
31063200Sbostic{ self_insert },			/* 0x76 (v) */
31163200Sbostic{ self_insert },			/* 0x77 (w) */
31263200Sbostic{ self_insert },			/* 0x78 (x) */
31363200Sbostic{ self_insert },			/* 0x79 (y) */
31463200Sbostic{ self_insert },			/* 0x7A (z) */
31563200Sbostic{ self_insert },			/* 0x7B ({) */
31663200Sbostic{ self_insert },			/* 0x7C (|) */
31763200Sbostic{ self_insert },			/* 0x7D (}) */
31863200Sbostic{ self_insert },			/* 0x7E (~) */
31963200Sbostic{ backward_delete_char },		/* 0x7F DEL */
32063200Sbostic};
32163200Sbostic
32263200Sbosticint
32363200Sbosticgetline(prompt, buff)
32463200Sbostic	char *prompt, *buff;
32563200Sbostic{
32663200Sbostic	register int c;
32763200Sbostic
32863200Sbostic	bzero(linebuff, MAXLINE);
32963200Sbostic	cursole = lineleft  = strlen(prompt);
33063200Sbostic	endline = lineright = MAXLINE - 1;
33163200Sbostic	printf("%s", prompt);
33263200Sbostic
33363200Sbostic	do {
33463200Sbostic		c = cngetc();
33563200Sbostic		c &= 0x7F;
33663200Sbostic	} while((*keybind[c].func)(c));
33763200Sbostic
33863200Sbostic	bcopy(&linebuff[lineleft],
33963200Sbostic	      &buff[0], cursole - lineleft);
34063200Sbostic	bcopy(&linebuff[endline+1],
34163200Sbostic	      &buff[cursole - lineleft], lineright - endline);
34263200Sbostic
34363200Sbostic	return(strlen(buff));
34463200Sbostic}
345