Jim Tcl
Diff
Not logged in

Differences From Artifact [4d2ed8e278340b68]:

To Artifact [c044a1de0c10c2e1]:


11745 11745 int exitCode = 0; 11746 11746 int i; 11747 11747 int sig = 0; 11748 11748 11749 11749 /* Which return codes are caught? These are the defaults */ 11750 11750 jim_wide mask = (1 << JIM_OK | 1 << JIM_ERR | 1 << JIM_BREAK | 1 << JIM_CONTINUE | 1 << JIM_RETURN); 11751 11751 11752 - for (i = 1; i < argc - 2; i++) { 11752 + for (i = 1; i < argc - 1; i++) { 11753 11753 const char *arg = Jim_GetString(argv[i], NULL); 11754 11754 jim_wide option; 11755 11755 int add; 11756 11756 11757 11757 /* It's a pity we can't use Jim_GetEnum here :-( */ 11758 + if (strcmp(arg, "--") == 0) { 11759 + i++; 11760 + break; 11761 + } 11762 + if (*arg != '-') { 11763 + break; 11764 + } 11765 + 11758 11766 if (strncmp(arg, "-no", 3) == 0) { 11759 11767 arg += 3; 11760 11768 add = 0; 11761 11769 } 11762 - else if (*arg == '-') { 11770 + else { 11763 11771 arg++; 11764 11772 add = 1; 11765 11773 } 11766 - else { 11767 - goto wrongargs; 11768 - } 11769 11774 11770 11775 if (Jim_StringToWide(arg, &option, 10) != JIM_OK) { 11771 11776 option = -1; 11772 11777 } 11773 11778 if (option < 0) { 11774 11779 option = Jim_FindByName(arg, jimReturnCodes, jimReturnCodesSize); 11775 11780 } ................................................................................ 11782 11787 } 11783 11788 else { 11784 11789 mask &= ~(1 << option); 11785 11790 } 11786 11791 } 11787 11792 11788 11793 argc -= i; 11789 - if (argc != 1 && argc != 2) { 11794 + if (argc < 1 || argc > 3) { 11795 + printf("argc=%d\n", argc); 11790 11796 wrongargs: 11791 - Jim_WrongNumArgs(interp, 1, argv, "?-?no?code ...? script ?varName?"); 11797 + Jim_WrongNumArgs(interp, 1, argv, "?-?no?code ... --? script ?resultVarName? ?optionVarName?"); 11792 11798 return JIM_ERR; 11793 11799 } 11794 11800 argv += i; 11795 11801 11796 11802 if (mask & (1 << JIM_SIGNAL)) { 11797 11803 sig++; 11798 11804 } 11799 11805 11800 11806 interp->signal_level += sig; 11801 11807 exitCode = Jim_EvalObj(interp, argv[0]); 11802 11808 interp->signal_level -= sig; 11803 - 11804 11809 11805 11810 /* Catch or pass through? Only the first 64 codes can be passed through */ 11806 11811 if (exitCode >= 0 && exitCode < sizeof(mask) && ((1 << exitCode) & mask) == 0) { 11807 11812 /* Not caught, pass it up */ 11808 11813 return exitCode; 11809 11814 } 11810 11815 ................................................................................ 11815 11820 } 11816 11821 else { 11817 11822 Jim_SetResultInt(interp, interp->signal); 11818 11823 } 11819 11824 interp->signal = 0; 11820 11825 } 11821 11826 11822 - if (argc == 2) { 11823 - if (Jim_SetVariable(interp, argv[1], Jim_GetResult(interp)) 11824 - != JIM_OK) 11827 + if (argc >= 2) { 11828 + if (Jim_SetVariable(interp, argv[1], Jim_GetResult(interp)) != JIM_OK) { 11825 11829 return JIM_ERR; 11830 + } 11831 + if (argc == 3) { 11832 + Jim_Obj *optListObj = Jim_NewListObj(interp, NULL, 0); 11833 + Jim_ListAppendElement(interp, optListObj, Jim_NewStringObj(interp, "-code", -1)); 11834 + Jim_ListAppendElement(interp, optListObj, 11835 + Jim_NewIntObj(interp, exitCode == JIM_RETURN ? interp->returnCode : exitCode)); 11836 + 11837 + if (Jim_SetVariable(interp, argv[2], optListObj) != JIM_OK) { 11838 + return JIM_ERR; 11839 + } 11840 + } 11826 11841 } 11827 11842 Jim_SetResultInt(interp, exitCode); 11828 11843 return JIM_OK; 11829 11844 } 11830 11845 11831 11846 #ifdef JIM_REFERENCES 11832 11847 /* [ref] */ ................................................................................ 12198 12213 /* Redirect to os.gethostname if it exists */ 12199 12214 return Jim_Eval(interp, "os.gethostname"); 12200 12215 12201 12216 case INFO_NAMEOFEXECUTABLE: 12202 12217 /* Redirect to Tcl proc */ 12203 12218 return Jim_Eval(interp, "{info nameofexecutable}"); 12204 12219 12205 - case INFO_RETURNCODES: { 12206 - int i; 12207 - Jim_Obj *listObjPtr = Jim_NewListObj(interp, NULL, 0); 12220 + case INFO_RETURNCODES: 12221 + if (argc == 2) { 12222 + int i; 12223 + Jim_Obj *listObjPtr = Jim_NewListObj(interp, NULL, 0); 12208 12224 12209 - for (i = 0; jimReturnCodes[i]; i++) { 12210 - Jim_ListAppendElement(interp, listObjPtr, Jim_NewIntObj(interp, i)); 12211 - Jim_ListAppendElement(interp, listObjPtr, Jim_NewStringObj(interp, jimReturnCodes[i], -1)); 12225 + for (i = 0; jimReturnCodes[i]; i++) { 12226 + Jim_ListAppendElement(interp, listObjPtr, Jim_NewIntObj(interp, i)); 12227 + Jim_ListAppendElement(interp, listObjPtr, Jim_NewStringObj(interp, jimReturnCodes[i], -1)); 12228 + } 12229 + 12230 + Jim_SetResult(interp, listObjPtr); 12231 + } 12232 + else if (argc == 3) { 12233 + long code; 12234 + const char *name; 12235 + if (Jim_GetLong(interp, argv[2], &code) != JIM_OK) { 12236 + return JIM_ERR; 12237 + } 12238 + name = Jim_ReturnCode(code); 12239 + if (*name == '?') { 12240 + Jim_SetResultInt(interp, code); 12241 + } 12242 + else { 12243 + Jim_SetResultString(interp, name, -1); 12244 + } 12245 + } 12246 + else { 12247 + Jim_WrongNumArgs(interp, 2, argv, "?code?"); 12248 + return JIM_ERR; 12212 12249 } 12213 - 12214 - Jim_SetResult(interp, listObjPtr); 12215 12250 break; 12216 - } 12217 12251 } 12218 12252 return JIM_OK; 12219 12253 } 12220 12254 12221 12255 /* [split] */ 12222 12256 static int Jim_SplitCoreCommand(Jim_Interp *interp, int argc, 12223 12257 Jim_Obj *const *argv)