From 6cc2437817c94ec8f43a0d015bfdcc25f90bee86 Mon Sep 17 00:00:00 2001 From: Sam Liddicott Date: Tue, 19 Jul 2011 08:31:59 +0100 Subject: [PATCH] Add top-level tunnelling so a makefile included in a makefile isn't quoted, etc --- fangle | 5 +-- fangle.tm | 9 +++-- fangle.txt | 109 +++++++++++++++++++++++++++++++------------------------------ 3 files changed, 64 insertions(+), 59 deletions(-) diff --git a/fangle b/fangle index dc4b81b..379542a 100644 --- a/fangle +++ b/fangle @@ -97,7 +97,8 @@ function push_mode_tracker(context, language, mode, return; } else { top = context[""]; - if (context[top, "language"] == language && mode=="") mode = context[top, "mode"]; +# if (context[top, "language"] == language && mode=="") mode = context[top, "mode"]; + if (context[top, "language"] == language && context[top, "mode"] == mode) return top; old_top = top; top++; context[top, "language"] = language; @@ -118,7 +119,7 @@ function dump_mode_tracker(context, } function pop_mode_tracker(context, context_origin) { - if ( (context_origin) && ("" in context) && context[""] != (1+context_origin)) return 0; + if ( (context_origin) && ("" in context) && context[""] != (1+context_origin) && context[""] != context_origin) return 0; context[""] = context_origin; return 1; } diff --git a/fangle.tm b/fangle.tm index df4641e..3ca8d4d 100644 --- a/fangle.tm +++ b/fangle.tm @@ -2595,8 +2595,11 @@ \ \ \ top = context[""]; - \ \ \ if (context[top, "language"] == language && mode=="") mode = - context[top, "mode"]; + # \ \ \ if (context[top, "language"] == language && mode=="") mode + = context[top, "mode"]; + + \ \ \ if (context[top, "language"] == language && context[top, + "mode"] == mode) return top; \ \ \ old_top = top; @@ -2645,7 +2648,7 @@ { \ if ( (context_origin) && ("" in context) && context[""] != - (1+context_origin)) return 0; + (1+context_origin) && context[""] != context_origin) return 0; \ context[""] = context_origin; diff --git a/fangle.txt b/fangle.txt index e9e59b8..58f36f4 100644 --- a/fangle.txt +++ b/fangle.txt @@ -1594,39 +1594,40 @@ And for tracking modes, we dispatch to a mode-tracker action based on the curren 7 | return; 8 | } else { 9 | top = context[""]; - 10 | if (context[top, "language"] == language && mode=="") mode = context[top, "mode"]; - 11 | old_top = top; - 12 | top++; - 13 | context[top, "language"] = language; - 14 | context[top, "mode"] = mode; - 15 | context[""] = top; - 16 | } - 17 | return old_top; - 18 | } + 10 | # if (context[top, "language"] == language && mode=="") mode = context[top, "mode"]; + 11 | if (context[top, "language"] == language && context[top, "mode"] == mode) return top; + 12 | old_top = top; + 13 | top++; + 14 | context[top, "language"] = language; + 15 | context[top, "mode"] = mode; + 16 | context[""] = top; + 17 | } + 18 | return old_top; + 19 | } |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ 55c +≡ ▵55b 55d▿ ./\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ - 19 | function dump_mode_tracker(context, - 20 | c, d) - 21 | { - 22 | for(c=0; c <= context[""]; c++) { - 23 | printf(" %2d %s:%s\n", c, context[c, "language"], context[c, "mode"]) > "/dev/stderr"; - 24 | for(d=1; ( (c, "values", d) in context); d++) { - 25 | printf(" %2d %s\n", d, context[c, "values", d]) > "/dev/stderr"; - 26 | } - 27 | } - 28 | } + 20 | function dump_mode_tracker(context, + 21 | c, d) + 22 | { + 23 | for(c=0; c <= context[""]; c++) { + 24 | printf(" %2d %s:%s\n", c, context[c, "language"], context[c, "mode"]) > "/dev/stderr"; + 25 | for(d=1; ( (c, "values", d) in context); d++) { + 26 | printf(" %2d %s\n", d, context[c, "values", d]) > "/dev/stderr"; + 27 | } + 28 | } + 29 | } |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ 55d +≡ ▵55c 60a⊳ ./\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ - 29 | function pop_mode_tracker(context, context_origin) - 30 | { - 31 | if ( (context_origin) && ("" in context) && context[""] != (1+context_origin)) return 0; - 32 | context[""] = context_origin; - 33 | return 1; - 34 | } + 30 | function pop_mode_tracker(context, context_origin) + 31 | { + 32 | if ( (context_origin) && ("" in context) && context[""] != (1+context_origin) && context[""] != context_origin) return 0; + 33 | context[""] = context_origin; + 34 | return 1; + 35 | } |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ This implies that any chunk must be syntactically whole; for instance, this is fine: @@ -1886,41 +1887,41 @@ To do: remove the hack 60a +≡ ⊲55d 60b▿ ./\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ - 35 | function untab(text) { - 36 | gsub("[[:space:]]*\xE2\x86\xA4","", text); - 37 | return text; - 38 | } + 36 | function untab(text) { + 37 | gsub("[[:space:]]*\xE2\x86\xA4","", text); + 38 | return text; + 39 | } |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ Each nested mode can optionally define a set of transforms to be applied to any text that is included from another language. This code can perform transforms from index c downwards. 60b +≡ ▵60a 58c⊳ ./\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ - 39 | function transform_escape(context, text, top, - 40 | c, cp, cpl, s, r) - 41 | { - 42 | for(c = top; c >= 0; c--) { - 43 | if ( (context[c, "language"], context[c, "mode"]) in escapes) { - 44 | cpl = escapes[context[c, "language"], context[c, "mode"]]; - 45 | for (cp = 1; cp <= cpl; cp ++) { - 46 | s = escapes[context[c, "language"], context[c, "mode"], cp, "s"]; - 47 | r = escapes[context[c, "language"], context[c, "mode"], cp, "r"]; - 48 | if (length(s)) { - 49 | gsub(s, r, text); - 50 | } - 51 | if ( (context[c, "language"], context[c, "mode"], cp, "t") in escapes ) { - 52 | quotes[src, "t"] = escapes[context[c, "language"], context[c, "mode"], cp, "t"]; - 53 | } - 54 | } - 55 | } - 56 | } - 57 | return text; - 58 | } - 59 | function dump_escaper(quotes, r, cc) { - 60 | for(cc=1; cc<=c; cc++) { - 61 | printf("%2d s[%s] r[%s]\n", cc, quotes[cc, "s"], quotes[cc, "r"]) > "/dev/stderr" - 62 | } - 63 | } + 40 | function transform_escape(context, text, top, + 41 | c, cp, cpl, s, r) + 42 | { + 43 | for(c = top; c >= 0; c--) { + 44 | if ( (context[c, "language"], context[c, "mode"]) in escapes) { + 45 | cpl = escapes[context[c, "language"], context[c, "mode"]]; + 46 | for (cp = 1; cp <= cpl; cp ++) { + 47 | s = escapes[context[c, "language"], context[c, "mode"], cp, "s"]; + 48 | r = escapes[context[c, "language"], context[c, "mode"], cp, "r"]; + 49 | if (length(s)) { + 50 | gsub(s, r, text); + 51 | } + 52 | if ( (context[c, "language"], context[c, "mode"], cp, "t") in escapes ) { + 53 | quotes[src, "t"] = escapes[context[c, "language"], context[c, "mode"], cp, "t"]; + 54 | } + 55 | } + 56 | } + 57 | } + 58 | return text; + 59 | } + 60 | function dump_escaper(quotes, r, cc) { + 61 | for(cc=1; cc<=c; cc++) { + 62 | printf("%2d s[%s] r[%s]\n", cc, quotes[cc, "s"], quotes[cc, "r"]) > "/dev/stderr" + 63 | } + 64 | } |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ 60c ≡ -- 2.11.4.GIT