/* * SeekCmd.java -- * * 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: SeekCmd.java,v 1.3 2003/03/08 03:42:44 mdejong Exp $ * */ using System; using System.IO; namespace tcl.lang { /// This class implements the built-in "seek" command in Tcl. class SeekCmd : Command { private static readonly string[] validOrigins = new string[] { "start", "current", "end" }; internal const int OPT_START = 0; internal const int OPT_CURRENT = 1; internal const int OPT_END = 2; /// This procedure is invoked to process the "seek" Tcl command. /// See the user documentation for details on what it does. /// public TCL.CompletionCode cmdProc( Interp interp, TclObject[] argv ) { Channel chan; /* The channel being operated on this method */ int mode; /* Stores the search mode, either beg, cur or end * of file. See the TclIO class for more info */ if ( argv.Length != 3 && argv.Length != 4 ) { throw new TclNumArgsException( interp, 1, argv, "channelId offset ?origin?" ); } // default is the beginning of the file mode = TclIO.SEEK_SET; if ( argv.Length == 4 ) { int index = TclIndex.get( interp, argv[3], validOrigins, "origin", 0 ); switch ( index ) { case OPT_START: { mode = TclIO.SEEK_SET; break; } case OPT_CURRENT: { mode = TclIO.SEEK_CUR; break; } case OPT_END: { mode = TclIO.SEEK_END; break; } } } chan = TclIO.getChannel( interp, argv[1].ToString() ); if ( chan == null ) { throw new TclException( interp, "can not find channel named \"" + argv[1].ToString() + "\"" ); } long offset = TclInteger.get( interp, argv[2] ); try { chan.seek( interp, offset, mode ); } catch ( IOException e ) { // FIXME: Need to figure out Tcl specific error conditions. // Should we also wrap an IOException in a ReflectException? throw new TclRuntimeError( "SeekCmd.cmdProc() Error: IOException when seeking " + chan.ChanName + ":" + e.Message ); } return TCL.CompletionCode.RETURN; } } }