wasCSharpSQLite – Rev
?pathlinks?
using System.Text;
/*
* RegsubCmd.java
*
* This contains the Jacl implementation of the built-in Tcl
* "regsub" command.
*
* Copyright (c) 1997-1999 Sun Microsystems, Inc.
*
* See the file "license.terms" for information on usage and
* redistribution of this file, and for a DISCLAIMER OF ALL
* WARRANTIES.
*
* Included in SQLite3 port to C# for use in testharness only; 2008 Noah B Hart
*
* RCS @(#) $Id: RegsubCmd.java,v 1.4 2000/02/23 22:07:23 mo Exp $
*/
using Regexp = sunlabs.brazil.util.regexp.Regexp;
using Regsub = sunlabs.brazil.util.regexp.Regsub;
namespace tcl.lang
{
/// <summary> This class implements the built-in "regsub" command in Tcl.</summary>
class RegsubCmd : Command
{
private static readonly string[] validOpts = new string[] { "-all", "-nocase", "--" };
private const int OPT_ALL = 0;
private const int OPT_NOCASE = 1;
private const int OPT_LAST = 2;
public TCL.CompletionCode cmdProc( Interp interp, TclObject[] argv )
{
bool all = false;
bool nocase = false;
try
{
int i = 1;
while ( argv[i].ToString().StartsWith( "-" ) )
{
int index = TclIndex.get( interp, argv[i], validOpts, "switch", 0 );
i++;
switch ( index )
{
case OPT_ALL:
{
all = true;
break;
}
case OPT_NOCASE:
{
nocase = true;
break;
}
case OPT_LAST:
{
goto opts_brk;
}
}
}
opts_brk:
;
TclObject exp = argv[i++];
string inString = argv[i++].ToString();
string subSpec = argv[i++].ToString();
string varName = null;
if (i != argv.Length) varName = argv[i++].ToString();
if ( i != argv.Length )
{
throw new System.IndexOutOfRangeException();
}
Regexp r = TclRegexp.compile( interp, exp, nocase );
int count = 0;
string result;
if ( all == false )
{
result = r.sub( inString, subSpec );
if ( (System.Object)result == null )
{
result = inString;
}
else
{
count++;
}
}
else
{
StringBuilder sb = new StringBuilder();
Regsub s = new Regsub( r, inString );
while ( s.nextMatch() )
{
count++;
sb.Append( s.skipped() );
Regexp.applySubspec( s, subSpec, sb );
}
sb.Append( s.rest() );
result = sb.ToString();
}
TclObject obj = TclString.newInstance( result );
if ( varName == null )
interp.setResult( result );
else {
try
{
interp.setVar( varName, obj, 0 );
}
catch ( TclException e )
{
throw new TclException( interp, "couldn't set variable \"" + varName + "\"" );
}
interp.setResult( count );
}
}
catch ( System.IndexOutOfRangeException e )
{
throw new TclNumArgsException( interp, 1, argv, "?switches? exp string subSpec ?varName?" );
}
return TCL.CompletionCode.RETURN;
}
} // end RegsubCmd
}