aboutsummaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2010-09-16 09:56:54 +1000
committerSteve Bennett <steveb@workware.net.au>2010-10-15 11:02:53 +1000
commit597e849ff45b4997e4938206f6465bdb0ad29b93 (patch)
tree101a32a794cae18ab155c62f2eec68433ff34923 /jim.c
parente9a230adb3af07d8323a11f90151076b32df432b (diff)
downloadjimtcl-597e849ff45b4997e4938206f6465bdb0ad29b93.zip
jimtcl-597e849ff45b4997e4938206f6465bdb0ad29b93.tar.gz
jimtcl-597e849ff45b4997e4938206f6465bdb0ad29b93.tar.bz2
Source info was lost when converting source to list
This meant that the single arg switch case would not give accurate line numbers Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim.c')
-rw-r--r--jim.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/jim.c b/jim.c
index 7747dd7..00b1d90 100644
--- a/jim.c
+++ b/jim.c
@@ -1694,6 +1694,9 @@ int JimParseListSep(struct JimParserCtx *pc)
pc->tstart = pc->p;
pc->tline = pc->linenr;
while (*pc->p == ' ' || *pc->p == '\t' || *pc->p == '\r' || *pc->p == '\n') {
+ if (*pc->p == '\n') {
+ pc->linenr++;
+ }
pc->p++;
pc->len--;
}
@@ -5541,6 +5544,14 @@ int SetListFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
struct JimParserCtx parser;
const char *str;
int strLen;
+ char *filename = NULL;
+ int linenr = 1;
+
+ /* Try to preserve information about filename / line number */
+ if (objPtr->typePtr == &sourceObjType) {
+ filename = Jim_StrDup(objPtr->internalRep.sourceValue.fileName);
+ linenr = objPtr->internalRep.sourceValue.lineNumber;
+ }
/* Get the string representation */
str = Jim_GetString(objPtr, &strLen);
@@ -5554,19 +5565,24 @@ int SetListFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
objPtr->internalRep.listValue.ele = NULL;
/* Convert into a list */
- JimParserInit(&parser, str, strLen, 1);
+ JimParserInit(&parser, str, strLen, linenr);
while (!JimParserEof(&parser)) {
char *token;
int tokenLen, type;
Jim_Obj *elementPtr;
+ int line;
JimParseList(&parser);
if (JimParserTtype(&parser) != JIM_TT_STR && JimParserTtype(&parser) != JIM_TT_ESC)
continue;
- token = JimParserGetToken(&parser, &tokenLen, &type, NULL);
+ token = JimParserGetToken(&parser, &tokenLen, &type, &line);
elementPtr = Jim_NewStringObjNoAlloc(interp, token, tokenLen);
+ if (filename) {
+ JimSetSourceInfo(interp, elementPtr, filename, line);
+ }
ListAppendElement(objPtr, elementPtr);
}
+ free(filename);
return JIM_OK;
}