From e349fb9a5554f7aa3e75588563e3173e2a216509 Mon Sep 17 00:00:00 2001 From: Steve Bennett Date: Sun, 24 Jan 2010 11:54:50 +1000 Subject: 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) --- jim-regexp.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) (limited to 'jim-regexp.c') 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; } -- cgit v1.1