Created
April 25, 2018 23:58
-
-
Save msteveb/bc468decd86293c185e498adff9a2199 to your computer and use it in GitHub Desktop.
Jim - Tcl compatibility for backslash newline
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 98cd46a47258542a2c67b81c76c888024bf02742 Mon Sep 17 00:00:00 2001 | |
From: Steve Bennett <steveb@workware.net.au> | |
Date: Thu, 26 Apr 2018 09:56:02 +1000 | |
Subject: [PATCH] Handle backslash newline followed by white space | |
For Tcl compatibily - but breaks line numbering in some circumstances | |
--- | |
jim.c | 57 ++++++++++++++++++++++++++++++++++++++++++++------------- | |
1 file changed, 44 insertions(+), 13 deletions(-) | |
diff --git a/jim.c b/jim.c | |
index 9ae90636..cb30e7a7 100644 | |
--- a/jim.c | |
+++ b/jim.c | |
@@ -1982,6 +1982,39 @@ static int JimEscape(char *dest, const char *s, int slen) | |
return len; | |
} | |
+static int JimSquashBacklashNewline(char *dest, const char *s, int slen) | |
+{ | |
+ char *p = dest; | |
+ int i, len; | |
+ | |
+ for (i = 0; i < slen; i++) { | |
+ switch (s[i]) { | |
+ case '\\': | |
+ switch (s[i + 1]) { | |
+ case '\\': | |
+ case '\0': | |
+ *p++ = '\\'; | |
+ i++; | |
+ break; | |
+ case '\n': | |
+ /* Replace all spaces and tabs after backslash newline with a single space*/ | |
+ *p++ = ' '; | |
+ i++; | |
+ do { | |
+ i++; | |
+ } while (s[i] == ' ' || s[i] == '\t'); | |
+ break; | |
+ } | |
+ default: | |
+ *p++ = s[i]; | |
+ break; | |
+ } | |
+ } | |
+ len = p - dest; | |
+ *p = '\0'; | |
+ return len; | |
+} | |
+ | |
/* Returns a dynamically allocated copy of the current token in the | |
* parser context. The function performs conversion of escapes if | |
* the token is of type JIM_TT_ESC. | |
@@ -3439,22 +3472,20 @@ static int JimCountWordTokens(struct ScriptObj *script, ParseToken *t) | |
*/ | |
static Jim_Obj *JimMakeScriptObj(Jim_Interp *interp, const ParseToken *t) | |
{ | |
- Jim_Obj *objPtr; | |
- | |
- if (t->type == JIM_TT_ESC && memchr(t->token, '\\', t->len) != NULL) { | |
- /* Convert backlash escapes. The result will never be longer than the original */ | |
+ if ((t->type == JIM_TT_ESC || t->type == JIM_TT_STR) && memchr(t->token, '\\', t->len) != NULL) { | |
int len = t->len; | |
char *str = Jim_Alloc(len + 1); | |
- len = JimEscape(str, t->token, len); | |
- objPtr = Jim_NewStringObjNoAlloc(interp, str, len); | |
- } | |
- else { | |
- /* XXX: For strict Tcl compatibility, JIM_TT_STR should replace <backslash><newline><whitespace> | |
- * with a single space. | |
- */ | |
- objPtr = Jim_NewStringObj(interp, t->token, t->len); | |
+ if (t->type == JIM_TT_ESC) { | |
+ /* Convert backlash escapes. The result will never be longer than the original */ | |
+ len = JimEscape(str, t->token, len); | |
+ } | |
+ else { | |
+ /* Convert backlash newline. The result will never be longer than the original */ | |
+ len = JimSquashBacklashNewline(str, t->token, len); | |
+ } | |
+ return Jim_NewStringObjNoAlloc(interp, str, len); | |
} | |
- return objPtr; | |
+ return Jim_NewStringObj(interp, t->token, t->len); | |
} | |
/** | |
-- | |
2.13.5 (Apple Git-94) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment