/* * EncodingCmd.java -- * * Copyright (c) 2001 Bruce A. Johnson * * 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: EncodingCmd.java,v 1.2 2002/04/12 15:32:44 mdejong Exp $ * */ using System; using System.Text; using System.Collections; using System.IO; namespace tcl.lang { /// This class implements the built-in "encoding" command in Tcl. class EncodingCmd : Command { // FIXME: Make sure this is a global property and not a per-interp // property! internal static string systemTclEncoding = "utf-8"; internal static Encoding systemJavaEncoding = UTF8Encoding.UTF8; internal static string[] tclNames = new string[] { "utf-8", "unicode", "ascii", "utf-7" }; internal static readonly Encoding[] encodings = new Encoding[] { UTF8Encoding.UTF8, UnicodeEncoding.Unicode, ASCIIEncoding.Unicode, UTF7Encoding.UTF7 }; internal static int[] bytesPerChar = new int[] { 1, 2, 1, 1 }; private static readonly string[] validCmds = new string[] { "convertfrom", "convertto", "names", "system" }; internal const int OPT_CONVERTFROM = 0; internal const int OPT_CONVERTTO = 1; internal const int OPT_NAMES = 2; internal const int OPT_SYSTEM = 3; /// This procedure is invoked to process the "encoding" Tcl command. /// See the user documentation for details on what it does. /// /// /// the current interpreter. /// /// command arguments. /// public TCL.CompletionCode cmdProc( Interp interp, TclObject[] argv ) { if ( argv.Length < 2 ) { throw new TclNumArgsException( interp, 1, argv, "option ?arg ...?" ); } int index = TclIndex.get( interp, argv[1], validCmds, "option", 0 ); switch ( index ) { case OPT_CONVERTTO: case OPT_CONVERTFROM: { string tclEncoding; Encoding javaEncoding; TclObject data; if ( argv.Length == 3 ) { tclEncoding = systemTclEncoding; data = argv[2]; } else if ( argv.Length == 4 ) { tclEncoding = argv[2].ToString(); data = argv[3]; } else { throw new TclNumArgsException( interp, 2, argv, "?encoding? data" ); } javaEncoding = getJavaName( tclEncoding ); if ( (System.Object)javaEncoding == null ) { throw new TclException( interp, "unknown encoding \"" + tclEncoding + "\"" ); } try { if ( index == OPT_CONVERTFROM ) { // Treat the string as binary data byte[] bytes = TclByteArray.getBytes( interp, data ); // ATK interp.setResult( System.Text.Encoding.UTF8.GetString( bytes, 0, bytes.Length) ); } else { // Store the result as binary data // ATK byte[] bytes = data.ToString().getBytes(javaEncoding); byte[] bytes = System.Text.Encoding.UTF8.GetBytes( data.ToString() ); interp.setResult( TclByteArray.newInstance( bytes ) ); } } catch ( IOException ex ) { throw new TclRuntimeError( "Encoding.cmdProc() error: " + "unsupported java encoding \"" + javaEncoding + "\"" ); } break; } case OPT_NAMES: { if ( argv.Length > 2 ) { throw new TclNumArgsException( interp, 2, argv, null ); } TclObject list = TclList.newInstance(); for ( int i = 0; i < tclNames.Length; i++ ) { TclList.append( interp, list, TclString.newInstance( tclNames[i] ) ); } interp.setResult( list ); break; } case OPT_SYSTEM: { if ( argv.Length > 3 ) throw new TclNumArgsException( interp, 2, argv, "?encoding?" ); if ( argv.Length == 2 ) { interp.setResult( systemTclEncoding ); } else { string tclEncoding = argv[2].ToString(); Encoding javaEncoding = getJavaName( tclEncoding ); if ( javaEncoding == null ) { throw new TclException( interp, "unknown encoding \"" + tclEncoding + "\"" ); } systemTclEncoding = tclEncoding; systemJavaEncoding = javaEncoding; } break; } default: { throw new TclRuntimeError( "Encoding.cmdProc() error: " + "incorrect index returned from TclIndex.get()" ); } } return TCL.CompletionCode.RETURN; } internal static int getBytesPerChar( Encoding encoding ) { return encoding.GetMaxByteCount( 1 ); } internal static System.Text.Encoding getJavaName( string name ) { for ( int x = 0; x < EncodingCmd.tclNames.Length; x++ ) { if ( EncodingCmd.tclNames[x] == name ) return EncodingCmd.encodings[x]; } return null; } internal static string getTclName( Encoding encoding ) { for ( int x = 0; x < EncodingCmd.encodings.Length; x++ ) { if ( EncodingCmd.encodings[x].EncodingName == encoding.EncodingName ) return EncodingCmd.tclNames[x]; } return null; } } }