summaryrefslogtreecommitdiff
path: root/sys/src/cmd/upas/fs/ref.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2017-03-12 17:15:03 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2017-03-12 17:15:03 +0100
commit963cfc9a6f6e721f52aa949e6d1af0c3e8dc2ecc (patch)
tree749b74875dbc49bcf6ed0776648b8f0ef9417407 /sys/src/cmd/upas/fs/ref.c
parent8177d20fb2709ba9290dfd41308b8e5bee4e00f8 (diff)
merging erik quanstros nupas
Diffstat (limited to 'sys/src/cmd/upas/fs/ref.c')
-rw-r--r--sys/src/cmd/upas/fs/ref.c100
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;
+}