5 * Text mode entry with history
18 tReadline *Readline_CreateInstance(int bUseHistory);
19 char *Readline(tReadline *Info);
29 char *Readline(tReadline *Info)
33 int len, pos, space = 1023-8-8; // optimised for the heap manager
35 int scrollbackPos = Info->NumHistory;
38 ret = malloc( space+1 );
44 // Read In Command Line
46 read(STDIN_FD, 1, &ch); // Read Character from stdin (read is a blocking call)
54 read(STDIN_FD, 1, &ch); // Read control character
57 //case 'D': if(pos) pos--; break;
58 //case 'C': if(pos<len) pos++; break;
60 read(STDIN_FD, 1, &ch); // Read control character
66 if( scrollbackPos <= 0 ) break;
68 if(ret != orig) free(ret);
69 ret = strdup( Info->History[--scrollbackPos] );
71 space = len = strlen(ret);
72 while(pos-->1) write(STDOUT_FD, 3, "\x1B[D");
73 write(STDOUT_FD, len, ret); pos = len;
74 while(pos++ < oldLen) write(STDOUT_FD, 1, " ");
80 if( scrollbackPos >= Info->NumHistory ) break;
82 if(ret != orig) free(ret);
83 ret = strdup( Info->History[scrollbackPos++] );
85 space = len = strlen(ret);
86 while(pos-->1) write(STDOUT_FD, 3, "\x1B[D");
87 write(STDOUT_FD, len, ret); pos = len;
88 while(pos++ < oldLen) write(STDOUT_FD, 1, " ");
94 write(STDOUT_FD, 3, "\x1B[D");
99 write(STDOUT_FD, 3, "\x1B[C");
107 if(len <= 0) break; // Protect against underflows
108 write(STDOUT_FD, 1, &ch);
109 if(pos == len) { // Simple case of end of string
114 char buf[7] = "\x1B[000D";
115 buf[2] += ((len-pos+1)/100) % 10;
116 buf[3] += ((len-pos+1)/10) % 10;
117 buf[4] += (len-pos+1) % 10;
118 write(STDOUT_FD, len-pos, &ret[pos]); // Move Text
119 ch = ' '; write(STDOUT_FD, 1, &ch); ch = '\b'; // Clear deleted character
120 write(STDOUT_FD, 7, buf); // Update Cursor
122 memmove(&ret[pos-1], &ret[pos], len-pos);
130 //TODO: Implement Tab-Completion
131 //Currently just ignore tabs
139 orig = ret = realloc(ret, space+1);
142 ret = realloc(ret, space+1);
144 if(!ret) return NULL;
147 // Editing inside the buffer
149 char buf[7] = "\x1B[000D";
150 buf[2] += ((len-pos)/100) % 10;
151 buf[3] += ((len-pos)/10) % 10;
152 buf[4] += (len-pos) % 10;
153 write(STDOUT_FD, 1, &ch); // Print new character
154 write(STDOUT_FD, len-pos, &ret[pos]); // Move Text
155 write(STDOUT_FD, 7, buf); // Update Cursor
156 memmove( &ret[pos+1], &ret[pos], len-pos );
159 write(STDOUT_FD, 1, &ch);
172 //if(Length) *Length = len;
175 if( Info->UseHistory )
177 if( !Info->History || strcmp( Info->History[ Info->NumHistory-1 ], ret) != 0 )
181 tmp = realloc( Info->History, Info->NumHistory * sizeof(char*) );
185 Info->History[ Info->NumHistory-1 ] = strdup(ret);
190 if(ret != orig) free(orig);