/*
* LrangeCmd.java
*
* Copyright (c) 1997 Cornell University.
* 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: LrangeCmd.java,v 1.2 2000/03/17 23:31:30 mo Exp $
*
*/
using System;
namespace tcl.lang
{
/// This class implements the built-in "lrange" command in Tcl.
class LrangeCmd : Command
{
/// See Tcl user documentation for details.
/// TclException If incorrect number of arguments.
///
public TCL.CompletionCode cmdProc( Interp interp, TclObject[] argv )
{
if ( argv.Length != 4 )
{
throw new TclNumArgsException( interp, 1, argv, "list first last" );
}
int size = TclList.getLength( interp, argv[1] );
int first;
int last;
first = Util.getIntForIndex( interp, argv[2], size - 1 );
last = Util.getIntForIndex( interp, argv[3], size - 1 );
if ( last < 0 )
{
interp.resetResult();
return TCL.CompletionCode.RETURN;
}
if ( first >= size )
{
interp.resetResult();
return TCL.CompletionCode.RETURN;
}
if ( first <= 0 && last >= size )
{
interp.setResult( argv[1] );
return TCL.CompletionCode.RETURN;
}
if ( first < 0 )
{
first = 0;
}
if ( first >= size )
{
first = size - 1;
}
if ( last < 0 )
{
last = 0;
}
if ( last >= size )
{
last = size - 1;
}
if ( first > last )
{
interp.resetResult();
return TCL.CompletionCode.RETURN;
}
TclObject list = TclList.newInstance();
list.preserve();
try
{
for ( int i = first; i <= last; i++ )
{
TclList.append( interp, list, TclList.index( interp, argv[1], i ) );
}
interp.setResult( list );
}
finally
{
list.release();
}
return TCL.CompletionCode.RETURN;
}
}
}