summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2014-10-22 15:05:55 +0000
committerkr.angelov <kr.angelov@gmail.com>2014-10-22 15:05:55 +0000
commit00922153aa1f94754847f60a959f3849dfc4771b (patch)
tree4d835112fc0fc87028681880a4c14af8b043cce0 /src
parentdf113f9cc4448b151ec2b53c6a17dfd9c0158489 (diff)
CAPIT is now naturally supported in the C runtime
Diffstat (limited to 'src')
-rw-r--r--src/runtime/c/pgf/graphviz.c3
-rw-r--r--src/runtime/c/pgf/linearizer.c43
-rw-r--r--src/runtime/c/pgf/linearizer.h3
-rw-r--r--src/runtime/c/pgf/parseval.c6
-rw-r--r--src/runtime/java/jpgf.c3
-rw-r--r--src/runtime/python/pypgf.c3
6 files changed, 54 insertions, 7 deletions
diff --git a/src/runtime/c/pgf/graphviz.c b/src/runtime/c/pgf/graphviz.c
index 9668762db..06950b83f 100644
--- a/src/runtime/c/pgf/graphviz.c
+++ b/src/runtime/c/pgf/graphviz.c
@@ -179,7 +179,8 @@ static PgfLinFuncs pgf_bracket_lin_funcs = {
.begin_phrase = pgf_bracket_lzn_begin_phrase,
.end_phrase = pgf_bracket_lzn_end_phrase,
.symbol_ne = NULL,
- .symbol_bind = NULL
+ .symbol_bind = NULL,
+ .symbol_capit = NULL
};
static void
diff --git a/src/runtime/c/pgf/linearizer.c b/src/runtime/c/pgf/linearizer.c
index 1b02e1b38..bbec2f3c2 100644
--- a/src/runtime/c/pgf/linearizer.c
+++ b/src/runtime/c/pgf/linearizer.c
@@ -7,6 +7,8 @@
#include <gu/file.h>
#include <gu/string.h>
#include <gu/assert.h>
+#include <gu/utf8.h>
+#include <gu/ucs.h>
#include <pgf/expr.h>
#include <pgf/literals.h>
#include <stdio.h>
@@ -649,6 +651,7 @@ typedef enum {
PGF_CACHED_BEGIN,
PGF_CACHED_END,
PGF_CACHED_BIND,
+ PGF_CACHED_CAPIT,
PGF_CACHED_NE
} PgfLzrCachedTag;
@@ -713,6 +716,11 @@ pgf_lzr_cache_flush(PgfLzrCache* cache, PgfSymbols* form)
(*cache->lzr->funcs)->symbol_bind(cache->lzr->funcs);
}
break;
+ case PGF_CACHED_CAPIT:
+ if ((*cache->lzr->funcs)->symbol_capit) {
+ (*cache->lzr->funcs)->symbol_capit(cache->lzr->funcs);
+ }
+ break;
case PGF_CACHED_NE:
if ((*cache->lzr->funcs)->symbol_ne) {
(*cache->lzr->funcs)->symbol_ne(cache->lzr->funcs);
@@ -788,12 +796,21 @@ pgf_lzr_cache_symbol_bind(PgfLinFuncs** funcs)
event->tag = PGF_CACHED_BIND;
}
+static void
+pgf_lzr_cache_symbol_capit(PgfLinFuncs** funcs)
+{
+ PgfLzrCache* cache = gu_container(funcs, PgfLzrCache, funcs);
+ PgfLzrCached* event = gu_buf_extend(cache->events);
+ event->tag = PGF_CACHED_CAPIT;
+}
+
static PgfLinFuncs pgf_lzr_cache_funcs = {
.symbol_token = pgf_lzr_cache_symbol_token,
.begin_phrase = pgf_lzr_cache_begin_phrase,
.end_phrase = pgf_lzr_cache_end_phrase,
.symbol_ne = pgf_lzr_cache_symbol_ne,
- .symbol_bind = pgf_lzr_cache_symbol_bind
+ .symbol_bind = pgf_lzr_cache_symbol_bind,
+ .symbol_capit = pgf_lzr_cache_symbol_capit
};
static void
@@ -905,6 +922,9 @@ pgf_lzr_linearize_symbols(PgfLzr* lzr, PgfCncTreeApp* fapp,
break;
}
case PGF_SYMBOL_CAPIT:
+ if ((*lzr->funcs)->symbol_capit) {
+ (*lzr->funcs)->symbol_capit(lzr->funcs);
+ }
break;
default:
gu_impossible();
@@ -1025,6 +1045,7 @@ typedef struct PgfSimpleLin PgfSimpleLin;
struct PgfSimpleLin {
PgfLinFuncs* funcs;
bool bind;
+ bool capit;
GuOut* out;
GuExn* err;
};
@@ -1047,6 +1068,14 @@ pgf_file_lzn_symbol_token(PgfLinFuncs** funcs, PgfToken tok)
}
pgf_file_lzn_put_space(flin);
+
+ if (flin->capit) {
+ GuUCS c = gu_utf8_decode((const uint8_t**) &tok);
+ c = gu_ucs_to_upper(c);
+ gu_out_utf8(c, flin->out, flin->err);
+ flin->capit = false;
+ }
+
gu_string_write(tok, flin->out, flin->err);
}
@@ -1064,12 +1093,20 @@ pgf_file_lzn_symbol_bind(PgfLinFuncs** funcs)
flin->bind = true;
}
+static void
+pgf_file_lzn_symbol_capit(PgfLinFuncs** funcs)
+{
+ PgfSimpleLin* flin = gu_container(funcs, PgfSimpleLin, funcs);
+ flin->capit = true;
+}
+
static PgfLinFuncs pgf_file_lin_funcs = {
.symbol_token = pgf_file_lzn_symbol_token,
.begin_phrase = NULL,
.end_phrase = NULL,
.symbol_ne = pgf_file_lzn_symbol_ne,
- .symbol_bind = pgf_file_lzn_symbol_bind
+ .symbol_bind = pgf_file_lzn_symbol_bind,
+ .symbol_capit = pgf_file_lzn_symbol_capit
};
void
@@ -1080,6 +1117,7 @@ pgf_lzr_linearize_simple(PgfConcr* concr, PgfCncTree ctree, size_t lin_idx,
PgfSimpleLin flin = {
.funcs = &pgf_file_lin_funcs,
.bind = true,
+ .capit = false,
.out = out,
.err = err
};
@@ -1145,6 +1183,7 @@ pgf_get_tokens(PgfSymbols* syms, uint16_t sym_idx, GuPool* pool)
PgfSimpleLin flin = {
.funcs = &pgf_file_lin_funcs,
.bind = true,
+ .capit = false,
.out = out,
.err = err
};
diff --git a/src/runtime/c/pgf/linearizer.h b/src/runtime/c/pgf/linearizer.h
index bee1e71a4..daa6f6438 100644
--- a/src/runtime/c/pgf/linearizer.h
+++ b/src/runtime/c/pgf/linearizer.h
@@ -54,6 +54,9 @@ struct PgfLinFuncs
/// token binding
void (*symbol_bind)(PgfLinFuncs** self);
+
+ /// capitalization
+ void (*symbol_capit)(PgfLinFuncs** self);
};
/// Linearize a concrete syntax tree.
diff --git a/src/runtime/c/pgf/parseval.c b/src/runtime/c/pgf/parseval.c
index 6262b5525..638ee79eb 100644
--- a/src/runtime/c/pgf/parseval.c
+++ b/src/runtime/c/pgf/parseval.c
@@ -115,7 +115,8 @@ static PgfLinFuncs pgf_metrics_lin_funcs1 = {
.begin_phrase = pgf_metrics_lzn_begin_phrase,
.end_phrase = pgf_metrics_lzn_end_phrase1,
.symbol_ne = pgf_metrics_symbol_ne,
- .symbol_bind = pgf_metrics_symbol_bind
+ .symbol_bind = pgf_metrics_symbol_bind,
+ .symbol_capit = NULL
};
static PgfLinFuncs pgf_metrics_lin_funcs2 = {
@@ -123,7 +124,8 @@ static PgfLinFuncs pgf_metrics_lin_funcs2 = {
.begin_phrase = pgf_metrics_lzn_begin_phrase,
.end_phrase = pgf_metrics_lzn_end_phrase2,
.symbol_ne = pgf_metrics_symbol_ne,
- .symbol_bind = pgf_metrics_symbol_bind
+ .symbol_bind = pgf_metrics_symbol_bind,
+ .symbol_capit = NULL
};
bool
diff --git a/src/runtime/java/jpgf.c b/src/runtime/java/jpgf.c
index 0c0284352..49a7e04dc 100644
--- a/src/runtime/java/jpgf.c
+++ b/src/runtime/java/jpgf.c
@@ -659,7 +659,8 @@ static PgfLinFuncs pgf_bracket_lin_funcs = {
.begin_phrase = pgf_bracket_lzn_begin_phrase,
.end_phrase = pgf_bracket_lzn_end_phrase,
.symbol_ne = NULL,
- .symbol_bind = NULL
+ .symbol_bind = NULL,
+ .symbol_capit = NULL
};
JNIEXPORT jobjectArray JNICALL
diff --git a/src/runtime/python/pypgf.c b/src/runtime/python/pypgf.c
index 10dd0969f..c356e5c76 100644
--- a/src/runtime/python/pypgf.c
+++ b/src/runtime/python/pypgf.c
@@ -1728,7 +1728,8 @@ static PgfLinFuncs pgf_bracket_lin_funcs = {
.begin_phrase = pgf_bracket_lzn_begin_phrase,
.end_phrase = pgf_bracket_lzn_end_phrase,
.symbol_ne = NULL,
- .symbol_bind = NULL
+ .symbol_bind = NULL,
+ .symbol_capit = NULL
};
static PyObject*