Example #1
0
        public override ReturnCode Execute(
            Interpreter interpreter,
            IClientData clientData,
            ArgumentList arguments,
            ref Result result
            )
        {
            ReturnCode code;

            if (interpreter != null)
            {
                if (arguments != null)
                {
                    if (arguments.Count >= 2)
                    {
                        string subCommand = arguments[1];
                        bool   tried      = false;

                        code = ScriptOps.TryExecuteSubCommandFromEnsemble(
                            interpreter, this, clientData, arguments, true,
                            false, ref subCommand, ref tried, ref result);

                        if ((code == ReturnCode.Ok) && !tried)
                        {
                            switch (subCommand)
                            {
                            case "convertfrom":
                            {
                                if ((arguments.Count == 3) || (arguments.Count == 4))
                                {
                                    //
                                    // NOTE: (from Tcl encoding.n): Convert data to Unicode from the
                                    //       specified encoding. The characters in data are treated
                                    //       as binary data where the lower 8-bits of each character
                                    //       is taken as a single byte. The resulting sequence of
                                    //       bytes is treated as a string in the specified encoding.
                                    //       If encoding is not specified, the current system encoding
                                    //       is used.
                                    //
                                    int      argumentIndex = 2;
                                    Encoding encoding      = null;

                                    if (arguments.Count == 4)
                                    {
                                        code = interpreter.GetEncoding(
                                            arguments[argumentIndex++], LookupFlags.Default,
                                            ref encoding, ref result);
                                    }
                                    else
                                    {
                                        code = ReturnCode.Ok;
                                    }

                                    if (code == ReturnCode.Ok)
                                    {
                                        string stringValue = null;

                                        code = StringOps.ConvertString(
                                            null, encoding, EncodingType.Binary, EncodingType.System,
                                            arguments[argumentIndex], ref stringValue, ref result);

                                        if (code == ReturnCode.Ok)
                                        {
                                            result = stringValue;
                                        }
                                    }
                                }
                                else
                                {
                                    result = "wrong # args: should be \"encoding convertfrom ?encoding? data\"";
                                    code   = ReturnCode.Error;
                                }
                                break;
                            }

                            case "convertto":
                            {
                                if ((arguments.Count == 3) || (arguments.Count == 4))
                                {
                                    //
                                    // NOTE: (from Tcl encoding.n): Convert string from Unicode to the
                                    //       specified encoding. The result is a sequence of bytes that
                                    //       represents the converted string. Each byte is stored in the
                                    //       lower 8-bits of a Unicode character. If encoding is not
                                    //       specified, the current system encoding is used.
                                    //
                                    int      argumentIndex = 2;
                                    Encoding encoding      = null;

                                    if (arguments.Count == 4)
                                    {
                                        code = interpreter.GetEncoding(
                                            arguments[argumentIndex++], LookupFlags.Default,
                                            ref encoding, ref result);
                                    }
                                    else
                                    {
                                        code = ReturnCode.Ok;
                                    }

                                    if (code == ReturnCode.Ok)
                                    {
                                        string stringValue = null;

                                        code = StringOps.ConvertString(
                                            encoding, null, EncodingType.System, EncodingType.Binary,
                                            arguments[argumentIndex], ref stringValue, ref result);

                                        if (code == ReturnCode.Ok)
                                        {
                                            result = stringValue;
                                        }
                                    }
                                }
                                else
                                {
                                    result = "wrong # args: should be \"encoding convertto ?encoding? data\"";
                                    code   = ReturnCode.Error;
                                }
                                break;
                            }

                            case "getstring":
                            {
                                if ((arguments.Count == 3) || (arguments.Count == 4))
                                {
                                    IObject @object = null;

                                    code = interpreter.GetObject(
                                        arguments[2], LookupFlags.Default,
                                        ref @object, ref result);

                                    if (code == ReturnCode.Ok)
                                    {
                                        Encoding encoding = null;

                                        if (arguments.Count == 4)
                                        {
                                            code = interpreter.GetEncoding(
                                                arguments[3], LookupFlags.Default,
                                                ref encoding, ref result);
                                        }
                                        else
                                        {
                                            code = ReturnCode.Ok;
                                        }

                                        if (code == ReturnCode.Ok)
                                        {
                                            if (@object.Value is byte[])
                                            {
                                                string stringValue = null;

                                                code = StringOps.GetString(
                                                    encoding, (byte[])@object.Value, EncodingType.System,
                                                    ref stringValue, ref result);

                                                if (code == ReturnCode.Ok)
                                                {
                                                    result = stringValue;
                                                }
                                            }
                                            else
                                            {
                                                result = String.Format(
                                                    "object \"{0}\" is not a byte array",
                                                    arguments[2]);

                                                code = ReturnCode.Error;
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    result = "wrong # args: should be \"encoding getstring object ?encoding?\"";
                                    code   = ReturnCode.Error;
                                }
                                break;
                            }

                            case "names":
                            {
                                if ((arguments.Count >= 2) && (arguments.Count <= 4))
                                {
                                    bool system = true;         /* COMPAT: Tcl. */

                                    if (arguments.Count >= 3)
                                    {
                                        code = Value.GetBoolean2(
                                            arguments[2], ValueFlags.AnyBoolean,
                                            interpreter.CultureInfo, ref system,
                                            ref result);
                                    }

                                    if (code == ReturnCode.Ok)
                                    {
                                        EncodingDictionary encodings = null;

                                        if (system)
                                        {
                                            StringOps.GetSystemEncodings(ref encodings);
                                        }

                                        interpreter.GetEncodings(ref encodings);

                                        string pattern = null;

                                        if (arguments.Count == 4)
                                        {
                                            pattern = arguments[3];
                                        }

                                        result = encodings.ToString(pattern, false);
                                    }
                                }
                                else
                                {
                                    result = "wrong # args: should be \"encoding names ?system? ?pattern?\"";
                                    code   = ReturnCode.Error;
                                }
                                break;
                            }

                            case "system":
                            {
                                //
                                // NOTE: The system encoding in Eagle is always Unicode and cannot
                                //       be changed.
                                //
                                if ((arguments.Count == 2) || (arguments.Count == 3))
                                {
                                    if (arguments.Count == 3)
                                    {
                                        result = "not implemented";
                                        code   = ReturnCode.Error;
                                    }
                                    else
                                    {
                                        result = StringOps.SystemEncodingWebName;
                                    }
                                }
                                else
                                {
                                    result = "wrong # args: should be \"encoding system ?encoding?\"";
                                    code   = ReturnCode.Error;
                                }
                                break;
                            }

                            default:
                            {
                                result = ScriptOps.BadSubCommand(
                                    interpreter, null, null, subCommand, this, null, null);

                                code = ReturnCode.Error;
                                break;
                            }
                            }
                        }
                    }
                    else
                    {
                        result = "wrong # args: should be \"encoding option ?arg ...?\"";
                        code   = ReturnCode.Error;
                    }
                }
                else
                {
                    result = "invalid argument list";
                    code   = ReturnCode.Error;
                }
            }
            else
            {
                result = "invalid interpreter";
                code   = ReturnCode.Error;
            }

            return(code);
        }