| 
				
			 | 
			
			
				
				@@ -30,6 +30,44 @@ 
			 | 
		
		
	
		
			
			| 
				30
			 | 
			
				30
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				31
			 | 
			
				31
			 | 
			
			
				
				 #define READLINE_MAX 256 
			 | 
		
		
	
		
			
			| 
				32
			 | 
			
				32
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				33
			 | 
			
			
				
				+/** 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				34
			 | 
			
			
				
				+ * Synchronise console with edited string 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				35
			 | 
			
			
				
				+ * 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				36
			 | 
			
			
				
				+ * @v string		Editable string 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				37
			 | 
			
			
				
				+ */ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				38
			 | 
			
			
				
				+static void sync_console ( struct edit_string *string ) { 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				39
			 | 
			
			
				
				+	unsigned int mod_start = string->mod_start; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				40
			 | 
			
			
				
				+	unsigned int mod_end = string->mod_end; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				41
			 | 
			
			
				
				+	unsigned int cursor = string->last_cursor; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				42
			 | 
			
			
				
				+	size_t len = strlen ( string->buf ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				43
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				44
			 | 
			
			
				
				+	/* Expand region back to old cursor position if applicable */ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				45
			 | 
			
			
				
				+	if ( mod_start > string->last_cursor ) 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				46
			 | 
			
			
				
				+		mod_start = string->last_cursor; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				47
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				48
			 | 
			
			
				
				+	/* Expand region forward to new cursor position if applicable */ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				49
			 | 
			
			
				
				+	if ( mod_end < string->cursor ) 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				50
			 | 
			
			
				
				+		mod_end = string->cursor; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				51
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				52
			 | 
			
			
				
				+	/* Backspace to start of region */ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				53
			 | 
			
			
				
				+	while ( cursor > mod_start ) { 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				54
			 | 
			
			
				
				+		putchar ( '\b' ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				55
			 | 
			
			
				
				+		cursor--; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				56
			 | 
			
			
				
				+	} 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				57
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				58
			 | 
			
			
				
				+	/* Print modified region */ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				59
			 | 
			
			
				
				+	while ( cursor < mod_end ) { 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				60
			 | 
			
			
				
				+		putchar ( ( cursor >= len ) ? ' ' : string->buf[cursor] ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				61
			 | 
			
			
				
				+		cursor++; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				62
			 | 
			
			
				
				+	} 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				63
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				64
			 | 
			
			
				
				+	/* Backspace to new cursor position */ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				65
			 | 
			
			
				
				+	while ( cursor > string->cursor ) { 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				66
			 | 
			
			
				
				+		putchar ( '\b' ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				67
			 | 
			
			
				
				+		cursor--; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				68
			 | 
			
			
				
				+	} 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				69
			 | 
			
			
				
				+} 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				70
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				33
			 | 
			
				71
			 | 
			
			
				
				 /** 
			 | 
		
		
	
		
			
			| 
				34
			 | 
			
				72
			 | 
			
			
				
				  * Read line from console 
			 | 
		
		
	
		
			
			| 
				35
			 | 
			
				73
			 | 
			
			
				
				  * 
			 | 
		
		
	
	
		
			
			| 
				
			 | 
			
			
				
				@@ -47,6 +85,7 @@ char * readline ( const char *prompt ) { 
			 | 
		
		
	
		
			
			| 
				47
			 | 
			
				85
			 | 
			
			
				
				 		.cursor = 0, 
			 | 
		
		
	
		
			
			| 
				48
			 | 
			
				86
			 | 
			
			
				
				 	}; 
			 | 
		
		
	
		
			
			| 
				49
			 | 
			
				87
			 | 
			
			
				
				 	int key; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				88
			 | 
			
			
				
				+	char *line = NULL; 
			 | 
		
		
	
		
			
			| 
				50
			 | 
			
				89
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				51
			 | 
			
				90
			 | 
			
			
				
				 	if ( prompt ) 
			 | 
		
		
	
		
			
			| 
				52
			 | 
			
				91
			 | 
			
			
				
				 		printf ( "%s", prompt ); 
			 | 
		
		
	
	
		
			
			| 
				
			 | 
			
			
				
				@@ -54,15 +93,21 @@ char * readline ( const char *prompt ) { 
			 | 
		
		
	
		
			
			| 
				54
			 | 
			
				93
			 | 
			
			
				
				 	buf[0] = '\0'; 
			 | 
		
		
	
		
			
			| 
				55
			 | 
			
				94
			 | 
			
			
				
				 	while ( 1 ) { 
			 | 
		
		
	
		
			
			| 
				56
			 | 
			
				95
			 | 
			
			
				
				 		key = edit_string ( &string, getchar() ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				96
			 | 
			
			
				
				+		sync_console ( &string ); 
			 | 
		
		
	
		
			
			| 
				57
			 | 
			
				97
			 | 
			
			
				
				 		switch ( key ) { 
			 | 
		
		
	
		
			
			| 
				58
			 | 
			
				98
			 | 
			
			
				
				 		case 0x0d: /* Carriage return */ 
			 | 
		
		
	
		
			
			| 
				59
			 | 
			
				99
			 | 
			
			
				
				 		case 0x0a: /* Line feed */ 
			 | 
		
		
	
		
			
			| 
				60
			 | 
			
				
			 | 
			
			
				
				-			return ( strdup ( buf ) ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				100
			 | 
			
			
				
				+			line = strdup ( buf ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				101
			 | 
			
			
				
				+			goto out; 
			 | 
		
		
	
		
			
			| 
				61
			 | 
			
				102
			 | 
			
			
				
				 		case 0x03: /* Ctrl-C */ 
			 | 
		
		
	
		
			
			| 
				62
			 | 
			
				
			 | 
			
			
				
				-			return NULL; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				103
			 | 
			
			
				
				+			goto out; 
			 | 
		
		
	
		
			
			| 
				63
			 | 
			
				104
			 | 
			
			
				
				 		default: 
			 | 
		
		
	
		
			
			| 
				64
			 | 
			
				105
			 | 
			
			
				
				 			/* Do nothing */ 
			 | 
		
		
	
		
			
			| 
				65
			 | 
			
				106
			 | 
			
			
				
				 			break; 
			 | 
		
		
	
		
			
			| 
				66
			 | 
			
				107
			 | 
			
			
				
				 		} 
			 | 
		
		
	
		
			
			| 
				67
			 | 
			
				108
			 | 
			
			
				
				 	} 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				109
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				110
			 | 
			
			
				
				+ out: 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				111
			 | 
			
			
				
				+	putchar ( '\n' ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				112
			 | 
			
			
				
				+	return line; 
			 | 
		
		
	
		
			
			| 
				68
			 | 
			
				113
			 | 
			
			
				
				 } 
			 |