X11 sample rewritten; now it works again
[k8lst.git] / modules / readline.st
blob6ceb07f630193e7c7ea09b4ea31c449d6b309933
1 Requires [ termkey ]
3 System extend [
4   ^readStdInCharAsSmallInt [
5     System eventWaitFor: 1001.
6     <#ReadCharacter>.
7     self primitiveFailed
8   ]
12 String extend [
13   ^input [
14     "read a line from input"
15     "TODO: use stringbuffer?"
16     | value c pos vn |
17     System flushStdOut.
18     System; termRaw: true.
19     value := String new: 256. pos := 1.
20     [ (c := Char input)
21       ifNil: [
22         pos = 1 ifTrue: [ value := nil ] ifFalse: [ value := value from: 1 to: pos ].
23         System; termRaw: false.
24         ^value
25       ].
26       c isEOL ] whileFalse: [
27       c value = 127 ifTrue: [
28         "backspace"
29         pos > 1 ifTrue: [
30           '\b \b' print.
31           pos := pos - 1.
32         ].
33       ] ifFalse: [
34         "c value printNl."
35         c value < 32 ifTrue: [
36           c value = 3 ifTrue: [
37             '^C' printNl.
38             System userBreakSignal.
39           ].
40         ] ifFalse: [
41           c print.
42           pos > value size ifTrue: [
43             "extend buffer"
44             vn := String new: (value size) + 256.
45             1 to: value size do: [:i | vn at: i put: (value at: i)].
46             value := vn. vn := nil.
47           ].
48           value at: pos put: c.
49           pos := pos + 1.
50         ].
51       ].
52       System flushStdOut.
53     ].
54     '\n' print.
55     System flushStdOut.
56     System; termRaw: false.
57     ^value from: 1 to: pos - 1.
58   ]