-
- // Backspace
- case '\b':
- if(len <= 0) break; // Protect against underflows
- write(_stdout, 1, &ch);
- if(pos == len) { // Simple case of end of string
- len --;
- pos--;
- }
- else {
- char buf[7] = "\x1B[000D";
- buf[2] += ((len-pos+1)/100) % 10;
- buf[3] += ((len-pos+1)/10) % 10;
- buf[4] += (len-pos+1) % 10;
- write(_stdout, len-pos, &ret[pos]); // Move Text
- ch = ' '; write(_stdout, 1, &ch); ch = '\b'; // Clear deleted character
- write(_stdout, 7, buf); // Update Cursor
- // Alter Buffer
- memmove(&ret[pos-1], &ret[pos], len-pos);
- pos --;
- len --;
- }
- break;
-
- // Tab
- case '\t':
- //TODO: Implement Tab-Completion
- //Currently just ignore tabs
- break;
-
- default:
- // Expand Buffer
- if(len+1 > space) {
- space += 256;
- ret = realloc(ret, space+1);
- if(!ret) return NULL;
- }
-
- // Editing inside the buffer
- if(pos != len) {
- char buf[7] = "\x1B[000D";
- buf[2] += ((len-pos)/100) % 10;
- buf[3] += ((len-pos)/10) % 10;
- buf[4] += (len-pos) % 10;
- write(_stdout, 1, &ch); // Print new character
- write(_stdout, len-pos, &ret[pos]); // Move Text
- write(_stdout, 7, buf); // Update Cursor
- memmove( &ret[pos+1], &ret[pos], len-pos );
- }
- else {
- write(_stdout, 1, &ch);
- }
- ret[pos++] = ch;
- len ++;