/* * FconfigureCmd.java -- * * Copyright (c) 2001 Bruce A. Johnson * 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: FconfigureCmd.java,v 1.11 2003/03/08 03:42:43 mdejong Exp $ * */ using System; using System.Text; namespace tcl.lang { /// This class implements the built-in "fconfigure" command in Tcl. class FconfigureCmd : Command { private static readonly string[] validCmds = new string[] { "-blocking", "-buffering", "-buffersize", "-encoding", "-eofchar", "-translation" }; internal const int OPT_BLOCKING = 0; internal const int OPT_BUFFERING = 1; internal const int OPT_BUFFERSIZE = 2; internal const int OPT_ENCODING = 3; internal const int OPT_EOFCHAR = 4; internal const int OPT_TRANSLATION = 5; /// This procedure is invoked to process the "fconfigure" 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 ) { Channel chan; // The channel being operated on this method if ( ( argv.Length < 2 ) || ( ( ( argv.Length % 2 ) == 1 ) && ( argv.Length != 3 ) ) ) { throw new TclNumArgsException( interp, 1, argv, "channelId ?optionName? ?value? ?optionName value?..." ); } chan = TclIO.getChannel( interp, argv[1].ToString() ); if ( chan == null ) { throw new TclException( interp, "can not find channel named \"" + argv[1].ToString() + "\"" ); } if ( argv.Length == 2 ) { // return list of all name/value pairs for this channelId TclObject list = TclList.newInstance(); TclList.append( interp, list, TclString.newInstance( "-blocking" ) ); TclList.append( interp, list, TclBoolean.newInstance( chan.Blocking ) ); TclList.append( interp, list, TclString.newInstance( "-buffering" ) ); TclList.append( interp, list, TclString.newInstance( TclIO.getBufferingString( chan.Buffering ) ) ); TclList.append( interp, list, TclString.newInstance( "-buffersize" ) ); TclList.append( interp, list, TclInteger.newInstance( chan.BufferSize ) ); // -encoding TclList.append( interp, list, TclString.newInstance( "-encoding" ) ); System.Text.Encoding javaEncoding = chan.Encoding; string tclEncoding; if ( (System.Object)javaEncoding == null ) { tclEncoding = "binary"; } else { tclEncoding = EncodingCmd.getTclName( javaEncoding ); } TclList.append( interp, list, TclString.newInstance( tclEncoding ) ); // -eofchar TclList.append( interp, list, TclString.newInstance( "-eofchar" ) ); if ( chan.ReadOnly ) { char eofChar = chan.InputEofChar; TclList.append( interp, list, ( eofChar == 0 ) ? TclString.newInstance( "" ) : TclString.newInstance( eofChar ) ); } else if ( chan.WriteOnly ) { char eofChar = chan.OutputEofChar; TclList.append( interp, list, ( eofChar == 0 ) ? TclString.newInstance( "" ) : TclString.newInstance( eofChar ) ); } else if ( chan.ReadWrite ) { char inEofChar = chan.InputEofChar; char outEofChar = chan.OutputEofChar; TclObject eofchar_pair = TclList.newInstance(); TclList.append( interp, eofchar_pair, ( inEofChar == 0 ) ? TclString.newInstance( "" ) : TclString.newInstance( inEofChar ) ); TclList.append( interp, eofchar_pair, ( outEofChar == 0 ) ? TclString.newInstance( "" ) : TclString.newInstance( outEofChar ) ); TclList.append( interp, list, eofchar_pair ); } else { // Not readable or writeable, do nothing } // -translation TclList.append( interp, list, TclString.newInstance( "-translation" ) ); if ( chan.ReadOnly ) { TclList.append( interp, list, TclString.newInstance( TclIO.getTranslationString( chan.InputTranslation ) ) ); } else if ( chan.WriteOnly ) { TclList.append( interp, list, TclString.newInstance( TclIO.getTranslationString( chan.OutputTranslation ) ) ); } else if ( chan.ReadWrite ) { TclObject translation_pair = TclList.newInstance(); TclList.append( interp, translation_pair, TclString.newInstance( TclIO.getTranslationString( chan.InputTranslation ) ) ); TclList.append( interp, translation_pair, TclString.newInstance( TclIO.getTranslationString( chan.OutputTranslation ) ) ); TclList.append( interp, list, translation_pair ); } else { // Not readable or writeable, do nothing } interp.setResult( list ); } if ( argv.Length == 3 ) { // return value for supplied name int index = TclIndex.get( interp, argv[2], validCmds, "option", 0 ); switch ( index ) { case OPT_BLOCKING: { // -blocking interp.setResult( chan.Blocking ); break; } case OPT_BUFFERING: { // -buffering interp.setResult( TclIO.getBufferingString( chan.Buffering ) ); break; } case OPT_BUFFERSIZE: { // -buffersize interp.setResult( chan.BufferSize ); break; } case OPT_ENCODING: { // -encoding System.Text.Encoding javaEncoding = chan.Encoding; if ( (System.Object)javaEncoding == null ) { interp.setResult( "binary" ); } else { interp.setResult( EncodingCmd.getTclName( javaEncoding ) ); } break; } case OPT_EOFCHAR: { // -eofchar if ( chan.ReadOnly ) { char eofChar = chan.InputEofChar; interp.setResult( ( eofChar == 0 ) ? TclString.newInstance( "" ) : TclString.newInstance( eofChar ) ); } else if ( chan.WriteOnly ) { char eofChar = chan.OutputEofChar; interp.setResult( ( eofChar == 0 ) ? TclString.newInstance( "" ) : TclString.newInstance( eofChar ) ); } else if ( chan.ReadWrite ) { char inEofChar = chan.InputEofChar; char outEofChar = chan.OutputEofChar; TclObject eofchar_pair = TclList.newInstance(); TclList.append( interp, eofchar_pair, ( inEofChar == 0 ) ? TclString.newInstance( "" ) : TclString.newInstance( inEofChar ) ); TclList.append( interp, eofchar_pair, ( outEofChar == 0 ) ? TclString.newInstance( "" ) : TclString.newInstance( outEofChar ) ); interp.setResult( eofchar_pair ); } else { // Not readable or writeable, do nothing } break; } case OPT_TRANSLATION: { // -translation if ( chan.ReadOnly ) { interp.setResult( TclIO.getTranslationString( chan.InputTranslation ) ); } else if ( chan.WriteOnly ) { interp.setResult( TclIO.getTranslationString( chan.OutputTranslation ) ); } else if ( chan.ReadWrite ) { TclObject translation_pair = TclList.newInstance(); TclList.append( interp, translation_pair, TclString.newInstance( TclIO.getTranslationString( chan.InputTranslation ) ) ); TclList.append( interp, translation_pair, TclString.newInstance( TclIO.getTranslationString( chan.OutputTranslation ) ) ); interp.setResult( translation_pair ); } else { // Not readable or writeable, do nothing } break; } default: { throw new TclRuntimeError( "Fconfigure.cmdProc() error: " + "incorrect index returned from TclIndex.get()" ); } } } for ( int i = 3; i < argv.Length; i += 2 ) { // Iterate through the list setting the name with the // corresponding value. int index = TclIndex.get( interp, argv[i - 1], validCmds, "option", 0 ); switch ( index ) { case OPT_BLOCKING: { // -blocking chan.Blocking = TclBoolean.get( interp, argv[i] ); break; } case OPT_BUFFERING: { // -buffering int id = TclIO.getBufferingID( argv[i].ToString() ); if ( id == -1 ) { throw new TclException( interp, "bad value for -buffering: must be " + "one of full, line, or none" ); } chan.Buffering = id; break; } case OPT_BUFFERSIZE: { // -buffersize chan.BufferSize = TclInteger.get( interp, argv[i] ); break; } case OPT_ENCODING: { // -encoding string tclEncoding = argv[i].ToString(); if ( tclEncoding.Equals( "" ) || tclEncoding.Equals( "binary" ) ) { chan.Encoding = null; } else { System.Text.Encoding javaEncoding = EncodingCmd.getJavaName( tclEncoding ); if ( (System.Object)javaEncoding == null ) { throw new TclException( interp, "unknown encoding \"" + tclEncoding + "\"" ); } chan.Encoding = javaEncoding; } break; } case OPT_EOFCHAR: { // -eofchar TclList.setListFromAny( interp, argv[i] ); int length = TclList.getLength( interp, argv[i] ); if ( length > 2 ) { throw new TclException( interp, "bad value for -eofchar: " + "should be a list of zero, one, or two elements" ); } char inputEofChar, outputEofChar; string s; if ( length == 0 ) { inputEofChar = outputEofChar = (char)( 0 ); } else if ( length == 1 ) { s = TclList.index( interp, argv[i], 0 ).ToString(); inputEofChar = outputEofChar = s[0]; } else { s = TclList.index( interp, argv[i], 0 ).ToString(); inputEofChar = s[0]; s = TclList.index( interp, argv[i], 1 ).ToString(); outputEofChar = s[0]; } chan.InputEofChar = inputEofChar; chan.OutputEofChar = outputEofChar; break; } case OPT_TRANSLATION: { // -translation TclList.setListFromAny( interp, argv[i] ); int length = TclList.getLength( interp, argv[i] ); if ( length < 1 || length > 2 ) { throw new TclException( interp, "bad value for -translation: " + "must be a one or two element list" ); } string inputTranslationArg, outputTranslationArg; int inputTranslation, outputTranslation; if ( length == 2 ) { inputTranslationArg = TclList.index( interp, argv[i], 0 ).ToString(); inputTranslation = TclIO.getTranslationID( inputTranslationArg ); outputTranslationArg = TclList.index( interp, argv[i], 1 ).ToString(); outputTranslation = TclIO.getTranslationID( outputTranslationArg ); } else { outputTranslationArg = inputTranslationArg = argv[i].ToString(); outputTranslation = inputTranslation = TclIO.getTranslationID( outputTranslationArg ); } if ( ( inputTranslation == -1 ) || ( outputTranslation == -1 ) ) { throw new TclException( interp, "bad value for -translation: " + "must be one of auto, binary, cr, lf, " + "crlf, or platform" ); } if ( outputTranslation == TclIO.TRANS_AUTO ) outputTranslation = TclIO.TRANS_PLATFORM; if ( chan.ReadOnly ) { chan.InputTranslation = inputTranslation; if ( inputTranslationArg.Equals( "binary" ) ) { chan.Encoding = null; } } else if ( chan.WriteOnly ) { chan.OutputTranslation = outputTranslation; if ( outputTranslationArg.Equals( "binary" ) ) { chan.Encoding = null; } } else if ( chan.ReadWrite ) { chan.InputTranslation = inputTranslation; chan.OutputTranslation = outputTranslation; if ( inputTranslationArg.Equals( "binary" ) || outputTranslationArg.Equals( "binary" ) ) { chan.Encoding = null; } } else { // Not readable or writeable, do nothing } break; } default: { throw new TclRuntimeError( "Fconfigure.cmdProc() error: " + "incorrect index returned from TclIndex.get()" ); } } } return TCL.CompletionCode.RETURN; } } }