annotate ploki/venus.c @ 4221:19624cfb341a

<mauke> cp ploki/ploki bin/
author HackBot
date Fri, 20 Dec 2013 22:11:30 +0000
parents 7a6bc310b732
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4215
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
1 #include "Str.h"
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
2 #include "hash.h"
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
3 #include "op.h"
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
4 #include "venus.h"
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
5 #include "xmalloc.h"
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
6 #include "zz.h"
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
7
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
8 #include <stddef.h>
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
9 #include <stdio.h>
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
10 #include <string.h>
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
11
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
12 enum {MAGIC = 23};
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
13
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
14 struct sorted {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
15 size_t size, length;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
16 struct op **array;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
17 };
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
18
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
19 static size_t hash(const void *p, size_t seed) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
20 return St_hash(p, seed);
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
21 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
22
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
23 static int compar(const void *a, const void *b) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
24 return St_cmp(a, b);
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
25 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
26
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
27 static void delk(void *k) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
28 St_clear(k);
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
29 xfree(k);
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
30 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
31
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
32 static void delv(void *v) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
33 xfree(((struct sorted *)v)->array);
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
34 xfree(v);
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
35 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
36
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
37 void ve_init(struct venus *v) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
38 h_init(&v->table, hash, compar, delk, delv);
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
39 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
40
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
41 void ve_end(struct venus *v) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
42 h_end(&v->table);
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
43 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
44
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
45 void ve_enter(struct venus *v, const String *s, struct op *o) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
46 struct sorted *x;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
47 void *tmp;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
48 size_t a, z;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
49
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
50 if (h_get(&v->table, s, &tmp) == H_NOENT) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
51 String *label;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
52 x = xmalloc(1, sizeof *x);
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
53 x->array = xmalloc(x->size = MAGIC, sizeof *x->array);
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
54 x->array[0] = o;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
55 x->length = 1;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
56 label = xmalloc(1, sizeof *label);
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
57 St_init(label);
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
58 St_cpy(label, s);
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
59 h_put(&v->table, label, x, 1);
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
60 return;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
61 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
62 x = tmp;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
63
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
64 for (a = 0, z = x->length; a < z; ) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
65 if (x->array[(a + z) / 2]->line < o->line) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
66 a = (a + z) / 2 + 1u;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
67 } else if (x->array[(a + z) / 2]->line > o->line) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
68 z = (a + z) / 2;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
69 } else {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
70 NOTREACHED;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
71 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
72 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
73
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
74 if (x->length >= x->size) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
75 x->array = xrealloc(x->array, x->size *= 2);
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
76 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
77 memmove(x->array + a + 1u, x->array + a, x->length - a);
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
78 x->array[a] = o;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
79 x->length++;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
80 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
81
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
82 struct op *ve_findnext(struct venus *v, const String *s, size_t line) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
83 struct sorted *x;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
84 void *tmp;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
85 size_t a, z;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
86
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
87 if (h_get(&v->table, s, &tmp) == H_NOENT) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
88 return NULL;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
89 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
90 x = tmp;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
91
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
92 for (a = 0, z = x->length; a < z; ) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
93 if (x->array[(a + z) / 2]->line < line) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
94 a = (a + z) / 2 + 1u;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
95 } else if (x->array[(a + z) / 2]->line > line) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
96 z = (a + z) / 2;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
97 } else {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
98 a = (a + z) / 2 + 1u;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
99 break;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
100 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
101 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
102
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
103 return x->array[a % x->length];
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
104 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
105
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
106 struct op *ve_findprev(struct venus *v, const String *s, size_t line) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
107 struct sorted *x;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
108 void *tmp;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
109 size_t a, z;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
110
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
111 if (h_get(&v->table, s, &tmp) == H_NOENT) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
112 return NULL;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
113 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
114 x = tmp;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
115
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
116 for (a = 0, z = x->length; a < z; ) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
117 if (x->array[(a + z) / 2]->line < line) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
118 a = (a + z) / 2 + 1u;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
119 } else if (x->array[(a + z) / 2]->line > line) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
120 z = (a + z) / 2;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
121 } else {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
122 a = (a + z) / 2;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
123 break;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
124 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
125 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
126 a += x->length - 1u;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
127 return x->array[a % x->length];
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
128 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
129
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
130 const String *ve_label(struct venus *v, const struct op *op) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
131 void *key, *value;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
132
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
133 h_reset(&v->table);
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
134 while (h_nextkv(&v->table, &key, &value) == H_OK) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
135 const struct sorted *x = value;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
136 size_t i;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
137
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
138 for (i = 0; i < x->length; ++i) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
139 if (x->array[i] == op) {
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
140 return key;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
141 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
142 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
143 }
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
144
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
145 return NULL;
7a6bc310b732 <shachaf> tar xjf ploki-0.6.5.1.tar.bz2
HackBot
parents:
diff changeset
146 }