diff options
-rw-r--r-- | include/base.h | 397 | ||||
-rw-r--r-- | include/base/coro.h | 7 | ||||
-rw-r--r-- | include/base/error.h | 7 | ||||
-rw-r--r-- | include/base/flate.h | 16 | ||||
-rw-r--r-- | include/base/fmt.h (renamed from include/libfmt.h) | 0 | ||||
-rw-r--r-- | include/base/fs.h | 29 | ||||
-rw-r--r-- | include/base/gz.h | 29 | ||||
-rw-r--r-- | include/base/io.h | 141 | ||||
-rw-r--r-- | include/base/mem.h | 63 | ||||
-rw-r--r-- | include/base/mmap.h | 13 | ||||
-rw-r--r-- | include/base/rng.h | 9 | ||||
-rw-r--r-- | include/base/sort.h | 18 | ||||
-rw-r--r-- | include/base/string.h | 30 | ||||
-rw-r--r-- | include/base/utf.h (renamed from include/libutf.h) | 0 | ||||
-rw-r--r-- | rules.mk | 4 | ||||
-rw-r--r-- | src/base/arg.c | 70 | ||||
-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.mk | 21 | ||||
-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.c | 7 | ||||
-rw-r--r-- | src/base/io/open.c | 6 | ||||
-rw-r--r-- | src/base/io/rules.mk | 3 | ||||
-rw-r--r-- | src/base/rules.mk | 9 | ||||
-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.mk | 71 | ||||
-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.c | 1 | ||||
-rw-r--r-- | src/cmd/core/cat.c | 1 | ||||
-rw-r--r-- | src/cmd/dwm/dwm.h | 1 | ||||
-rw-r--r-- | src/cmd/menu/menu.h | 1 | ||||
-rw-r--r-- | src/cmd/rc/rc.h | 2 | ||||
-rw-r--r-- | src/cmd/term/term.h | 1 | ||||
-rw-r--r-- | src/libbio/rules.mk | 5 | ||||
-rw-r--r-- | src/libc/rules.mk | 20 | ||||
-rw-r--r-- | src/libc/stdio.c | 59 | ||||
-rw-r--r-- | src/libc/string.c | 80 | ||||
-rw-r--r-- | src/libfmt/rules.mk | 36 | ||||
-rw-r--r-- | src/libutf/rules.mk | 76 | ||||
-rw-r--r-- | src/rules.mk | 6 | ||||
-rw-r--r-- | sys/linux/src/infofd.c | 1 | ||||
-rw-r--r-- | sys/linux/src/ioctl.c | 1 |
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 @@ -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, ...) |