6 #define SNOWBALL_RUNTIME_THROW_EXCEPTIONS
10 #ifdef SNOWBALL_RUNTIME_THROW_EXCEPTIONS
13 # define SNOWBALL_RETURN_OK return
14 # define SNOWBALL_RETURN_OR_THROW(R, E) throw E
15 # define SNOWBALL_PROPAGATE_ERR(F) F
17 # define SNOWBALL_RETURN_OK return 0
18 # define SNOWBALL_RETURN_OR_THROW(R, E) return R
19 # define SNOWBALL_PROPAGATE_ERR(F) do { \
20 int snowball_err = F; \
21 if (snowball_err < 0) return snowball_err; \
25 #define HEAD (2 * sizeof(int))
34 #define CREATE_SIZE 31
48 if (
p == NULL)
return;
49 free((
char *)
p -
HEAD);
64 if (c >= limit)
return -1;
69 if (b >= 0xC0 || b < 0x80)
break;
90 if (c <= limit)
return -1;
107 if (c >= l)
return 0;
109 if (b0 < 0xC0 || c == l) {
114 if (b0 < 0xE0 || c == l) {
115 *slot = (b0 & 0x1F) << 6 | b1;
119 if (b0 < 0xF0 || c == l) {
120 *slot = (b0 & 0xF) << 12 | b1 << 6 | b2;
123 *slot = (b0 & 0x7) << 18 | b1 << 12 | b2 << 6 | (
p[c] & 0x3F);
129 if (c <= lb)
return 0;
131 if (b < 0x80 || c == lb) {
137 if (b >= 0xC0 || c == lb) {
138 *slot = (b & 0x1F) << 6 | a;
141 a |= (b & 0x3F) << 6;
143 if (b >= 0xE0 || c == lb) {
144 *slot = (b & 0xF) << 12 | a;
147 *slot = (
p[--c] & 0x7) << 18 | (b & 0x3F) << 12 | a;
151 #ifdef SNOWBALL_COVERAGE
153 static char grouping_seen[255];
155 static void report_coverage(
const unsigned char * s,
int min,
int max,
int ch,
const unsigned char *
p,
int w) {
159 const unsigned char * loc = s + (max - min + 8) / 8;
160 int grouping_number = *loc++;
166 if (ch > max) ch -= min;
168 for (j = 0; j != max - min; ++j) {
169 if (s[j >> 3] & (0X1 << (j & 0X7))) {
174 if (grouping_number < (
int)
sizeof(grouping_seen) &&
175 grouping_seen[grouping_number] == 0) {
180 for (j = 0; j != max - min; ++j) {
181 if (s[j >> 3] & (0X1 << (j & 0X7))) {
182 fprintf(stderr,
"%s index %d of %d '", loc, k, outof + 1);
183 int codepoint = j + min;
184 if (codepoint < 0x80) {
185 putc(codepoint, stderr);
186 }
else if (codepoint < 0x800) {
187 putc((codepoint >> 6) | 0xC0, stderr);
188 putc((codepoint & 0x3F) | 0x80, stderr);
190 putc((codepoint >> 12) | 0xE0, stderr);
191 putc(((codepoint >> 6) & 0x3F) | 0x80, stderr);
192 putc((codepoint & 0x3F) | 0x80, stderr);
194 fprintf(stderr,
"'\n");
198 grouping_seen[grouping_number] = 1;
200 fprintf(stderr,
"%s index %d of %d '%.*s'\n", loc, i, outof + 1, w,
p);
203 static void report_coverage_nomatch(
const unsigned char * s,
int min,
int max) {
204 const unsigned char * loc = s + (max - min + 8) / 8;
206 fprintf(stderr,
"%s no match\n", loc);
215 if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) {
216 #ifdef SNOWBALL_COVERAGE
217 report_coverage_nomatch(s, min, max);
221 #ifdef SNOWBALL_COVERAGE
222 report_coverage(s, min, max, ch, z->
p + z->
c, w);
234 if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) {
235 #ifdef SNOWBALL_COVERAGE
236 report_coverage_nomatch(s, min, max);
240 #ifdef SNOWBALL_COVERAGE
241 report_coverage(s, min, max, ch, z->
p + z->
c - w, w);
253 if (!(ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)) {
254 #ifdef SNOWBALL_COVERAGE
255 report_coverage(s, min, max, ch, z->
p + z->
c, w);
259 #ifdef SNOWBALL_COVERAGE
260 report_coverage_nomatch(s, min, max);
272 if (!(ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)) {
273 #ifdef SNOWBALL_COVERAGE
274 report_coverage(s, min, max, ch, z->
p + z->
c - w, w);
278 #ifdef SNOWBALL_COVERAGE
279 report_coverage_nomatch(s, min, max);
288 extern int in_grouping(
struct SN_env * z,
const unsigned char * s,
int min,
int max,
int repeat) {
291 if (z->
c >= z->
l)
return -1;
293 if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)
303 if (z->
c <= z->
lb)
return -1;
305 if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)
315 if (z->
c >= z->
l)
return -1;
317 if (!(ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0))
327 if (z->
c <= z->
lb)
return -1;
329 if (!(ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0))
337 if (z->
l - z->
c < s_size || memcmp(z->
p + z->
c, s, s_size *
sizeof(
symbol)) != 0)
return 0;
338 z->
c += s_size;
return 1;
342 if (z->
c - z->
lb < s_size || memcmp(z->
p + z->
c - s_size, s, s_size *
sizeof(
symbol)) != 0)
return 0;
343 z->
c -= s_size;
return 1;
354 #ifdef SNOWBALL_COVERAGE
356 static char among_seen[4096];
360 int (*call_among_func)(
struct SN_env*)) {
365 int c = z->
c;
int l = z->
l;
368 const struct among * w;
373 int first_key_inspected = 0;
375 #ifdef SNOWBALL_COVERAGE
376 int among_number =
v[v_size].s_size;
377 if (among_number < (
int)
sizeof(among_seen) &&
378 among_seen[among_number] == 0) {
383 for (k = 0; k < v_size; ++k) {
385 fprintf(stderr,
"%s: among %d : %d of %d string '%.*s'\n", w[v_size].
s, among_number, w[v_size].
result, v_size, w->
s_size, w->
s);
387 fprintf(stderr,
"%s: among %d : %d of %d func-f '%.*s'\n", w[v_size].
s, among_number, w[v_size].
result, v_size, w->
s_size, w->
s);
394 if (
v[v_size * 2].
s_size != -1) {
395 fprintf(stderr,
"%s: among %d no match\n",
v[v_size * 2].
s, among_number);
397 among_seen[among_number] = 1;
401 int k = i + ((j - i) >> 1);
403 int common = common_i < common_j ? common_i : common_j;
406 int i2;
for (i2 = common; i2 < w->
s_size; i2++) {
407 if (c + common == l) { diff = -1;
break; }
408 diff = q[common] - w->
s[i2];
409 if (diff != 0)
break;
428 if (first_key_inspected)
break;
429 first_key_inspected = 1;
434 if (common_i >= w->
s_size) {
437 #ifdef SNOWBALL_COVERAGE
438 fprintf(stderr,
"%s: among %d : %d of %d string '%.*s'\n", w[v_size].
s, among_number, w[v_size].
result, v_size, w->
s_size, w->
s);
443 if (call_among_func(z)) {
445 #ifdef SNOWBALL_COVERAGE
446 fprintf(stderr,
"%s: among %d : %d of %d string '%.*s'\n", w[v_size].
s, among_number, w[v_size].
result, v_size, w->
s_size, w->
s);
450 #ifdef SNOWBALL_COVERAGE
451 fprintf(stderr,
"%s: among %d : %d of %d func-f '%.*s'\n", w[v_size].
s, among_number, w[v_size].
result, v_size, w->
s_size, w->
s);
455 #ifdef SNOWBALL_COVERAGE
456 fprintf(stderr,
"%s: among %d no match\n",
v[v_size * 2].
s, among_number);
467 int (*call_among_func)(
struct SN_env*)) {
472 int c = z->
c;
int lb = z->
lb;
473 const symbol * q = z->
p + c - 1;
475 const struct among * w;
480 int first_key_inspected = 0;
482 #ifdef SNOWBALL_COVERAGE
483 int among_number =
v[v_size].s_size;
484 if (among_number < (
int)
sizeof(among_seen) &&
485 among_seen[among_number] == 0) {
490 for (k = 0; k < v_size; ++k) {
492 fprintf(stderr,
"%s: among %d : %d of %d string '%.*s'\n", w[v_size].
s, among_number, w[v_size].
result, v_size, w->
s_size, w->
s);
494 fprintf(stderr,
"%s: among %d : %d of %d func-f '%.*s'\n", w[v_size].
s, among_number, w[v_size].
result, v_size, w->
s_size, w->
s);
501 if (
v[v_size * 2].
s_size != -1) {
502 fprintf(stderr,
"%s: among %d no match\n",
v[v_size * 2].
s, among_number);
504 among_seen[among_number] = 1;
508 int k = i + ((j - i) >> 1);
510 int common = common_i < common_j ? common_i : common_j;
513 int i2;
for (i2 = w->
s_size - 1 - common; i2 >= 0; i2--) {
514 if (c - common == lb) { diff = -1;
break; }
515 diff = q[- common] - w->
s[i2];
516 if (diff != 0)
break;
520 if (diff < 0) { j = k; common_j = common; }
521 else { i = k; common_i = common; }
525 if (first_key_inspected)
break;
526 first_key_inspected = 1;
531 if (common_i >= w->
s_size) {
534 #ifdef SNOWBALL_COVERAGE
535 fprintf(stderr,
"%s: among %d : %d of %d string '%.*s'\n", w[v_size].
s, among_number, w[v_size].
result, v_size, w->
s_size, w->
s);
540 if (call_among_func(z)) {
541 #ifdef SNOWBALL_COVERAGE
542 fprintf(stderr,
"%s: among %d : %d of %d string '%.*s'\n", w[v_size].
s, among_number, w[v_size].
result, v_size, w->
s_size, w->
s);
547 #ifdef SNOWBALL_COVERAGE
548 fprintf(stderr,
"%s: among %d : %d of %d func-f '%.*s'\n", w[v_size].
s, among_number, w[v_size].
result, v_size, w->
s_size, w->
s);
552 #ifdef SNOWBALL_COVERAGE
553 fprintf(stderr,
"%s: among %d no match\n",
v[v_size * 2].
s, among_number);
566 int new_size = n + 20;
567 void * mem = realloc((
char *) *
p -
HEAD,
570 if (mem == NULL)
return -1;
584 if (adjustment != 0) {
585 int len =
SIZE(z->
p);
589 memmove(z->
p +
c_ket + adjustment,
603 # define REPLACE_S(Z, B, K, SIZE, S) \
604 SNOWBALL_PROPAGATE_ERR(replace_s(Z, B, K, SIZE, S))
614 fprintf(stderr,
"faulty slice operation:\n");
622 # define SLICE_CHECK(Z) SNOWBALL_PROPAGATE_ERR(slice_check(Z))
638 int slice_size = z->
ket - z->
bra;
639 if (slice_size != 0) {
640 int len =
SIZE(z->
p);
641 memmove(z->
p + z->
bra,
648 else if (z->
c > z->
bra)
659 int adjustment =
s_size - (ket - bra);
660 z->
ket += adjustment;
661 if (bra <= z->bra) z->
bra += adjustment;
673 int len = z->
ket - z->
bra;
688 memmove(*
p, z->
p, len *
sizeof(
symbol));
698 if (b >= 0xC0 || b < 0x80) ++len;
#define REPLACE_S(Z, B, K, SIZE, S)
#define SNOWBALL_RETURN_OR_THROW(R, E)
int out_grouping_U(struct SN_env *z, const unsigned char *s, int min, int max, int repeat)
int in_grouping_U(struct SN_env *z, const unsigned char *s, int min, int max, int repeat)
SNOWBALL_ERR insert_s(struct SN_env *z, int bra, int ket, int s_size, const symbol *s)
int eq_v_b(struct SN_env *z, const symbol *p)
SNOWBALL_ERR slice_from_s(struct SN_env *z, int s_size, const symbol *s)
int in_grouping(struct SN_env *z, const unsigned char *s, int min, int max, int repeat)
SNOWBALL_ERR slice_to(struct SN_env *z, symbol **p)
int sizeof_symbol_divides_head[(HEAD % sizeof(symbol)==0) ? 1 :-1]
SNOWBALL_ERR assign_to(struct SN_env *z, symbol **p)
SNOWBALL_ERR slice_from_v(struct SN_env *z, const symbol *p)
int eq_s(struct SN_env *z, int s_size, const symbol *s)
SNOWBALL_ERR insert_v(struct SN_env *z, int bra, int ket, const symbol *p)
#define SNOWBALL_PROPAGATE_ERR(F)
static SNOWBALL_ERR slice_check(struct SN_env *z)
int eq_v(struct SN_env *z, const symbol *p)
SNOWBALL_ERR replace_s(struct SN_env *z, int c_bra, int c_ket, int s_size, const symbol *s)
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 find_among_b(struct SN_env *z, const struct among *v, int v_size, int(*call_among_func)(struct SN_env *))
#define SNOWBALL_RETURN_OK
int in_grouping_b_U(struct SN_env *z, const unsigned char *s, int min, int max, int repeat)
int skip_b_utf8(const symbol *p, int c, int limit, int n)
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)
SNOWBALL_ERR slice_del(struct SN_env *z)
int out_grouping_b_U(struct SN_env *z, const unsigned char *s, int min, int max, int repeat)
int skip_utf8(const symbol *p, int c, int limit, int n)
int in_grouping_b(struct SN_env *z, const unsigned char *s, int min, int max, int repeat)
int len_utf8(const symbol *p)
static int get_b_utf8(const symbol *p, int c, int lb, int *slot)
static int increase_size(symbol **p, int n)
int find_among(struct SN_env *z, const struct among *v, int v_size, int(*call_among_func)(struct SN_env *))