aboutsummaryrefslogtreecommitdiff
path: root/jim-regexp.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2010-01-24 11:54:50 +1000
committerSteve Bennett <steveb@workware.net.au>2010-10-15 11:02:43 +1000
commite349fb9a5554f7aa3e75588563e3173e2a216509 (patch)
tree8ec30fb154c559baee2b1aa60ddc94171222fba1 /jim-regexp.c
parent69364efd1631cfe9d10e855d5917b9d9ec7122fc (diff)
downloadjimtcl-e349fb9a5554f7aa3e75588563e3173e2a216509.zip
jimtcl-e349fb9a5554f7aa3e75588563e3173e2a216509.tar.gz
jimtcl-e349fb9a5554f7aa3e75588563e3173e2a216509.tar.bz2
Allow regsub to return the result as a string
From Tcl 8.4 (see TIP 76: http://www.tcl.tk/cgi-bin/tct/tip/76.html)
Diffstat (limited to 'jim-regexp.c')
-rw-r--r--jim-regexp.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/jim-regexp.c b/jim-regexp.c
index e161d37..3c36ae9 100644
--- a/jim-regexp.c
+++ b/jim-regexp.c
@@ -318,7 +318,7 @@ int Jim_RegsubCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
long offset = 0;
regex_t *regex;
const char *p;
- int result = JIM_ERR;
+ int result;
regmatch_t pmatch[MAX_SUB_MATCHES + 1];
int num_matches = 0;
@@ -330,9 +330,9 @@ int Jim_RegsubCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
const char *replace_str;
const char *pattern;
- if (argc < 5) {
+ if (argc < 4) {
wrongNumArgs:
- Jim_WrongNumArgs(interp, 1, argv, "?-nocase? ?-all? exp string subSpec varName");
+ Jim_WrongNumArgs(interp, 1, argv, "?-nocase? ?-all? exp string subSpec ?varName?");
return JIM_ERR;
}
@@ -367,7 +367,7 @@ int Jim_RegsubCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
break;
}
}
- if (argc - i != 4) {
+ if (argc - i != 3 && argc - i != 4) {
goto wrongNumArgs;
}
@@ -413,7 +413,7 @@ int Jim_RegsubCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
regerror(match, regex, buf, sizeof(buf));
Jim_SetResultString(interp, "", 0);
Jim_AppendStrings(interp, Jim_GetResult(interp), "error while matching pattern: ", buf, NULL);
- goto done;
+ return JIM_ERR;
}
if (match == REG_NOMATCH) {
break;
@@ -479,19 +479,24 @@ int Jim_RegsubCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
*/
Jim_AppendString(interp, resultObj, p, -1);
- /* And now set the result variable */
- result = Jim_SetVariable(interp, varname, resultObj);
+ /* And now set or return the result variable */
+ if (argc - i == 4) {
+ result = Jim_SetVariable(interp, varname, resultObj);
- if (result == JIM_OK) {
- Jim_SetResultInt(interp, num_matches);
+ if (result == JIM_OK) {
+ Jim_SetResultInt(interp, num_matches);
+ }
+ else {
+ Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
+ Jim_AppendStrings(interp, Jim_GetResult(interp), "couldn't set variable \"", Jim_GetString(varname, NULL), "\"", NULL);
+ Jim_FreeObj(interp, resultObj);
+ }
}
else {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp), "couldn't set variable \"", Jim_GetString(varname, NULL), "\"", NULL);
- Jim_FreeObj(interp, resultObj);
+ Jim_SetResult(interp, resultObj);
+ result = JIM_OK;
}
- done:
return result;
}