8 #define unless(C) if(!(C))
15 if (mem == NULL)
return NULL;
23 if (p == NULL)
return;
39 if (c >= l)
return -1;
44 if (b >= 0xC0 || b < 0x80)
break;
52 if (c <= lb)
return -1;
72 if (b0 < 0xC0 || c == l) {
73 * slot = b0;
return 1;
76 if (b0 < 0xE0 || c == l) {
77 * slot = (b0 & 0x1F) << 6 | (b1 & 0x3F);
return 2;
79 * slot = (b0 & 0xF) << 12 | (b1 & 0x3F) << 6 | (p[c] & 0x3F);
return 3;
84 if (c <= lb)
return 0;
86 if (b0 < 0x80 || c == lb) {
87 * slot = b0;
return 1;
90 if (b1 >= 0xC0 || c == lb) {
91 * slot = (b1 & 0x1F) << 6 | (b0 & 0x3F);
return 2;
93 * slot = (p[c] & 0xF) << 12 | (b1 & 0x3F) << 6 | (b0 & 0x3F);
return 3;
101 if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)
113 if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)
125 unless (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)
137 unless (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)
146 extern int in_grouping(
struct SN_env * z,
const unsigned char * s,
int min,
int max,
int repeat) {
149 if (z->
c >= z->
l)
return -1;
151 if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)
161 if (z->
c <= z->
lb)
return -1;
163 if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)
173 if (z->
c >= z->
l)
return -1;
175 unless (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)
185 if (z->
c <= z->
lb)
return -1;
187 unless (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)
195 if (z->
l - z->
c < s_size || memcmp(z->
p + z->
c, s, s_size *
sizeof(
symbol)) != 0)
return 0;
196 z->
c += s_size;
return 1;
200 if (z->
c - z->
lb < s_size || memcmp(z->
p + z->
c - s_size, s, s_size *
sizeof(
symbol)) != 0)
return 0;
201 z->
c -= s_size;
return 1;
217 int c = z->
c;
int l = z->
l;
220 const struct among * w;
225 int first_key_inspected = 0;
228 int k = i + ((j - i) >> 1);
230 int common = common_i < common_j ? common_i : common_j;
233 int i2;
for (i2 = common; i2 < w->
s_size; i2++) {
234 if (c + common == l) { diff = -1;
break; }
235 diff = q[common] - w->
s[i2];
236 if (diff != 0)
break;
240 if (diff < 0) { j = k; common_j = common; }
241 else { i = k; common_i = common; }
250 if (first_key_inspected)
break;
251 first_key_inspected = 1;
256 if (common_i >= w->
s_size) {
262 if (res)
return w->
result;
277 int c = z->
c;
int lb = z->
lb;
280 const struct among * w;
285 int first_key_inspected = 0;
288 int k = i + ((j - i) >> 1);
290 int common = common_i < common_j ? common_i : common_j;
293 int i2;
for (i2 = w->
s_size - 1 - common; i2 >= 0; i2--) {
294 if (c - common == lb) { diff = -1;
break; }
295 diff = q[- common] - w->
s[i2];
296 if (diff != 0)
break;
300 if (diff < 0) { j = k; common_j = common; }
301 else { i = k; common_i = common; }
305 if (first_key_inspected)
break;
306 first_key_inspected = 1;
311 if (common_i >= w->
s_size) {
317 if (res)
return w->
result;
331 int new_size = n + 20;
332 void * mem = realloc((
char *) p -
HEAD,
354 if (z->
p == NULL)
return -1;
356 adjustment =
s_size - (c_ket - c_bra);
358 if (adjustment != 0) {
361 if (z->
p == NULL)
return -1;
363 memmove(z->
p + c_ket + adjustment,
365 (len - c_ket) *
sizeof(
symbol));
376 *adjptr = adjustment;
389 fprintf(stderr,
"faulty slice operation:\n");
414 if (bra <= z->bra) z->
bra += adjustment;
415 if (bra <= z->ket) z->
ket += adjustment;
423 if (bra <= z->bra) z->
bra += adjustment;
424 if (bra <= z->ket) z->
ket += adjustment;
434 int len = z->
ket - z->
bra;
440 memmove(p, z->
p + z->
bra, len *
sizeof(
symbol));
453 memmove(p, z->
p, len *
sizeof(
symbol));
459 extern void debug(
struct SN_env * z,
int number,
int line_count) {
461 int limit =
SIZE(z->
p);
463 if (number >= 0) printf(
"%3d (line %4d): [%d]'", number, line_count,limit);
464 for (i = 0; i <= limit; i++) {
465 if (z->
lb == i) printf(
"{");
466 if (z->
bra == i) printf(
"[");
467 if (z->
c == i) printf(
"|");
468 if (z->
ket == i) printf(
"]");
469 if (z->
l == i) printf(
"}");
472 if (ch == 0) ch =
'#';
int(* function)(struct SN_env *)
int insert_v(struct SN_env *z, int bra, int ket, const symbol *p)
int find_among_b(struct SN_env *z, const struct among *v, int v_size)
int out_grouping_U(struct SN_env *z, const unsigned char *s, int min, int max, int repeat)
int insert_s(struct SN_env *z, int bra, int ket, int s_size, const symbol *s)
static int slice_check(struct SN_env *z)
int slice_del(struct SN_env *z)
int in_grouping_U(struct SN_env *z, const unsigned char *s, int min, int max, int repeat)
static symbol * increase_size(symbol *p, int n)
int eq_v_b(struct SN_env *z, const symbol *p)
symbol * assign_to(struct SN_env *z, symbol *p)
int in_grouping(struct SN_env *z, const unsigned char *s, int min, int max, int repeat)
int eq_s(struct SN_env *z, int s_size, const symbol *s)
int replace_s(struct SN_env *z, int c_bra, int c_ket, int s_size, const symbol *s, int *adjptr)
symbol * slice_to(struct SN_env *z, symbol *p)
int eq_v(struct SN_env *z, const symbol *p)
static int get_utf8(const symbol *p, int c, int l, int *slot)
int out_grouping_b(struct SN_env *z, const unsigned char *s, int min, int max, int repeat)
int skip_utf8(const symbol *p, int c, int lb, int l, int n)
int in_grouping_b_U(struct SN_env *z, const unsigned char *s, int min, int max, int repeat)
int eq_s_b(struct SN_env *z, int s_size, const symbol *s)
int out_grouping(struct SN_env *z, const unsigned char *s, int min, int max, int repeat)
int out_grouping_b_U(struct SN_env *z, const unsigned char *s, int min, int max, int repeat)
int slice_from_v(struct SN_env *z, const symbol *p)
int find_among(struct SN_env *z, const struct among *v, int v_size)
int slice_from_s(struct SN_env *z, int s_size, const symbol *s)
int in_grouping_b(struct SN_env *z, const unsigned char *s, int min, int max, int repeat)
static int get_b_utf8(const symbol *p, int c, int lb, int *slot)