Fossil SCM

Latest upstream autosetup, primarily for [https://github.com/msteveb/autosetup/issues/67|an OpenBSD-specific fix].

stephan 2024-09-03 15:31 trunk
Commit 4eef2de39f9f496909353dbe8a4a19c1f21b26fa2449d529b43ce36359315952
--- autosetup/README.autosetup
+++ autosetup/README.autosetup
@@ -1,6 +1,6 @@
1
-README.autosetup created by autosetup v0.7.1+
1
+README.autosetup created by autosetup v0.7.2
22
33
This is the autosetup directory for a local install of autosetup.
44
It contains autosetup, support files and loadable modules.
55
66
*.tcl files in this directory are optional modules which
77
--- autosetup/README.autosetup
+++ autosetup/README.autosetup
@@ -1,6 +1,6 @@
1 README.autosetup created by autosetup v0.7.1+
2
3 This is the autosetup directory for a local install of autosetup.
4 It contains autosetup, support files and loadable modules.
5
6 *.tcl files in this directory are optional modules which
7
--- autosetup/README.autosetup
+++ autosetup/README.autosetup
@@ -1,6 +1,6 @@
1 README.autosetup created by autosetup v0.7.2
2
3 This is the autosetup directory for a local install of autosetup.
4 It contains autosetup, support files and loadable modules.
5
6 *.tcl files in this directory are optional modules which
7
--- autosetup/autosetup
+++ autosetup/autosetup
@@ -4,11 +4,11 @@
44
# vim:se syntax=tcl:
55
# \
66
dir=`dirname "$0"`; exec "`$dir/autosetup-find-tclsh`" "$0" "$@"
77
88
# Note that the version has a trailing + on unreleased versions
9
-set autosetup(version) 0.7.1+
9
+set autosetup(version) 0.7.2
1010
1111
# Can be set to 1 to debug early-init problems
1212
set autosetup(debug) [expr {"--debug" in $argv}]
1313
1414
##################################################################
1515
--- autosetup/autosetup
+++ autosetup/autosetup
@@ -4,11 +4,11 @@
4 # vim:se syntax=tcl:
5 # \
6 dir=`dirname "$0"`; exec "`$dir/autosetup-find-tclsh`" "$0" "$@"
7
8 # Note that the version has a trailing + on unreleased versions
9 set autosetup(version) 0.7.1+
10
11 # Can be set to 1 to debug early-init problems
12 set autosetup(debug) [expr {"--debug" in $argv}]
13
14 ##################################################################
15
--- autosetup/autosetup
+++ autosetup/autosetup
@@ -4,11 +4,11 @@
4 # vim:se syntax=tcl:
5 # \
6 dir=`dirname "$0"`; exec "`$dir/autosetup-find-tclsh`" "$0" "$@"
7
8 # Note that the version has a trailing + on unreleased versions
9 set autosetup(version) 0.7.2
10
11 # Can be set to 1 to debug early-init problems
12 set autosetup(debug) [expr {"--debug" in $argv}]
13
14 ##################################################################
15
--- autosetup/autosetup-find-tclsh
+++ autosetup/autosetup-find-tclsh
@@ -7,10 +7,10 @@
77
for tclsh in ./jimsh0 $autosetup_tclsh jimsh tclsh tclsh8.5 tclsh8.6 tclsh8.7; do
88
{ $tclsh "$d/${1-autosetup-test-tclsh}"; } 2>/dev/null && exit 0
99
done
1010
echo 1>&2 "No installed jimsh or tclsh, building local bootstrap jimsh0"
1111
for cc in ${CC_FOR_BUILD:-cc} gcc; do
12
- { $cc -o jimsh0 "$d/jimsh0.c"; } 2>/dev/null || continue
12
+ { $cc -o jimsh0 "$d/jimsh0.c"; } 2>&1 >/dev/null || continue
1313
./jimsh0 "$d/${1-autosetup-test-tclsh}" && exit 0
1414
done
1515
echo 1>&2 "No working C compiler found. Tried ${CC_FOR_BUILD:-cc} and gcc."
1616
echo false
1717
--- autosetup/autosetup-find-tclsh
+++ autosetup/autosetup-find-tclsh
@@ -7,10 +7,10 @@
7 for tclsh in ./jimsh0 $autosetup_tclsh jimsh tclsh tclsh8.5 tclsh8.6 tclsh8.7; do
8 { $tclsh "$d/${1-autosetup-test-tclsh}"; } 2>/dev/null && exit 0
9 done
10 echo 1>&2 "No installed jimsh or tclsh, building local bootstrap jimsh0"
11 for cc in ${CC_FOR_BUILD:-cc} gcc; do
12 { $cc -o jimsh0 "$d/jimsh0.c"; } 2>/dev/null || continue
13 ./jimsh0 "$d/${1-autosetup-test-tclsh}" && exit 0
14 done
15 echo 1>&2 "No working C compiler found. Tried ${CC_FOR_BUILD:-cc} and gcc."
16 echo false
17
--- autosetup/autosetup-find-tclsh
+++ autosetup/autosetup-find-tclsh
@@ -7,10 +7,10 @@
7 for tclsh in ./jimsh0 $autosetup_tclsh jimsh tclsh tclsh8.5 tclsh8.6 tclsh8.7; do
8 { $tclsh "$d/${1-autosetup-test-tclsh}"; } 2>/dev/null && exit 0
9 done
10 echo 1>&2 "No installed jimsh or tclsh, building local bootstrap jimsh0"
11 for cc in ${CC_FOR_BUILD:-cc} gcc; do
12 { $cc -o jimsh0 "$d/jimsh0.c"; } 2>&1 >/dev/null || continue
13 ./jimsh0 "$d/${1-autosetup-test-tclsh}" && exit 0
14 done
15 echo 1>&2 "No working C compiler found. Tried ${CC_FOR_BUILD:-cc} and gcc."
16 echo false
17
+306 -179
--- autosetup/jimsh0.c
+++ autosetup/jimsh0.c
@@ -1,10 +1,11 @@
11
/* This is single source file, bootstrap version of Jim Tcl. See http://jim.tcl.tk/ */
22
#define JIM_TCL_COMPAT
33
#define JIM_ANSIC
44
#define JIM_REGEXP
55
#define HAVE_NO_AUTOCONF
6
+#define JIM_TINY
67
#define _JIMAUTOCONF_H
78
#define TCL_LIBRARY "."
89
#define jim_ext_bootstrap
910
#define jim_ext_aio
1011
#define jim_ext_readdir
@@ -60,11 +61,11 @@
6061
#define HAVE_UNISTD_H
6162
#define HAVE_UMASK
6263
#define HAVE_PIPE
6364
#define _FILE_OFFSET_BITS 64
6465
#endif
65
-#define JIM_VERSION 82
66
+#define JIM_VERSION 83
6667
#ifndef JIM_WIN32COMPAT_H
6768
#define JIM_WIN32COMPAT_H
6869
6970
7071
@@ -574,11 +575,11 @@
574575
575576
typedef struct Jim_Interp {
576577
Jim_Obj *result;
577578
int unused_errorLine;
578579
Jim_Obj *currentFilenameObj;
579
- int unused_addStackTrace;
580
+ int break_level;
580581
int maxCallFrameDepth;
581582
int maxEvalDepth;
582583
int evalDepth;
583584
int returnCode;
584585
int returnLevel;
@@ -716,10 +717,18 @@
716717
int objc, Jim_Obj *const *objv);
717718
#define Jim_EvalPrefix(i, p, oc, ov) Jim_EvalObjPrefix((i), Jim_NewStringObj((i), (p), -1), (oc), (ov))
718719
JIM_EXPORT int Jim_EvalNamespace(Jim_Interp *interp, Jim_Obj *scriptObj, Jim_Obj *nsObj);
719720
JIM_EXPORT int Jim_SubstObj (Jim_Interp *interp, Jim_Obj *substObjPtr,
720721
Jim_Obj **resObjPtrPtr, int flags);
722
+
723
+
724
+JIM_EXPORT Jim_Obj *Jim_GetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr,
725
+ int *lineptr);
726
+
727
+JIM_EXPORT void Jim_SetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr,
728
+ Jim_Obj *fileNameObj, int lineNumber);
729
+
721730
722731
723732
JIM_EXPORT void Jim_InitStack(Jim_Stack *stack);
724733
JIM_EXPORT void Jim_FreeStack(Jim_Stack *stack);
725734
JIM_EXPORT int Jim_StackLen(Jim_Stack *stack);
@@ -2343,13 +2352,11 @@
23432352
continue;
23442353
}
23452354
if (JimCheckStreamError(interp, af)) {
23462355
return JIM_ERR;
23472356
}
2348
- if (nb || af->timeout) {
2349
- return JIM_OK;
2350
- }
2357
+ break;
23512358
}
23522359
23532360
return JIM_OK;
23542361
}
23552362
@@ -2617,18 +2624,13 @@
26172624
}
26182625
26192626
offset = len;
26202627
len = af->fops->reader(af, buf, AIO_BUF_LEN, nb);
26212628
if (len <= 0) {
2622
- if (nb || af->timeout) {
2623
-
2624
- break;
2625
- }
2626
- }
2627
- else {
2628
- Jim_AppendString(interp, af->readbuf, buf, len);
2629
- }
2629
+ break;
2630
+ }
2631
+ Jim_AppendString(interp, af->readbuf, buf, len);
26302632
}
26312633
26322634
aio_set_nonblocking(af, nb);
26332635
26342636
if (!nl && aio_eof(af)) {
@@ -3770,31 +3772,34 @@
37703772
int Jim_RegsubCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
37713773
{
37723774
int regcomp_flags = 0;
37733775
int regexec_flags = 0;
37743776
int opt_all = 0;
3777
+ int opt_command = 0;
37753778
int offset = 0;
37763779
regex_t *regex;
37773780
const char *p;
3778
- int result;
3781
+ int result = JIM_OK;
37793782
regmatch_t pmatch[MAX_SUB_MATCHES + 1];
37803783
int num_matches = 0;
37813784
37823785
int i, j, n;
37833786
Jim_Obj *varname;
37843787
Jim_Obj *resultObj;
3788
+ Jim_Obj *cmd_prefix = NULL;
3789
+ Jim_Obj *regcomp_obj = NULL;
37853790
const char *source_str;
37863791
int source_len;
3787
- const char *replace_str;
3792
+ const char *replace_str = NULL;
37883793
int replace_len;
37893794
const char *pattern;
37903795
int option;
37913796
enum {
3792
- OPT_NOCASE, OPT_LINE, OPT_ALL, OPT_START, OPT_END
3797
+ OPT_NOCASE, OPT_LINE, OPT_ALL, OPT_START, OPT_COMMAND, OPT_END
37933798
};
37943799
static const char * const options[] = {
3795
- "-nocase", "-line", "-all", "-start", "--", NULL
3800
+ "-nocase", "-line", "-all", "-start", "-command", "--", NULL
37963801
};
37973802
37983803
if (argc < 4) {
37993804
wrongNumArgs:
38003805
Jim_WrongNumArgs(interp, 1, argv,
@@ -3834,24 +3839,43 @@
38343839
}
38353840
if (Jim_GetIndex(interp, argv[i], &offset) != JIM_OK) {
38363841
return JIM_ERR;
38373842
}
38383843
break;
3844
+
3845
+ case OPT_COMMAND:
3846
+ opt_command = 1;
3847
+ break;
38393848
}
38403849
}
38413850
if (argc - i != 3 && argc - i != 4) {
38423851
goto wrongNumArgs;
38433852
}
38443853
3845
- regex = SetRegexpFromAny(interp, argv[i], regcomp_flags);
3854
+
3855
+ regcomp_obj = Jim_DuplicateObj(interp, argv[i]);
3856
+ Jim_IncrRefCount(regcomp_obj);
3857
+ regex = SetRegexpFromAny(interp, regcomp_obj, regcomp_flags);
38463858
if (!regex) {
3859
+ Jim_DecrRefCount(interp, regcomp_obj);
38473860
return JIM_ERR;
38483861
}
38493862
pattern = Jim_String(argv[i]);
38503863
38513864
source_str = Jim_GetString(argv[i + 1], &source_len);
3852
- replace_str = Jim_GetString(argv[i + 2], &replace_len);
3865
+ if (opt_command) {
3866
+ cmd_prefix = argv[i + 2];
3867
+ if (Jim_ListLength(interp, cmd_prefix) == 0) {
3868
+ Jim_SetResultString(interp, "command prefix must be a list of at least one element", -1);
3869
+ Jim_DecrRefCount(interp, regcomp_obj);
3870
+ return JIM_ERR;
3871
+ }
3872
+ Jim_IncrRefCount(cmd_prefix);
3873
+ }
3874
+ else {
3875
+ replace_str = Jim_GetString(argv[i + 2], &replace_len);
3876
+ }
38533877
varname = argv[i + 3];
38543878
38553879
38563880
resultObj = Jim_NewStringObj(interp, "", 0);
38573881
@@ -3891,39 +3915,62 @@
38913915
38923916
num_matches++;
38933917
38943918
Jim_AppendString(interp, resultObj, p, pmatch[0].rm_so);
38953919
3896
-
3897
- for (j = 0; j < replace_len; j++) {
3898
- int idx;
3899
- int c = replace_str[j];
3900
-
3901
- if (c == '&') {
3902
- idx = 0;
3903
- }
3904
- else if (c == '\\' && j < replace_len) {
3905
- c = replace_str[++j];
3906
- if ((c >= '0') && (c <= '9')) {
3907
- idx = c - '0';
3908
- }
3909
- else if ((c == '\\') || (c == '&')) {
3910
- Jim_AppendString(interp, resultObj, replace_str + j, 1);
3911
- continue;
3912
- }
3913
- else {
3914
- Jim_AppendString(interp, resultObj, replace_str + j - 1, (j == replace_len) ? 1 : 2);
3915
- continue;
3916
- }
3917
- }
3918
- else {
3919
- Jim_AppendString(interp, resultObj, replace_str + j, 1);
3920
- continue;
3921
- }
3922
- if ((idx < MAX_SUB_MATCHES) && pmatch[idx].rm_so != -1 && pmatch[idx].rm_eo != -1) {
3923
- Jim_AppendString(interp, resultObj, p + pmatch[idx].rm_so,
3924
- pmatch[idx].rm_eo - pmatch[idx].rm_so);
3920
+ if (opt_command) {
3921
+
3922
+ Jim_Obj *cmdListObj = Jim_DuplicateObj(interp, cmd_prefix);
3923
+ for (j = 0; j < MAX_SUB_MATCHES; j++) {
3924
+ if (pmatch[j].rm_so == -1) {
3925
+ break;
3926
+ }
3927
+ else {
3928
+ Jim_Obj *srcObj = Jim_NewStringObj(interp, p + pmatch[j].rm_so, pmatch[j].rm_eo - pmatch[j].rm_so);
3929
+ Jim_ListAppendElement(interp, cmdListObj, srcObj);
3930
+ }
3931
+ }
3932
+ Jim_IncrRefCount(cmdListObj);
3933
+
3934
+ result = Jim_EvalObj(interp, cmdListObj);
3935
+ Jim_DecrRefCount(interp, cmdListObj);
3936
+ if (result != JIM_OK) {
3937
+ goto cmd_error;
3938
+ }
3939
+ Jim_AppendString(interp, resultObj, Jim_String(Jim_GetResult(interp)), -1);
3940
+ }
3941
+ else {
3942
+
3943
+ for (j = 0; j < replace_len; j++) {
3944
+ int idx;
3945
+ int c = replace_str[j];
3946
+
3947
+ if (c == '&') {
3948
+ idx = 0;
3949
+ }
3950
+ else if (c == '\\' && j < replace_len) {
3951
+ c = replace_str[++j];
3952
+ if ((c >= '0') && (c <= '9')) {
3953
+ idx = c - '0';
3954
+ }
3955
+ else if ((c == '\\') || (c == '&')) {
3956
+ Jim_AppendString(interp, resultObj, replace_str + j, 1);
3957
+ continue;
3958
+ }
3959
+ else {
3960
+ Jim_AppendString(interp, resultObj, replace_str + j - 1, (j == replace_len) ? 1 : 2);
3961
+ continue;
3962
+ }
3963
+ }
3964
+ else {
3965
+ Jim_AppendString(interp, resultObj, replace_str + j, 1);
3966
+ continue;
3967
+ }
3968
+ if ((idx < MAX_SUB_MATCHES) && pmatch[idx].rm_so != -1 && pmatch[idx].rm_eo != -1) {
3969
+ Jim_AppendString(interp, resultObj, p + pmatch[idx].rm_so,
3970
+ pmatch[idx].rm_eo - pmatch[idx].rm_so);
3971
+ }
39253972
}
39263973
}
39273974
39283975
p += pmatch[0].rm_eo;
39293976
n -= pmatch[0].rm_eo;
@@ -3956,25 +4003,37 @@
39564003
39574004
} while (n);
39584005
39594006
Jim_AppendString(interp, resultObj, p, -1);
39604007
3961
-
3962
- if (argc - i == 4) {
3963
- result = Jim_SetVariable(interp, varname, resultObj);
3964
-
3965
- if (result == JIM_OK) {
3966
- Jim_SetResultInt(interp, num_matches);
3967
- }
3968
- else {
3969
- Jim_FreeObj(interp, resultObj);
3970
- }
3971
- }
3972
- else {
3973
- Jim_SetResult(interp, resultObj);
3974
- result = JIM_OK;
3975
- }
4008
+cmd_error:
4009
+ if (result == JIM_OK) {
4010
+
4011
+ if (argc - i == 4) {
4012
+ result = Jim_SetVariable(interp, varname, resultObj);
4013
+
4014
+ if (result == JIM_OK) {
4015
+ Jim_SetResultInt(interp, num_matches);
4016
+ }
4017
+ else {
4018
+ Jim_FreeObj(interp, resultObj);
4019
+ }
4020
+ }
4021
+ else {
4022
+ Jim_SetResult(interp, resultObj);
4023
+ result = JIM_OK;
4024
+ }
4025
+ }
4026
+ else {
4027
+ Jim_FreeObj(interp, resultObj);
4028
+ }
4029
+
4030
+ if (opt_command) {
4031
+ Jim_DecrRefCount(interp, cmd_prefix);
4032
+ }
4033
+
4034
+ Jim_DecrRefCount(interp, regcomp_obj);
39764035
39774036
return result;
39784037
}
39794038
39804039
int Jim_regexpInit(Jim_Interp *interp)
@@ -6353,10 +6412,11 @@
63536412
Jim_SetResultString(interp, "Failed to parse time according to format", -1);
63546413
return JIM_ERR;
63556414
}
63566415
63576416
6417
+ tm.tm_isdst = options.gmt ? 0 : -1;
63586418
Jim_SetResultInt(interp, options.gmt ? jim_timegm(&tm) : mktime(&tm));
63596419
63606420
return JIM_OK;
63616421
}
63626422
#endif
@@ -6732,11 +6792,13 @@
67326792
Jim_arrayInit(interp);
67336793
Jim_stdlibInit(interp);
67346794
Jim_tclcompatInit(interp);
67356795
return JIM_OK;
67366796
}
6797
+#ifndef JIM_TINY
67376798
#define JIM_OPTIMIZATION
6799
+#endif
67386800
67396801
#include <stdio.h>
67406802
#include <stdlib.h>
67416803
67426804
#include <string.h>
@@ -6792,11 +6854,13 @@
67926854
67936855
67946856
67956857
#define JIM_INTEGER_SPACE 24
67966858
6797
-const char *jim_tt_name(int type);
6859
+#if defined(DEBUG_SHOW_SCRIPT) || defined(DEBUG_SHOW_SCRIPT_TOKENS) || defined(JIM_DEBUG_COMMAND) || defined(DEBUG_SHOW_SUBST)
6860
+static const char *jim_tt_name(int type);
6861
+#endif
67986862
67996863
#ifdef JIM_DEBUG_PANIC
68006864
static void JimPanicDump(int fail_condition, const char *fmt, ...);
68016865
#define JimPanic(X) JimPanicDump X
68026866
#else
@@ -6828,11 +6892,10 @@
68286892
static int JimSign(jim_wide w);
68296893
static void JimPrngSeed(Jim_Interp *interp, unsigned char *seed, int seedLen);
68306894
static void JimRandomBytes(Jim_Interp *interp, void *dest, unsigned int len);
68316895
static int JimSetNewVariable(Jim_HashTable *ht, Jim_Obj *nameObjPtr, Jim_VarVal *vv);
68326896
static Jim_VarVal *JimFindVariable(Jim_HashTable *ht, Jim_Obj *nameObjPtr);
6833
-static void JimSetErrorStack(Jim_Interp *interp);
68346897
static int SetVariableFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr);
68356898
68366899
#define JIM_DICT_SUGAR 100
68376900
68386901
@@ -7807,10 +7870,11 @@
78077870
int tt;
78087871
int eof;
78097872
int inquote;
78107873
int comment;
78117874
struct JimParseMissing missing;
7875
+ const char *errmsg;
78127876
};
78137877
78147878
static int JimParseScript(struct JimParserCtx *pc);
78157879
static int JimParseSep(struct JimParserCtx *pc);
78167880
static int JimParseEol(struct JimParserCtx *pc);
@@ -9507,21 +9571,10 @@
95079571
{
95089572
dupPtr->internalRep.sourceValue = srcPtr->internalRep.sourceValue;
95099573
Jim_IncrRefCount(dupPtr->internalRep.sourceValue.fileNameObj);
95109574
}
95119575
9512
-static void JimSetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr,
9513
- Jim_Obj *fileNameObj, int lineNumber)
9514
-{
9515
- JimPanic((Jim_IsShared(objPtr), "JimSetSourceInfo called with shared object"));
9516
- JimPanic((objPtr->typePtr != NULL, "JimSetSourceInfo called with typed object"));
9517
- Jim_IncrRefCount(fileNameObj);
9518
- objPtr->internalRep.sourceValue.fileNameObj = fileNameObj;
9519
- objPtr->internalRep.sourceValue.lineNumber = lineNumber;
9520
- objPtr->typePtr = &sourceObjType;
9521
-}
9522
-
95239576
static const Jim_ObjType scriptLineObjType = {
95249577
"scriptline",
95259578
NULL,
95269579
NULL,
95279580
NULL,
@@ -9578,10 +9631,11 @@
95789631
} ScriptObj;
95799632
95809633
static void JimSetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr);
95819634
static int JimParseCheckMissing(Jim_Interp *interp, int ch);
95829635
static ScriptObj *JimGetScript(Jim_Interp *interp, Jim_Obj *objPtr);
9636
+static void JimSetErrorStack(Jim_Interp *interp, ScriptObj *script);
95839637
95849638
void FreeScriptInternalRep(Jim_Interp *interp, Jim_Obj *objPtr)
95859639
{
95869640
int i;
95879641
struct ScriptObj *script = (void *)objPtr->internalRep.ptr;
@@ -9793,11 +9847,11 @@
97939847
97949848
token->type = t->type;
97959849
token->objPtr = JimMakeScriptObj(interp, t);
97969850
Jim_IncrRefCount(token->objPtr);
97979851
9798
- JimSetSourceInfo(interp, token->objPtr, script->fileNameObj, t->line);
9852
+ Jim_SetSourceInfo(interp, token->objPtr, script->fileNameObj, t->line);
97999853
token++;
98009854
}
98019855
}
98029856
98039857
if (lineargs == 0) {
@@ -9852,10 +9906,43 @@
98529906
}
98539907
98549908
Jim_SetResultString(interp, msg, -1);
98559909
return JIM_ERR;
98569910
}
9911
+
9912
+Jim_Obj *Jim_GetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr, int *lineptr)
9913
+{
9914
+ int line;
9915
+ Jim_Obj *fileNameObj;
9916
+
9917
+ if (objPtr->typePtr == &sourceObjType) {
9918
+ fileNameObj = objPtr->internalRep.sourceValue.fileNameObj;
9919
+ line = objPtr->internalRep.sourceValue.lineNumber;
9920
+ }
9921
+ else if (objPtr->typePtr == &scriptObjType) {
9922
+ ScriptObj *script = JimGetScript(interp, objPtr);
9923
+ fileNameObj = script->fileNameObj;
9924
+ line = script->firstline;
9925
+ }
9926
+ else {
9927
+ fileNameObj = interp->emptyObj;
9928
+ line = 1;
9929
+ }
9930
+ *lineptr = line;
9931
+ return fileNameObj;
9932
+}
9933
+
9934
+void Jim_SetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr,
9935
+ Jim_Obj *fileNameObj, int lineNumber)
9936
+{
9937
+ JimPanic((Jim_IsShared(objPtr), "Jim_SetSourceInfo called with shared object"));
9938
+ Jim_FreeIntRep(interp, objPtr);
9939
+ Jim_IncrRefCount(fileNameObj);
9940
+ objPtr->internalRep.sourceValue.fileNameObj = fileNameObj;
9941
+ objPtr->internalRep.sourceValue.lineNumber = lineNumber;
9942
+ objPtr->typePtr = &sourceObjType;
9943
+}
98579944
98589945
static void SubstObjAddTokens(Jim_Interp *interp, struct ScriptObj *script,
98599946
ParseTokenList *tokenlist)
98609947
{
98619948
int i;
@@ -9881,16 +9968,15 @@
98819968
int scriptTextLen;
98829969
const char *scriptText = Jim_GetString(objPtr, &scriptTextLen);
98839970
struct JimParserCtx parser;
98849971
struct ScriptObj *script;
98859972
ParseTokenList tokenlist;
9886
- int line = 1;
9973
+ Jim_Obj *fileNameObj;
9974
+ int line;
98879975
98889976
9889
- if (objPtr->typePtr == &sourceObjType) {
9890
- line = objPtr->internalRep.sourceValue.lineNumber;
9891
- }
9977
+ fileNameObj = Jim_GetSourceInfo(interp, objPtr, &line);
98929978
98939979
98949980
ScriptTokenListInit(&tokenlist);
98959981
98969982
JimParserInit(&parser, scriptText, scriptTextLen, line);
@@ -9905,16 +9991,11 @@
99059991
99069992
99079993
script = Jim_Alloc(sizeof(*script));
99089994
memset(script, 0, sizeof(*script));
99099995
script->inUse = 1;
9910
- if (objPtr->typePtr == &sourceObjType) {
9911
- script->fileNameObj = objPtr->internalRep.sourceValue.fileNameObj;
9912
- }
9913
- else {
9914
- script->fileNameObj = interp->emptyObj;
9915
- }
9996
+ script->fileNameObj = fileNameObj;
99169997
Jim_IncrRefCount(script->fileNameObj);
99179998
script->missing = parser.missing.ch;
99189999
script->linenr = parser.missing.line;
991910000
992010001
ScriptObjAddTokens(interp, script, &tokenlist);
@@ -11386,14 +11467,15 @@
1138611467
Jim_DecrRefCount(i, i->unknown);
1138711468
Jim_DecrRefCount(i, i->defer);
1138811469
Jim_DecrRefCount(i, i->nullScriptObj);
1138911470
Jim_DecrRefCount(i, i->currentFilenameObj);
1139011471
11472
+ Jim_FreeHashTable(&i->commands);
11473
+
1139111474
1139211475
Jim_InterpIncrProcEpoch(i);
1139311476
11394
- Jim_FreeHashTable(&i->commands);
1139511477
#ifdef JIM_REFERENCES
1139611478
Jim_FreeHashTable(&i->references);
1139711479
#endif
1139811480
Jim_FreeHashTable(&i->packages);
1139911481
Jim_Free(i->prngState);
@@ -11588,20 +11670,28 @@
1158811670
Jim_DecrRefCount(interp, interp->stackTrace);
1158911671
interp->stackTrace = stackTraceObj;
1159011672
interp->errorFlag = 1;
1159111673
}
1159211674
11593
-static void JimSetErrorStack(Jim_Interp *interp)
11675
+static void JimSetErrorStack(Jim_Interp *interp, ScriptObj *script)
1159411676
{
1159511677
if (!interp->errorFlag) {
1159611678
int i;
1159711679
Jim_Obj *stackTrace = Jim_NewListObj(interp, NULL, 0);
1159811680
11599
- for (i = 0; i <= interp->procLevel; i++) {
11600
- Jim_EvalFrame *frame = JimGetEvalFrameByProcLevel(interp, -i);
11601
- if (frame) {
11602
- JimAddStackFrame(interp, frame, stackTrace);
11681
+ if (interp->procLevel == 0 && script) {
11682
+ Jim_ListAppendElement(interp, stackTrace, interp->emptyObj);
11683
+ Jim_ListAppendElement(interp, stackTrace, script->fileNameObj);
11684
+ Jim_ListAppendElement(interp, stackTrace, Jim_NewIntObj(interp, script->linenr));
11685
+ Jim_ListAppendElement(interp, stackTrace, interp->emptyObj);
11686
+ }
11687
+ else {
11688
+ for (i = 0; i <= interp->procLevel; i++) {
11689
+ Jim_EvalFrame *frame = JimGetEvalFrameByProcLevel(interp, -i);
11690
+ if (frame) {
11691
+ JimAddStackFrame(interp, frame, stackTrace);
11692
+ }
1160311693
}
1160411694
}
1160511695
JimSetStackTrace(interp, stackTrace);
1160611696
}
1160711697
}
@@ -12288,18 +12378,11 @@
1228812378
Jim_Free(dict);
1228912379
return JIM_OK;
1229012380
}
1229112381
1229212382
12293
- if (objPtr->typePtr == &sourceObjType) {
12294
- fileNameObj = objPtr->internalRep.sourceValue.fileNameObj;
12295
- linenr = objPtr->internalRep.sourceValue.lineNumber;
12296
- }
12297
- else {
12298
- fileNameObj = interp->emptyObj;
12299
- linenr = 1;
12300
- }
12383
+ fileNameObj = Jim_GetSourceInfo(interp, objPtr, &linenr);
1230112384
Jim_IncrRefCount(fileNameObj);
1230212385
1230312386
1230412387
str = Jim_GetString(objPtr, &strLen);
1230512388
@@ -12317,11 +12400,11 @@
1231712400
1231812401
JimParseList(&parser);
1231912402
if (parser.tt != JIM_TT_STR && parser.tt != JIM_TT_ESC)
1232012403
continue;
1232112404
elementPtr = JimParserGetTokenObj(interp, &parser);
12322
- JimSetSourceInfo(interp, elementPtr, fileNameObj, parser.tline);
12405
+ Jim_SetSourceInfo(interp, elementPtr, fileNameObj, parser.tline);
1232312406
ListAppendElement(objPtr, elementPtr);
1232412407
}
1232512408
}
1232612409
Jim_DecrRefCount(interp, fileNameObj);
1232712410
return JIM_OK;
@@ -12372,11 +12455,12 @@
1237212455
enum {
1237312456
JIM_LSORT_ASCII,
1237412457
JIM_LSORT_NOCASE,
1237512458
JIM_LSORT_INTEGER,
1237612459
JIM_LSORT_REAL,
12377
- JIM_LSORT_COMMAND
12460
+ JIM_LSORT_COMMAND,
12461
+ JIM_LSORT_DICT
1237812462
} type;
1237912463
int order;
1238012464
Jim_Obj **indexv;
1238112465
int indexc;
1238212466
int unique;
@@ -12404,10 +12488,47 @@
1240412488
1240512489
static int ListSortStringNoCase(Jim_Obj **lhsObj, Jim_Obj **rhsObj)
1240612490
{
1240712491
return Jim_StringCompareObj(sort_info->interp, *lhsObj, *rhsObj, 1) * sort_info->order;
1240812492
}
12493
+
12494
+static int ListSortDict(Jim_Obj **lhsObj, Jim_Obj **rhsObj)
12495
+{
12496
+
12497
+ const char *left = Jim_String(*lhsObj);
12498
+ const char *right = Jim_String(*rhsObj);
12499
+
12500
+ while (1) {
12501
+ if (isdigit(UCHAR(*left)) && isdigit(UCHAR(*right))) {
12502
+
12503
+ jim_wide lint, rint;
12504
+ char *lend, *rend;
12505
+ lint = jim_strtoull(left, &lend);
12506
+ rint = jim_strtoull(right, &rend);
12507
+ if (lint != rint) {
12508
+ return JimSign(lint - rint) * sort_info->order;
12509
+ }
12510
+ if (lend -left != rend - right) {
12511
+ return JimSign((lend - left) - (rend - right)) * sort_info->order;
12512
+ }
12513
+ left = lend;
12514
+ right = rend;
12515
+ }
12516
+ else {
12517
+ int cl, cr;
12518
+ left += utf8_tounicode_case(left, &cl, 1);
12519
+ right += utf8_tounicode_case(right, &cr, 1);
12520
+ if (cl != cr) {
12521
+ return JimSign(cl - cr) * sort_info->order;
12522
+ }
12523
+ if (cl == 0) {
12524
+
12525
+ return Jim_StringCompareObj(sort_info->interp, *lhsObj, *rhsObj, 0) * sort_info->order;
12526
+ }
12527
+ }
12528
+ }
12529
+}
1240912530
1241012531
static int ListSortInteger(Jim_Obj **lhsObj, Jim_Obj **rhsObj)
1241112532
{
1241212533
jim_wide lhs = 0, rhs = 0;
1241312534
@@ -12519,10 +12640,13 @@
1251912640
fn = ListSortReal;
1252012641
break;
1252112642
case JIM_LSORT_COMMAND:
1252212643
fn = ListSortCommand;
1252312644
break;
12645
+ case JIM_LSORT_DICT:
12646
+ fn = ListSortDict;
12647
+ break;
1252412648
default:
1252512649
fn = NULL;
1252612650
JimPanic((1, "ListSort called with invalid sort type"));
1252712651
return -1;
1252812652
}
@@ -12567,10 +12691,15 @@
1256712691
{
1256812692
int currentLen = listPtr->internalRep.listValue.len;
1256912693
int requiredLen = currentLen + elemc;
1257012694
int i;
1257112695
Jim_Obj **point;
12696
+
12697
+ if (elemc == 0) {
12698
+
12699
+ return;
12700
+ }
1257212701
1257312702
if (requiredLen > listPtr->internalRep.listValue.maxLen) {
1257412703
if (currentLen) {
1257512704
1257612705
requiredLen *= 2;
@@ -14332,10 +14461,12 @@
1433214461
#define JIM_EXPR_OPERATORS_NUM \
1433314462
(sizeof(Jim_ExprOperators)/sizeof(struct Jim_ExprOperator))
1433414463
1433514464
static int JimParseExpression(struct JimParserCtx *pc)
1433614465
{
14466
+ pc->errmsg = NULL;
14467
+
1433714468
while (1) {
1433814469
1433914470
while (isspace(UCHAR(*pc->p)) || (*(pc->p) == '\\' && *(pc->p + 1) == '\n')) {
1434014471
if (*pc->p == '\n') {
1434114472
pc->linenr++;
@@ -14382,10 +14513,11 @@
1438214513
if (JimParseVar(pc) == JIM_ERR)
1438314514
return JimParseExprOperator(pc);
1438414515
else {
1438514516
1438614517
if (pc->tt == JIM_TT_EXPRSUGAR) {
14518
+ pc->errmsg = "nesting expr in expr is not allowed";
1438714519
return JIM_ERR;
1438814520
}
1438914521
return JIM_OK;
1439014522
}
1439114523
break;
@@ -14526,10 +14658,11 @@
1452614658
while (len && isspace(UCHAR(*p))) {
1452714659
len--;
1452814660
p++;
1452914661
}
1453014662
if (*p != '(') {
14663
+ pc->errmsg = "function requires parentheses";
1453114664
return JIM_ERR;
1453214665
}
1453314666
}
1453414667
pc->tend = pc->p + bestLen - 1;
1453514668
pc->p += bestLen;
@@ -14537,35 +14670,10 @@
1453714670
1453814671
pc->tt = (bestOp - Jim_ExprOperators) + JIM_TT_EXPR_OP;
1453914672
return JIM_OK;
1454014673
}
1454114674
14542
-const char *jim_tt_name(int type)
14543
-{
14544
- static const char * const tt_names[JIM_TT_EXPR_OP] =
14545
- { "NIL", "STR", "ESC", "VAR", "ARY", "CMD", "SEP", "EOL", "EOF", "LIN", "WRD", "(((", ")))", ",,,", "INT",
14546
- "DBL", "BOO", "$()" };
14547
- if (type < JIM_TT_EXPR_OP) {
14548
- return tt_names[type];
14549
- }
14550
- else if (type == JIM_EXPROP_UNARYMINUS) {
14551
- return "-VE";
14552
- }
14553
- else if (type == JIM_EXPROP_UNARYPLUS) {
14554
- return "+VE";
14555
- }
14556
- else {
14557
- const struct Jim_ExprOperator *op = JimExprOperatorInfoByOpcode(type);
14558
- static char buf[20];
14559
-
14560
- if (op->name) {
14561
- return op->name;
14562
- }
14563
- sprintf(buf, "(%d)", type);
14564
- return buf;
14565
- }
14566
-}
1456714675
1456814676
static void FreeExprInternalRep(Jim_Interp *interp, Jim_Obj *objPtr);
1456914677
static void DupExprInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr);
1457014678
static int SetExprFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr);
1457114679
@@ -14867,11 +14975,11 @@
1486714975
if (!objPtr) {
1486814976
1486914977
objPtr = Jim_NewStringObj(interp, t->token, t->len);
1487014978
if (t->type == JIM_TT_CMD) {
1487114979
14872
- JimSetSourceInfo(interp, objPtr, builder->fileNameObj, t->line);
14980
+ Jim_SetSourceInfo(interp, objPtr, builder->fileNameObj, t->line);
1487314981
}
1487414982
}
1487514983
1487614984
1487714985
node = builder->next++;
@@ -14965,18 +15073,11 @@
1496515073
int line;
1496615074
Jim_Obj *fileNameObj;
1496715075
int rc = JIM_ERR;
1496815076
1496915077
14970
- if (objPtr->typePtr == &sourceObjType) {
14971
- fileNameObj = objPtr->internalRep.sourceValue.fileNameObj;
14972
- line = objPtr->internalRep.sourceValue.lineNumber;
14973
- }
14974
- else {
14975
- fileNameObj = interp->emptyObj;
14976
- line = 1;
14977
- }
15078
+ fileNameObj = Jim_GetSourceInfo(interp, objPtr, &line);
1497815079
Jim_IncrRefCount(fileNameObj);
1497915080
1498015081
exprText = Jim_GetString(objPtr, &exprTextLen);
1498115082
1498215083
@@ -14985,10 +15086,13 @@
1498515086
JimParserInit(&parser, exprText, exprTextLen, line);
1498615087
while (!parser.eof) {
1498715088
if (JimParseExpression(&parser) != JIM_OK) {
1498815089
ScriptTokenListFree(&tokenlist);
1498915090
Jim_SetResultFormatted(interp, "syntax error in expression: \"%#s\"", objPtr);
15091
+ if (parser.errmsg) {
15092
+ Jim_AppendStrings(interp, Jim_GetResult(interp), ": ", parser.errmsg, NULL);
15093
+ }
1499015094
expr = NULL;
1499115095
goto err;
1499215096
}
1499315097
1499415098
ScriptAddToken(&tokenlist, parser.tstart, parser.tend - parser.tstart + 1, parser.tt,
@@ -15004,14 +15108,21 @@
1500415108
tokenlist.list[i].len, tokenlist.list[i].token);
1500515109
}
1500615110
}
1500715111
#endif
1500815112
15009
- if (JimParseCheckMissing(interp, parser.missing.ch) == JIM_ERR) {
15113
+ if (tokenlist.count <= 1) {
15114
+ Jim_SetResultString(interp, "empty expression", -1);
15115
+ rc = JIM_ERR;
15116
+ }
15117
+ else {
15118
+ rc = JimParseCheckMissing(interp, parser.missing.ch);
15119
+ }
15120
+ if (rc != JIM_OK) {
1501015121
ScriptTokenListFree(&tokenlist);
1501115122
Jim_DecrRefCount(interp, fileNameObj);
15012
- return JIM_ERR;
15123
+ return rc;
1501315124
}
1501415125
1501515126
1501615127
expr = ExprTreeCreateTree(interp, &tokenlist, objPtr, fileNameObj);
1501715128
@@ -15858,17 +15969,22 @@
1585815969
1585915970
int ret;
1586015971
Jim_Obj *nargv[7];
1586115972
Jim_Obj *traceCmdObj = interp->traceCmdObj;
1586215973
Jim_Obj *resultObj = Jim_GetResult(interp);
15974
+ ScriptObj *script = NULL;
1586315975
15864
- ScriptObj *script = JimGetScript(interp, interp->evalFrame->scriptObj);
15976
+
15977
+
15978
+ if (interp->evalFrame->scriptObj) {
15979
+ script = JimGetScript(interp, interp->evalFrame->scriptObj);
15980
+ }
1586515981
1586615982
nargv[0] = traceCmdObj;
1586715983
nargv[1] = Jim_NewStringObj(interp, type, -1);
15868
- nargv[2] = script->fileNameObj;
15869
- nargv[3] = Jim_NewIntObj(interp, script->linenr);
15984
+ nargv[2] = script ? script->fileNameObj : interp->emptyObj;
15985
+ nargv[3] = Jim_NewIntObj(interp, script ? script->linenr : 1);
1587015986
nargv[4] = resultObj;
1587115987
nargv[5] = argv[0];
1587215988
nargv[6] = Jim_NewListObj(interp, argv + 1, argc - 1);
1587315989
1587415990
@@ -15986,11 +16102,11 @@
1598616102
else {
1598716103
interp->cmdPrivData = cmdPtr->u.native.privData;
1598816104
retcode = cmdPtr->u.native.cmdProc(interp, objc, objv);
1598916105
}
1599016106
if (retcode == JIM_ERR) {
15991
- JimSetErrorStack(interp);
16107
+ JimSetErrorStack(interp, NULL);
1599216108
}
1599316109
}
1599416110
1599516111
if (tailcallObj) {
1599616112
@@ -16021,11 +16137,11 @@
1602116137
1602216138
out:
1602316139
JimDecrCmdRefCount(interp, cmdPtr);
1602416140
1602516141
if (retcode == JIM_ERR) {
16026
- JimSetErrorStack(interp);
16142
+ JimSetErrorStack(interp, NULL);
1602716143
}
1602816144
1602916145
if (interp->framePtr->tailcallObj) {
1603016146
JimDecrCmdRefCount(interp, interp->framePtr->tailcallCmd);
1603116147
Jim_DecrRefCount(interp, interp->framePtr->tailcallObj);
@@ -16042,10 +16158,11 @@
1604216158
Jim_EvalFrame frame;
1604316159
1604416160
1604516161
for (i = 0; i < objc; i++)
1604616162
Jim_IncrRefCount(objv[i]);
16163
+
1604716164
1604816165
JimPushEvalFrame(interp, &frame, NULL);
1604916166
1605016167
retcode = JimInvokeCommand(interp, objc, objv);
1605116168
@@ -16181,11 +16298,13 @@
1618116298
objPtr->internalRep.dictSubstValue.indexObjPtr = intv[2];
1618216299
Jim_IncrRefCount(intv[2]);
1618316300
}
1618416301
else if (tokens && intv[0] && intv[0]->typePtr == &sourceObjType) {
1618516302
16186
- JimSetSourceInfo(interp, objPtr, intv[0]->internalRep.sourceValue.fileNameObj, intv[0]->internalRep.sourceValue.lineNumber);
16303
+ int line;
16304
+ Jim_Obj *fileNameObj = Jim_GetSourceInfo(interp, intv[0], &line);
16305
+ Jim_SetSourceInfo(interp, objPtr, fileNameObj, line);
1618716306
}
1618816307
1618916308
1619016309
s = objPtr->bytes = Jim_Alloc(totlen + 1);
1619116310
objPtr->length = totlen;
@@ -16248,11 +16367,11 @@
1624816367
}
1624916368
1625016369
Jim_IncrRefCount(scriptObjPtr);
1625116370
script = JimGetScript(interp, scriptObjPtr);
1625216371
if (JimParseCheckMissing(interp, script->missing) == JIM_ERR) {
16253
- JimSetErrorStack(interp);
16372
+ JimSetErrorStack(interp, script);
1625416373
Jim_DecrRefCount(interp, scriptObjPtr);
1625516374
return JIM_ERR;
1625616375
}
1625716376
1625816377
Jim_SetEmptyResult(interp);
@@ -16420,11 +16539,11 @@
1642016539
}
1642116540
}
1642216541
1642316542
1642416543
if (retcode == JIM_ERR) {
16425
- JimSetErrorStack(interp);
16544
+ JimSetErrorStack(interp, NULL);
1642616545
}
1642716546
1642816547
JimPopEvalFrame(interp);
1642916548
1643016549
Jim_FreeIntRep(interp, scriptObjPtr);
@@ -16648,11 +16767,11 @@
1664816767
Jim_Obj *scriptObjPtr;
1664916768
1665016769
scriptObjPtr = Jim_NewStringObj(interp, script, -1);
1665116770
Jim_IncrRefCount(scriptObjPtr);
1665216771
if (filename) {
16653
- JimSetSourceInfo(interp, scriptObjPtr, Jim_NewStringObj(interp, filename, -1), lineno);
16772
+ Jim_SetSourceInfo(interp, scriptObjPtr, Jim_NewStringObj(interp, filename, -1), lineno);
1665416773
}
1665516774
retval = Jim_EvalObj(interp, scriptObjPtr);
1665616775
Jim_DecrRefCount(interp, scriptObjPtr);
1665716776
return retval;
1665816777
}
@@ -16730,11 +16849,11 @@
1673016849
if (!scriptObjPtr) {
1673116850
return JIM_ERR;
1673216851
}
1673316852
1673416853
filenameObj = Jim_NewStringObj(interp, filename, -1);
16735
- JimSetSourceInfo(interp, scriptObjPtr, filenameObj, 1);
16854
+ Jim_SetSourceInfo(interp, scriptObjPtr, filenameObj, 1);
1673616855
1673716856
oldFilenameObj = JimPushInterpObj(interp->currentFilenameObj, filenameObj);
1673816857
1673916858
retcode = Jim_EvalObj(interp, scriptObjPtr);
1674016859
@@ -16771,11 +16890,13 @@
1677116890
if (JimParseVar(pc) == JIM_OK) {
1677216891
return;
1677316892
}
1677416893
1677516894
pc->tstart = pc->p;
16776
- flags |= JIM_SUBST_NOVAR;
16895
+
16896
+ pc->p++;
16897
+ pc->len--;
1677716898
}
1677816899
while (pc->len) {
1677916900
if (*pc->p == '$' && !(flags & JIM_SUBST_NOVAR)) {
1678016901
break;
1678116902
}
@@ -17274,11 +17395,11 @@
1727417395
}
1727517396
1727617397
static int JimCheckLoopRetcode(Jim_Interp *interp, int retval)
1727717398
{
1727817399
if (retval == JIM_BREAK || retval == JIM_CONTINUE) {
17279
- if (--interp->returnLevel > 0) {
17400
+ if (--interp->break_level > 0) {
1728017401
return 1;
1728117402
}
1728217403
}
1728317404
return 0;
1728417405
}
@@ -17464,19 +17585,18 @@
1746417585
#endif
1746517586
1746617587
while (boolean && (retval == JIM_OK || retval == JIM_CONTINUE)) {
1746717588
1746817589
retval = Jim_EvalObj(interp, argv[4]);
17469
-
17590
+ if (JimCheckLoopRetcode(interp, retval)) {
17591
+ immediate++;
17592
+ break;
17593
+ }
1747017594
if (retval == JIM_OK || retval == JIM_CONTINUE) {
1747117595
1747217596
JIM_IF_OPTIM(evalnext:)
1747317597
retval = Jim_EvalObj(interp, argv[3]);
17474
- if (JimCheckLoopRetcode(interp, retval)) {
17475
- immediate++;
17476
- goto out;
17477
- }
1747817598
if (retval == JIM_OK || retval == JIM_CONTINUE) {
1747917599
1748017600
JIM_IF_OPTIM(testcond:)
1748117601
retval = Jim_GetBoolFromExpr(interp, argv[2], &boolean);
1748217602
}
@@ -18327,21 +18447,23 @@
1832718447
1832818448
static int Jim_LsortCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const argv[])
1832918449
{
1833018450
static const char * const options[] = {
1833118451
"-ascii", "-nocase", "-increasing", "-decreasing", "-command", "-integer", "-real", "-index", "-unique",
18332
- "-stride", NULL
18452
+ "-stride", "-dictionary", NULL
1833318453
};
1833418454
enum {
1833518455
OPT_ASCII, OPT_NOCASE, OPT_INCREASING, OPT_DECREASING, OPT_COMMAND, OPT_INTEGER, OPT_REAL, OPT_INDEX, OPT_UNIQUE,
18336
- OPT_STRIDE
18456
+ OPT_STRIDE, OPT_DICT
1833718457
};
1833818458
Jim_Obj *resObj;
1833918459
int i;
1834018460
int retCode;
1834118461
int shared;
1834218462
long stride = 1;
18463
+ Jim_Obj **elements;
18464
+ int listlen;
1834318465
1834418466
struct lsort_info info;
1834518467
1834618468
if (argc < 2) {
1834718469
wrongargs:
@@ -18364,10 +18486,13 @@
1836418486
return JIM_ERR;
1836518487
switch (option) {
1836618488
case OPT_ASCII:
1836718489
info.type = JIM_LSORT_ASCII;
1836818490
break;
18491
+ case OPT_DICT:
18492
+ info.type = JIM_LSORT_DICT;
18493
+ break;
1836918494
case OPT_NOCASE:
1837018495
info.type = JIM_LSORT_NOCASE;
1837118496
break;
1837218497
case OPT_INTEGER:
1837318498
info.type = JIM_LSORT_INTEGER;
@@ -18418,17 +18543,21 @@
1841818543
i++;
1841918544
break;
1842018545
}
1842118546
}
1842218547
resObj = argv[argc - 1];
18548
+ JimListGetElements(interp, resObj, &listlen, &elements);
18549
+ if (listlen <= 1) {
18550
+
18551
+ Jim_SetResult(interp, resObj);
18552
+ return JIM_OK;
18553
+ }
18554
+
1842318555
if (stride > 1) {
1842418556
Jim_Obj *tmpListObj;
18425
- Jim_Obj **elements;
18426
- int listlen;
1842718557
int i;
1842818558
18429
- JimListGetElements(interp, resObj, &listlen, &elements);
1843018559
if (listlen % stride) {
1843118560
Jim_SetResultString(interp, "list size must be a multiple of the stride length", -1);
1843218561
return JIM_ERR;
1843318562
}
1843418563
@@ -18612,11 +18741,11 @@
1861218741
long level;
1861318742
int ret = Jim_GetLong(interp, argv[1], &level);
1861418743
if (ret != JIM_OK) {
1861518744
return ret;
1861618745
}
18617
- interp->returnLevel = level;
18746
+ interp->break_level = level;
1861818747
}
1861918748
return retcode;
1862018749
}
1862118750
1862218751
@@ -20330,39 +20459,28 @@
2033020459
}
2033120460
Jim_SetResult(interp, interp->currentFilenameObj);
2033220461
return JIM_OK;
2033320462
2033420463
case INFO_SOURCE:{
20335
- jim_wide line;
2033620464
Jim_Obj *resObjPtr;
2033720465
Jim_Obj *fileNameObj;
2033820466
2033920467
if (argc == 4) {
2034020468
Jim_SubCmdArgError(interp, ct, argv[0]);
2034120469
return JIM_ERR;
2034220470
}
2034320471
if (argc == 5) {
20472
+ jim_wide line;
2034420473
if (Jim_GetWide(interp, argv[4], &line) != JIM_OK) {
2034520474
return JIM_ERR;
2034620475
}
2034720476
resObjPtr = Jim_NewStringObj(interp, Jim_String(argv[2]), Jim_Length(argv[2]));
20348
- JimSetSourceInfo(interp, resObjPtr, argv[3], line);
20349
- }
20350
- else {
20351
- if (argv[2]->typePtr == &sourceObjType) {
20352
- fileNameObj = argv[2]->internalRep.sourceValue.fileNameObj;
20353
- line = argv[2]->internalRep.sourceValue.lineNumber;
20354
- }
20355
- else if (argv[2]->typePtr == &scriptObjType) {
20356
- ScriptObj *script = JimGetScript(interp, argv[2]);
20357
- fileNameObj = script->fileNameObj;
20358
- line = script->firstline;
20359
- }
20360
- else {
20361
- fileNameObj = interp->emptyObj;
20362
- line = 1;
20363
- }
20477
+ Jim_SetSourceInfo(interp, resObjPtr, argv[3], line);
20478
+ }
20479
+ else {
20480
+ int line;
20481
+ fileNameObj = Jim_GetSourceInfo(interp, argv[2], &line);
2036420482
resObjPtr = Jim_NewListObj(interp, NULL, 0);
2036520483
Jim_ListAppendElement(interp, resObjPtr, fileNameObj);
2036620484
Jim_ListAppendElement(interp, resObjPtr, Jim_NewIntObj(interp, line));
2036720485
}
2036820486
Jim_SetResult(interp, resObjPtr);
@@ -23644,11 +23762,13 @@
2364423762
else {
2364523763
filenameObj = Jim_NewStringObj(interp, filename_template, -1);
2364623764
}
2364723765
2364823766
23767
+#ifdef HAVE_UMASK
2364923768
mask = umask(S_IXUSR | S_IRWXG | S_IRWXO);
23769
+#endif
2365023770
#ifdef HAVE_MKSTEMP
2365123771
fd = mkstemp(filenameObj->bytes);
2365223772
#else
2365323773
if (mktemp(filenameObj->bytes) == NULL) {
2365423774
fd = -1;
@@ -23655,11 +23775,13 @@
2365523775
}
2365623776
else {
2365723777
fd = open(filenameObj->bytes, O_RDWR | O_CREAT | O_TRUNC);
2365823778
}
2365923779
#endif
23780
+#ifdef HAVE_UMASK
2366023781
umask(mask);
23782
+#endif
2366123783
if (fd < 0) {
2366223784
Jim_SetResultErrno(interp, Jim_String(filenameObj));
2366323785
Jim_FreeNewObj(interp, filenameObj);
2366423786
return -1;
2366523787
}
@@ -24258,10 +24380,15 @@
2425824380
JimPrintErrorMessage(interp);
2425924381
}
2426024382
2426124383
Jim_SetVariableStrWithStr(interp, "jim::argv0", orig_argv0);
2426224384
Jim_SetVariableStrWithStr(interp, JIM_INTERACTIVE, argc == 1 ? "1" : "0");
24385
+#ifdef USE_LINENOISE
24386
+ Jim_SetVariableStrWithStr(interp, "jim::lineedit", "1");
24387
+#else
24388
+ Jim_SetVariableStrWithStr(interp, "jim::lineedit", "0");
24389
+#endif
2426324390
retcode = Jim_initjimshInit(interp);
2426424391
2426524392
if (argc == 1) {
2426624393
2426724394
if (retcode == JIM_ERR) {
2426824395
--- autosetup/jimsh0.c
+++ autosetup/jimsh0.c
@@ -1,10 +1,11 @@
1 /* This is single source file, bootstrap version of Jim Tcl. See http://jim.tcl.tk/ */
2 #define JIM_TCL_COMPAT
3 #define JIM_ANSIC
4 #define JIM_REGEXP
5 #define HAVE_NO_AUTOCONF
 
6 #define _JIMAUTOCONF_H
7 #define TCL_LIBRARY "."
8 #define jim_ext_bootstrap
9 #define jim_ext_aio
10 #define jim_ext_readdir
@@ -60,11 +61,11 @@
60 #define HAVE_UNISTD_H
61 #define HAVE_UMASK
62 #define HAVE_PIPE
63 #define _FILE_OFFSET_BITS 64
64 #endif
65 #define JIM_VERSION 82
66 #ifndef JIM_WIN32COMPAT_H
67 #define JIM_WIN32COMPAT_H
68
69
70
@@ -574,11 +575,11 @@
574
575 typedef struct Jim_Interp {
576 Jim_Obj *result;
577 int unused_errorLine;
578 Jim_Obj *currentFilenameObj;
579 int unused_addStackTrace;
580 int maxCallFrameDepth;
581 int maxEvalDepth;
582 int evalDepth;
583 int returnCode;
584 int returnLevel;
@@ -716,10 +717,18 @@
716 int objc, Jim_Obj *const *objv);
717 #define Jim_EvalPrefix(i, p, oc, ov) Jim_EvalObjPrefix((i), Jim_NewStringObj((i), (p), -1), (oc), (ov))
718 JIM_EXPORT int Jim_EvalNamespace(Jim_Interp *interp, Jim_Obj *scriptObj, Jim_Obj *nsObj);
719 JIM_EXPORT int Jim_SubstObj (Jim_Interp *interp, Jim_Obj *substObjPtr,
720 Jim_Obj **resObjPtrPtr, int flags);
 
 
 
 
 
 
 
 
721
722
723 JIM_EXPORT void Jim_InitStack(Jim_Stack *stack);
724 JIM_EXPORT void Jim_FreeStack(Jim_Stack *stack);
725 JIM_EXPORT int Jim_StackLen(Jim_Stack *stack);
@@ -2343,13 +2352,11 @@
2343 continue;
2344 }
2345 if (JimCheckStreamError(interp, af)) {
2346 return JIM_ERR;
2347 }
2348 if (nb || af->timeout) {
2349 return JIM_OK;
2350 }
2351 }
2352
2353 return JIM_OK;
2354 }
2355
@@ -2617,18 +2624,13 @@
2617 }
2618
2619 offset = len;
2620 len = af->fops->reader(af, buf, AIO_BUF_LEN, nb);
2621 if (len <= 0) {
2622 if (nb || af->timeout) {
2623
2624 break;
2625 }
2626 }
2627 else {
2628 Jim_AppendString(interp, af->readbuf, buf, len);
2629 }
2630 }
2631
2632 aio_set_nonblocking(af, nb);
2633
2634 if (!nl && aio_eof(af)) {
@@ -3770,31 +3772,34 @@
3770 int Jim_RegsubCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
3771 {
3772 int regcomp_flags = 0;
3773 int regexec_flags = 0;
3774 int opt_all = 0;
 
3775 int offset = 0;
3776 regex_t *regex;
3777 const char *p;
3778 int result;
3779 regmatch_t pmatch[MAX_SUB_MATCHES + 1];
3780 int num_matches = 0;
3781
3782 int i, j, n;
3783 Jim_Obj *varname;
3784 Jim_Obj *resultObj;
 
 
3785 const char *source_str;
3786 int source_len;
3787 const char *replace_str;
3788 int replace_len;
3789 const char *pattern;
3790 int option;
3791 enum {
3792 OPT_NOCASE, OPT_LINE, OPT_ALL, OPT_START, OPT_END
3793 };
3794 static const char * const options[] = {
3795 "-nocase", "-line", "-all", "-start", "--", NULL
3796 };
3797
3798 if (argc < 4) {
3799 wrongNumArgs:
3800 Jim_WrongNumArgs(interp, 1, argv,
@@ -3834,24 +3839,43 @@
3834 }
3835 if (Jim_GetIndex(interp, argv[i], &offset) != JIM_OK) {
3836 return JIM_ERR;
3837 }
3838 break;
 
 
 
 
3839 }
3840 }
3841 if (argc - i != 3 && argc - i != 4) {
3842 goto wrongNumArgs;
3843 }
3844
3845 regex = SetRegexpFromAny(interp, argv[i], regcomp_flags);
 
 
 
3846 if (!regex) {
 
3847 return JIM_ERR;
3848 }
3849 pattern = Jim_String(argv[i]);
3850
3851 source_str = Jim_GetString(argv[i + 1], &source_len);
3852 replace_str = Jim_GetString(argv[i + 2], &replace_len);
 
 
 
 
 
 
 
 
 
 
 
3853 varname = argv[i + 3];
3854
3855
3856 resultObj = Jim_NewStringObj(interp, "", 0);
3857
@@ -3891,39 +3915,62 @@
3891
3892 num_matches++;
3893
3894 Jim_AppendString(interp, resultObj, p, pmatch[0].rm_so);
3895
3896
3897 for (j = 0; j < replace_len; j++) {
3898 int idx;
3899 int c = replace_str[j];
3900
3901 if (c == '&') {
3902 idx = 0;
3903 }
3904 else if (c == '\\' && j < replace_len) {
3905 c = replace_str[++j];
3906 if ((c >= '0') && (c <= '9')) {
3907 idx = c - '0';
3908 }
3909 else if ((c == '\\') || (c == '&')) {
3910 Jim_AppendString(interp, resultObj, replace_str + j, 1);
3911 continue;
3912 }
3913 else {
3914 Jim_AppendString(interp, resultObj, replace_str + j - 1, (j == replace_len) ? 1 : 2);
3915 continue;
3916 }
3917 }
3918 else {
3919 Jim_AppendString(interp, resultObj, replace_str + j, 1);
3920 continue;
3921 }
3922 if ((idx < MAX_SUB_MATCHES) && pmatch[idx].rm_so != -1 && pmatch[idx].rm_eo != -1) {
3923 Jim_AppendString(interp, resultObj, p + pmatch[idx].rm_so,
3924 pmatch[idx].rm_eo - pmatch[idx].rm_so);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3925 }
3926 }
3927
3928 p += pmatch[0].rm_eo;
3929 n -= pmatch[0].rm_eo;
@@ -3956,25 +4003,37 @@
3956
3957 } while (n);
3958
3959 Jim_AppendString(interp, resultObj, p, -1);
3960
3961
3962 if (argc - i == 4) {
3963 result = Jim_SetVariable(interp, varname, resultObj);
3964
3965 if (result == JIM_OK) {
3966 Jim_SetResultInt(interp, num_matches);
3967 }
3968 else {
3969 Jim_FreeObj(interp, resultObj);
3970 }
3971 }
3972 else {
3973 Jim_SetResult(interp, resultObj);
3974 result = JIM_OK;
3975 }
 
 
 
 
 
 
 
 
 
 
 
 
3976
3977 return result;
3978 }
3979
3980 int Jim_regexpInit(Jim_Interp *interp)
@@ -6353,10 +6412,11 @@
6353 Jim_SetResultString(interp, "Failed to parse time according to format", -1);
6354 return JIM_ERR;
6355 }
6356
6357
 
6358 Jim_SetResultInt(interp, options.gmt ? jim_timegm(&tm) : mktime(&tm));
6359
6360 return JIM_OK;
6361 }
6362 #endif
@@ -6732,11 +6792,13 @@
6732 Jim_arrayInit(interp);
6733 Jim_stdlibInit(interp);
6734 Jim_tclcompatInit(interp);
6735 return JIM_OK;
6736 }
 
6737 #define JIM_OPTIMIZATION
 
6738
6739 #include <stdio.h>
6740 #include <stdlib.h>
6741
6742 #include <string.h>
@@ -6792,11 +6854,13 @@
6792
6793
6794
6795 #define JIM_INTEGER_SPACE 24
6796
6797 const char *jim_tt_name(int type);
 
 
6798
6799 #ifdef JIM_DEBUG_PANIC
6800 static void JimPanicDump(int fail_condition, const char *fmt, ...);
6801 #define JimPanic(X) JimPanicDump X
6802 #else
@@ -6828,11 +6892,10 @@
6828 static int JimSign(jim_wide w);
6829 static void JimPrngSeed(Jim_Interp *interp, unsigned char *seed, int seedLen);
6830 static void JimRandomBytes(Jim_Interp *interp, void *dest, unsigned int len);
6831 static int JimSetNewVariable(Jim_HashTable *ht, Jim_Obj *nameObjPtr, Jim_VarVal *vv);
6832 static Jim_VarVal *JimFindVariable(Jim_HashTable *ht, Jim_Obj *nameObjPtr);
6833 static void JimSetErrorStack(Jim_Interp *interp);
6834 static int SetVariableFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr);
6835
6836 #define JIM_DICT_SUGAR 100
6837
6838
@@ -7807,10 +7870,11 @@
7807 int tt;
7808 int eof;
7809 int inquote;
7810 int comment;
7811 struct JimParseMissing missing;
 
7812 };
7813
7814 static int JimParseScript(struct JimParserCtx *pc);
7815 static int JimParseSep(struct JimParserCtx *pc);
7816 static int JimParseEol(struct JimParserCtx *pc);
@@ -9507,21 +9571,10 @@
9507 {
9508 dupPtr->internalRep.sourceValue = srcPtr->internalRep.sourceValue;
9509 Jim_IncrRefCount(dupPtr->internalRep.sourceValue.fileNameObj);
9510 }
9511
9512 static void JimSetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr,
9513 Jim_Obj *fileNameObj, int lineNumber)
9514 {
9515 JimPanic((Jim_IsShared(objPtr), "JimSetSourceInfo called with shared object"));
9516 JimPanic((objPtr->typePtr != NULL, "JimSetSourceInfo called with typed object"));
9517 Jim_IncrRefCount(fileNameObj);
9518 objPtr->internalRep.sourceValue.fileNameObj = fileNameObj;
9519 objPtr->internalRep.sourceValue.lineNumber = lineNumber;
9520 objPtr->typePtr = &sourceObjType;
9521 }
9522
9523 static const Jim_ObjType scriptLineObjType = {
9524 "scriptline",
9525 NULL,
9526 NULL,
9527 NULL,
@@ -9578,10 +9631,11 @@
9578 } ScriptObj;
9579
9580 static void JimSetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr);
9581 static int JimParseCheckMissing(Jim_Interp *interp, int ch);
9582 static ScriptObj *JimGetScript(Jim_Interp *interp, Jim_Obj *objPtr);
 
9583
9584 void FreeScriptInternalRep(Jim_Interp *interp, Jim_Obj *objPtr)
9585 {
9586 int i;
9587 struct ScriptObj *script = (void *)objPtr->internalRep.ptr;
@@ -9793,11 +9847,11 @@
9793
9794 token->type = t->type;
9795 token->objPtr = JimMakeScriptObj(interp, t);
9796 Jim_IncrRefCount(token->objPtr);
9797
9798 JimSetSourceInfo(interp, token->objPtr, script->fileNameObj, t->line);
9799 token++;
9800 }
9801 }
9802
9803 if (lineargs == 0) {
@@ -9852,10 +9906,43 @@
9852 }
9853
9854 Jim_SetResultString(interp, msg, -1);
9855 return JIM_ERR;
9856 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9857
9858 static void SubstObjAddTokens(Jim_Interp *interp, struct ScriptObj *script,
9859 ParseTokenList *tokenlist)
9860 {
9861 int i;
@@ -9881,16 +9968,15 @@
9881 int scriptTextLen;
9882 const char *scriptText = Jim_GetString(objPtr, &scriptTextLen);
9883 struct JimParserCtx parser;
9884 struct ScriptObj *script;
9885 ParseTokenList tokenlist;
9886 int line = 1;
 
9887
9888
9889 if (objPtr->typePtr == &sourceObjType) {
9890 line = objPtr->internalRep.sourceValue.lineNumber;
9891 }
9892
9893
9894 ScriptTokenListInit(&tokenlist);
9895
9896 JimParserInit(&parser, scriptText, scriptTextLen, line);
@@ -9905,16 +9991,11 @@
9905
9906
9907 script = Jim_Alloc(sizeof(*script));
9908 memset(script, 0, sizeof(*script));
9909 script->inUse = 1;
9910 if (objPtr->typePtr == &sourceObjType) {
9911 script->fileNameObj = objPtr->internalRep.sourceValue.fileNameObj;
9912 }
9913 else {
9914 script->fileNameObj = interp->emptyObj;
9915 }
9916 Jim_IncrRefCount(script->fileNameObj);
9917 script->missing = parser.missing.ch;
9918 script->linenr = parser.missing.line;
9919
9920 ScriptObjAddTokens(interp, script, &tokenlist);
@@ -11386,14 +11467,15 @@
11386 Jim_DecrRefCount(i, i->unknown);
11387 Jim_DecrRefCount(i, i->defer);
11388 Jim_DecrRefCount(i, i->nullScriptObj);
11389 Jim_DecrRefCount(i, i->currentFilenameObj);
11390
 
 
11391
11392 Jim_InterpIncrProcEpoch(i);
11393
11394 Jim_FreeHashTable(&i->commands);
11395 #ifdef JIM_REFERENCES
11396 Jim_FreeHashTable(&i->references);
11397 #endif
11398 Jim_FreeHashTable(&i->packages);
11399 Jim_Free(i->prngState);
@@ -11588,20 +11670,28 @@
11588 Jim_DecrRefCount(interp, interp->stackTrace);
11589 interp->stackTrace = stackTraceObj;
11590 interp->errorFlag = 1;
11591 }
11592
11593 static void JimSetErrorStack(Jim_Interp *interp)
11594 {
11595 if (!interp->errorFlag) {
11596 int i;
11597 Jim_Obj *stackTrace = Jim_NewListObj(interp, NULL, 0);
11598
11599 for (i = 0; i <= interp->procLevel; i++) {
11600 Jim_EvalFrame *frame = JimGetEvalFrameByProcLevel(interp, -i);
11601 if (frame) {
11602 JimAddStackFrame(interp, frame, stackTrace);
 
 
 
 
 
 
 
 
11603 }
11604 }
11605 JimSetStackTrace(interp, stackTrace);
11606 }
11607 }
@@ -12288,18 +12378,11 @@
12288 Jim_Free(dict);
12289 return JIM_OK;
12290 }
12291
12292
12293 if (objPtr->typePtr == &sourceObjType) {
12294 fileNameObj = objPtr->internalRep.sourceValue.fileNameObj;
12295 linenr = objPtr->internalRep.sourceValue.lineNumber;
12296 }
12297 else {
12298 fileNameObj = interp->emptyObj;
12299 linenr = 1;
12300 }
12301 Jim_IncrRefCount(fileNameObj);
12302
12303
12304 str = Jim_GetString(objPtr, &strLen);
12305
@@ -12317,11 +12400,11 @@
12317
12318 JimParseList(&parser);
12319 if (parser.tt != JIM_TT_STR && parser.tt != JIM_TT_ESC)
12320 continue;
12321 elementPtr = JimParserGetTokenObj(interp, &parser);
12322 JimSetSourceInfo(interp, elementPtr, fileNameObj, parser.tline);
12323 ListAppendElement(objPtr, elementPtr);
12324 }
12325 }
12326 Jim_DecrRefCount(interp, fileNameObj);
12327 return JIM_OK;
@@ -12372,11 +12455,12 @@
12372 enum {
12373 JIM_LSORT_ASCII,
12374 JIM_LSORT_NOCASE,
12375 JIM_LSORT_INTEGER,
12376 JIM_LSORT_REAL,
12377 JIM_LSORT_COMMAND
 
12378 } type;
12379 int order;
12380 Jim_Obj **indexv;
12381 int indexc;
12382 int unique;
@@ -12404,10 +12488,47 @@
12404
12405 static int ListSortStringNoCase(Jim_Obj **lhsObj, Jim_Obj **rhsObj)
12406 {
12407 return Jim_StringCompareObj(sort_info->interp, *lhsObj, *rhsObj, 1) * sort_info->order;
12408 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12409
12410 static int ListSortInteger(Jim_Obj **lhsObj, Jim_Obj **rhsObj)
12411 {
12412 jim_wide lhs = 0, rhs = 0;
12413
@@ -12519,10 +12640,13 @@
12519 fn = ListSortReal;
12520 break;
12521 case JIM_LSORT_COMMAND:
12522 fn = ListSortCommand;
12523 break;
 
 
 
12524 default:
12525 fn = NULL;
12526 JimPanic((1, "ListSort called with invalid sort type"));
12527 return -1;
12528 }
@@ -12567,10 +12691,15 @@
12567 {
12568 int currentLen = listPtr->internalRep.listValue.len;
12569 int requiredLen = currentLen + elemc;
12570 int i;
12571 Jim_Obj **point;
 
 
 
 
 
12572
12573 if (requiredLen > listPtr->internalRep.listValue.maxLen) {
12574 if (currentLen) {
12575
12576 requiredLen *= 2;
@@ -14332,10 +14461,12 @@
14332 #define JIM_EXPR_OPERATORS_NUM \
14333 (sizeof(Jim_ExprOperators)/sizeof(struct Jim_ExprOperator))
14334
14335 static int JimParseExpression(struct JimParserCtx *pc)
14336 {
 
 
14337 while (1) {
14338
14339 while (isspace(UCHAR(*pc->p)) || (*(pc->p) == '\\' && *(pc->p + 1) == '\n')) {
14340 if (*pc->p == '\n') {
14341 pc->linenr++;
@@ -14382,10 +14513,11 @@
14382 if (JimParseVar(pc) == JIM_ERR)
14383 return JimParseExprOperator(pc);
14384 else {
14385
14386 if (pc->tt == JIM_TT_EXPRSUGAR) {
 
14387 return JIM_ERR;
14388 }
14389 return JIM_OK;
14390 }
14391 break;
@@ -14526,10 +14658,11 @@
14526 while (len && isspace(UCHAR(*p))) {
14527 len--;
14528 p++;
14529 }
14530 if (*p != '(') {
 
14531 return JIM_ERR;
14532 }
14533 }
14534 pc->tend = pc->p + bestLen - 1;
14535 pc->p += bestLen;
@@ -14537,35 +14670,10 @@
14537
14538 pc->tt = (bestOp - Jim_ExprOperators) + JIM_TT_EXPR_OP;
14539 return JIM_OK;
14540 }
14541
14542 const char *jim_tt_name(int type)
14543 {
14544 static const char * const tt_names[JIM_TT_EXPR_OP] =
14545 { "NIL", "STR", "ESC", "VAR", "ARY", "CMD", "SEP", "EOL", "EOF", "LIN", "WRD", "(((", ")))", ",,,", "INT",
14546 "DBL", "BOO", "$()" };
14547 if (type < JIM_TT_EXPR_OP) {
14548 return tt_names[type];
14549 }
14550 else if (type == JIM_EXPROP_UNARYMINUS) {
14551 return "-VE";
14552 }
14553 else if (type == JIM_EXPROP_UNARYPLUS) {
14554 return "+VE";
14555 }
14556 else {
14557 const struct Jim_ExprOperator *op = JimExprOperatorInfoByOpcode(type);
14558 static char buf[20];
14559
14560 if (op->name) {
14561 return op->name;
14562 }
14563 sprintf(buf, "(%d)", type);
14564 return buf;
14565 }
14566 }
14567
14568 static void FreeExprInternalRep(Jim_Interp *interp, Jim_Obj *objPtr);
14569 static void DupExprInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr);
14570 static int SetExprFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr);
14571
@@ -14867,11 +14975,11 @@
14867 if (!objPtr) {
14868
14869 objPtr = Jim_NewStringObj(interp, t->token, t->len);
14870 if (t->type == JIM_TT_CMD) {
14871
14872 JimSetSourceInfo(interp, objPtr, builder->fileNameObj, t->line);
14873 }
14874 }
14875
14876
14877 node = builder->next++;
@@ -14965,18 +15073,11 @@
14965 int line;
14966 Jim_Obj *fileNameObj;
14967 int rc = JIM_ERR;
14968
14969
14970 if (objPtr->typePtr == &sourceObjType) {
14971 fileNameObj = objPtr->internalRep.sourceValue.fileNameObj;
14972 line = objPtr->internalRep.sourceValue.lineNumber;
14973 }
14974 else {
14975 fileNameObj = interp->emptyObj;
14976 line = 1;
14977 }
14978 Jim_IncrRefCount(fileNameObj);
14979
14980 exprText = Jim_GetString(objPtr, &exprTextLen);
14981
14982
@@ -14985,10 +15086,13 @@
14985 JimParserInit(&parser, exprText, exprTextLen, line);
14986 while (!parser.eof) {
14987 if (JimParseExpression(&parser) != JIM_OK) {
14988 ScriptTokenListFree(&tokenlist);
14989 Jim_SetResultFormatted(interp, "syntax error in expression: \"%#s\"", objPtr);
 
 
 
14990 expr = NULL;
14991 goto err;
14992 }
14993
14994 ScriptAddToken(&tokenlist, parser.tstart, parser.tend - parser.tstart + 1, parser.tt,
@@ -15004,14 +15108,21 @@
15004 tokenlist.list[i].len, tokenlist.list[i].token);
15005 }
15006 }
15007 #endif
15008
15009 if (JimParseCheckMissing(interp, parser.missing.ch) == JIM_ERR) {
 
 
 
 
 
 
 
15010 ScriptTokenListFree(&tokenlist);
15011 Jim_DecrRefCount(interp, fileNameObj);
15012 return JIM_ERR;
15013 }
15014
15015
15016 expr = ExprTreeCreateTree(interp, &tokenlist, objPtr, fileNameObj);
15017
@@ -15858,17 +15969,22 @@
15858
15859 int ret;
15860 Jim_Obj *nargv[7];
15861 Jim_Obj *traceCmdObj = interp->traceCmdObj;
15862 Jim_Obj *resultObj = Jim_GetResult(interp);
 
15863
15864 ScriptObj *script = JimGetScript(interp, interp->evalFrame->scriptObj);
 
 
 
 
15865
15866 nargv[0] = traceCmdObj;
15867 nargv[1] = Jim_NewStringObj(interp, type, -1);
15868 nargv[2] = script->fileNameObj;
15869 nargv[3] = Jim_NewIntObj(interp, script->linenr);
15870 nargv[4] = resultObj;
15871 nargv[5] = argv[0];
15872 nargv[6] = Jim_NewListObj(interp, argv + 1, argc - 1);
15873
15874
@@ -15986,11 +16102,11 @@
15986 else {
15987 interp->cmdPrivData = cmdPtr->u.native.privData;
15988 retcode = cmdPtr->u.native.cmdProc(interp, objc, objv);
15989 }
15990 if (retcode == JIM_ERR) {
15991 JimSetErrorStack(interp);
15992 }
15993 }
15994
15995 if (tailcallObj) {
15996
@@ -16021,11 +16137,11 @@
16021
16022 out:
16023 JimDecrCmdRefCount(interp, cmdPtr);
16024
16025 if (retcode == JIM_ERR) {
16026 JimSetErrorStack(interp);
16027 }
16028
16029 if (interp->framePtr->tailcallObj) {
16030 JimDecrCmdRefCount(interp, interp->framePtr->tailcallCmd);
16031 Jim_DecrRefCount(interp, interp->framePtr->tailcallObj);
@@ -16042,10 +16158,11 @@
16042 Jim_EvalFrame frame;
16043
16044
16045 for (i = 0; i < objc; i++)
16046 Jim_IncrRefCount(objv[i]);
 
16047
16048 JimPushEvalFrame(interp, &frame, NULL);
16049
16050 retcode = JimInvokeCommand(interp, objc, objv);
16051
@@ -16181,11 +16298,13 @@
16181 objPtr->internalRep.dictSubstValue.indexObjPtr = intv[2];
16182 Jim_IncrRefCount(intv[2]);
16183 }
16184 else if (tokens && intv[0] && intv[0]->typePtr == &sourceObjType) {
16185
16186 JimSetSourceInfo(interp, objPtr, intv[0]->internalRep.sourceValue.fileNameObj, intv[0]->internalRep.sourceValue.lineNumber);
 
 
16187 }
16188
16189
16190 s = objPtr->bytes = Jim_Alloc(totlen + 1);
16191 objPtr->length = totlen;
@@ -16248,11 +16367,11 @@
16248 }
16249
16250 Jim_IncrRefCount(scriptObjPtr);
16251 script = JimGetScript(interp, scriptObjPtr);
16252 if (JimParseCheckMissing(interp, script->missing) == JIM_ERR) {
16253 JimSetErrorStack(interp);
16254 Jim_DecrRefCount(interp, scriptObjPtr);
16255 return JIM_ERR;
16256 }
16257
16258 Jim_SetEmptyResult(interp);
@@ -16420,11 +16539,11 @@
16420 }
16421 }
16422
16423
16424 if (retcode == JIM_ERR) {
16425 JimSetErrorStack(interp);
16426 }
16427
16428 JimPopEvalFrame(interp);
16429
16430 Jim_FreeIntRep(interp, scriptObjPtr);
@@ -16648,11 +16767,11 @@
16648 Jim_Obj *scriptObjPtr;
16649
16650 scriptObjPtr = Jim_NewStringObj(interp, script, -1);
16651 Jim_IncrRefCount(scriptObjPtr);
16652 if (filename) {
16653 JimSetSourceInfo(interp, scriptObjPtr, Jim_NewStringObj(interp, filename, -1), lineno);
16654 }
16655 retval = Jim_EvalObj(interp, scriptObjPtr);
16656 Jim_DecrRefCount(interp, scriptObjPtr);
16657 return retval;
16658 }
@@ -16730,11 +16849,11 @@
16730 if (!scriptObjPtr) {
16731 return JIM_ERR;
16732 }
16733
16734 filenameObj = Jim_NewStringObj(interp, filename, -1);
16735 JimSetSourceInfo(interp, scriptObjPtr, filenameObj, 1);
16736
16737 oldFilenameObj = JimPushInterpObj(interp->currentFilenameObj, filenameObj);
16738
16739 retcode = Jim_EvalObj(interp, scriptObjPtr);
16740
@@ -16771,11 +16890,13 @@
16771 if (JimParseVar(pc) == JIM_OK) {
16772 return;
16773 }
16774
16775 pc->tstart = pc->p;
16776 flags |= JIM_SUBST_NOVAR;
 
 
16777 }
16778 while (pc->len) {
16779 if (*pc->p == '$' && !(flags & JIM_SUBST_NOVAR)) {
16780 break;
16781 }
@@ -17274,11 +17395,11 @@
17274 }
17275
17276 static int JimCheckLoopRetcode(Jim_Interp *interp, int retval)
17277 {
17278 if (retval == JIM_BREAK || retval == JIM_CONTINUE) {
17279 if (--interp->returnLevel > 0) {
17280 return 1;
17281 }
17282 }
17283 return 0;
17284 }
@@ -17464,19 +17585,18 @@
17464 #endif
17465
17466 while (boolean && (retval == JIM_OK || retval == JIM_CONTINUE)) {
17467
17468 retval = Jim_EvalObj(interp, argv[4]);
17469
 
 
 
17470 if (retval == JIM_OK || retval == JIM_CONTINUE) {
17471
17472 JIM_IF_OPTIM(evalnext:)
17473 retval = Jim_EvalObj(interp, argv[3]);
17474 if (JimCheckLoopRetcode(interp, retval)) {
17475 immediate++;
17476 goto out;
17477 }
17478 if (retval == JIM_OK || retval == JIM_CONTINUE) {
17479
17480 JIM_IF_OPTIM(testcond:)
17481 retval = Jim_GetBoolFromExpr(interp, argv[2], &boolean);
17482 }
@@ -18327,21 +18447,23 @@
18327
18328 static int Jim_LsortCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const argv[])
18329 {
18330 static const char * const options[] = {
18331 "-ascii", "-nocase", "-increasing", "-decreasing", "-command", "-integer", "-real", "-index", "-unique",
18332 "-stride", NULL
18333 };
18334 enum {
18335 OPT_ASCII, OPT_NOCASE, OPT_INCREASING, OPT_DECREASING, OPT_COMMAND, OPT_INTEGER, OPT_REAL, OPT_INDEX, OPT_UNIQUE,
18336 OPT_STRIDE
18337 };
18338 Jim_Obj *resObj;
18339 int i;
18340 int retCode;
18341 int shared;
18342 long stride = 1;
 
 
18343
18344 struct lsort_info info;
18345
18346 if (argc < 2) {
18347 wrongargs:
@@ -18364,10 +18486,13 @@
18364 return JIM_ERR;
18365 switch (option) {
18366 case OPT_ASCII:
18367 info.type = JIM_LSORT_ASCII;
18368 break;
 
 
 
18369 case OPT_NOCASE:
18370 info.type = JIM_LSORT_NOCASE;
18371 break;
18372 case OPT_INTEGER:
18373 info.type = JIM_LSORT_INTEGER;
@@ -18418,17 +18543,21 @@
18418 i++;
18419 break;
18420 }
18421 }
18422 resObj = argv[argc - 1];
 
 
 
 
 
 
 
18423 if (stride > 1) {
18424 Jim_Obj *tmpListObj;
18425 Jim_Obj **elements;
18426 int listlen;
18427 int i;
18428
18429 JimListGetElements(interp, resObj, &listlen, &elements);
18430 if (listlen % stride) {
18431 Jim_SetResultString(interp, "list size must be a multiple of the stride length", -1);
18432 return JIM_ERR;
18433 }
18434
@@ -18612,11 +18741,11 @@
18612 long level;
18613 int ret = Jim_GetLong(interp, argv[1], &level);
18614 if (ret != JIM_OK) {
18615 return ret;
18616 }
18617 interp->returnLevel = level;
18618 }
18619 return retcode;
18620 }
18621
18622
@@ -20330,39 +20459,28 @@
20330 }
20331 Jim_SetResult(interp, interp->currentFilenameObj);
20332 return JIM_OK;
20333
20334 case INFO_SOURCE:{
20335 jim_wide line;
20336 Jim_Obj *resObjPtr;
20337 Jim_Obj *fileNameObj;
20338
20339 if (argc == 4) {
20340 Jim_SubCmdArgError(interp, ct, argv[0]);
20341 return JIM_ERR;
20342 }
20343 if (argc == 5) {
 
20344 if (Jim_GetWide(interp, argv[4], &line) != JIM_OK) {
20345 return JIM_ERR;
20346 }
20347 resObjPtr = Jim_NewStringObj(interp, Jim_String(argv[2]), Jim_Length(argv[2]));
20348 JimSetSourceInfo(interp, resObjPtr, argv[3], line);
20349 }
20350 else {
20351 if (argv[2]->typePtr == &sourceObjType) {
20352 fileNameObj = argv[2]->internalRep.sourceValue.fileNameObj;
20353 line = argv[2]->internalRep.sourceValue.lineNumber;
20354 }
20355 else if (argv[2]->typePtr == &scriptObjType) {
20356 ScriptObj *script = JimGetScript(interp, argv[2]);
20357 fileNameObj = script->fileNameObj;
20358 line = script->firstline;
20359 }
20360 else {
20361 fileNameObj = interp->emptyObj;
20362 line = 1;
20363 }
20364 resObjPtr = Jim_NewListObj(interp, NULL, 0);
20365 Jim_ListAppendElement(interp, resObjPtr, fileNameObj);
20366 Jim_ListAppendElement(interp, resObjPtr, Jim_NewIntObj(interp, line));
20367 }
20368 Jim_SetResult(interp, resObjPtr);
@@ -23644,11 +23762,13 @@
23644 else {
23645 filenameObj = Jim_NewStringObj(interp, filename_template, -1);
23646 }
23647
23648
 
23649 mask = umask(S_IXUSR | S_IRWXG | S_IRWXO);
 
23650 #ifdef HAVE_MKSTEMP
23651 fd = mkstemp(filenameObj->bytes);
23652 #else
23653 if (mktemp(filenameObj->bytes) == NULL) {
23654 fd = -1;
@@ -23655,11 +23775,13 @@
23655 }
23656 else {
23657 fd = open(filenameObj->bytes, O_RDWR | O_CREAT | O_TRUNC);
23658 }
23659 #endif
 
23660 umask(mask);
 
23661 if (fd < 0) {
23662 Jim_SetResultErrno(interp, Jim_String(filenameObj));
23663 Jim_FreeNewObj(interp, filenameObj);
23664 return -1;
23665 }
@@ -24258,10 +24380,15 @@
24258 JimPrintErrorMessage(interp);
24259 }
24260
24261 Jim_SetVariableStrWithStr(interp, "jim::argv0", orig_argv0);
24262 Jim_SetVariableStrWithStr(interp, JIM_INTERACTIVE, argc == 1 ? "1" : "0");
 
 
 
 
 
24263 retcode = Jim_initjimshInit(interp);
24264
24265 if (argc == 1) {
24266
24267 if (retcode == JIM_ERR) {
24268
--- autosetup/jimsh0.c
+++ autosetup/jimsh0.c
@@ -1,10 +1,11 @@
1 /* This is single source file, bootstrap version of Jim Tcl. See http://jim.tcl.tk/ */
2 #define JIM_TCL_COMPAT
3 #define JIM_ANSIC
4 #define JIM_REGEXP
5 #define HAVE_NO_AUTOCONF
6 #define JIM_TINY
7 #define _JIMAUTOCONF_H
8 #define TCL_LIBRARY "."
9 #define jim_ext_bootstrap
10 #define jim_ext_aio
11 #define jim_ext_readdir
@@ -60,11 +61,11 @@
61 #define HAVE_UNISTD_H
62 #define HAVE_UMASK
63 #define HAVE_PIPE
64 #define _FILE_OFFSET_BITS 64
65 #endif
66 #define JIM_VERSION 83
67 #ifndef JIM_WIN32COMPAT_H
68 #define JIM_WIN32COMPAT_H
69
70
71
@@ -574,11 +575,11 @@
575
576 typedef struct Jim_Interp {
577 Jim_Obj *result;
578 int unused_errorLine;
579 Jim_Obj *currentFilenameObj;
580 int break_level;
581 int maxCallFrameDepth;
582 int maxEvalDepth;
583 int evalDepth;
584 int returnCode;
585 int returnLevel;
@@ -716,10 +717,18 @@
717 int objc, Jim_Obj *const *objv);
718 #define Jim_EvalPrefix(i, p, oc, ov) Jim_EvalObjPrefix((i), Jim_NewStringObj((i), (p), -1), (oc), (ov))
719 JIM_EXPORT int Jim_EvalNamespace(Jim_Interp *interp, Jim_Obj *scriptObj, Jim_Obj *nsObj);
720 JIM_EXPORT int Jim_SubstObj (Jim_Interp *interp, Jim_Obj *substObjPtr,
721 Jim_Obj **resObjPtrPtr, int flags);
722
723
724 JIM_EXPORT Jim_Obj *Jim_GetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr,
725 int *lineptr);
726
727 JIM_EXPORT void Jim_SetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr,
728 Jim_Obj *fileNameObj, int lineNumber);
729
730
731
732 JIM_EXPORT void Jim_InitStack(Jim_Stack *stack);
733 JIM_EXPORT void Jim_FreeStack(Jim_Stack *stack);
734 JIM_EXPORT int Jim_StackLen(Jim_Stack *stack);
@@ -2343,13 +2352,11 @@
2352 continue;
2353 }
2354 if (JimCheckStreamError(interp, af)) {
2355 return JIM_ERR;
2356 }
2357 break;
 
 
2358 }
2359
2360 return JIM_OK;
2361 }
2362
@@ -2617,18 +2624,13 @@
2624 }
2625
2626 offset = len;
2627 len = af->fops->reader(af, buf, AIO_BUF_LEN, nb);
2628 if (len <= 0) {
2629 break;
2630 }
2631 Jim_AppendString(interp, af->readbuf, buf, len);
 
 
 
 
 
2632 }
2633
2634 aio_set_nonblocking(af, nb);
2635
2636 if (!nl && aio_eof(af)) {
@@ -3770,31 +3772,34 @@
3772 int Jim_RegsubCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
3773 {
3774 int regcomp_flags = 0;
3775 int regexec_flags = 0;
3776 int opt_all = 0;
3777 int opt_command = 0;
3778 int offset = 0;
3779 regex_t *regex;
3780 const char *p;
3781 int result = JIM_OK;
3782 regmatch_t pmatch[MAX_SUB_MATCHES + 1];
3783 int num_matches = 0;
3784
3785 int i, j, n;
3786 Jim_Obj *varname;
3787 Jim_Obj *resultObj;
3788 Jim_Obj *cmd_prefix = NULL;
3789 Jim_Obj *regcomp_obj = NULL;
3790 const char *source_str;
3791 int source_len;
3792 const char *replace_str = NULL;
3793 int replace_len;
3794 const char *pattern;
3795 int option;
3796 enum {
3797 OPT_NOCASE, OPT_LINE, OPT_ALL, OPT_START, OPT_COMMAND, OPT_END
3798 };
3799 static const char * const options[] = {
3800 "-nocase", "-line", "-all", "-start", "-command", "--", NULL
3801 };
3802
3803 if (argc < 4) {
3804 wrongNumArgs:
3805 Jim_WrongNumArgs(interp, 1, argv,
@@ -3834,24 +3839,43 @@
3839 }
3840 if (Jim_GetIndex(interp, argv[i], &offset) != JIM_OK) {
3841 return JIM_ERR;
3842 }
3843 break;
3844
3845 case OPT_COMMAND:
3846 opt_command = 1;
3847 break;
3848 }
3849 }
3850 if (argc - i != 3 && argc - i != 4) {
3851 goto wrongNumArgs;
3852 }
3853
3854
3855 regcomp_obj = Jim_DuplicateObj(interp, argv[i]);
3856 Jim_IncrRefCount(regcomp_obj);
3857 regex = SetRegexpFromAny(interp, regcomp_obj, regcomp_flags);
3858 if (!regex) {
3859 Jim_DecrRefCount(interp, regcomp_obj);
3860 return JIM_ERR;
3861 }
3862 pattern = Jim_String(argv[i]);
3863
3864 source_str = Jim_GetString(argv[i + 1], &source_len);
3865 if (opt_command) {
3866 cmd_prefix = argv[i + 2];
3867 if (Jim_ListLength(interp, cmd_prefix) == 0) {
3868 Jim_SetResultString(interp, "command prefix must be a list of at least one element", -1);
3869 Jim_DecrRefCount(interp, regcomp_obj);
3870 return JIM_ERR;
3871 }
3872 Jim_IncrRefCount(cmd_prefix);
3873 }
3874 else {
3875 replace_str = Jim_GetString(argv[i + 2], &replace_len);
3876 }
3877 varname = argv[i + 3];
3878
3879
3880 resultObj = Jim_NewStringObj(interp, "", 0);
3881
@@ -3891,39 +3915,62 @@
3915
3916 num_matches++;
3917
3918 Jim_AppendString(interp, resultObj, p, pmatch[0].rm_so);
3919
3920 if (opt_command) {
3921
3922 Jim_Obj *cmdListObj = Jim_DuplicateObj(interp, cmd_prefix);
3923 for (j = 0; j < MAX_SUB_MATCHES; j++) {
3924 if (pmatch[j].rm_so == -1) {
3925 break;
3926 }
3927 else {
3928 Jim_Obj *srcObj = Jim_NewStringObj(interp, p + pmatch[j].rm_so, pmatch[j].rm_eo - pmatch[j].rm_so);
3929 Jim_ListAppendElement(interp, cmdListObj, srcObj);
3930 }
3931 }
3932 Jim_IncrRefCount(cmdListObj);
3933
3934 result = Jim_EvalObj(interp, cmdListObj);
3935 Jim_DecrRefCount(interp, cmdListObj);
3936 if (result != JIM_OK) {
3937 goto cmd_error;
3938 }
3939 Jim_AppendString(interp, resultObj, Jim_String(Jim_GetResult(interp)), -1);
3940 }
3941 else {
3942
3943 for (j = 0; j < replace_len; j++) {
3944 int idx;
3945 int c = replace_str[j];
3946
3947 if (c == '&') {
3948 idx = 0;
3949 }
3950 else if (c == '\\' && j < replace_len) {
3951 c = replace_str[++j];
3952 if ((c >= '0') && (c <= '9')) {
3953 idx = c - '0';
3954 }
3955 else if ((c == '\\') || (c == '&')) {
3956 Jim_AppendString(interp, resultObj, replace_str + j, 1);
3957 continue;
3958 }
3959 else {
3960 Jim_AppendString(interp, resultObj, replace_str + j - 1, (j == replace_len) ? 1 : 2);
3961 continue;
3962 }
3963 }
3964 else {
3965 Jim_AppendString(interp, resultObj, replace_str + j, 1);
3966 continue;
3967 }
3968 if ((idx < MAX_SUB_MATCHES) && pmatch[idx].rm_so != -1 && pmatch[idx].rm_eo != -1) {
3969 Jim_AppendString(interp, resultObj, p + pmatch[idx].rm_so,
3970 pmatch[idx].rm_eo - pmatch[idx].rm_so);
3971 }
3972 }
3973 }
3974
3975 p += pmatch[0].rm_eo;
3976 n -= pmatch[0].rm_eo;
@@ -3956,25 +4003,37 @@
4003
4004 } while (n);
4005
4006 Jim_AppendString(interp, resultObj, p, -1);
4007
4008 cmd_error:
4009 if (result == JIM_OK) {
4010
4011 if (argc - i == 4) {
4012 result = Jim_SetVariable(interp, varname, resultObj);
4013
4014 if (result == JIM_OK) {
4015 Jim_SetResultInt(interp, num_matches);
4016 }
4017 else {
4018 Jim_FreeObj(interp, resultObj);
4019 }
4020 }
4021 else {
4022 Jim_SetResult(interp, resultObj);
4023 result = JIM_OK;
4024 }
4025 }
4026 else {
4027 Jim_FreeObj(interp, resultObj);
4028 }
4029
4030 if (opt_command) {
4031 Jim_DecrRefCount(interp, cmd_prefix);
4032 }
4033
4034 Jim_DecrRefCount(interp, regcomp_obj);
4035
4036 return result;
4037 }
4038
4039 int Jim_regexpInit(Jim_Interp *interp)
@@ -6353,10 +6412,11 @@
6412 Jim_SetResultString(interp, "Failed to parse time according to format", -1);
6413 return JIM_ERR;
6414 }
6415
6416
6417 tm.tm_isdst = options.gmt ? 0 : -1;
6418 Jim_SetResultInt(interp, options.gmt ? jim_timegm(&tm) : mktime(&tm));
6419
6420 return JIM_OK;
6421 }
6422 #endif
@@ -6732,11 +6792,13 @@
6792 Jim_arrayInit(interp);
6793 Jim_stdlibInit(interp);
6794 Jim_tclcompatInit(interp);
6795 return JIM_OK;
6796 }
6797 #ifndef JIM_TINY
6798 #define JIM_OPTIMIZATION
6799 #endif
6800
6801 #include <stdio.h>
6802 #include <stdlib.h>
6803
6804 #include <string.h>
@@ -6792,11 +6854,13 @@
6854
6855
6856
6857 #define JIM_INTEGER_SPACE 24
6858
6859 #if defined(DEBUG_SHOW_SCRIPT) || defined(DEBUG_SHOW_SCRIPT_TOKENS) || defined(JIM_DEBUG_COMMAND) || defined(DEBUG_SHOW_SUBST)
6860 static const char *jim_tt_name(int type);
6861 #endif
6862
6863 #ifdef JIM_DEBUG_PANIC
6864 static void JimPanicDump(int fail_condition, const char *fmt, ...);
6865 #define JimPanic(X) JimPanicDump X
6866 #else
@@ -6828,11 +6892,10 @@
6892 static int JimSign(jim_wide w);
6893 static void JimPrngSeed(Jim_Interp *interp, unsigned char *seed, int seedLen);
6894 static void JimRandomBytes(Jim_Interp *interp, void *dest, unsigned int len);
6895 static int JimSetNewVariable(Jim_HashTable *ht, Jim_Obj *nameObjPtr, Jim_VarVal *vv);
6896 static Jim_VarVal *JimFindVariable(Jim_HashTable *ht, Jim_Obj *nameObjPtr);
 
6897 static int SetVariableFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr);
6898
6899 #define JIM_DICT_SUGAR 100
6900
6901
@@ -7807,10 +7870,11 @@
7870 int tt;
7871 int eof;
7872 int inquote;
7873 int comment;
7874 struct JimParseMissing missing;
7875 const char *errmsg;
7876 };
7877
7878 static int JimParseScript(struct JimParserCtx *pc);
7879 static int JimParseSep(struct JimParserCtx *pc);
7880 static int JimParseEol(struct JimParserCtx *pc);
@@ -9507,21 +9571,10 @@
9571 {
9572 dupPtr->internalRep.sourceValue = srcPtr->internalRep.sourceValue;
9573 Jim_IncrRefCount(dupPtr->internalRep.sourceValue.fileNameObj);
9574 }
9575
 
 
 
 
 
 
 
 
 
 
 
9576 static const Jim_ObjType scriptLineObjType = {
9577 "scriptline",
9578 NULL,
9579 NULL,
9580 NULL,
@@ -9578,10 +9631,11 @@
9631 } ScriptObj;
9632
9633 static void JimSetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr);
9634 static int JimParseCheckMissing(Jim_Interp *interp, int ch);
9635 static ScriptObj *JimGetScript(Jim_Interp *interp, Jim_Obj *objPtr);
9636 static void JimSetErrorStack(Jim_Interp *interp, ScriptObj *script);
9637
9638 void FreeScriptInternalRep(Jim_Interp *interp, Jim_Obj *objPtr)
9639 {
9640 int i;
9641 struct ScriptObj *script = (void *)objPtr->internalRep.ptr;
@@ -9793,11 +9847,11 @@
9847
9848 token->type = t->type;
9849 token->objPtr = JimMakeScriptObj(interp, t);
9850 Jim_IncrRefCount(token->objPtr);
9851
9852 Jim_SetSourceInfo(interp, token->objPtr, script->fileNameObj, t->line);
9853 token++;
9854 }
9855 }
9856
9857 if (lineargs == 0) {
@@ -9852,10 +9906,43 @@
9906 }
9907
9908 Jim_SetResultString(interp, msg, -1);
9909 return JIM_ERR;
9910 }
9911
9912 Jim_Obj *Jim_GetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr, int *lineptr)
9913 {
9914 int line;
9915 Jim_Obj *fileNameObj;
9916
9917 if (objPtr->typePtr == &sourceObjType) {
9918 fileNameObj = objPtr->internalRep.sourceValue.fileNameObj;
9919 line = objPtr->internalRep.sourceValue.lineNumber;
9920 }
9921 else if (objPtr->typePtr == &scriptObjType) {
9922 ScriptObj *script = JimGetScript(interp, objPtr);
9923 fileNameObj = script->fileNameObj;
9924 line = script->firstline;
9925 }
9926 else {
9927 fileNameObj = interp->emptyObj;
9928 line = 1;
9929 }
9930 *lineptr = line;
9931 return fileNameObj;
9932 }
9933
9934 void Jim_SetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr,
9935 Jim_Obj *fileNameObj, int lineNumber)
9936 {
9937 JimPanic((Jim_IsShared(objPtr), "Jim_SetSourceInfo called with shared object"));
9938 Jim_FreeIntRep(interp, objPtr);
9939 Jim_IncrRefCount(fileNameObj);
9940 objPtr->internalRep.sourceValue.fileNameObj = fileNameObj;
9941 objPtr->internalRep.sourceValue.lineNumber = lineNumber;
9942 objPtr->typePtr = &sourceObjType;
9943 }
9944
9945 static void SubstObjAddTokens(Jim_Interp *interp, struct ScriptObj *script,
9946 ParseTokenList *tokenlist)
9947 {
9948 int i;
@@ -9881,16 +9968,15 @@
9968 int scriptTextLen;
9969 const char *scriptText = Jim_GetString(objPtr, &scriptTextLen);
9970 struct JimParserCtx parser;
9971 struct ScriptObj *script;
9972 ParseTokenList tokenlist;
9973 Jim_Obj *fileNameObj;
9974 int line;
9975
9976
9977 fileNameObj = Jim_GetSourceInfo(interp, objPtr, &line);
 
 
9978
9979
9980 ScriptTokenListInit(&tokenlist);
9981
9982 JimParserInit(&parser, scriptText, scriptTextLen, line);
@@ -9905,16 +9991,11 @@
9991
9992
9993 script = Jim_Alloc(sizeof(*script));
9994 memset(script, 0, sizeof(*script));
9995 script->inUse = 1;
9996 script->fileNameObj = fileNameObj;
 
 
 
 
 
9997 Jim_IncrRefCount(script->fileNameObj);
9998 script->missing = parser.missing.ch;
9999 script->linenr = parser.missing.line;
10000
10001 ScriptObjAddTokens(interp, script, &tokenlist);
@@ -11386,14 +11467,15 @@
11467 Jim_DecrRefCount(i, i->unknown);
11468 Jim_DecrRefCount(i, i->defer);
11469 Jim_DecrRefCount(i, i->nullScriptObj);
11470 Jim_DecrRefCount(i, i->currentFilenameObj);
11471
11472 Jim_FreeHashTable(&i->commands);
11473
11474
11475 Jim_InterpIncrProcEpoch(i);
11476
 
11477 #ifdef JIM_REFERENCES
11478 Jim_FreeHashTable(&i->references);
11479 #endif
11480 Jim_FreeHashTable(&i->packages);
11481 Jim_Free(i->prngState);
@@ -11588,20 +11670,28 @@
11670 Jim_DecrRefCount(interp, interp->stackTrace);
11671 interp->stackTrace = stackTraceObj;
11672 interp->errorFlag = 1;
11673 }
11674
11675 static void JimSetErrorStack(Jim_Interp *interp, ScriptObj *script)
11676 {
11677 if (!interp->errorFlag) {
11678 int i;
11679 Jim_Obj *stackTrace = Jim_NewListObj(interp, NULL, 0);
11680
11681 if (interp->procLevel == 0 && script) {
11682 Jim_ListAppendElement(interp, stackTrace, interp->emptyObj);
11683 Jim_ListAppendElement(interp, stackTrace, script->fileNameObj);
11684 Jim_ListAppendElement(interp, stackTrace, Jim_NewIntObj(interp, script->linenr));
11685 Jim_ListAppendElement(interp, stackTrace, interp->emptyObj);
11686 }
11687 else {
11688 for (i = 0; i <= interp->procLevel; i++) {
11689 Jim_EvalFrame *frame = JimGetEvalFrameByProcLevel(interp, -i);
11690 if (frame) {
11691 JimAddStackFrame(interp, frame, stackTrace);
11692 }
11693 }
11694 }
11695 JimSetStackTrace(interp, stackTrace);
11696 }
11697 }
@@ -12288,18 +12378,11 @@
12378 Jim_Free(dict);
12379 return JIM_OK;
12380 }
12381
12382
12383 fileNameObj = Jim_GetSourceInfo(interp, objPtr, &linenr);
 
 
 
 
 
 
 
12384 Jim_IncrRefCount(fileNameObj);
12385
12386
12387 str = Jim_GetString(objPtr, &strLen);
12388
@@ -12317,11 +12400,11 @@
12400
12401 JimParseList(&parser);
12402 if (parser.tt != JIM_TT_STR && parser.tt != JIM_TT_ESC)
12403 continue;
12404 elementPtr = JimParserGetTokenObj(interp, &parser);
12405 Jim_SetSourceInfo(interp, elementPtr, fileNameObj, parser.tline);
12406 ListAppendElement(objPtr, elementPtr);
12407 }
12408 }
12409 Jim_DecrRefCount(interp, fileNameObj);
12410 return JIM_OK;
@@ -12372,11 +12455,12 @@
12455 enum {
12456 JIM_LSORT_ASCII,
12457 JIM_LSORT_NOCASE,
12458 JIM_LSORT_INTEGER,
12459 JIM_LSORT_REAL,
12460 JIM_LSORT_COMMAND,
12461 JIM_LSORT_DICT
12462 } type;
12463 int order;
12464 Jim_Obj **indexv;
12465 int indexc;
12466 int unique;
@@ -12404,10 +12488,47 @@
12488
12489 static int ListSortStringNoCase(Jim_Obj **lhsObj, Jim_Obj **rhsObj)
12490 {
12491 return Jim_StringCompareObj(sort_info->interp, *lhsObj, *rhsObj, 1) * sort_info->order;
12492 }
12493
12494 static int ListSortDict(Jim_Obj **lhsObj, Jim_Obj **rhsObj)
12495 {
12496
12497 const char *left = Jim_String(*lhsObj);
12498 const char *right = Jim_String(*rhsObj);
12499
12500 while (1) {
12501 if (isdigit(UCHAR(*left)) && isdigit(UCHAR(*right))) {
12502
12503 jim_wide lint, rint;
12504 char *lend, *rend;
12505 lint = jim_strtoull(left, &lend);
12506 rint = jim_strtoull(right, &rend);
12507 if (lint != rint) {
12508 return JimSign(lint - rint) * sort_info->order;
12509 }
12510 if (lend -left != rend - right) {
12511 return JimSign((lend - left) - (rend - right)) * sort_info->order;
12512 }
12513 left = lend;
12514 right = rend;
12515 }
12516 else {
12517 int cl, cr;
12518 left += utf8_tounicode_case(left, &cl, 1);
12519 right += utf8_tounicode_case(right, &cr, 1);
12520 if (cl != cr) {
12521 return JimSign(cl - cr) * sort_info->order;
12522 }
12523 if (cl == 0) {
12524
12525 return Jim_StringCompareObj(sort_info->interp, *lhsObj, *rhsObj, 0) * sort_info->order;
12526 }
12527 }
12528 }
12529 }
12530
12531 static int ListSortInteger(Jim_Obj **lhsObj, Jim_Obj **rhsObj)
12532 {
12533 jim_wide lhs = 0, rhs = 0;
12534
@@ -12519,10 +12640,13 @@
12640 fn = ListSortReal;
12641 break;
12642 case JIM_LSORT_COMMAND:
12643 fn = ListSortCommand;
12644 break;
12645 case JIM_LSORT_DICT:
12646 fn = ListSortDict;
12647 break;
12648 default:
12649 fn = NULL;
12650 JimPanic((1, "ListSort called with invalid sort type"));
12651 return -1;
12652 }
@@ -12567,10 +12691,15 @@
12691 {
12692 int currentLen = listPtr->internalRep.listValue.len;
12693 int requiredLen = currentLen + elemc;
12694 int i;
12695 Jim_Obj **point;
12696
12697 if (elemc == 0) {
12698
12699 return;
12700 }
12701
12702 if (requiredLen > listPtr->internalRep.listValue.maxLen) {
12703 if (currentLen) {
12704
12705 requiredLen *= 2;
@@ -14332,10 +14461,12 @@
14461 #define JIM_EXPR_OPERATORS_NUM \
14462 (sizeof(Jim_ExprOperators)/sizeof(struct Jim_ExprOperator))
14463
14464 static int JimParseExpression(struct JimParserCtx *pc)
14465 {
14466 pc->errmsg = NULL;
14467
14468 while (1) {
14469
14470 while (isspace(UCHAR(*pc->p)) || (*(pc->p) == '\\' && *(pc->p + 1) == '\n')) {
14471 if (*pc->p == '\n') {
14472 pc->linenr++;
@@ -14382,10 +14513,11 @@
14513 if (JimParseVar(pc) == JIM_ERR)
14514 return JimParseExprOperator(pc);
14515 else {
14516
14517 if (pc->tt == JIM_TT_EXPRSUGAR) {
14518 pc->errmsg = "nesting expr in expr is not allowed";
14519 return JIM_ERR;
14520 }
14521 return JIM_OK;
14522 }
14523 break;
@@ -14526,10 +14658,11 @@
14658 while (len && isspace(UCHAR(*p))) {
14659 len--;
14660 p++;
14661 }
14662 if (*p != '(') {
14663 pc->errmsg = "function requires parentheses";
14664 return JIM_ERR;
14665 }
14666 }
14667 pc->tend = pc->p + bestLen - 1;
14668 pc->p += bestLen;
@@ -14537,35 +14670,10 @@
14670
14671 pc->tt = (bestOp - Jim_ExprOperators) + JIM_TT_EXPR_OP;
14672 return JIM_OK;
14673 }
14674
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14675
14676 static void FreeExprInternalRep(Jim_Interp *interp, Jim_Obj *objPtr);
14677 static void DupExprInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr);
14678 static int SetExprFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr);
14679
@@ -14867,11 +14975,11 @@
14975 if (!objPtr) {
14976
14977 objPtr = Jim_NewStringObj(interp, t->token, t->len);
14978 if (t->type == JIM_TT_CMD) {
14979
14980 Jim_SetSourceInfo(interp, objPtr, builder->fileNameObj, t->line);
14981 }
14982 }
14983
14984
14985 node = builder->next++;
@@ -14965,18 +15073,11 @@
15073 int line;
15074 Jim_Obj *fileNameObj;
15075 int rc = JIM_ERR;
15076
15077
15078 fileNameObj = Jim_GetSourceInfo(interp, objPtr, &line);
 
 
 
 
 
 
 
15079 Jim_IncrRefCount(fileNameObj);
15080
15081 exprText = Jim_GetString(objPtr, &exprTextLen);
15082
15083
@@ -14985,10 +15086,13 @@
15086 JimParserInit(&parser, exprText, exprTextLen, line);
15087 while (!parser.eof) {
15088 if (JimParseExpression(&parser) != JIM_OK) {
15089 ScriptTokenListFree(&tokenlist);
15090 Jim_SetResultFormatted(interp, "syntax error in expression: \"%#s\"", objPtr);
15091 if (parser.errmsg) {
15092 Jim_AppendStrings(interp, Jim_GetResult(interp), ": ", parser.errmsg, NULL);
15093 }
15094 expr = NULL;
15095 goto err;
15096 }
15097
15098 ScriptAddToken(&tokenlist, parser.tstart, parser.tend - parser.tstart + 1, parser.tt,
@@ -15004,14 +15108,21 @@
15108 tokenlist.list[i].len, tokenlist.list[i].token);
15109 }
15110 }
15111 #endif
15112
15113 if (tokenlist.count <= 1) {
15114 Jim_SetResultString(interp, "empty expression", -1);
15115 rc = JIM_ERR;
15116 }
15117 else {
15118 rc = JimParseCheckMissing(interp, parser.missing.ch);
15119 }
15120 if (rc != JIM_OK) {
15121 ScriptTokenListFree(&tokenlist);
15122 Jim_DecrRefCount(interp, fileNameObj);
15123 return rc;
15124 }
15125
15126
15127 expr = ExprTreeCreateTree(interp, &tokenlist, objPtr, fileNameObj);
15128
@@ -15858,17 +15969,22 @@
15969
15970 int ret;
15971 Jim_Obj *nargv[7];
15972 Jim_Obj *traceCmdObj = interp->traceCmdObj;
15973 Jim_Obj *resultObj = Jim_GetResult(interp);
15974 ScriptObj *script = NULL;
15975
15976
15977
15978 if (interp->evalFrame->scriptObj) {
15979 script = JimGetScript(interp, interp->evalFrame->scriptObj);
15980 }
15981
15982 nargv[0] = traceCmdObj;
15983 nargv[1] = Jim_NewStringObj(interp, type, -1);
15984 nargv[2] = script ? script->fileNameObj : interp->emptyObj;
15985 nargv[3] = Jim_NewIntObj(interp, script ? script->linenr : 1);
15986 nargv[4] = resultObj;
15987 nargv[5] = argv[0];
15988 nargv[6] = Jim_NewListObj(interp, argv + 1, argc - 1);
15989
15990
@@ -15986,11 +16102,11 @@
16102 else {
16103 interp->cmdPrivData = cmdPtr->u.native.privData;
16104 retcode = cmdPtr->u.native.cmdProc(interp, objc, objv);
16105 }
16106 if (retcode == JIM_ERR) {
16107 JimSetErrorStack(interp, NULL);
16108 }
16109 }
16110
16111 if (tailcallObj) {
16112
@@ -16021,11 +16137,11 @@
16137
16138 out:
16139 JimDecrCmdRefCount(interp, cmdPtr);
16140
16141 if (retcode == JIM_ERR) {
16142 JimSetErrorStack(interp, NULL);
16143 }
16144
16145 if (interp->framePtr->tailcallObj) {
16146 JimDecrCmdRefCount(interp, interp->framePtr->tailcallCmd);
16147 Jim_DecrRefCount(interp, interp->framePtr->tailcallObj);
@@ -16042,10 +16158,11 @@
16158 Jim_EvalFrame frame;
16159
16160
16161 for (i = 0; i < objc; i++)
16162 Jim_IncrRefCount(objv[i]);
16163
16164
16165 JimPushEvalFrame(interp, &frame, NULL);
16166
16167 retcode = JimInvokeCommand(interp, objc, objv);
16168
@@ -16181,11 +16298,13 @@
16298 objPtr->internalRep.dictSubstValue.indexObjPtr = intv[2];
16299 Jim_IncrRefCount(intv[2]);
16300 }
16301 else if (tokens && intv[0] && intv[0]->typePtr == &sourceObjType) {
16302
16303 int line;
16304 Jim_Obj *fileNameObj = Jim_GetSourceInfo(interp, intv[0], &line);
16305 Jim_SetSourceInfo(interp, objPtr, fileNameObj, line);
16306 }
16307
16308
16309 s = objPtr->bytes = Jim_Alloc(totlen + 1);
16310 objPtr->length = totlen;
@@ -16248,11 +16367,11 @@
16367 }
16368
16369 Jim_IncrRefCount(scriptObjPtr);
16370 script = JimGetScript(interp, scriptObjPtr);
16371 if (JimParseCheckMissing(interp, script->missing) == JIM_ERR) {
16372 JimSetErrorStack(interp, script);
16373 Jim_DecrRefCount(interp, scriptObjPtr);
16374 return JIM_ERR;
16375 }
16376
16377 Jim_SetEmptyResult(interp);
@@ -16420,11 +16539,11 @@
16539 }
16540 }
16541
16542
16543 if (retcode == JIM_ERR) {
16544 JimSetErrorStack(interp, NULL);
16545 }
16546
16547 JimPopEvalFrame(interp);
16548
16549 Jim_FreeIntRep(interp, scriptObjPtr);
@@ -16648,11 +16767,11 @@
16767 Jim_Obj *scriptObjPtr;
16768
16769 scriptObjPtr = Jim_NewStringObj(interp, script, -1);
16770 Jim_IncrRefCount(scriptObjPtr);
16771 if (filename) {
16772 Jim_SetSourceInfo(interp, scriptObjPtr, Jim_NewStringObj(interp, filename, -1), lineno);
16773 }
16774 retval = Jim_EvalObj(interp, scriptObjPtr);
16775 Jim_DecrRefCount(interp, scriptObjPtr);
16776 return retval;
16777 }
@@ -16730,11 +16849,11 @@
16849 if (!scriptObjPtr) {
16850 return JIM_ERR;
16851 }
16852
16853 filenameObj = Jim_NewStringObj(interp, filename, -1);
16854 Jim_SetSourceInfo(interp, scriptObjPtr, filenameObj, 1);
16855
16856 oldFilenameObj = JimPushInterpObj(interp->currentFilenameObj, filenameObj);
16857
16858 retcode = Jim_EvalObj(interp, scriptObjPtr);
16859
@@ -16771,11 +16890,13 @@
16890 if (JimParseVar(pc) == JIM_OK) {
16891 return;
16892 }
16893
16894 pc->tstart = pc->p;
16895
16896 pc->p++;
16897 pc->len--;
16898 }
16899 while (pc->len) {
16900 if (*pc->p == '$' && !(flags & JIM_SUBST_NOVAR)) {
16901 break;
16902 }
@@ -17274,11 +17395,11 @@
17395 }
17396
17397 static int JimCheckLoopRetcode(Jim_Interp *interp, int retval)
17398 {
17399 if (retval == JIM_BREAK || retval == JIM_CONTINUE) {
17400 if (--interp->break_level > 0) {
17401 return 1;
17402 }
17403 }
17404 return 0;
17405 }
@@ -17464,19 +17585,18 @@
17585 #endif
17586
17587 while (boolean && (retval == JIM_OK || retval == JIM_CONTINUE)) {
17588
17589 retval = Jim_EvalObj(interp, argv[4]);
17590 if (JimCheckLoopRetcode(interp, retval)) {
17591 immediate++;
17592 break;
17593 }
17594 if (retval == JIM_OK || retval == JIM_CONTINUE) {
17595
17596 JIM_IF_OPTIM(evalnext:)
17597 retval = Jim_EvalObj(interp, argv[3]);
 
 
 
 
17598 if (retval == JIM_OK || retval == JIM_CONTINUE) {
17599
17600 JIM_IF_OPTIM(testcond:)
17601 retval = Jim_GetBoolFromExpr(interp, argv[2], &boolean);
17602 }
@@ -18327,21 +18447,23 @@
18447
18448 static int Jim_LsortCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const argv[])
18449 {
18450 static const char * const options[] = {
18451 "-ascii", "-nocase", "-increasing", "-decreasing", "-command", "-integer", "-real", "-index", "-unique",
18452 "-stride", "-dictionary", NULL
18453 };
18454 enum {
18455 OPT_ASCII, OPT_NOCASE, OPT_INCREASING, OPT_DECREASING, OPT_COMMAND, OPT_INTEGER, OPT_REAL, OPT_INDEX, OPT_UNIQUE,
18456 OPT_STRIDE, OPT_DICT
18457 };
18458 Jim_Obj *resObj;
18459 int i;
18460 int retCode;
18461 int shared;
18462 long stride = 1;
18463 Jim_Obj **elements;
18464 int listlen;
18465
18466 struct lsort_info info;
18467
18468 if (argc < 2) {
18469 wrongargs:
@@ -18364,10 +18486,13 @@
18486 return JIM_ERR;
18487 switch (option) {
18488 case OPT_ASCII:
18489 info.type = JIM_LSORT_ASCII;
18490 break;
18491 case OPT_DICT:
18492 info.type = JIM_LSORT_DICT;
18493 break;
18494 case OPT_NOCASE:
18495 info.type = JIM_LSORT_NOCASE;
18496 break;
18497 case OPT_INTEGER:
18498 info.type = JIM_LSORT_INTEGER;
@@ -18418,17 +18543,21 @@
18543 i++;
18544 break;
18545 }
18546 }
18547 resObj = argv[argc - 1];
18548 JimListGetElements(interp, resObj, &listlen, &elements);
18549 if (listlen <= 1) {
18550
18551 Jim_SetResult(interp, resObj);
18552 return JIM_OK;
18553 }
18554
18555 if (stride > 1) {
18556 Jim_Obj *tmpListObj;
 
 
18557 int i;
18558
 
18559 if (listlen % stride) {
18560 Jim_SetResultString(interp, "list size must be a multiple of the stride length", -1);
18561 return JIM_ERR;
18562 }
18563
@@ -18612,11 +18741,11 @@
18741 long level;
18742 int ret = Jim_GetLong(interp, argv[1], &level);
18743 if (ret != JIM_OK) {
18744 return ret;
18745 }
18746 interp->break_level = level;
18747 }
18748 return retcode;
18749 }
18750
18751
@@ -20330,39 +20459,28 @@
20459 }
20460 Jim_SetResult(interp, interp->currentFilenameObj);
20461 return JIM_OK;
20462
20463 case INFO_SOURCE:{
 
20464 Jim_Obj *resObjPtr;
20465 Jim_Obj *fileNameObj;
20466
20467 if (argc == 4) {
20468 Jim_SubCmdArgError(interp, ct, argv[0]);
20469 return JIM_ERR;
20470 }
20471 if (argc == 5) {
20472 jim_wide line;
20473 if (Jim_GetWide(interp, argv[4], &line) != JIM_OK) {
20474 return JIM_ERR;
20475 }
20476 resObjPtr = Jim_NewStringObj(interp, Jim_String(argv[2]), Jim_Length(argv[2]));
20477 Jim_SetSourceInfo(interp, resObjPtr, argv[3], line);
20478 }
20479 else {
20480 int line;
20481 fileNameObj = Jim_GetSourceInfo(interp, argv[2], &line);
 
 
 
 
 
 
 
 
 
 
 
20482 resObjPtr = Jim_NewListObj(interp, NULL, 0);
20483 Jim_ListAppendElement(interp, resObjPtr, fileNameObj);
20484 Jim_ListAppendElement(interp, resObjPtr, Jim_NewIntObj(interp, line));
20485 }
20486 Jim_SetResult(interp, resObjPtr);
@@ -23644,11 +23762,13 @@
23762 else {
23763 filenameObj = Jim_NewStringObj(interp, filename_template, -1);
23764 }
23765
23766
23767 #ifdef HAVE_UMASK
23768 mask = umask(S_IXUSR | S_IRWXG | S_IRWXO);
23769 #endif
23770 #ifdef HAVE_MKSTEMP
23771 fd = mkstemp(filenameObj->bytes);
23772 #else
23773 if (mktemp(filenameObj->bytes) == NULL) {
23774 fd = -1;
@@ -23655,11 +23775,13 @@
23775 }
23776 else {
23777 fd = open(filenameObj->bytes, O_RDWR | O_CREAT | O_TRUNC);
23778 }
23779 #endif
23780 #ifdef HAVE_UMASK
23781 umask(mask);
23782 #endif
23783 if (fd < 0) {
23784 Jim_SetResultErrno(interp, Jim_String(filenameObj));
23785 Jim_FreeNewObj(interp, filenameObj);
23786 return -1;
23787 }
@@ -24258,10 +24380,15 @@
24380 JimPrintErrorMessage(interp);
24381 }
24382
24383 Jim_SetVariableStrWithStr(interp, "jim::argv0", orig_argv0);
24384 Jim_SetVariableStrWithStr(interp, JIM_INTERACTIVE, argc == 1 ? "1" : "0");
24385 #ifdef USE_LINENOISE
24386 Jim_SetVariableStrWithStr(interp, "jim::lineedit", "1");
24387 #else
24388 Jim_SetVariableStrWithStr(interp, "jim::lineedit", "0");
24389 #endif
24390 retcode = Jim_initjimshInit(interp);
24391
24392 if (argc == 1) {
24393
24394 if (retcode == JIM_ERR) {
24395

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button