summaryrefslogtreecommitdiff
path: root/appl
diff options
context:
space:
mode:
Diffstat (limited to 'appl')
-rw-r--r--appl/cmd/rawdbfs.b3
-rw-r--r--appl/lib/mkfile1
-rw-r--r--appl/lib/rabin.b85
-rw-r--r--appl/lib/styxservers.b5
4 files changed, 92 insertions, 2 deletions
diff --git a/appl/cmd/rawdbfs.b b/appl/cmd/rawdbfs.b
index cb2daf2c..0b59167e 100644
--- a/appl/cmd/rawdbfs.b
+++ b/appl/cmd/rawdbfs.b
@@ -179,7 +179,7 @@ init(ctxt: ref Draw->Context, args: list of string)
df := bufio->open(file, Sys->ORDWR);
if(df == nil && empty){
- (rc, d) := sys->stat(file);
+ (rc, nil) := sys->stat(file);
if(rc < 0)
df = bufio->create(file, Sys->ORDWR, 8r600);
}
@@ -246,7 +246,6 @@ Serve:
sys->fprint(stderr, "dbfs: fatal read error: %s\n", m.error);
break Serve;
Open =>
- c := srv.getfid(m.fid);
open(srv, m);
Read =>
(c, err) := srv.canread(m);
diff --git a/appl/lib/mkfile b/appl/lib/mkfile
index 279ca1ac..50806482 100644
--- a/appl/lib/mkfile
+++ b/appl/lib/mkfile
@@ -91,6 +91,7 @@ TARG=\
profile.dis\
pslib.dis\
quicktime.dis\
+ rabin.dis\
rand.dis\
random.dis\
readdir.dis\
diff --git a/appl/lib/rabin.b b/appl/lib/rabin.b
new file mode 100644
index 00000000..6a33011a
--- /dev/null
+++ b/appl/lib/rabin.b
@@ -0,0 +1,85 @@
+implement Rabin;
+
+include "sys.m";
+ sys: Sys;
+include "bufio.m";
+ bufio: Bufio;
+ Iobuf, EOF, ERROR: import bufio;
+include "rabin.m";
+
+sprint: import sys;
+
+init(b: Bufio)
+{
+ sys = load Sys Sys->PATH;
+ bufio = b;
+}
+
+modpower(base, n, mod: int): int
+{
+ power := 1;
+ for(i := 0; i < n; i++)
+ power = (power * base) % mod;
+ return power;
+}
+
+Rcfg.mk(prime, width, mod: int): (ref Rcfg, string)
+{
+ rcfg := ref Rcfg(prime, width, mod, array[256] of int);
+ power := modpower(prime, width, mod);
+ for(i := 0; i < 256; i++)
+ rcfg.tab[i] = (i * power) % mod;
+ return (rcfg, nil);
+}
+
+
+open(rcfg: ref Rcfg, b: ref Iobuf, min, max: int): (ref Rfile, string)
+{
+ if(min > max)
+ return (nil, sprint("bad min/max"));
+ if(min < rcfg.width)
+ return (nil, "min < width");
+ r := ref Rfile(b, rcfg, min, max, array[max+rcfg.width] of byte, 0, 0, big 0);
+
+ (prime, width, mod) := (r.rcfg.prime, r.rcfg.width, r.rcfg.mod);
+ while(r.n < width) {
+ ch := r.b.getb();
+ if(ch == ERROR)
+ return (nil, sprint("reading: %r"));
+ if(ch == EOF)
+ break;
+ r.buf[r.n] = byte ch;
+ r.state = (prime*r.state + ch) % mod;
+ r.n++;
+ }
+ return (r, nil);
+}
+
+Rfile.read(r: self ref Rfile): (array of byte, big, string)
+{
+ (prime, width, mod) := (r.rcfg.prime, r.rcfg.width, r.rcfg.mod);
+ for(;;) {
+ ch := r.b.getb();
+ if(ch == ERROR)
+ return (nil, big 0, sprint("reading: %r"));
+ if(ch == EOF) {
+ d := r.buf[:r.n];
+ off := r.off;
+ r.n = 0;
+ r.off += big len d;
+ return (d, off, nil);
+ }
+ r.buf[r.n] = byte ch;
+ r.state = (mod+prime*r.state + ch - r.rcfg.tab[int r.buf[r.n-width]]) % mod;
+ r.n++;
+ if(r.n-width >= r.max || (r.n-width >= r.min && r.state == mod-1)) {
+ d := array[r.n-width] of byte;
+ d[:] = r.buf[:len d];
+ off := r.off;
+ r.buf[:] = r.buf[r.n-width:r.n];
+ r.n = width;
+ r.off += big len d;
+ return (d, off, nil);
+ }
+ }
+}
diff --git a/appl/lib/styxservers.b b/appl/lib/styxservers.b
index 034cd4b7..0f60699d 100644
--- a/appl/lib/styxservers.b
+++ b/appl/lib/styxservers.b
@@ -100,6 +100,11 @@ Fid.open(c: self ref Fid, mode: int, qid: Sys->Qid)
c.qtype = qid.qtype;
}
+Styxserver.error(srv: self ref Styxserver, m: ref Tmsg, msg: string)
+{
+ srv.reply(ref Rmsg.Error(m.tag, msg));
+}
+
Styxserver.reply(srv: self ref Styxserver, m: ref Rmsg): int
{
if(debug)