diff options
| author | krasimir <krasimir@chalmers.se> | 2015-05-11 13:01:39 +0000 |
|---|---|---|
| committer | krasimir <krasimir@chalmers.se> | 2015-05-11 13:01:39 +0000 |
| commit | 1e0d7be4f4322836093d744c916fe02bfbcf9418 (patch) | |
| tree | 21b259b2c9eb31ce9fbcfe5d168d1747f6a2c5c2 /src/runtime/c/pgf/linearizer.c | |
| parent | 13998e32873758c0b1964a62f738b9916e666b86 (diff) | |
added all orthographic primitives
Diffstat (limited to 'src/runtime/c/pgf/linearizer.c')
| -rw-r--r-- | src/runtime/c/pgf/linearizer.c | 73 |
1 files changed, 51 insertions, 22 deletions
diff --git a/src/runtime/c/pgf/linearizer.c b/src/runtime/c/pgf/linearizer.c index 409d60a2c..e7031950d 100644 --- a/src/runtime/c/pgf/linearizer.c +++ b/src/runtime/c/pgf/linearizer.c @@ -652,6 +652,7 @@ typedef enum { PGF_CACHED_END, PGF_CACHED_BIND, PGF_CACHED_CAPIT, + PGF_CACHED_ALL_CAPIT, PGF_CACHED_NE } PgfLzrCachedTag; @@ -718,7 +719,12 @@ pgf_lzr_cache_flush(PgfLzrCache* cache, PgfSymbols* form) break; case PGF_CACHED_CAPIT: if ((*cache->lzr->funcs)->symbol_capit) { - (*cache->lzr->funcs)->symbol_capit(cache->lzr->funcs); + (*cache->lzr->funcs)->symbol_capit(cache->lzr->funcs, PGF_CAPIT_FIRST); + } + break; + case PGF_CACHED_ALL_CAPIT: + if ((*cache->lzr->funcs)->symbol_capit) { + (*cache->lzr->funcs)->symbol_capit(cache->lzr->funcs, PGF_CAPIT_ALL); } break; case PGF_CACHED_NE: @@ -797,11 +803,11 @@ pgf_lzr_cache_symbol_bind(PgfLinFuncs** funcs) } static void -pgf_lzr_cache_symbol_capit(PgfLinFuncs** funcs) +pgf_lzr_cache_symbol_capit(PgfLinFuncs** funcs, PgfCapitState capit) { PgfLzrCache* cache = gu_container(funcs, PgfLzrCache, funcs); PgfLzrCached* event = gu_buf_extend(cache->events); - event->tag = PGF_CACHED_CAPIT; + event->tag = (capit == PGF_CAPIT_ALL) ? PGF_CACHED_ALL_CAPIT : PGF_CACHED_CAPIT; } static PgfLinFuncs pgf_lzr_cache_funcs = { @@ -921,9 +927,18 @@ pgf_lzr_linearize_symbols(PgfLzr* lzr, PgfCncTreeApp* fapp, } break; } + case PGF_SYMBOL_SOFT_SPACE: { + // SOFT_SPACE should be just ignored in linearization + break; + } case PGF_SYMBOL_CAPIT: if ((*lzr->funcs)->symbol_capit) { - (*lzr->funcs)->symbol_capit(lzr->funcs); + (*lzr->funcs)->symbol_capit(lzr->funcs, PGF_CAPIT_FIRST); + } + break; + case PGF_SYMBOL_ALL_CAPIT: + if ((*lzr->funcs)->symbol_capit) { + (*lzr->funcs)->symbol_capit(lzr->funcs, PGF_CAPIT_ALL); } break; default: @@ -1045,21 +1060,12 @@ typedef struct PgfSimpleLin PgfSimpleLin; struct PgfSimpleLin { PgfLinFuncs* funcs; bool bind; - bool capit; + PgfCapitState capit; GuOut* out; GuExn* err; }; static void -pgf_file_lzn_put_space(PgfSimpleLin* flin) -{ - if (flin->bind) - flin->bind = false; - else - gu_putc(' ', flin->out, flin->err); -} - -static void pgf_file_lzn_symbol_token(PgfLinFuncs** funcs, PgfToken tok) { PgfSimpleLin* flin = gu_container(funcs, PgfSimpleLin, funcs); @@ -1067,16 +1073,39 @@ pgf_file_lzn_symbol_token(PgfLinFuncs** funcs, PgfToken tok) return; } - pgf_file_lzn_put_space(flin); + if (flin->bind) + flin->bind = false; + else { + gu_putc(' ', flin->out, flin->err); + if (flin->capit == PGF_CAPIT_NEXT) + flin->capit = PGF_CAPIT_NONE; + } - if (flin->capit) { + switch (flin->capit) { + case PGF_CAPIT_NONE: + gu_string_write(tok, flin->out, flin->err); + break; + case PGF_CAPIT_FIRST: { 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); + flin->capit = PGF_CAPIT_NONE; + break; + } + case PGF_CAPIT_ALL: + flin->capit = PGF_CAPIT_NEXT; + // continue + case PGF_CAPIT_NEXT: { + const uint8_t* p = (uint8_t*) tok; + while (*p) { + GuUCS c = gu_utf8_decode(&p); + c = gu_ucs_to_upper(c); + gu_out_utf8(c, flin->out, flin->err); + } + break; + } } - - gu_string_write(tok, flin->out, flin->err); } static void @@ -1094,10 +1123,10 @@ pgf_file_lzn_symbol_bind(PgfLinFuncs** funcs) } static void -pgf_file_lzn_symbol_capit(PgfLinFuncs** funcs) +pgf_file_lzn_symbol_capit(PgfLinFuncs** funcs, PgfCapitState capit) { PgfSimpleLin* flin = gu_container(funcs, PgfSimpleLin, funcs); - flin->capit = true; + flin->capit = capit; } static PgfLinFuncs pgf_file_lin_funcs = { @@ -1117,7 +1146,7 @@ pgf_lzr_linearize_simple(PgfConcr* concr, PgfCncTree ctree, size_t lin_idx, PgfSimpleLin flin = { .funcs = &pgf_file_lin_funcs, .bind = true, - .capit = false, + .capit = PGF_CAPIT_NONE, .out = out, .err = err }; |
