lessの実装
Posted feedbacks - Smalltalk
Squeak Smalltalk で。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | | file font nLines cr sp goNextPage goPrevPage findNext prevLine |
file := FileStream fileNamed: 'in.txt'.
font := TextStyle defaultFont.
cr := Character cr.
sp := Character space.
nLines := Display height // (font height + font descent).
goNextPage := [nLines timesRepeat: [file nextLine]].
prevLine := [file binary. [file position = 0 or: [file back = 13]] whileFalse. file ascii].
goPrevPage := [nLines timesRepeat: [prevLine value]].
findNext := [:pattern | pattern notEmpty ifTrue: [file upToAll: pattern]. prevLine value].
[ | string |
string := String streamContents: [:ss |
| position |
position := file position.
nLines timesRepeat: [
file nextLine ifNotNilDo: [:line | ss nextPutAll: line].
file peek ifNotNil: [ss cr]].
file position: position].
Display fillWhite.
string asDisplayText display.
[Sensor keyboardPressed] whileFalse.
Sensor keyboard caseOf: {
[$q] -> [file close. ^World restoreDisplay].
[$g] -> [file reset].
[$G] -> [file setToEnd].
[sp] -> [goNextPage value].
[$f] -> [goNextPage value].
[$b] -> [goPrevPage value].
[cr] -> [file nextLine].
[$e] -> [file nextLine].
[$y] -> [prevLine value].
[$/] -> [findNext value: (FillInTheBlank request: 'pattern:')]
} otherwise: []
] repeat
|


takeru #6817() Rating-7/7=-1.00
'less'を実装してください。
巨大なファイルでも効率的に動作するようにしてください。
最低限必要な機能は、
です。
[ reply ]