implement Buf;
include "buf.m";
include "sys.m";
sys : Sys;
new(s : string) : ref Data
{
sys = load Sys Sys->PATH;
d := ref Data;
d.txt = s;
d.ptr = 0;
return d;
}
Data.seek(d: self ref Data, n, where: int): int
{
case where {
Sys->SEEKSTART =>
d.ptr = n;
Sys->SEEKRELA =>
d.ptr += n;
Sys->SEEKEND =>
d.ptr = len d.txt - n;
}
if(d.ptr < 0) {
d.ptr = 0;
return d.ptr;
}
if(d.ptr > len d.txt) {
d.ptr = len d.txt;
return d.ptr;
}
return d.ptr;
}
Data.getc(d: self ref Data) : int
{
if(d.ptr == len d.txt)
return EOF;
i := sys->sprint("%s", d.txt[d.ptr:d.ptr+1]);
(c, nil, nil) := sys->byte2char(array of byte i, 0);
d.ptr++;
return c;
}
Data.ungetc(d: self ref Data) : int
{
d.ptr--;
if(d.ptr < 0)
d.ptr = 0;
return d.ptr;
}
Data.offset(d: self ref Data) : int
{
return d.ptr;
}
Data.gets(d: self ref Data, sep : int) : string
{
b := array[sys->UTFmax] of byte;
used : int;
s := "";
for(c := d.getc(); c != EOF; c = d.getc()) {
used = sys->char2byte(c, b, 0);
s += string b[0:used];
if(c == sep)
break;
}
return s;
}
|