Differences From Artifact [4d2ed8e278340b68]:
- File
jim.c
-
2010-10-15 01:02:46
- part of checkin
[6b1ca23db9]
on branch trunk
- Improve error message from wrong args to proc
*: Use ?argname? to show an optional arg *: Use ?argument ...? to represent 'args', just like Tcl 8.5 (user: steveb@workware.net.au
-
2010-10-15 01:02:46
- part of checkin
[6b1ca23db9]
on branch trunk
- Improve error message from wrong args to proc
To Artifact [c044a1de0c10c2e1]:
- File
jim.c
-
2010-10-15 01:02:46
- part of checkin
[5aad01974a]
on branch trunk
- Enhance catch and 'info returncodes'
*: Add optional arg to catch, opts, like Tcl 8.5 to allow access to the code given by 'return -code' *: Use -- to signify end of options to catch *: 'info returncodes' can give the name of a single code *: Fix 'case' to handle 'return -code' properly (user: steveb@workware.net.au
-
2010-10-15 01:02:46
- part of checkin
[5aad01974a]
on branch trunk
- Enhance catch and 'info returncodes'
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)