aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas <nbnoll@eml.cc>2021-11-20 10:53:19 -0800
committerNicholas <nbnoll@eml.cc>2021-11-20 10:53:19 -0800
commita9bfe650038afea8b751175cac16f6027345e45f (patch)
tree9a7f9feb76a64bb3efe573036d80b7bdbf8a59a5
parent1c8d4e69205fd875f6bec3fa3bd929c2e7f52f62 (diff)
Chore: reorganize libutf and libfmt into base
I found the split to be arbitrary. Better to include the functionality in the standard library. I also split the headers to allow for more granular inclusion (but the library is still monolithic). The only ugliness is the circular dependency introduced with libutf's generated functions. We put explicit prereqs with the necessary object files instead.
-rw-r--r--include/base.h397
-rw-r--r--include/base/coro.h7
-rw-r--r--include/base/error.h7
-rw-r--r--include/base/flate.h16
-rw-r--r--include/base/fmt.h (renamed from include/libfmt.h)0
-rw-r--r--include/base/fs.h29
-rw-r--r--include/base/gz.h29
-rw-r--r--include/base/io.h141
-rw-r--r--include/base/mem.h63
-rw-r--r--include/base/mmap.h13
-rw-r--r--include/base/rng.h9
-rw-r--r--include/base/sort.h18
-rw-r--r--include/base/string.h30
-rw-r--r--include/base/utf.h (renamed from include/libutf.h)0
-rw-r--r--rules.mk4
-rw-r--r--src/base/arg.c70
-rw-r--r--src/base/fmt/buffer.c (renamed from src/libfmt/buffer.c)0
-rw-r--r--src/base/fmt/do.c (renamed from src/libfmt/do.c)0
-rw-r--r--src/base/fmt/esprint.c (renamed from src/libfmt/esprint.c)0
-rw-r--r--src/base/fmt/float.c (renamed from src/libfmt/float.c)0
-rw-r--r--src/base/fmt/fprint.c (renamed from src/libfmt/fprint.c)0
-rw-r--r--src/base/fmt/internal.h (renamed from src/libfmt/internal.h)2
-rw-r--r--src/base/fmt/locale.c (renamed from src/libfmt/locale.c)0
-rw-r--r--src/base/fmt/nsprint.c (renamed from src/libfmt/nsprint.c)0
-rw-r--r--src/base/fmt/open.c (renamed from src/libfmt/open.c)0
-rw-r--r--src/base/fmt/panic.c (renamed from src/libfmt/panic.c)0
-rw-r--r--src/base/fmt/print.c (renamed from src/libfmt/print.c)0
-rw-r--r--src/base/fmt/rules.mk21
-rw-r--r--src/base/fmt/sprint.c (renamed from src/libfmt/sprint.c)0
-rw-r--r--src/base/fmt/test.c (renamed from src/libfmt/test.c)0
-rw-r--r--src/base/fmt/vesprint.c (renamed from src/libfmt/vesprint.c)0
-rw-r--r--src/base/fmt/vfprint.c (renamed from src/libfmt/vfprint.c)0
-rw-r--r--src/base/fmt/vnsprint.c (renamed from src/libfmt/vnsprint.c)0
-rw-r--r--src/base/fmt/vprint.c (renamed from src/libfmt/vprint.c)0
-rw-r--r--src/base/fmt/vwrite.c (renamed from src/libfmt/vwrite.c)0
-rw-r--r--src/base/fmt/write.c (renamed from src/libfmt/write.c)0
-rw-r--r--src/base/io/close.c7
-rw-r--r--src/base/io/open.c6
-rw-r--r--src/base/io/rules.mk3
-rw-r--r--src/base/rules.mk9
-rw-r--r--src/base/utf/canfit.c (renamed from src/libutf/canfit.c)0
-rw-r--r--src/base/utf/decode.c (renamed from src/libutf/decode.c)0
-rw-r--r--src/base/utf/decodeprev.c (renamed from src/libutf/decodeprev.c)0
-rw-r--r--src/base/utf/encode.c (renamed from src/libutf/encode.c)0
-rw-r--r--src/base/utf/find.c (renamed from src/libutf/find.c)0
-rw-r--r--src/base/utf/findlast.c (renamed from src/libutf/findlast.c)0
-rw-r--r--src/base/utf/internal.h (renamed from src/libutf/internal.h)1
-rw-r--r--src/base/utf/len.c (renamed from src/libutf/len.c)0
-rw-r--r--src/base/utf/rules.mk71
-rw-r--r--src/base/utf/runelen.c (renamed from src/libutf/runelen.c)0
-rw-r--r--src/base/utf/vendor/common.c (renamed from src/libutf/vendor/common.c)2
-rw-r--r--src/base/utf/vendor/common.h (renamed from src/libutf/vendor/common.h)1
-rw-r--r--src/base/utf/vendor/mkgraphemedata.c (renamed from src/libutf/vendor/mkgraphemedata.c)0
-rw-r--r--src/base/utf/vendor/mkrunetype.c (renamed from src/libutf/vendor/mkrunetype.c)0
-rw-r--r--src/base/utf/vendor/mkrunewidth.c (renamed from src/libutf/vendor/mkrunewidth.c)0
-rw-r--r--src/cmd/core/basename.c1
-rw-r--r--src/cmd/core/cat.c1
-rw-r--r--src/cmd/dwm/dwm.h1
-rw-r--r--src/cmd/menu/menu.h1
-rw-r--r--src/cmd/rc/rc.h2
-rw-r--r--src/cmd/term/term.h1
-rw-r--r--src/libbio/rules.mk5
-rw-r--r--src/libc/rules.mk20
-rw-r--r--src/libc/stdio.c59
-rw-r--r--src/libc/string.c80
-rw-r--r--src/libfmt/rules.mk36
-rw-r--r--src/libutf/rules.mk76
-rw-r--r--src/rules.mk6
-rw-r--r--sys/linux/src/infofd.c1
-rw-r--r--sys/linux/src/ioctl.c1
70 files changed, 491 insertions, 756 deletions
diff --git a/include/base.h b/include/base.h
index df580c3..8152cb7 100644
--- a/include/base.h
+++ b/include/base.h
@@ -23,385 +23,21 @@
typedef wchar_t wchar;
-// ----------------------------------------------------------------------------
-// dynamic array
-
-typedef struct BufHdr
-{
- vlong len;
- vlong cap;
- byte buf[];
-} BufHdr;
-
-#define bufhdr(b) ((BufHdr*)((uint8*)(b)-offsetof(BufHdr, buf)))
-#define buflen(b) ((b) ? (bufhdr(b)->len) : 0)
-#define bufcap(b) ((b) ? (bufhdr(b)->cap) : 0)
-#define bufend(b) ((b) + buflen(b))
-#define bufsize(b) ((b) ? (buflen(b) * sizeof((b)[0])) : 0)
-
-#define buffree(b) ((b) ? (free(bufhdr(b)), (b) = nil) : 0)
-#define buffit(b, n) ((n) <= bufcap(b) ? 0 : ((b) = ·bufgrow((b), (n), sizeof(*(b)))))
-
-#define bufpush(b, ...) (buffit((b), 1 + buflen(b)), (b)[bufhdr(b)->len++] = (__VA_ARGS__))
-#define bufaddn(b, n) (buffit(b, buflen(b)+n), bufhdr(b)->len += n, b+bufhdr(b)->len-n)
-
-#define bufpop(b) ((b)[--bufhdr(b)->len])
-#define bufdel(b, i) bufdeln((b), (i), 1)
-#define bufdeln(b, i, n) (memmove((b)+(i), (b)+(i)+(n), sizeof(*(b))*(bufhdr(b)->len-(n)-(i)), bufhdr(b)->len -= (n))
-#define bufdelswap(b, i) ((b)[i] = bufend(b)[-1], bufhdr(b)->len-=1)
-
-void* ·bufgrow(void*, vlong, vlong);
-
-// -----------------------------------------------------------------------------
-// memory allocation
-
-/* allocator interface */
-typedef struct mem·Allocator {
- void *(*alloc)(void *heap, uint n, ulong size);
- void (*free)(void *heap, void *ptr);
-} mem·Allocator;
-
-extern mem·Allocator sys·Memory;
-
-typedef struct mem·Reallocator {
- void *(*alloc)(void *iface, uint n, ulong size);
- void *(*realloc)(void *iface, void *ptr, uint n, ulong size);
- void (*free)(void *iface, void *ptr);
-} mem·Reallocator;
-
-extern mem·Reallocator sys·FullMemory;
-
-/* simple memory arena */
-typedef struct mem·Arena mem·Arena;
-
-mem·Arena *mem·makearena(mem·Allocator from, void*);
-void *mem·arenaalloc(mem·Arena *A, uint n, ulong size);
-void mem·freearena(mem·Arena *A);
-
-extern mem·Allocator mem·ArenaAllocator;
-
-/* generalized memxxx functions */
-void memset64(void *dst, uint64 val, uintptr size);
-
-// -----------------------------------------------------------------------------
-// coroutines
-
-typedef struct Coro Coro;
-
-Coro* coro·make(uintptr stk, uintptr (*func)(Coro*, uintptr));
-uintptr coro·yield(Coro *c, uintptr arg);
-int coro·free(Coro *c);
-
-// -----------------------------------------------------------------------------
-// strings
-
-typedef byte* string;
-
-/* augmented string functions */
-string str·makecap(const char *s, vlong len, vlong cap);
-string str·makelen(const char *s, vlong len);
-string str·make(const char *s);
-string str·makef(const char *fmt, ...);
-void str·free(string s);
-int str·len(const string s);
-int str·cap(const string s);
-void str·clear(string *s);
-void str·grow(string *s, vlong delta);
-void str·fit(string *s);
-int str·appendlen(string *s, vlong len, const char *b);
-int str·append(string *s, const char *b);
-int str·appendf(string *s, const char *fmt, ...);
-int str·appendbyte(string *s, const char b);
-bool str·equals(const string s, const string t);
-int str·find(string s, const char* substr);
-void str·lower(string s);
-void str·upper(string s);
-int str·read(string s, int size, int n, void *buf);
-void str·replace(string s, const byte* from, const byte* to);
-string* str·split(string s, const byte* tok);
-string str·join(vlong len, byte** fields, const byte* sep);
-
-/* raw C string functions */
-char *str·copyn(char *dst, char *src, int n);
-
-// -----------------------------------------------------------------------------
-// i/o
-
-enum SeekPos
-{
- seek·cur = SEEK_CUR,
- seek·set = SEEK_SET,
- seek·end = SEEK_END
-};
-
-typedef struct io·Reader
-{
- int (*read)(void*, int sz, int n, void *buf);
-} io·Reader;
-extern io·Reader sys·Reader;
-
-typedef struct io·Peeker
-{
- byte (*get)(void*);
- int (*unget)(void*, byte);
-} io·Peeker;
-extern io·Peeker sys·Peeker;
-
-typedef struct io·Seeker
-{
- int (*seek)(void *skr, long off, enum SeekPos whence);
- long (*tell)(void *skr);
-} io·Seeker;
-extern io·Seeker sys·Seeker;
-
-typedef struct io·SeekReader
-{
- io·Seeker;
- io·Reader;
-} io·SeekReader;
-extern io·SeekReader sys·SeekReader;
-
-typedef struct io·PeekReader
-{
- io·Reader;
- io·Peeker;
-} io·PeekReader;
-extern io·PeekReader sys·PeekReader;
-
-typedef struct io·Writer
-{
- int (*write)(void*, int sz, int n, void *buf);
-} io·Writer;
-extern io·Writer sys·Writer;
-
-typedef struct io·Putter
-{
- int (*put) (void*, byte);
- int (*puts)(void*, string);
-} io·Putter;
-extern io·Putter sys·Putter;
-
-typedef struct io·PutWriter
-{
- io·Writer;
- io·Putter;
-} io·PutWriter;
-extern io·PutWriter sys·PutWriter;
-
-typedef struct io·ReadWriter
-{
- io·Reader;
- io·Writer;
-} io·ReadWriter;
-extern io·ReadWriter sys·ReadWriter;
-
-/* XXX: change casing */
-enum
-{
- ReadOK = R_OK,
- WriteOK = W_OK,
- ExecOK = X_OK,
-};
-
-/* XXX(deprecated): file handling */
-
-typedef FILE io·Stream;
-typedef struct stat io·Stat;
-
-io·Stream *io·open(byte *name, byte *mode);
-int io·fd(io·Stream *s);
-int io·stat(io·Stream *s, io·Stat *buf);
-int io·close(io·Stream *s);
-byte io·getbyte(io·Stream *s);
-int io·ungetbyte(io·Stream *s, byte c);
-int io·read(io·Stream *s, int sz, int n, void *buf);
-int io·readln(io·Stream *s, int n, byte *buf);
-int io·putbyte(io·Stream *s, byte c);
-int io·putstring(io·Stream *s, string str);
-int io·write(io·Stream *s, int sz, int n, void *buf);
-int io·flush(io·Stream *s);
-int io·seek(io·Stream *s, long off, enum SeekPos whence);
-long io·tell(io·Stream *s);
-
-/* basic os helpers */
-
-int os·exists(byte *path, int flag);
-byte *os·dirname(byte *path);
-byte *os·basename(byte *path);
-int os·sep(void);
-
-/* io interfaces */
-/* buffered i/o */
-typedef struct io·Buffer io·Buffer;
-
-enum
-{
- bufio·size = 2*4096,
- bufio·ungets = 8,
- bufio·eof = -1,
- bufio·err = -2,
-
- bufio·nil = 1 << 0,
- bufio·rdr = 1 << 1,
- bufio·wtr = 1 << 2,
- bufio·end = 1 << 3,
-};
-
-struct io·Buffer
-{
- int state;
- int runesize;
- void *h;
- union {
- io·Reader rdr;
- io·Writer wtr;
- };
- vlong size;
- byte *beg, *pos, *end;
- byte buf[bufio·size + bufio·ungets];
-};
-
-int bufio·initreader(io·Buffer *buf, io·Reader rdr, void *h);
-void bufio·finireader(io·Buffer *buf);
-int bufio·getbyte(io·Buffer *buf);
-int bufio·ungetbyte(io·Buffer *buf, byte c);
-int bufio·read(io·Buffer *buf, int sz, int n, void *out);
-
-// -----------------------------------------------------------------------------
-// memory mapped files
-
-typedef struct mmap·Reader
-{
- vlong len;
- union{
- char *b;
- uchar *u;
- };
-} mmap·Reader;
-
-mmap·Reader mmap·open(byte *name);
-int mmap·close(mmap·Reader rdr);
-
-// -----------------------------------------------------------------------------
-// filesystem
-
-#define iota(x) 1 << (x)
-enum
-{
- fs·preorder = iota(0),
- fs·nolinks = iota(1),
- fs·verbose = iota(2),
-};
-#undef iota
-
-typedef struct fs·Walker fs·Walker;
-typedef struct fs·History fs·History;
-
-struct fs·Walker
-{
- int fd, lev, max, err;
- uchar flags : 4;
- fs·History *hist;
- struct {
- void *data;
- int (*func)(void *data, char *relp, char *absp, io·Stat* info);
- };
- char *base, *end, path[4096];
-};
-
-int fs·init(fs·Walker *, char *path);
-void fs·fini(fs·Walker *);
-void fs·walk(fs·Walker *);
-
-// -----------------------------------------------------------------------------
-// libflate
-// NOTE: Experimental!
-
-typedef struct flate·Reader flate·Reader;
-typedef struct flate·Writer flate·Writer;
-
-flate·Reader *flate·openreader(io·Reader rdr, void* r, mem·Allocator mem, void* m);
-int flate·read(flate·Reader *rdr, int sz, int n, void *buf);
-int flate·closereader(flate·Reader *rdr);
-
-flate·Writer *flate·openwriter(io·Writer wtr, void* w, mem·Allocator mem, void* m);
-int flate·write(flate·Writer *wtr, int sz, int n, void *buf);
-int flate·closewriter(flate·Writer *wtr);
-
-// -----------------------------------------------------------------------------
-// libgz
-
-typedef void gz·Stream;
-
-/* interfaces */
-extern io·Reader gz·Reader;
-extern io·Peeker gz·Peeker;
-extern io·Seeker gz·Seeker;
-extern io·SeekReader gz·SeekReader;
-extern io·PeekReader gz·PeekReader;
-
-extern io·Writer gz·Writer;
-extern io·Putter gz·Putter;
-extern io·PutWriter gz·PutWriter;
-extern io·ReadWriter gz·ReadWriter;
-
-gz·Stream *gz·open(byte *path, byte *mode);
-int 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);
-int gz·ungetbyte(gz·Stream *s, byte c);
-int gz·write(gz·Stream *s, int sz, int n, void* buf);
-int gz·putbyte(gz·Stream *s, byte str);
-int gz·putstring(gz·Stream *s, byte *str);
-int gz·printf(gz·Stream *s, byte *fmt, ...);
-int gz·flush(gz·Stream *s);
-int gz·seek(gz·Stream *s, long off, enum SeekPos whence);
-long gz·tell(gz·Stream *s);
-
-// -----------------------------------------------------------------------------
-// libjson
-// NOTE: Experimental!
-
-// -----------------------------------------------------------------------------
-// error handling functions
-
-void exits(char *s);
-void errorf(byte* fmt, ...);
-void verrorf(byte* fmt, va_list args);
-void panicf(byte *fmt, ...);
-void vpanicf(byte *fmt, va_list args);
-
-// -----------------------------------------------------------------------------
-// sorting
-
-void sort·int(uintptr n, int arr[]);
-void sort·int8(uintptr n, int8 arr[]);
-void sort·int16(uintptr n, int16 arr[]);
-void sort·int32(uintptr n, int32 arr[]);
-void sort·int64(uintptr n, int64 arr[]);
-
-void sort·uint(uintptr n, uint arr[]);
-void sort·uint8(uintptr n, uint8 arr[]);
-void sort·uint16(uintptr n, uint16 arr[]);
-void sort·uint32(uintptr n, uint32 arr[]);
-void sort·uint64(uintptr n, uint64 arr[]);
-
-void sort·float(uintptr n, float arr[]);
-void sort·double(uintptr n, double arr[]);
-
-void sort·string(uintptr n, byte* arr[]);
-
-// -----------------------------------------------------------------------------
-// fast random number generation
-
-int rng·init(uint64 seed);
-double rng·random(void);
-double rng·exponential(double lambda);
-bool rng·bernoulli(double f);
-double rng·normal(void);
-uint64 rng·randi(int max);
-uint64 rng·poisson(double mean);
+/* must be included first */
+#include <base/mem.h>
+#include <base/string.h>
+#include <base/error.h>
+#include <base/io.h>
+
+#include <base/fmt.h>
+#include <base/utf.h>
+#include <base/coro.h>
+#include <base/mmap.h>
+#include <base/fs.h>
+#include <base/flate.h>
+#include <base/gz.h>
+#include <base/sort.h>
+#include <base/rng.h>
// -----------------------------------------------------------------------------
// variable arguments
@@ -420,7 +56,6 @@ uint64 rng·poisson(double mean);
#endif
extern char *argv0;
-int arg·bytetorune(uint32*, byte *);
#define ARGBEGIN for((argv0?0:(argv0=*argv)),argv++,argc--; \
argv[0] && argv[0][0]=='-' && argv[0][1]; \
argc--, argv++) { \
@@ -431,7 +66,7 @@ int arg·bytetorune(uint32*, byte *);
argc--; argv++; break; \
} \
_argc = 0; \
- while(*_args && (_args += arg·bytetorune(&_argc, _args)))\
+ while(*_args && (_args += utf8·decode(_args, &_argc)))\
switch(_argc)
#define ARGEND SET(_argt);USED(_argt);USED(_argc);USED(_args);}USED(argv);USED(argc);
#define ARGF() (_argt=_args, _args="",\
diff --git a/include/base/coro.h b/include/base/coro.h
new file mode 100644
index 0000000..e8f23b1
--- /dev/null
+++ b/include/base/coro.h
@@ -0,0 +1,7 @@
+#pragma once
+
+typedef struct Coro Coro;
+
+Coro* coro·make(uintptr stk, uintptr (*func)(Coro*, uintptr));
+uintptr coro·yield(Coro *c, uintptr arg);
+int coro·free(Coro *c);
diff --git a/include/base/error.h b/include/base/error.h
new file mode 100644
index 0000000..57c1a77
--- /dev/null
+++ b/include/base/error.h
@@ -0,0 +1,7 @@
+#pragma once
+
+void exits(char *s);
+void errorf(byte* fmt, ...);
+void verrorf(byte* fmt, va_list args);
+void panicf(byte *fmt, ...);
+void vpanicf(byte *fmt, va_list args);
diff --git a/include/base/flate.h b/include/base/flate.h
new file mode 100644
index 0000000..670c8e7
--- /dev/null
+++ b/include/base/flate.h
@@ -0,0 +1,16 @@
+#pragma once
+
+// -----------------------------------------------------------------------------
+// libflate
+// NOTE: Experimental!
+
+typedef struct flate·Reader flate·Reader;
+typedef struct flate·Writer flate·Writer;
+
+flate·Reader *flate·openreader(io·Reader rdr, void* r, mem·Allocator mem, void* m);
+int flate·read(flate·Reader *rdr, int sz, int n, void *buf);
+int flate·closereader(flate·Reader *rdr);
+
+flate·Writer *flate·openwriter(io·Writer wtr, void* w, mem·Allocator mem, void* m);
+int flate·write(flate·Writer *wtr, int sz, int n, void *buf);
+int flate·closewriter(flate·Writer *wtr);
diff --git a/include/libfmt.h b/include/base/fmt.h
index 4c187fd..4c187fd 100644
--- a/include/libfmt.h
+++ b/include/base/fmt.h
diff --git a/include/base/fs.h b/include/base/fs.h
new file mode 100644
index 0000000..6852a84
--- /dev/null
+++ b/include/base/fs.h
@@ -0,0 +1,29 @@
+#pragma once
+
+#define iota(x) 1 << (x)
+enum
+{
+ fs·preorder = iota(0),
+ fs·nolinks = iota(1),
+ fs·verbose = iota(2),
+};
+#undef iota
+
+typedef struct fs·Walker fs·Walker;
+typedef struct fs·History fs·History;
+
+struct fs·Walker
+{
+ int fd, lev, max, err;
+ uchar flags : 4;
+ fs·History *hist;
+ struct {
+ void *data;
+ int (*func)(void *data, char *relp, char *absp, io·Stat* info);
+ };
+ char *base, *end, path[4096];
+};
+
+int fs·init(fs·Walker *, char *path);
+void fs·fini(fs·Walker *);
+void fs·walk(fs·Walker *);
diff --git a/include/base/gz.h b/include/base/gz.h
new file mode 100644
index 0000000..3b3a830
--- /dev/null
+++ b/include/base/gz.h
@@ -0,0 +1,29 @@
+#pragma once
+
+typedef void gz·Stream;
+
+/* interfaces */
+extern io·Reader gz·Reader;
+extern io·Peeker gz·Peeker;
+extern io·Seeker gz·Seeker;
+extern io·SeekReader gz·SeekReader;
+extern io·PeekReader gz·PeekReader;
+
+extern io·Writer gz·Writer;
+extern io·Putter gz·Putter;
+extern io·PutWriter gz·PutWriter;
+extern io·ReadWriter gz·ReadWriter;
+
+gz·Stream *gz·open(byte *path, byte *mode);
+int 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);
+int gz·ungetbyte(gz·Stream *s, byte c);
+int gz·write(gz·Stream *s, int sz, int n, void* buf);
+int gz·putbyte(gz·Stream *s, byte str);
+int gz·putstring(gz·Stream *s, byte *str);
+int gz·printf(gz·Stream *s, byte *fmt, ...);
+int gz·flush(gz·Stream *s);
+int gz·seek(gz·Stream *s, long off, enum SeekPos whence);
+long gz·tell(gz·Stream *s);
diff --git a/include/base/io.h b/include/base/io.h
new file mode 100644
index 0000000..f8c0bcc
--- /dev/null
+++ b/include/base/io.h
@@ -0,0 +1,141 @@
+#pragma once
+
+enum SeekPos
+{
+ seek·cur = SEEK_CUR,
+ seek·set = SEEK_SET,
+ seek·end = SEEK_END
+};
+
+typedef struct io·Reader
+{
+ int (*read)(void*, int sz, int n, void *buf);
+} io·Reader;
+extern io·Reader sys·Reader;
+
+typedef struct io·Peeker
+{
+ byte (*get)(void*);
+ int (*unget)(void*, byte);
+} io·Peeker;
+extern io·Peeker sys·Peeker;
+
+typedef struct io·Seeker
+{
+ int (*seek)(void *skr, long off, enum SeekPos whence);
+ long (*tell)(void *skr);
+} io·Seeker;
+extern io·Seeker sys·Seeker;
+
+typedef struct io·SeekReader
+{
+ io·Seeker;
+ io·Reader;
+} io·SeekReader;
+extern io·SeekReader sys·SeekReader;
+
+typedef struct io·PeekReader
+{
+ io·Reader;
+ io·Peeker;
+} io·PeekReader;
+extern io·PeekReader sys·PeekReader;
+
+typedef struct io·Writer
+{
+ int (*write)(void*, int sz, int n, void *buf);
+} io·Writer;
+extern io·Writer sys·Writer;
+
+typedef struct io·Putter
+{
+ int (*put) (void*, byte);
+ int (*puts)(void*, string);
+} io·Putter;
+extern io·Putter sys·Putter;
+
+typedef struct io·PutWriter
+{
+ io·Writer;
+ io·Putter;
+} io·PutWriter;
+extern io·PutWriter sys·PutWriter;
+
+typedef struct io·ReadWriter
+{
+ io·Reader;
+ io·Writer;
+} io·ReadWriter;
+extern io·ReadWriter sys·ReadWriter;
+
+/* XXX: change casing */
+enum
+{
+ ReadOK = R_OK,
+ WriteOK = W_OK,
+ ExecOK = X_OK,
+};
+
+/* XXX(deprecated): file handling */
+
+typedef FILE io·Stream;
+typedef struct stat io·Stat;
+
+io·Stream *io·open(byte *name, byte *mode);
+int io·fd(io·Stream *s);
+int io·stat(io·Stream *s, io·Stat *buf);
+int io·close(io·Stream *s);
+byte io·getbyte(io·Stream *s);
+int io·ungetbyte(io·Stream *s, byte c);
+int io·read(io·Stream *s, int sz, int n, void *buf);
+int io·readln(io·Stream *s, int n, byte *buf);
+int io·putbyte(io·Stream *s, byte c);
+int io·putstring(io·Stream *s, string str);
+int io·write(io·Stream *s, int sz, int n, void *buf);
+int io·flush(io·Stream *s);
+int io·seek(io·Stream *s, long off, enum SeekPos whence);
+long io·tell(io·Stream *s);
+
+/* basic os helpers */
+
+int os·exists(byte *path, int flag);
+byte *os·dirname(byte *path);
+byte *os·basename(byte *path);
+int os·sep(void);
+
+/* io interfaces */
+/* buffered i/o */
+typedef struct io·Buffer io·Buffer;
+
+enum
+{
+ bufio·size = 2*4096,
+ bufio·ungets = 8,
+ bufio·eof = -1,
+ bufio·err = -2,
+
+ bufio·nil = 1 << 0,
+ bufio·rdr = 1 << 1,
+ bufio·wtr = 1 << 2,
+ bufio·end = 1 << 3,
+};
+
+struct io·Buffer
+{
+ int state;
+ int runesize;
+ void *h;
+ union {
+ io·Reader rdr;
+ io·Writer wtr;
+ };
+ vlong size;
+ byte *beg, *pos, *end;
+ byte buf[bufio·size + bufio·ungets];
+};
+
+int bufio·initreader(io·Buffer *buf, io·Reader rdr, void *h);
+void bufio·finireader(io·Buffer *buf);
+int bufio·getbyte(io·Buffer *buf);
+int bufio·ungetbyte(io·Buffer *buf, byte c);
+int bufio·read(io·Buffer *buf, int sz, int n, void *out);
diff --git a/include/base/mem.h b/include/base/mem.h
new file mode 100644
index 0000000..3f1b6e1
--- /dev/null
+++ b/include/base/mem.h
@@ -0,0 +1,63 @@
+#pragma once
+
+// ----------------------------------------------------------------------------
+// dynamic array
+
+typedef struct BufHdr
+{
+ vlong len;
+ vlong cap;
+ byte buf[];
+} BufHdr;
+
+#define bufhdr(b) ((BufHdr*)((uint8*)(b)-offsetof(BufHdr, buf)))
+#define buflen(b) ((b) ? (bufhdr(b)->len) : 0)
+#define bufcap(b) ((b) ? (bufhdr(b)->cap) : 0)
+#define bufend(b) ((b) + buflen(b))
+#define bufsize(b) ((b) ? (buflen(b) * sizeof((b)[0])) : 0)
+
+#define buffree(b) ((b) ? (free(bufhdr(b)), (b) = nil) : 0)
+#define buffit(b, n) ((n) <= bufcap(b) ? 0 : ((b) = ·bufgrow((b), (n), sizeof(*(b)))))
+
+#define bufpush(b, ...) (buffit((b), 1 + buflen(b)), (b)[bufhdr(b)->len++] = (__VA_ARGS__))
+#define bufaddn(b, n) (buffit(b, buflen(b)+n), bufhdr(b)->len += n, b+bufhdr(b)->len-n)
+
+#define bufpop(b) ((b)[--bufhdr(b)->len])
+#define bufdel(b, i) bufdeln((b), (i), 1)
+#define bufdeln(b, i, n) (memmove((b)+(i), (b)+(i)+(n), sizeof(*(b))*(bufhdr(b)->len-(n)-(i)), bufhdr(b)->len -= (n))
+#define bufdelswap(b, i) ((b)[i] = bufend(b)[-1], bufhdr(b)->len-=1)
+
+void* ·bufgrow(void*, vlong, vlong);
+
+// -----------------------------------------------------------------------------
+// memory allocation
+
+/* allocator interface */
+typedef struct mem·Allocator {
+ void *(*alloc)(void *heap, uint n, ulong size);
+ void (*free)(void *heap, void *ptr);
+} mem·Allocator;
+
+extern mem·Allocator sys·Memory;
+
+typedef struct mem·Reallocator {
+ void *(*alloc)(void *iface, uint n, ulong size);
+ void *(*realloc)(void *iface, void *ptr, uint n, ulong size);
+ void (*free)(void *iface, void *ptr);
+} mem·Reallocator;
+
+extern mem·Reallocator sys·FullMemory;
+
+/* simple memory arena */
+typedef struct mem·Arena mem·Arena;
+
+mem·Arena *mem·makearena(mem·Allocator from, void*);
+void *mem·arenaalloc(mem·Arena *A, uint n, ulong size);
+void mem·freearena(mem·Arena *A);
+
+extern mem·Allocator mem·ArenaAllocator;
+
+/* generalized memxxx functions */
+void memset64(void *dst, uint64 val, uintptr size);
+
+
diff --git a/include/base/mmap.h b/include/base/mmap.h
new file mode 100644
index 0000000..9c4bd5f
--- /dev/null
+++ b/include/base/mmap.h
@@ -0,0 +1,13 @@
+#pragma once
+
+typedef struct mmap·Reader
+{
+ vlong len;
+ union{
+ char *b;
+ uchar *u;
+ };
+} mmap·Reader;
+
+mmap·Reader mmap·open(byte *name);
+int mmap·close(mmap·Reader rdr);
diff --git a/include/base/rng.h b/include/base/rng.h
new file mode 100644
index 0000000..ee41509
--- /dev/null
+++ b/include/base/rng.h
@@ -0,0 +1,9 @@
+#pragma once
+
+int rng·init(uint64 seed);
+double rng·random(void);
+double rng·exponential(double lambda);
+bool rng·bernoulli(double f);
+double rng·normal(void);
+uint64 rng·randi(int max);
+uint64 rng·poisson(double mean);
diff --git a/include/base/sort.h b/include/base/sort.h
new file mode 100644
index 0000000..e9a0e87
--- /dev/null
+++ b/include/base/sort.h
@@ -0,0 +1,18 @@
+#pragma once
+
+void sort·int(uintptr n, int arr[]);
+void sort·int8(uintptr n, int8 arr[]);
+void sort·int16(uintptr n, int16 arr[]);
+void sort·int32(uintptr n, int32 arr[]);
+void sort·int64(uintptr n, int64 arr[]);
+
+void sort·uint(uintptr n, uint arr[]);
+void sort·uint8(uintptr n, uint8 arr[]);
+void sort·uint16(uintptr n, uint16 arr[]);
+void sort·uint32(uintptr n, uint32 arr[]);
+void sort·uint64(uintptr n, uint64 arr[]);
+
+void sort·float(uintptr n, float arr[]);
+void sort·double(uintptr n, double arr[]);
+
+void sort·string(uintptr n, byte* arr[]);
diff --git a/include/base/string.h b/include/base/string.h
new file mode 100644
index 0000000..08466fa
--- /dev/null
+++ b/include/base/string.h
@@ -0,0 +1,30 @@
+#pragma once
+
+typedef byte* string;
+
+/* augmented string functions */
+string str·makecap(const char *s, vlong len, vlong cap);
+string str·makelen(const char *s, vlong len);
+string str·make(const char *s);
+string str·makef(const char *fmt, ...);
+void str·free(string s);
+int str·len(const string s);
+int str·cap(const string s);
+void str·clear(string *s);
+void str·grow(string *s, vlong delta);
+void str·fit(string *s);
+int str·appendlen(string *s, vlong len, const char *b);
+int str·append(string *s, const char *b);
+int str·appendf(string *s, const char *fmt, ...);
+int str·appendbyte(string *s, const char b);
+bool str·equals(const string s, const string t);
+int str·find(string s, const char* substr);
+void str·lower(string s);
+void str·upper(string s);
+int str·read(string s, int size, int n, void *buf);
+void str·replace(string s, const byte* from, const byte* to);
+string* str·split(string s, const byte* tok);
+string str·join(vlong len, byte** fields, const byte* sep);
+
+/* raw C string functions */
+char *str·copyn(char *dst, char *src, int n);
diff --git a/include/libutf.h b/include/base/utf.h
index 846296c..846296c 100644
--- a/include/libutf.h
+++ b/include/base/utf.h
diff --git a/rules.mk b/rules.mk
index 8c7bb2c..e8be45d 100644
--- a/rules.mk
+++ b/rules.mk
@@ -52,14 +52,14 @@ $(OBJ_DIR)/%: $(SRC_DIR)/%.c
DIR := src
include $(DIR)/rules.mk
-system: $(RUNTIME)
+system: $(RUNTIME) $(SYS)
bins: system $(BINS)
tests: system $(TEST)
targets: libs bins tests
clean:
@echo removing system layer
- @rm -f $(SYS_OBJS) $(SYS) $(RT) $(RT_OBJS) $(RT1) $(RTI) $(RTN)
+ @rm -f $(SYS_OBJS) $(SYS) $(RT_OBJS) $(RT1) $(RTI) $(RTN) $(RT3)
@echo removing object files
@rm -f $(OBJS)
@echo removing dependency files
diff --git a/src/base/arg.c b/src/base/arg.c
index 269043e..64e4dd6 100644
--- a/src/base/arg.c
+++ b/src/base/arg.c
@@ -1,71 +1 @@
-#include <u.h>
-#include <base.h>
-
-// NOTE: this utf8 bit is copied from libunicode to remove the hard dependency just for ARG_BEGIN.
-
-#define UTFmax 4
-#define RuneSync 0x80u
-#define RuneSelf 0x80u
-#define RuneErr 0xFFFDu
-#define RuneMax 0x10FFFFu
-#define RuneMask 0x1FFFFFu
-
-#define Bit(i) (7-(i))
-/* N 0's preceded by i 1's e.g. T(Bit(2)) is 1100 0000 */
-#define Tbyte(i) (((1 << (Bit(i)+1))-1) ^ 0xFF)
-/* 0000 0000 0000 0111 1111 1111 */
-#define RuneX(i) ((1 << (Bit(i) + ((i)-1)*Bitx))-1)
-enum
-{
- Bitx = Bit(1),
- Tx = Tbyte(1),
- Rune1 = (1 << (Bit(0)+0*Bitx)) - 1,
-
- Maskx = (1 << Bitx) - 1, /* 0011 1111 */
- Testx = Maskx ^ 0xff, /* 1100 0000 */
-
- SurrogateMin = 0xD800,
- SurrogateMax = 0xDFFF,
- Bad = RuneErr,
-};
-
-
-int
-arg·bytetorune(uint32* r, byte* s)
-{
- int c[4], i;
- uint32 l;
-
- c[0] = *(ubyte*)(s);
- if(c[0] < Tx) {
- *r = c[0];
- return 1;
- }
-
- l = c[0];
- for(i = 1; i < UTFmax; i++) {
- c[i] = *(ubyte*)(s+i);
- c[i] ^= Tx;
- if (c[i] & Testx) goto bad;
-
- l = (l << Bitx) | c[i];
- if(c[0] < Tbyte(i + 2)) {
- l &= RuneX(i + 1);
- if (i == 1) {
- if (c[0] < Tbyte(2) || l <= Rune1)
- goto bad;
- } else if (l <= RuneX(i) || l > RuneMax)
- goto bad;
- if (i == 2 && SurrogateMin <= l && l <= SurrogateMax)
- goto bad;
-
- *r = l;
- return i + 1;
- }
- }
-bad:
- *r = RuneErr;
- return 1;
-}
-
char *argv0;
diff --git a/src/libfmt/buffer.c b/src/base/fmt/buffer.c
index 0099e72..0099e72 100644
--- a/src/libfmt/buffer.c
+++ b/src/base/fmt/buffer.c
diff --git a/src/libfmt/do.c b/src/base/fmt/do.c
index bd2e65c..bd2e65c 100644
--- a/src/libfmt/do.c
+++ b/src/base/fmt/do.c
diff --git a/src/libfmt/esprint.c b/src/base/fmt/esprint.c
index 6d97340..6d97340 100644
--- a/src/libfmt/esprint.c
+++ b/src/base/fmt/esprint.c
diff --git a/src/libfmt/float.c b/src/base/fmt/float.c
index 63ea80f..63ea80f 100644
--- a/src/libfmt/float.c
+++ b/src/base/fmt/float.c
diff --git a/src/libfmt/fprint.c b/src/base/fmt/fprint.c
index 5077359..5077359 100644
--- a/src/libfmt/fprint.c
+++ b/src/base/fmt/fprint.c
diff --git a/src/libfmt/internal.h b/src/base/fmt/internal.h
index 725cfff..7bf47af 100644
--- a/src/libfmt/internal.h
+++ b/src/base/fmt/internal.h
@@ -2,8 +2,6 @@
#include <u.h>
#include <base.h>
-#include <libutf.h>
-#include <libfmt.h>
typedef int (*Formatter)(fmt·State *io);
typedef struct Verb Verb;
diff --git a/src/libfmt/locale.c b/src/base/fmt/locale.c
index 437c61e..437c61e 100644
--- a/src/libfmt/locale.c
+++ b/src/base/fmt/locale.c
diff --git a/src/libfmt/nsprint.c b/src/base/fmt/nsprint.c
index 90489e0..90489e0 100644
--- a/src/libfmt/nsprint.c
+++ b/src/base/fmt/nsprint.c
diff --git a/src/libfmt/open.c b/src/base/fmt/open.c
index 8aadef5..8aadef5 100644
--- a/src/libfmt/open.c
+++ b/src/base/fmt/open.c
diff --git a/src/libfmt/panic.c b/src/base/fmt/panic.c
index 25ee277..25ee277 100644
--- a/src/libfmt/panic.c
+++ b/src/base/fmt/panic.c
diff --git a/src/libfmt/print.c b/src/base/fmt/print.c
index 20b8e00..20b8e00 100644
--- a/src/libfmt/print.c
+++ b/src/base/fmt/print.c
diff --git a/src/base/fmt/rules.mk b/src/base/fmt/rules.mk
new file mode 100644
index 0000000..fdfdac0
--- /dev/null
+++ b/src/base/fmt/rules.mk
@@ -0,0 +1,21 @@
+# Local sources
+SRCS_$(d)+=\
+ $(d)/fmt/buffer.c\
+ $(d)/fmt/do.c\
+ $(d)/fmt/esprint.c\
+ $(d)/fmt/fprint.c\
+ $(d)/fmt/locale.c\
+ $(d)/fmt/nsprint.c\
+ $(d)/fmt/open.c\
+ $(d)/fmt/print.c\
+ $(d)/fmt/sprint.c\
+ $(d)/fmt/vesprint.c\
+ $(d)/fmt/vfprint.c\
+ $(d)/fmt/vnsprint.c\
+ $(d)/fmt/vprint.c\
+ $(d)/fmt/vwrite.c\
+ $(d)/fmt/panic.c\
+ $(d)/fmt/write.c
+
+CHECK_$(d)+=\
+ $(d)/fmt/test.c
diff --git a/src/libfmt/sprint.c b/src/base/fmt/sprint.c
index f1be6dd..f1be6dd 100644
--- a/src/libfmt/sprint.c
+++ b/src/base/fmt/sprint.c
diff --git a/src/libfmt/test.c b/src/base/fmt/test.c
index d81a62e..d81a62e 100644
--- a/src/libfmt/test.c
+++ b/src/base/fmt/test.c
diff --git a/src/libfmt/vesprint.c b/src/base/fmt/vesprint.c
index 18f4dd2..18f4dd2 100644
--- a/src/libfmt/vesprint.c
+++ b/src/base/fmt/vesprint.c
diff --git a/src/libfmt/vfprint.c b/src/base/fmt/vfprint.c
index 4306ea7..4306ea7 100644
--- a/src/libfmt/vfprint.c
+++ b/src/base/fmt/vfprint.c
diff --git a/src/libfmt/vnsprint.c b/src/base/fmt/vnsprint.c
index 7ded908..7ded908 100644
--- a/src/libfmt/vnsprint.c
+++ b/src/base/fmt/vnsprint.c
diff --git a/src/libfmt/vprint.c b/src/base/fmt/vprint.c
index bb3076b..bb3076b 100644
--- a/src/libfmt/vprint.c
+++ b/src/base/fmt/vprint.c
diff --git a/src/libfmt/vwrite.c b/src/base/fmt/vwrite.c
index cacdef2..cacdef2 100644
--- a/src/libfmt/vwrite.c
+++ b/src/base/fmt/vwrite.c
diff --git a/src/libfmt/write.c b/src/base/fmt/write.c
index 9a77223..9a77223 100644
--- a/src/libfmt/write.c
+++ b/src/base/fmt/write.c
diff --git a/src/base/io/close.c b/src/base/io/close.c
new file mode 100644
index 0000000..5a773cd
--- /dev/null
+++ b/src/base/io/close.c
@@ -0,0 +1,7 @@
+#include "internal.h"
+
+int
+io·close(io·Stream *s)
+{
+ return fclose(s);
+}
diff --git a/src/base/io/open.c b/src/base/io/open.c
index 71e88d4..fe78255 100644
--- a/src/base/io/open.c
+++ b/src/base/io/open.c
@@ -5,9 +5,3 @@ io·open(byte *name, byte *mode)
{
return fopen(name, mode);
}
-
-int
-io·close(io·Stream *s)
-{
- return fclose(s);
-}
diff --git a/src/base/io/rules.mk b/src/base/io/rules.mk
index 2e03ca5..124cd09 100644
--- a/src/base/io/rules.mk
+++ b/src/base/io/rules.mk
@@ -3,6 +3,7 @@ SRCS_$(d)+=\
$(d)/io/flush.c\
$(d)/io/interface.c\
$(d)/io/open.c\
+ $(d)/io/close.c\
$(d)/io/putbyte.c\
$(d)/io/putstring.c\
$(d)/io/read.c\
@@ -11,4 +12,4 @@ SRCS_$(d)+=\
$(d)/io/stat.c\
$(d)/io/tell.c\
$(d)/io/unget.c\
- $(d)/io/write.c\
+ $(d)/io/write.c
diff --git a/src/base/rules.mk b/src/base/rules.mk
index 9f25d37..0a262c7 100644
--- a/src/base/rules.mk
+++ b/src/base/rules.mk
@@ -5,10 +5,15 @@ include share/push.mk
# local sources
SRCS_$(d):=\
$(d)/arg.c
+
+CHECK_$(d):=\
+ $(d)/test.c
+
include $(d)/bufio/rules.mk
include $(d)/coro/rules.mk
include $(d)/error/rules.mk
include $(d)/flate/rules.mk
+include $(d)/fmt/rules.mk
include $(d)/fs/rules.mk
include $(d)/gz/rules.mk
include $(d)/io/rules.mk
@@ -18,12 +23,10 @@ include $(d)/os/rules.mk
include $(d)/rng/rules.mk
include $(d)/sort/rules.mk
include $(d)/string/rules.mk
-CHECK_$(d):=\
- $(d)/test.c
+include $(d)/utf/rules.mk
# outputs
LIBS_$(d) := $(d)/base.a
-BINS_$(d) :=
include share/paths.mk
diff --git a/src/libutf/canfit.c b/src/base/utf/canfit.c
index 4579ab3..4579ab3 100644
--- a/src/libutf/canfit.c
+++ b/src/base/utf/canfit.c
diff --git a/src/libutf/decode.c b/src/base/utf/decode.c
index 01797f1..01797f1 100644
--- a/src/libutf/decode.c
+++ b/src/base/utf/decode.c
diff --git a/src/libutf/decodeprev.c b/src/base/utf/decodeprev.c
index 27dced6..27dced6 100644
--- a/src/libutf/decodeprev.c
+++ b/src/base/utf/decodeprev.c
diff --git a/src/libutf/encode.c b/src/base/utf/encode.c
index fa7c93e..fa7c93e 100644
--- a/src/libutf/encode.c
+++ b/src/base/utf/encode.c
diff --git a/src/libutf/find.c b/src/base/utf/find.c
index d75feb8..d75feb8 100644
--- a/src/libutf/find.c
+++ b/src/base/utf/find.c
diff --git a/src/libutf/findlast.c b/src/base/utf/findlast.c
index ab25ab2..ab25ab2 100644
--- a/src/libutf/findlast.c
+++ b/src/base/utf/findlast.c
diff --git a/src/libutf/internal.h b/src/base/utf/internal.h
index 9719977..49945dd 100644
--- a/src/libutf/internal.h
+++ b/src/base/utf/internal.h
@@ -2,7 +2,6 @@
#include <u.h>
#include <base.h>
-#include <libutf.h>
/*
* NOTE: we use the preprocessor to ensure we have unsigned constants.
diff --git a/src/libutf/len.c b/src/base/utf/len.c
index 8fbd679..8fbd679 100644
--- a/src/libutf/len.c
+++ b/src/base/utf/len.c
diff --git a/src/base/utf/rules.mk b/src/base/utf/rules.mk
new file mode 100644
index 0000000..446c113
--- /dev/null
+++ b/src/base/utf/rules.mk
@@ -0,0 +1,71 @@
+UNICODE=14.0.0
+
+SRCS_$(d)+=\
+ $(d)/utf/encode.c\
+ $(d)/utf/decode.c\
+ $(d)/utf/decodeprev.c\
+ $(d)/utf/find.c\
+ $(d)/utf/findlast.c\
+ $(d)/utf/canfit.c\
+ $(d)/utf/runelen.c\
+ $(d)/utf/len.c\
+ $(d)/utf/runetype-$(UNICODE).c\
+ $(d)/utf/runewidth-$(UNICODE).c
+
+# ========================================================================
+# table generation
+
+# NOTE: this is pretty hacky...
+NEED_OBJS=\
+ $(OBJ_DIR)/base/arg.o\
+ $(OBJ_DIR)/base/utf/decode.o\
+ $(OBJ_DIR)/base/error/panicf.o\
+ $(OBJ_DIR)/base/io/readln.o\
+ $(OBJ_DIR)/base/io/open.o\
+ $(OBJ_DIR)/base/io/close.o
+
+$(d)/utf/vendor/common.o: $(d)/utf/vendor/common.c
+ $(COMPILE)
+
+# rune categories
+$(d)/utf/vendor/UnicodeData-$(UNICODE).txt:
+ @echo "GET UnicodeData.txt";\
+ curl https://www.unicode.org/Public/$(UNICODE)/ucd/UnicodeData.txt > $@
+
+$(d)/utf/vendor/mkrunetype: $(d)/utf/vendor/mkrunetype.c $(d)/utf/vendor/common.o $(NEED_OBJS)
+ $(COMPLINK)
+
+GENS += $(d)/utf/vendor/mkrunetype
+
+$(d)/utf/runetype-$(UNICODE).c: $(d)/utf/vendor/UnicodeData-$(UNICODE).txt $(d)/utf/vendor/mkrunetype
+ @$(dir $@)vendor/mkrunetype $< > $@
+
+# rune widths
+$(d)/utf/vendor/EastAsianWidth-$(UNICODE).txt:
+ @echo "GET EastAsianWidth.txt";\
+ curl https://www.unicode.org/Public/$(UNICODE)/ucd/EastAsianWidth.txt > $@
+
+$(d)/utf/vendor/EmojiData-$(UNICODE).txt:
+ @echo "GET EmojiData.txt";\
+ curl https://www.unicode.org/Public/$(UNICODE)/ucd/emoji/emoji-data.txt > $@
+
+$(d)/utf/vendor/mkrunewidth: $(d)/utf/vendor/mkrunewidth.c $(d)/utf/vendor/common.o $(NEED_OBJS)
+ $(COMPLINK)
+
+GENS += $(d)/utf/vendor/mkrunewidth
+
+$(d)/utf/runewidth-$(UNICODE).c: $(d)/utf/vendor/mkrunewidth $(d)/utf/vendor/UnicodeData-$(UNICODE).txt $(d)/utf/vendor/EastAsianWidth-$(UNICODE).txt $(d)/utf/vendor/EmojiData-$(UNICODE).txt
+ @$(dir $@)vendor/mkrunewidth $(filter-out $<, $^) > $@
+
+# grapheme boundaries
+$(d)/utf/vendor/GraphemeBreakProperty-$(UNICODE).txt:
+ @echo "GET GraphemeBreakProperty.txt";\
+ curl https://www.unicode.org/Public/$(UNICODE)/ucd/auxiliary/GraphemeBreakProperty.txt > $@
+
+$(d)/utf/vendor/mkgraphemedata: $(d)/utf/vendor/mkgraphemedata.c $(d)/utf/vendor/common.o $(NEED_OBJS)
+ $(COMPLINK)
+
+$(d)/utf/graphemedata-$(UNICODE).c: $(d)/utf/vendor/mkgraphemedata $(d)/utf/vendor/GraphemeBreakProperty-$(UNICODE).txt
+ $^ > $@
+
+GENS += $(d)/utf/vendor/mkgraphemedata
diff --git a/src/libutf/runelen.c b/src/base/utf/runelen.c
index dac7f15..dac7f15 100644
--- a/src/libutf/runelen.c
+++ b/src/base/utf/runelen.c
diff --git a/src/libutf/vendor/common.c b/src/base/utf/vendor/common.c
index 5a03a50..fcf1177 100644
--- a/src/libutf/vendor/common.c
+++ b/src/base/utf/vendor/common.c
@@ -99,7 +99,7 @@ putsearch(void)
{
puts(
"#include <u.h>\n"
- "#include <libutf.h>\n"
+ "#include <base/utf.h>\n"
"\n"
"static\n"
"rune*\n"
diff --git a/src/libutf/vendor/common.h b/src/base/utf/vendor/common.h
index 62f6c5b..51a53bd 100644
--- a/src/libutf/vendor/common.h
+++ b/src/base/utf/vendor/common.h
@@ -2,7 +2,6 @@
#include <u.h>
#include <base.h>
-#include <libutf.h>
enum
{
diff --git a/src/libutf/vendor/mkgraphemedata.c b/src/base/utf/vendor/mkgraphemedata.c
index ce5a952..ce5a952 100644
--- a/src/libutf/vendor/mkgraphemedata.c
+++ b/src/base/utf/vendor/mkgraphemedata.c
diff --git a/src/libutf/vendor/mkrunetype.c b/src/base/utf/vendor/mkrunetype.c
index b33df32..b33df32 100644
--- a/src/libutf/vendor/mkrunetype.c
+++ b/src/base/utf/vendor/mkrunetype.c
diff --git a/src/libutf/vendor/mkrunewidth.c b/src/base/utf/vendor/mkrunewidth.c
index 14e6973..14e6973 100644
--- a/src/libutf/vendor/mkrunewidth.c
+++ b/src/base/utf/vendor/mkrunewidth.c
diff --git a/src/cmd/core/basename.c b/src/cmd/core/basename.c
index ba9d4c9..263592f 100644
--- a/src/cmd/core/basename.c
+++ b/src/cmd/core/basename.c
@@ -1,6 +1,5 @@
#include <u.h>
#include <base.h>
-#include <libfmt.h>
static void
usage(void)
diff --git a/src/cmd/core/cat.c b/src/cmd/core/cat.c
index 4f0929c..e9b770b 100644
--- a/src/cmd/core/cat.c
+++ b/src/cmd/core/cat.c
@@ -1,6 +1,5 @@
#include <u.h>
#include <base.h>
-#include <libfmt.h>
static void
usage(void)
diff --git a/src/cmd/dwm/dwm.h b/src/cmd/dwm/dwm.h
index afec1f2..269f373 100644
--- a/src/cmd/dwm/dwm.h
+++ b/src/cmd/dwm/dwm.h
@@ -2,7 +2,6 @@
#pragma once
#include <u.h>
#include <base.h>
-#include <libutf.h>
#include <errno.h>
#include <locale.h>
diff --git a/src/cmd/menu/menu.h b/src/cmd/menu/menu.h
index f4345bb..de01607 100644
--- a/src/cmd/menu/menu.h
+++ b/src/cmd/menu/menu.h
@@ -1,7 +1,6 @@
/* See LICENSE file for copyright and license details. */
#include <u.h>
#include <base.h>
-#include <libutf.h>
#include <time.h>
#include <locale.h>
diff --git a/src/cmd/rc/rc.h b/src/cmd/rc/rc.h
index f52e4e2..76a1b3d 100644
--- a/src/cmd/rc/rc.h
+++ b/src/cmd/rc/rc.h
@@ -2,7 +2,7 @@
#include <u.h>
#include <base.h>
-#include <libutf.h>
+#include <base/utf.h>
// -----------------------------------------------------------------------
// types
diff --git a/src/cmd/term/term.h b/src/cmd/term/term.h
index 6784974..c370239 100644
--- a/src/cmd/term/term.h
+++ b/src/cmd/term/term.h
@@ -3,7 +3,6 @@
#include <u.h>
#include <base.h>
-#include <libutf.h>
#include <signal.h>
#include <sys/ioctl.h>
diff --git a/src/libbio/rules.mk b/src/libbio/rules.mk
index f4e75f4..032670c 100644
--- a/src/libbio/rules.mk
+++ b/src/libbio/rules.mk
@@ -6,7 +6,6 @@ SRCS_$(d) := \
$(d)/newick.c \
$(d)/phylo.c
LIBS_$(d) := $(d)/libbio.a
-BINS_$(d) :=
# CHECK_$(d) := \
# $(d)/test.c \
# $(d)/simulate.c
@@ -17,8 +16,8 @@ include share/paths.mk
$(LIBS_$(d)): $(OBJS_$(d)) $(OBJS_$(d)/io)
$(ARCHIVE)
-$(TEST_$(d)): TLIBS = $(LIBS_$(d)) $(OBJ_DIR)/libn/libn.a
-$(TEST_$(d)): $(UNIT_$(d)) $(LIBS_$(d)) $(OBJ_DIR)/libn/libn.a
+$(TEST_$(d)): TLIBS = $(LIBS_$(d)) $(OBJ_DIR)/base/base.a
+$(TEST_$(d)): $(UNIT_$(d)) $(LIBS_$(d)) $(OBJ_DIR)/base/base.a
$(LINK)
include share/pop.mk
diff --git a/src/libc/rules.mk b/src/libc/rules.mk
deleted file mode 100644
index 34e0912..0000000
--- a/src/libc/rules.mk
+++ /dev/null
@@ -1,20 +0,0 @@
-include share/push.mk
-
-# Iterate through subdirectory tree
-
-# Local sources
-SRCS_$(d) := $(wildcard $(d)/*.c)
-LIBS_$(d) := $(d)/libc_n.a
-BINS_$(d) :=
-
-include share/paths.mk
-
-# Local rules
-$(LIBS_$(d)): TCFLAGS = -ffreestanding -fno-builtin -nostdlib
-$(LIBS_$(d)): $(OBJS_$(d))
- $(ARCHIVE)
-
-$(BINS_$(d)): $(OBJ_DIR)/libn/test.o
- $(LINK)
-
-include share/pop.mk
diff --git a/src/libc/stdio.c b/src/libc/stdio.c
deleted file mode 100644
index 8bbbe9a..0000000
--- a/src/libc/stdio.c
+++ /dev/null
@@ -1,59 +0,0 @@
-#include <u.h>
-#include <libc.h>
-
-int
-printf(byte* fmt, ...)
-{
- va_list args;
- va_start(args, fmt);
-
- int nw, rem, peek, len;
- byte *str, c;
-
- while (*fmt) {
- rem = INT_MAX - nw;
-
- if (fmt[0] != '%' || fmt[1] == '%') {
- if (fmt[0] == '%') fmt++;
-
- for (peek = 1; fmt[peek] && fmt[peek] != '%'; peek++) {
- ;
- }
- if (rem < peek) return -1;
- // TODO: Print here.
- fmt += peek;
- nw += peek;
- continue;
- }
-
- str = fmt++;
-
- switch (*fmt++) {
- case 'c':
- c = va_arg(args, int);
- if (rem < 0) return -1;
- // TODO: Print here
- nw++;
- break;
-
- case 's':
- str = va_arg(args, byte*);
- len = strlen(str);
- if (rem < len) return -1;
- // TODO: Print here
- nw += len;
- break;
- default:
- fmt = str;
- len = strlen(fmt);
- if (rem < len) return -1;
- // TODO: Print here
- nw += len;
- fmt += len;
- break;
- }
- }
-
- va_end(args);
- return nw;
-}
diff --git a/src/libc/string.c b/src/libc/string.c
deleted file mode 100644
index 0e41efa..0000000
--- a/src/libc/string.c
+++ /dev/null
@@ -1,80 +0,0 @@
-#include <u.h>
-#include <libc.h>
-
-void*
-memcopy(void *dst, void *src, intptr n)
-{
- byte *e, *s, *d;
-
- d = dst;
- e = d + n;
- for (s = src ; d != e; ++s, ++d) {
- *d = *s;
- }
-
- return dst;
-}
-
-void*
-memmove(void *dst, void *src, intptr n)
-{
- byte *e, *s, *d;
- s = src;
- d = dst;
-
- if (d < s) {
- e = d + n;
- for (; d != e; ++s, ++d)
- *d = *s;
-
- } else {
- e = d;
- d += n;
- s += n;
- for (; d != e; --s, --d)
- d[-1] = s[-1];
- }
-
- return dst;
-}
-
-void*
-memset(void *buf, int val, intptr n)
-{
- byte *b, *e;
- b = buf;
- e = b + n;
- for (; b != e; b++) {
- *b = (byte)val;
- }
-
- return buf;
-}
-
-int
-memcmp(void *lhs, void *rhs, intptr n)
-{
- byte *bl, *br, *e;
-
- br = rhs;
- e = br + n;
- for (bl = lhs; br != e; ++bl, ++br) {
- if (*bl < *br)
- return -1;
- else if (*bl > *br)
- return 1;
- }
-
- return 0;
-}
-
-int
-strlen(byte* s)
-{
- byte* b;
- for (b = s; *b; b++) {
- ;
- }
-
- return b - s;
-}
diff --git a/src/libfmt/rules.mk b/src/libfmt/rules.mk
deleted file mode 100644
index 75a7bc7..0000000
--- a/src/libfmt/rules.mk
+++ /dev/null
@@ -1,36 +0,0 @@
-include share/push.mk
-
-# Local sources
-SRCS_$(d):=\
- $(d)/buffer.c\
- $(d)/do.c\
- $(d)/esprint.c\
- $(d)/fprint.c\
- $(d)/locale.c\
- $(d)/nsprint.c\
- $(d)/open.c\
- $(d)/print.c\
- $(d)/sprint.c\
- $(d)/vesprint.c\
- $(d)/vfprint.c\
- $(d)/vnsprint.c\
- $(d)/vprint.c\
- $(d)/vwrite.c\
- $(d)/panic.c\
- $(d)/write.c
-
-LIBS_$(d):=\
- $(d)/libfmt.a
-
-CHECK_$(d):=\
- $(d)/test.c
-
-include share/paths.mk
-
-$(LIBS_$(d)): $(OBJS_$(d))
- $(ARCHIVE)
-
-$(TEST_$(d)): $(UNIT_$(d)) $(LIBS_$(d)) $(OBJ_DIR)/libutf/libutf.a $(OBJ_DIR)/base/base.a
- $(COMPLINK)
-
-include share/pop.mk
diff --git a/src/libutf/rules.mk b/src/libutf/rules.mk
deleted file mode 100644
index aeb86b2..0000000
--- a/src/libutf/rules.mk
+++ /dev/null
@@ -1,76 +0,0 @@
-include share/push.mk
-
-UNICODE=14.0.0
-
-SRCS_$(d):=\
- $(d)/encode.c\
- $(d)/decode.c\
- $(d)/decodeprev.c\
- $(d)/find.c\
- $(d)/findlast.c\
- $(d)/canfit.c\
- $(d)/runelen.c\
- $(d)/len.c\
- $(d)/runetype-$(UNICODE).c\
- $(d)/runewidth-$(UNICODE).c
-
-LIBS_$(d):=$(d)/libutf.a
-
-include share/paths.mk
-
-# ========================================================================
-# table generation
-
-$(d)/vendor/common.o: $(d)/vendor/common.c
- $(COMPILE)
-
-# rune categories
-$(d)/vendor/UnicodeData-$(UNICODE).txt:
- @echo "GET UnicodeData.txt";\
- curl https://www.unicode.org/Public/$(UNICODE)/ucd/UnicodeData.txt > $@
-
-$(d)/vendor/mkrunetype: $(d)/vendor/mkrunetype.c $(d)/vendor/common.o $(OBJ_DIR)/base/base.a
- $(COMPLINK)
-
-GENS += $(d)/vendor/mkrunetype
-
-$(d)/runetype-$(UNICODE).c: $(d)/vendor/UnicodeData-$(UNICODE).txt $(d)/vendor/mkrunetype
- @$(dir $@)vendor/mkrunetype $< > $@
-
-# rune widths
-$(d)/vendor/EastAsianWidth-$(UNICODE).txt:
- @echo "GET EastAsianWidth.txt";\
- curl https://www.unicode.org/Public/$(UNICODE)/ucd/EastAsianWidth.txt > $@
-
-$(d)/vendor/EmojiData-$(UNICODE).txt:
- @echo "GET EmojiData.txt";\
- curl https://www.unicode.org/Public/$(UNICODE)/ucd/emoji/emoji-data.txt > $@
-
-$(d)/vendor/mkrunewidth: $(d)/vendor/mkrunewidth.c $(d)/vendor/common.o $(OBJ_DIR)/base/base.a
- $(COMPLINK)
-
-GENS += $(d)/vendor/mkrunewidth
-
-$(d)/runewidth-$(UNICODE).c: $(d)/vendor/mkrunewidth $(d)/vendor/UnicodeData-$(UNICODE).txt $(d)/vendor/EastAsianWidth-$(UNICODE).txt $(d)/vendor/EmojiData-$(UNICODE).txt
- @$(dir $@)vendor/mkrunewidth $(filter-out $<, $^) > $@
-
-# grapheme boundaries
-$(d)/vendor/GraphemeBreakProperty-$(UNICODE).txt:
- @echo "GET GraphemeBreakProperty.txt";\
- curl https://www.unicode.org/Public/$(UNICODE)/ucd/auxiliary/GraphemeBreakProperty.txt > $@
-
-$(d)/vendor/mkgraphemedata: $(d)/vendor/mkgraphemedata.c $(d)/vendor/common.o $(OBJ_DIR)/base/base.a
- $(COMPLINK)
-
-$(d)/graphemedata-$(UNICODE).c: $(d)/vendor/mkgraphemedata $(d)/vendor/GraphemeBreakProperty-$(UNICODE).txt
- $^ > $@
-
-GENS += $(d)/vendor/mkgraphemedata
-
-# ========================================================================
-# normal operations
-
-$(LIBS_$(d)): $(OBJS_$(d))
- $(ARCHIVE)
-
-include share/pop.mk
diff --git a/src/rules.mk b/src/rules.mk
index 9bb61ae..368479c 100644
--- a/src/rules.mk
+++ b/src/rules.mk
@@ -8,12 +8,6 @@ include $(DIR)/rules.mk
DIR := $(d)/base
include $(DIR)/rules.mk
-DIR := $(d)/libutf
-include $(DIR)/rules.mk
-
-DIR := $(d)/libfmt
-include $(DIR)/rules.mk
-
DIR := $(d)/libmath
include $(DIR)/rules.mk
diff --git a/sys/linux/src/infofd.c b/sys/linux/src/infofd.c
index 8b2973b..770009a 100644
--- a/sys/linux/src/infofd.c
+++ b/sys/linux/src/infofd.c
@@ -1,5 +1,4 @@
#include "internal.h"
-#include <linux/stat.h>
int
sys·infofd(int fd, sys·Info *file)
diff --git a/sys/linux/src/ioctl.c b/sys/linux/src/ioctl.c
index 30c7318..a065d40 100644
--- a/sys/linux/src/ioctl.c
+++ b/sys/linux/src/ioctl.c
@@ -1,5 +1,4 @@
#include "internal.h"
-#include <asm/ioctl.h>
int
sys·ioctl(int fd, int request, ...)