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