import "io" import "heap" import "strings_two" export { new_stringstream, stringstream_istheremore, stringstream_getchar, stringstream_undogetchar, stringstream_getstring, stringstream_delete } manifest { stringstream_string = 0, stringstream_pos = 1, sizeof_stringstream = 2 } let new_stringstream(s) be { let r = newvec(sizeof_stringstream); if r = nil then resultis nil; r ! stringstream_string := s; r ! stringstream_pos := 0; resultis r } let stringstream_istheremore(s) be resultis s ! stringstream_pos < string_length(s ! stringstream_string); let stringstream_getchar(s) be test stringstream_istheremore(s) then { let r = string_getchar(s ! stringstream_string, s ! stringstream_pos); s ! stringstream_pos +:= 1; resultis r } else resultis 0; let stringstream_undogetchar(s) be { if s ! stringstream_pos = 0 then resultis false; s ! stringstream_pos -:= 1; resultis true } let stringstream_getstring(s) be { let r, c; while true do { c := stringstream_getchar(s); if c <> ' ' then break } if c = 0 then resultis nil; stringstream_undogetchar(s); r := new_string(); if r = nil then resultis nil; while true do { c := stringstream_getchar(s); if c = 0 then resultis r; if c = ' ' then { stringstream_undogetchar(s); resultis r } string_addchar(r, c) } } let stringstream_delete(s) be { freevec(s ! stringstream_string); freevec(s) } let start() be { let base, strm; init(); base := string_frombcplstring(" the quick brown fox jumped over the lazy dogs "); strm := new_stringstream(base); while true do { let s = stringstream_getstring(strm); if s = nil then break; string_print(s); outch('\n'); } }