diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-03-12 17:15:03 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-03-12 17:15:03 +0100 |
commit | 963cfc9a6f6e721f52aa949e6d1af0c3e8dc2ecc (patch) | |
tree | 749b74875dbc49bcf6ed0776648b8f0ef9417407 /sys/src/cmd/upas/fs/ref.c | |
parent | 8177d20fb2709ba9290dfd41308b8e5bee4e00f8 (diff) |
merging erik quanstros nupas
Diffstat (limited to 'sys/src/cmd/upas/fs/ref.c')
-rw-r--r-- | sys/src/cmd/upas/fs/ref.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/sys/src/cmd/upas/fs/ref.c b/sys/src/cmd/upas/fs/ref.c new file mode 100644 index 000000000..f3cf078b3 --- /dev/null +++ b/sys/src/cmd/upas/fs/ref.c @@ -0,0 +1,100 @@ +#include "common.h" +#include <libsec.h> +#include "dat.h" + +/* all the data that's fit to cache */ + +typedef struct{ + char *s; + int l; + ulong ref; +}Refs; + +Refs *rtab; +int nrtab; +int nralloc; + +int +newrefs(char *s) +{ + int l, i; + Refs *r; + + l = strlen(s); + for(i = 0; i < nrtab; i++){ + r = rtab + i; + if(r->ref == 0) + goto enter; + if(l == r->l && strcmp(r->s, s) == 0){ + r->ref++; + return i; + } + } + if(nrtab == nralloc) + rtab = erealloc(rtab, sizeof *rtab*(nralloc += 50)); + nrtab = i + 1; +enter: + r = rtab + i; + r->s = strdup(s); + r->l = l; + r->ref = 1; + return i; +} + +void +delrefs(int i) +{ + Refs *r; + + r = rtab + i; + if(--r->ref > 0) + return; + free(r->s); + memset(r, 0, sizeof *r); +} + +void +refsinit(void) +{ + newrefs(""); +} + +static char *sep = "--------\n"; + +int +prrefs(Biobuf *b) +{ + int i, n; + + n = 0; + for(i = 1; i < nrtab; i++){ + if(rtab[i].ref == 0) + continue; + Bprint(b, "%s ", rtab[i].s); + if(n++%8 == 7) + Bprint(b, "\n"); + } + if(n%8 != 7) + Bprint(b, "\n"); + Bprint(b, sep); + return 0; +} + +int +rdrefs(Biobuf *b) +{ + char *f[10], *s; + int i, n; + + while(s = Brdstr(b, '\n', 1)){ + if(strcmp(s, sep) == 0){ + free(s); + return 0; + } + n = tokenize(s, f, nelem(f)); + for(i = 0; i < n; i++) + newrefs(f[i]); + free(s); + } + return -1; +} |