<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE TIP SYSTEM "http://tcl.activestate.com/cgi-bin/tct/tip/tipxml.dtd">
<!-- Converted at Thu Feb 09 12:27:06 GMT 2012 -->
<!-- TIP AutoGenerator - written by Donal K. Fellows -->

<TIP number='76'>
<header><title>Make &apos;regsub&apos; Return a String</title><author address="mailto:B.Hartweg@compaq.com">Bruce Hartweg</author><author address="mailto:dkf@users.sf.net">Donal K. Fellows</author><status type='project' state='final' tclversion="8.4" vote='after'>$Revision: 1.3 $</status><history></history><created day='29' month='nov' year='2001' /></header>
<abstract>This TIP proposes altering the [regsub] command so that it can return the substituted string as the result of the command.</abstract>
<body><section title="Rationale">
<para>In many of the most common uses of the [regsub] command, the substituted string is used only once in the immediately following command. However, the [regsub] command only provides the substituted string via a variable, with the result of the command itself being the number of substitutions performed. For many uses of the command, it is the substituted string though that is the most useful result, especially if some other transformation is going to be applied to it (like further [regsub] commands or some other Tcl command like one of the [string] subcommands or [subst].) This TIP proposes a mechanism for providing the ability to return the string as the command&apos;s result, and in a way that is backward-compatible with existing scripts.</para>
</section>
<section title="Specification">
<verbatim><vline encoding='base64'>ICAgcmVnc3ViID9zd2l0Y2hlcz8gZXhwIHN0cmluZyBzdWJTcGVjID92YXJOYW1lPw==</vline></verbatim>
<para>If <emph style="italic">varName</emph> is supplied the new string is written there and the number of substitutions are returned (same as current behavior). If <emph style="italic">varName</emph> is not supplied than the new string is returned as the result of the [regsub] command.</para>
</section>
<section title="Reference Implementation">
<para>This is a pretty easy change, although I do not currently have an environment where I can actually build and test this the following should create the desired behavior.</para>
<para>File: <emph style="italic">tcl/generic/tclCmdMZ.c</emph></para>
<para>Function: <emph style="italic">Tcl_RegsubObjCmd</emph></para>
<para>Currently (v 1.52):</para>
<verbatim><vline encoding='base64'>ICAgIGlmIChvYmpjIC0gaWR4ICE9IDQpIHs=</vline><vline encoding='base64'>CSBUY2xfV3JvbmdOdW1BcmdzKGludGVycCwgMSwgb2Jqdiw=</vline><vline encoding='base64'>CQkgIj9zd2l0Y2hlcz8gZXhwIHN0cmluZyBzdWJTcGVjIHZhck5hbWUiKTs=</vline><vline encoding='base64'>CSByZXR1cm4gVENMX0VSUk9SOw==</vline><vline encoding='base64'>ICAgIH0=</vline></verbatim>
<para>which should be changed to:</para>
<verbatim><vline encoding='base64'>ICAgIG9iamMgLT0gaWR4Ow==</vline><vline encoding='base64'>ICAgIGlmIChvYmpjICE9IDMgfHwgb2JqYyAhPSA0KSB7</vline><vline encoding='base64'>CSBUY2xfV3JvbmdOdW1BcmdzKGludGVycCwgMSwgb2Jqdiw=</vline><vline encoding='base64'>CQkgIj9zd2l0Y2hlcz8gZXhwIHN0cmluZyBzdWJTcGVjID92YXJOYW1lPyIpOw==</vline><vline encoding='base64'>CSByZXR1cm4gVENMX0VSUk9SOw==</vline><vline encoding='base64'>ICAgIH0=</vline></verbatim>
<para>and then at the end change this:</para>
<verbatim><vline encoding='base64'>ICAgIGlmIChUY2xfT2JqU2V0VmFyMihpbnRlcnAsIG9ianZbM10sIE5VTEwsIHJlc3VsdFB0ciwgMCkgPT0gTlVMTCkgew==</vline><vline encoding='base64'>CSBUY2xfQXBwZW5kUmVzdWx0KGludGVycCwgImNvdWxkbid0IHNldCB2YXJpYWJsZSBcIiIs</vline><vline encoding='base64'>CQkgVGNsX0dldFN0cmluZyhvYmp2WzNdKSwgIlwiIiwgKGNoYXIgKikgTlVMTCk7</vline><vline encoding='base64'>CSByZXN1bHQgPSBUQ0xfRVJST1I7</vline><vline encoding='base64'>ICAgIH0gZWxzZSB7</vline><vline encoding='base64'>CSAvKg==</vline><vline encoding='base64'>CSAgKiBTZXQgdGhlIGludGVycHJldGVyJ3Mgb2JqZWN0IHJlc3VsdCB0byBhbiBpbnRlZ2VyIG9iamVjdA==</vline><vline encoding='base64'>CSAgKiBob2xkaW5nIHRoZSBudW1iZXIgb2YgbWF0Y2hlcy4=</vline><vline encoding='base64'>CSAgKi8=</vline><vline encoding='base64'></vline><vline encoding='base64'>CSBUY2xfU2V0SW50T2JqKFRjbF9HZXRPYmpSZXN1bHQoaW50ZXJwKSwgbnVtTWF0Y2hlcyk7</vline><vline encoding='base64'>ICAgIH0=</vline></verbatim>
<para>to this:</para>
<verbatim><vline encoding='base64'>ICAgIGlmIChvYmpjID09IDQpIHs=</vline><vline encoding='base64'>ICAgICAgICBpZiAoVGNsX09ialNldFZhcjIoaW50ZXJwLCBvYmp2WzNdLCBOVUxMLCByZXN1bHRQdHIsIDApID09IE5VTEwpIHs=</vline><vline encoding='base64'>ICAgICAgICAgICAgVGNsX0FwcGVuZFJlc3VsdChpbnRlcnAsICJjb3VsZG4ndCBzZXQgdmFyaWFibGUgXCIiLA==</vline><vline encoding='base64'>ICAgICAgICAJICAgICBUY2xfR2V0U3RyaW5nKG9ianZbM10pLCAiXCIiLCAoY2hhciAqKSBOVUxMKTs=</vline><vline encoding='base64'>ICAgICAgICAgICAgcmVzdWx0ID0gVENMX0VSUk9SOw==</vline><vline encoding='base64'>ICAgICAgICB9IGVsc2Ugew==</vline><vline encoding='base64'>ICAgICAgICAgICAgLyo=</vline><vline encoding='base64'>ICAgICAgICAgICAgICogU2V0IHRoZSBpbnRlcnByZXRlcidzIG9iamVjdCByZXN1bHQgdG8gYW4gaW50ZWdlciBvYmplY3Q=</vline><vline encoding='base64'>ICAgICAgICAgICAgICogaG9sZGluZyB0aGUgbnVtYmVyIG9mIG1hdGNoZXMu</vline><vline encoding='base64'>ICAgICAgICAgICAgICov</vline><vline encoding='base64'></vline><vline encoding='base64'>ICAgICAgICAgICAgVGNsX1NldEludE9iaihUY2xfR2V0T2JqUmVzdWx0KGludGVycCksIG51bU1hdGNoZXMpOw==</vline><vline encoding='base64'>ICAgICAgICB9</vline><vline encoding='base64'>ICAgIH0gZWxzZSB7</vline><vline encoding='base64'>ICAgICAgICAgICAvKg==</vline><vline encoding='base64'>ICAgICAgICAgICAgKiBObyB2YXJuYW1lIHN1cHBsaWVkLCByZXR1cm4gc3RyaW5nIGFzIHJlc3VsdA==</vline><vline encoding='base64'>ICAgICAgICAgICAgKi8=</vline><vline encoding='base64'>ICAgICAgICAgICBUY2xfU2V0T2JqUmVzdWx0KGludGVycCwgcmVzdWx0UHRyKTs=</vline><vline encoding='base64'>ICAgIH0=</vline></verbatim>
<para>And then minor updates to the man page to show that <emph style="italic">varName</emph> is optional.</para>
</section>
<section title="Copyright">
<para>This document has been placed in the public domain.</para>
</section>
</body></TIP>

