wasCSharpSQLite – Rev 1
?pathlinks?
/*
* LsortCmd.java
*
* The file implements the Tcl "lsort" command.
*
* Copyright (c) 1997 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: LsortCmd.java,v 1.3 2003/01/09 02:15:39 mdejong Exp $
*/
using System;
namespace tcl.lang
{
/*
* This LsortCmd class implements the Command interface for specifying a new
* Tcl command. The Lsort command implements the built-in Tcl command "lsort"
* which is used to sort Tcl lists. See user documentation for more details.
*/
class LsortCmd : Command
{
/*
* List of switches that are legal in the lsort command.
*/
private static readonly string[] validOpts = new string[] { "-ascii", "-command", "-decreasing", "-dictionary", "-increasing", "-index", "-integer", "-real", "-unique" };
/*
*----------------------------------------------------------------------
*
* cmdProc --
*
* This procedure is invoked as part of the Command interface to
* process the "lsort" Tcl command. See the user documentation for
* details on what it does.
*
* Results:
* A standard Tcl result.
*
* Side effects:
* See the user documentation.
*
*----------------------------------------------------------------------
*/
public TCL.CompletionCode cmdProc( Interp interp, TclObject[] argv )
{
if ( argv.Length < 2 )
{
throw new TclNumArgsException( interp, 1, argv, "?options? list" );
}
string command = null;
int sortMode = QSort.ASCII;
int sortIndex = -1;
bool sortIncreasing = true;
bool unique = false;
for ( int i = 1; i < argv.Length - 1; i++ )
{
int index = TclIndex.get( interp, argv[i], validOpts, "option", 0 );
switch ( index )
{
case 0:
sortMode = QSort.ASCII;
break;
case 1:
if ( i == argv.Length - 2 )
{
throw new TclException( interp, "\"-command\" option must be" + " followed by comparison command" );
}
sortMode = QSort.COMMAND;
command = argv[i + 1].ToString();
i++;
break;
case 2:
sortIncreasing = false;
break;
case 3:
sortMode = QSort.DICTIONARY;
break;
case 4:
sortIncreasing = true;
break;
case 5:
if ( i == argv.Length - 2 )
{
throw new TclException( interp, "\"-index\" option must be followed by list index" );
}
sortIndex = Util.getIntForIndex( interp, argv[i + 1], -2 );
command = argv[i + 1].ToString();
i++;
break;
case 6:
sortMode = QSort.INTEGER;
break;
case 7:
sortMode = QSort.REAL;
break;
case 8: /* -unique */
unique = true;
break;
}
}
TclObject list = argv[argv.Length - 1];
bool isDuplicate = false;
// If the list object is unshared we can modify it directly. Otherwise
// we create a copy to modify: this is "copy on write".
if ( list.Shared )
{
list = list.duplicate();
isDuplicate = true;
}
try
{
TclList.sort( interp, list, sortMode, sortIndex, sortIncreasing, command, unique );
interp.setResult( list );
}
catch ( TclException e )
{
if ( isDuplicate )
{
list.release();
}
throw;
}
return TCL.CompletionCode.RETURN;
}
} // LsortCmd
}