aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libn.h35
-rw-r--r--sys/libn/flate.c36
-rw-r--r--sys/libn/gz.c90
3 files changed, 135 insertions, 26 deletions
diff --git a/include/libn.h b/include/libn.h
index 6547713..43600c0 100644
--- a/include/libn.h
+++ b/include/libn.h
@@ -176,17 +176,36 @@ typedef struct io·ReadWriter
// -----------------------------------------------------------------------------
// libflate
+// NOTE: Experimental!
-typedef struct gz·Reader gz·Reader;
-typedef struct gz·Writer gz·Writer;
+typedef struct flate·Reader flate·Reader;
+typedef struct flate·Writer flate·Writer;
-gz·Reader *gz·newreader(io·Reader rdr, void* r, mem·Allocator mem, void* m);
-int gz·read(gz·Reader *rdr, int sz, int n, void *buf);
-error gz·freereader(gz·Reader *rdr);
+flate·Reader *flate·newreader(io·Reader rdr, void* r, mem·Allocator mem, void* m);
+int flate·read(flate·Reader *rdr, int sz, int n, void *buf);
+error flate·freereader(flate·Reader *rdr);
-gz·Writer *gz·newwriter(io·Writer wtr, void* w, mem·Allocator mem, void* m);
-error gz·freewriter(gz·Writer *wtr);
-int gz·write(gz·Writer *wtr, int sz, int n, void *buf);
+flate·Writer *flate·newwriter(io·Writer wtr, void* w, mem·Allocator mem, void* m);
+error flate·freewriter(flate·Writer *wtr);
+int flate·write(flate·Writer *wtr, int sz, int n, void *buf);
+
+// -----------------------------------------------------------------------------
+// libgz
+
+typedef void gz·Stream;
+
+gz·Stream* gz·open(byte *path, byte *mode);
+error gz·close(gz·Stream* s);
+int gz·read(gz·Stream *s, int sz, int n, void* buf);
+int gz·readln(gz·Stream *s, int n, byte *buf);
+byte gz·getbyte(gz·Stream *s);
+error gz·ungetbyte(gz·Stream *s, byte c);
+int gz·write(gz·Stream *s, int sz, int n, void* buf);
+error gz·putbyte(gz·Stream *s, byte str);
+error gz·putstring(gz·Stream *s, byte *str);
+int gz·printf(gz·Stream *s, byte *fmt, ...);
+error gz·flush(gz·Stream *s);
+vlong gz·seek(gz·Stream *s, long off, enum SeekPos whence);
// -----------------------------------------------------------------------------
// Error handling functions.
diff --git a/sys/libn/flate.c b/sys/libn/flate.c
index 907d958..b2feaff 100644
--- a/sys/libn/flate.c
+++ b/sys/libn/flate.c
@@ -16,7 +16,7 @@ typedef struct buffer
// -----------------------------------------------------------------------
// Reading
-typedef struct gz·Reader
+typedef struct flate·Reader
{
io·Reader rdr;
void* impl;
@@ -25,13 +25,13 @@ typedef struct gz·Reader
struct buffer;
buffer b;
};
-} gz·Reader;
+} flate·Reader;
-gz·Reader*
-gz·newreader(io·Reader rdr, void* r, mem·Allocator mem, void* m)
+flate·Reader*
+flate·newreader(io·Reader rdr, void* r, mem·Allocator mem, void* m)
{
error err;
- gz·Reader *zrdr;
+ flate·Reader *zrdr;
zrdr = mem.alloc(m, 1, sizeof(*zrdr));
@@ -69,10 +69,10 @@ ERROR:
}
error
-gz·freereader(gz·Reader *rdr)
+flate·freereader(flate·Reader *rdr)
{
int err;
- gz·Reader zrdr;
+ flate·Reader zrdr;
zrdr = *rdr;
err = inflateEnd(&zrdr.b.z);
@@ -86,11 +86,11 @@ gz·freereader(gz·Reader *rdr)
}
int
-gz·read(gz·Reader *rdr, int sz, int n, void *buf)
+flate·read(flate·Reader *rdr, int sz, int n, void *buf)
{
int r;
int err;
- gz·Reader zrdr;
+ flate·Reader zrdr;
zrdr = *rdr;
zrdr.next_out = buf;
@@ -121,14 +121,14 @@ READ:
goto ERROR;
}
ERROR:
- gz·freereader(rdr);
+ flate·freereader(rdr);
return -1;
}
// -----------------------------------------------------------------------
// Writing
-struct gz·Writer
+struct flate·Writer
{
io·Writer wtr;
void* impl;
@@ -139,11 +139,11 @@ struct gz·Writer
};
};
-gz·Writer*
-gz·newwriter(io·Writer wtr, void* w, mem·Allocator mem, void* m)
+flate·Writer*
+flate·newwriter(io·Writer wtr, void* w, mem·Allocator mem, void* m)
{
error err;
- gz·Writer *zwtr;
+ flate·Writer *zwtr;
zwtr = mem.alloc(m, 1, sizeof(*zwtr));
zwtr->zalloc = mem.alloc;
@@ -179,10 +179,10 @@ ERROR:
}
error
-gz·freewriter(gz·Writer *wtr)
+flate·freewriter(flate·Writer *wtr)
{
int err;
- gz·Writer zwtr;
+ flate·Writer zwtr;
zwtr = *wtr;
err = deflateEnd(&zwtr.b.z);
@@ -196,11 +196,11 @@ gz·freewriter(gz·Writer *wtr)
}
int
-gz·write(gz·Writer *wtr, int sz, int n, void *buf)
+flate·write(flate·Writer *wtr, int sz, int n, void *buf)
{
int r;
int err;
- gz·Writer zwtr;
+ flate·Writer zwtr;
zwtr = *wtr;
zwtr.next_out = buf;
diff --git a/sys/libn/gz.c b/sys/libn/gz.c
new file mode 100644
index 0000000..86face4
--- /dev/null
+++ b/sys/libn/gz.c
@@ -0,0 +1,90 @@
+#include <u.h>
+#include <libn.h>
+
+#include <vendor/zlib.h>
+
+gz·Stream*
+gz·open(byte *path, byte *mode)
+{
+ return gzopen(path, mode);
+}
+
+error
+gz·close(gz·Stream* s)
+{
+ return gzclose(s);
+}
+
+int
+gz·read(gz·Stream *s, int sz, int n, void* buf)
+{
+ return gzread(s, buf, n*sz);
+}
+
+int
+gz·readln(gz·Stream *s, int n, byte *buf)
+{
+ byte* b;
+ b = gzgets(s, buf, n);
+
+ return strlen(b);
+}
+
+byte
+gz·getbyte(gz·Stream *s)
+{
+ // NOTE: Can't call macro
+ byte b[2];
+ gzread(s, b, 1);
+
+ return b[0];
+}
+
+error
+gz·ungetbyte(gz·Stream *s, byte c)
+{
+ return gzungetc(c, s);
+}
+
+int
+gz·write(gz·Stream *s, int sz, int n, void* buf)
+{
+ return gzwrite(s, buf, n*sz);
+}
+
+error
+gz·putbyte(gz·Stream *s, byte c)
+{
+ return gzputc(s, c);
+}
+
+error
+gz·putstring(gz·Stream *s, byte *str)
+{
+ return gzputs(s, str);
+}
+
+int
+gz·printf(gz·Stream *s, byte *fmt, ...)
+{
+ error err;
+
+ va_list args;
+ va_start(args, fmt);
+ err = gzprintf(s, fmt, args);
+ va_end(args);
+
+ return err;
+}
+
+error
+gz·flush(gz·Stream *s)
+{
+ return gzflush(s, Z_FINISH);
+}
+
+vlong
+gz·seek(gz·Stream *s, long off, enum SeekPos whence)
+{
+ return gzseek(s, off, whence);
+}