summaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorkrasimir <krasimir@chalmers.se>2015-05-18 14:20:35 +0000
committerkrasimir <krasimir@chalmers.se>2015-05-18 14:20:35 +0000
commit773a33979b8504a93a77f6581b3a1b0a0ed6c5ab (patch)
treefb955f77ad70fab777bf9535b1cf35e148aa1cc5 /src/runtime
parent9d21b73a81297043b75866ee76c4edf2ae578dd3 (diff)
pgf_lookup_morpho and pgf_lookup_word_prefix are now also case insensitive if case_sensitive=off
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/c/pgf/parser.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/src/runtime/c/pgf/parser.c b/src/runtime/c/pgf/parser.c
index 1702228e9..f3479949a 100644
--- a/src/runtime/c/pgf/parser.c
+++ b/src/runtime/c/pgf/parser.c
@@ -2216,15 +2216,20 @@ pgf_morpho_iter(PgfProductionIdx* idx,
}
}
+typedef struct {
+ GuOrder order;
+ bool case_sensitive;
+} PgfSequenceOrder;
+
static int
-pgf_sequence_cmp_fn(GuOrder* self, const void* p1, const void* p2)
+pgf_sequence_cmp_fn(GuOrder* order, const void* p1, const void* p2)
{
- (void) self;
+ PgfSequenceOrder* self = gu_container(order, PgfSequenceOrder, order);
GuString sent = (GuString) p1;
const PgfSequence* sp2 = p2;
BIND_TYPE bind = BIND_HARD;
- int res = pgf_symbols_cmp(&sent, &bind, sp2->syms, true);
+ int res = pgf_symbols_cmp(&sent, &bind, sp2->syms, self->case_sensitive);
if (res == 0 && *sent != 0) {
res = 1;
}
@@ -2232,8 +2237,6 @@ pgf_sequence_cmp_fn(GuOrder* self, const void* p1, const void* p2)
return res;
}
-static GuOrder pgf_sequence_order[1] = { { pgf_sequence_cmp_fn } };
-
void
pgf_lookup_morpho(PgfConcr *concr, GuString sentence,
PgfMorphoCallback* callback, GuExn* err)
@@ -2246,8 +2249,12 @@ pgf_lookup_morpho(PgfConcr *concr, GuString sentence,
}
}
+ bool case_sensitive =
+ (gu_seq_binsearch(concr->cflags, pgf_flag_order, PgfFlag, "case_sensitive") == NULL);
+
+ PgfSequenceOrder order = { { pgf_sequence_cmp_fn }, case_sensitive };
PgfSequence* seq = (PgfSequence*)
- gu_seq_binsearch(concr->sequences, pgf_sequence_order,
+ gu_seq_binsearch(concr->sequences, &order.order,
PgfSequence, (void*) sentence);
if (seq != NULL && seq->idx != NULL)
@@ -2341,7 +2348,11 @@ pgf_lookup_word_prefix(PgfConcr *concr, GuString prefix,
state->prefix = prefix;
state->seq_idx = 0;
- if (!gu_seq_binsearch_index(concr->sequences, pgf_sequence_order,
+ bool case_sensitive =
+ (gu_seq_binsearch(concr->cflags, pgf_flag_order, PgfFlag, "case_sensitive") == NULL);
+
+ PgfSequenceOrder order = { { pgf_sequence_cmp_fn }, case_sensitive };
+ if (!gu_seq_binsearch_index(concr->sequences, &order.order,
PgfSequence, (void*) prefix,
&state->seq_idx)) {
state->seq_idx++;