Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save msteveb/bc468decd86293c185e498adff9a2199 to your computer and use it in GitHub Desktop.
Save msteveb/bc468decd86293c185e498adff9a2199 to your computer and use it in GitHub Desktop.
Jim - Tcl compatibility for backslash newline
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