diff --git a/stix/kernel/Console.st b/stix/kernel/Console.st new file mode 100644 index 0000000..b4cfe5e --- /dev/null +++ b/stix/kernel/Console.st @@ -0,0 +1,206 @@ +#class Point(Object) +{ + #dcl x y. + + #method(#class) new + { + ^self basicNew x: 0 y: 0. + } + #method(#class) x: x y: y + { + ^self basicNew x: x y: y. + } + + #method x + { + ^self.x + } + + #method y + { + ^self.y + } + + #method x: x + { + self.x := x + } + + #method y: y + { + self.y := y + } + + #method x: x y: y + { + self.x := x. + self.y := y + } +} + +#extend SmallInteger +{ + #method @ y + { + ^Point x: self y: y + } +} + + + + +#class Console(Object) +{ + #dcl handle. +" + #method finalize + { + handle notNil ifTrue: [ + self _close: handle. + ] + } +" + + +## #method(#class) input +## { +## ^self new _open: filename mode: mode +## } + + #method(#class) output + { + | c | + + c := self new. + c handle: (c _open). + ^c + } + +## #method(#class) error +## { +## } + + + #method handle: v + { + self.handle := v. + } + + #method close + { + self _close: self.handle. + self.handle := nil. + } + + #method write: text + { + ^self _writeOn: self.handle text: text. + } + + #method clear + { + ^self _clear: self.handle + } + #method setCursor: point + { + ^self _setCursor: self.handle point: point. + } +" + #method _open: filename mode: mode + { + self.handle := self __open: filename mode: mode. + ^self. + } + + #method __open: filename mode: mode + { + + ##StdioException signal: ('cannot open ' & filename). + } +" + + #method _open + { + + } + + #method _close: handle + { + + self primitiveFailed. + } + + #method _clear: handle + { + + self primitiveFailed. + } + + #method _writeOn: handle text: text + { + + self primitiveFailed. + } + + #method _setCursor: handle point: point + { + + self primitiveFailed. + } + + + +" + #method(#class) open + { + + self primitiveFailed. + } + + #method close + { + + self primitiveFailed. + } + + #method setCursorTo: point + { + + self primitiveFailed. + } +" + +##x := Colsole new. +##x := Console open. +##(x isError) ifTrue: [ +## handle error... +## ] +## ifFalse: [ +## x setCursor (1, 2). +## x clear. +## x close. +## ] + +##x := File open: 'abc.def' +##t := x read: 1000. +##x close. +} + +" +Stix define: 'console_write' + forClass: Console + method: 'write: aString upto: length' + returns: 'size_t' + arguments: 'void* size_t' + +---> produces a method like this internally... + +#class Console +{ + #method write: aString upto: length + { + <== parse the string, create a descriptor table, key is console_write, value is resolved to a function pointer. + } +} +" +