[pmarin]. ReadChar is an implementation of the classic getc and putbak functions. <
> For more info see the page 255 of Software Tools by Kernighan and Plauger. <
> The code is part of [Muddy Scheme] ---- ====== package require TclOO package require struct::stack oo::class create ReadChar { constructor {{chan stdin}} { my variable ch my variable buf set ch $chan set buf [struct::stack] } method getc {} { my variable ch my variable buf if {[$buf size]} { return [$buf pop] } else { if {![eof $ch]} { return [read $ch 1] } else { return "eof" } } } method eof {} { my variable ch my variable buf if { ![$buf size] && [eof $ch] } { return 1 } else { return 0 } } method peek {} { my variable ch my variable buf if {[$buf size]} { return [$buf peek] } else { if {![eof $ch]} { set c [read $ch 1] $buf push $c return $c } else { return "eof" } } } method putbak str { my variable buf if { [string length $str] > 0 } { if { [string length $str] == 1 } { $buf push $str } else { foreach i [split [string reverse $str] {}] { $buf push $i } } } } destructor { my variable ch my variable buf $buf destroy close $ch } } ====== ---- **Comments** It is rare that It is not already implemented in the core libraries... Am I missing something? DCP: Never ever needed to read or write a single char in Tcl in the last 10-15 years! <
> [pmarin]: Even the C Standard Library comes with getc and ungetc (stdio.h)! ---- '''[LVwikignome] - 2010-01-20 12:54:00''' So, what would an example of using the above code look like? Is it a '''true''' getc, in that the application using the above code will get a single character at a time, without a newline needing to be typed? (2010-1-20) [pmarin]. It is like `getc` and `ungetc` functions in C. Tcl I/O can't return characters to the buffer, or not? : ====== # An implementation of cat # cat.tcl ReadChar create rchar ; # by default use stdin while { ![rchar eof] } { puts -nonewline [rchar getc]] } ====== Another example: ====== > ReadChar create rchar ::rchar > rchar putbak "hello wolrd" > puts [rchar peek] h > puts [rchar getc] h > puts [rchar getc] e > puts "[rchar getc][rchar getc][rchar getc]" llo > rchar destroy ====== I am using this class in the reader of [Muddy Scheme] ---- !!!!!! %| [Category Example] |% !!!!!!