/* * SplitCmd.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: SplitCmd.java,v 1.1.1.1 1998/10/14 21:09:19 cvsadmin Exp $ * */ using System; namespace tcl.lang { /// This class implements the built-in "split" command in Tcl. class SplitCmd : Command { /// Default characters for splitting up strings. private static char[] defSplitChars = new char[] { ' ', '\n', '\t', '\r' }; /// This procedure is invoked to process the "split" Tcl /// command. See Tcl user documentation for details. /// /// /// the current interpreter. /// /// command arguments. /// /// TclException If incorrect number of arguments. /// public TCL.CompletionCode cmdProc( Interp interp, TclObject[] argv ) { char[] splitChars = null; string inString; if ( argv.Length == 2 ) { splitChars = defSplitChars; } else if ( argv.Length == 3 ) { splitChars = argv[2].ToString().ToCharArray(); } else { throw new TclNumArgsException( interp, 1, argv, "string ?splitChars?" ); } inString = argv[1].ToString(); int len = inString.Length; int num = splitChars.Length; /* * Handle the special case of splitting on every character. */ if ( num == 0 ) { TclObject list = TclList.newInstance(); list.preserve(); try { for ( int i = 0; i < len; i++ ) { TclList.append( interp, list, TclString.newInstance( inString[i] ) ); } interp.setResult( list ); } finally { list.release(); } return TCL.CompletionCode.RETURN; } /* * Normal case: split on any of a given set of characters. * Discard instances of the split characters. */ TclObject list2 = TclList.newInstance(); int elemStart = 0; list2.preserve(); try { int i, j; for ( i = 0; i < len; i++ ) { char c = inString[i]; for ( j = 0; j < num; j++ ) { if ( c == splitChars[j] ) { TclList.append( interp, list2, TclString.newInstance( inString.Substring( elemStart, ( i ) - ( elemStart ) ) ) ); elemStart = i + 1; break; } } } if ( i != 0 ) { TclList.append( interp, list2, TclString.newInstance( inString.Substring( elemStart ) ) ); } interp.setResult( list2 ); } finally { list2.release(); } return TCL.CompletionCode.RETURN; } } }