コード例 #1
0
ファイル: Variables.cs プロジェクト: kia92798/tinyasn1
        public static void PrintC(ArrayValue pThis, StreamWriterLevel c, int lev)
        {
            c.WriteLine("{");
            lev++;

            int cnt = pThis.m_children.Count;

            c.P(lev); c.WriteLine("{0},", cnt);

            c.P(lev); c.WriteLine("{");
            for (int i = 0; i < cnt; i++)
            {
                c.P(lev + 1);
                ((ISCCVariable)pThis.m_children[i]).PrintC(c, lev + 1);
                if (i != cnt - 1)
                    c.WriteLine(",");
                else
                    c.WriteLine();
            }
            c.P(lev); c.WriteLine("}");

            lev--;
            c.P(lev);
            c.Write("}");
        }
コード例 #2
0
ファイル: TableValue.cs プロジェクト: modulexcite/NToml
        public void FlattenChildArrayTables()
        {
            foreach (var group in this.childArrayTables.GroupBy(x => x.Item1))
            {
                var array = new ArrayValue<TableValue>(group.Select(x => x.Item2).ToArray());
                this.AddKeyValuePair(group.Key, array);
            }

            this.childArrayTables.Clear();
        }
コード例 #3
0
        public void It_Should_Return_An_Error_If_Array_Is_Empty() // TODO: Check if this is the case
        {
            // Arrange
            ArrayValue arrayValue = new ArrayValue(new List<IExpressionConstant>());
            var filter = new LastFilter();

            // Act
            var result = filter.Apply(new TemplateContext(), arrayValue);

            // Assert
            Assert.That(result.IsError, Is.True);

        }
コード例 #4
0
        public void An_Array_With_No_Value_Should_Have_Zero_Length()
        {
            // Arrange
            ArrayValue arrayValue = new ArrayValue(new List<IExpressionConstant>());
            var filter = new SizeFilter();
            
            // Act
            var result = filter.Apply(new TemplateContext(), arrayValue).SuccessValue<NumericValue>();

            // Assert
            Assert.That(result.Value, Is.EqualTo(0));

        }
コード例 #5
0
        public void It_Should_Format_An_Array_By_Concatenating_Each_Elements_STring_Value()
        {
            // Arrange
            var num = new ArrayValue(new List<IExpressionConstant> { new StringValue("a"), new StringValue("b"), new StringValue("c") });

            // Act
            var result1 = ValueCaster.Cast<ArrayValue, StringValue>(num);
            var stringliteral = result1.SuccessValue<StringValue>()
                .StringVal;

            // Assert
            Assert.That(stringliteral, Is.EqualTo("abc"));

        }
コード例 #6
0
        public void It_Should_Save_Meta_Data()
        {
            // Arrange

            var expected = "Hello";
            ArrayValue arrayValue = new ArrayValue(new List<IExpressionConstant>());

            // Act
            arrayValue.MetaData["test"] = expected;

            // Assert
            Assert.That(arrayValue.MetaData.ContainsKey("test"));
            Assert.That(arrayValue.MetaData["test"], Is.EqualTo(expected));
            
        }
コード例 #7
0
        public void It_Should_Dereference_An_Array_Element()
        {

            // Arrange
            IList<IExpressionConstant> objlist = new List<IExpressionConstant>
            {
                new StringValue("a string"), 
                NumericValue.Create(123), 
                NumericValue.Create(456m),
                new BooleanValue(false)
            };
            ArrayValue arrayValue = new ArrayValue(objlist);

            // Assert
            var valueAt = arrayValue.ValueAt(0);
            Assert.That(valueAt.Value, Is.EqualTo(objlist[0].Value));
        }
コード例 #8
0
        public void It_Should_Return_An_Element_At_Position_0()
        {
            // Arrange
            IList<IExpressionConstant> objlist = new List<IExpressionConstant>
            {
                new StringValue("a string"), 
                NumericValue.Create(123), 
                NumericValue.Create(456m),
                new BooleanValue(false)
            };
            ArrayValue arrayValue = new ArrayValue(objlist);
            var filter = new PositionFilter(NumericValue.Create(0));
           
            // Act
            var result = filter.Apply(new TemplateContext(), arrayValue).SuccessValue<StringValue>();

            // Assert
            Assert.That(result, Is.EqualTo(objlist[0]));
        }
コード例 #9
0
        public void It_Should_Measure_The_Size_Of_An_Array()
        {
            // Arrange
            IList<IExpressionConstant> objlist = new List<IExpressionConstant>
            {
                new StringValue("a string"), 
                NumericValue.Create(123), 
                NumericValue.Create(456m),
                new BooleanValue(false)
            };
            ArrayValue arrayValue = new ArrayValue(objlist);
            var filter = new SizeFilter();

            // Act
            var result = filter.Apply(new TemplateContext(), arrayValue).SuccessValue<NumericValue>();

            // Assert
            Assert.That(result.Value, Is.EqualTo(4));

        }
コード例 #10
0
        public void It_Should_Access_Size_Property_Of_An_Array()
        {
            // Arrange
            IList<IExpressionConstant> objlist = new List<IExpressionConstant>
            {
                new StringValue("a string"), 
                NumericValue.Create(123), 
                NumericValue.Create(456m),
                new BooleanValue(false)
            };
            ArrayValue arrayValue = new ArrayValue(objlist);
            var ctx = new TemplateContext().WithAllFilters();
            ctx.DefineLocalVariable("myarray", arrayValue);
            // Act
            var result = RenderingHelper.RenderTemplate("Result : {{ myarray.size }}", ctx);

            // Assert
          
            Assert.That(result, Is.EqualTo("Result : 4" ));
        }
コード例 #11
0
        public void It_Should_Join_An_Array_With_A_String()
        {
            // Arrange
            IList<IExpressionConstant> objlist = new List<IExpressionConstant>
            {
                new StringValue("a string"), 
                NumericValue.Create(123), 
                NumericValue.Create(456m),
                new BooleanValue(false)
            };
            ArrayValue arrayValue = new ArrayValue(objlist);
            var filter = new JoinFilter(new StringValue(", "));

            // Act
            var result = filter.Apply(new TemplateContext(), arrayValue).SuccessValue<StringValue>();
            //Logger.Log(result.ToString());

            // Assert
            Assert.That(result.StringVal, Is.EqualTo("a string, 123, 456.0, false"));
     
        }
コード例 #12
0
        public void It_Should_Filter_Out_Unique_Simple_Objects()
        {
            // Arrange
            IList<IExpressionConstant> objlist = new List<IExpressionConstant>
            {
                new StringValue("123"), 
                NumericValue.Create(456m),
                NumericValue.Create(123), 
                NumericValue.Create(123), 
                new BooleanValue(false)
            };
            ArrayValue arrayValue = new ArrayValue(objlist);
            var filter = new UniqFilter();

            // Act
            var result = filter.Apply(new TemplateContext(), arrayValue).SuccessValue<ArrayValue>();

            // Assert
            Assert.That(result.Select(ValueCaster.RenderAsString), Is.EquivalentTo(new List<String>{"123", "456.0", "123", "false"}));

        }
コード例 #13
0
        public void It_Should_Sort_An_Array_By_StringValues()
        {
            // Arrange
            IList<IExpressionConstant> objlist = new List<IExpressionConstant>
            {
                new StringValue("a string"), 
                NumericValue.Create(123), 
                NumericValue.Create(456m),
                new BooleanValue(false)
            };
            ArrayValue arrayValue = new ArrayValue(objlist);
            var filter = new SortFilter(new StringValue(""));

            // Act            
            var result = filter.Apply(new TemplateContext(), arrayValue);
            var resultStrings = result.SuccessValue<ArrayValue>().Select(ValueCaster.RenderAsString);
            
            // Assert
            Assert.That(resultStrings, Is.EqualTo(new List<String>{"123", "456.0", "a string", "false"}));

        }
コード例 #14
0
        private LiquidExpressionResult DoLookup(ITemplateContext ctx, ArrayValue arrayValue, IExpressionConstant indexProperty)
        {

            String propertyNameString = ValueCaster.RenderAsString(indexProperty);
            int index;
            if (propertyNameString.ToLower().Equals("first"))
            {
                index = 0;
            }
            else if (propertyNameString.ToLower().Equals("last"))
            {
                index = arrayValue.ArrValue.Count - 1;
            }
            else if (propertyNameString.ToLower().Equals("size"))
            {
                return LiquidExpressionResult.Success(NumericValue.Create(arrayValue.ArrValue.Count));
            }
            else
            {
                var maybeIndexResult = ValueCaster.Cast<IExpressionConstant, NumericValue>(indexProperty);
                if (maybeIndexResult.IsError || !maybeIndexResult.SuccessResult.HasValue)
                {
                    return LiquidExpressionResult.Error("invalid array index: " + propertyNameString);
                }
                else
                {
                    index = maybeIndexResult.SuccessValue<NumericValue>().IntValue;
                }
            }

            if (arrayValue.ArrValue.Count == 0)
            {
                //return LiquidExpressionResult.Error("array is empty: " + propertyNameString);
                return LiquidExpressionResult.Success(new None<IExpressionConstant>()); // not an error in Ruby liquid.
            }
            var result = arrayValue.ValueAt(index);
            return LiquidExpressionResult.Success(result);
        }
コード例 #15
0
        public void It_Should_Sort_Dictionaries_By_Field()
        {
            // Arrange
            IList<IExpressionConstant> objlist = new List<IExpressionConstant>
            {
                DataFixtures.CreateDictionary(1, "Aa", "Value 1 B"), 
                DataFixtures.CreateDictionary(2, "Z", "Value 2 B"), 
                DataFixtures.CreateDictionary(3, "ab", "Value 3 B"), 
                DataFixtures.CreateDictionary(4, "b", "Value 4 B"),
            };
            ArrayValue arrayValue = new ArrayValue(objlist);
            SortFilter sizeFilter = new SortFilter(new StringValue("field1"));

            // Act
            var result = sizeFilter.Apply(new TemplateContext(), arrayValue);

            // Assert
            Assert.That(IdAt(result.SuccessValue<ArrayValue>(), 0, "field1").Value, Is.EqualTo("Aa"));
            Assert.That(IdAt(result.SuccessValue<ArrayValue>(), 1, "field1").Value, Is.EqualTo("ab"));
            Assert.That(IdAt(result.SuccessValue<ArrayValue>(), 2, "field1").Value, Is.EqualTo("b"));
            Assert.That(IdAt(result.SuccessValue<ArrayValue>(), 3, "field1").Value, Is.EqualTo("Z"));

        }
コード例 #16
0
        public void It_Should_Allow_Tags_To_Span_Lines()
        {
            // Arrange
            var templateContext = new TemplateContext();
            IList<IExpressionConstant> objlist = new List<IExpressionConstant>
            {
                DataFixtures.CreateDictionary(1, "Title 1", "Value 1 B"), 
                DataFixtures.CreateDictionary(2, "Title 2", "Value 2 B"), 
                DataFixtures.CreateDictionary(3, "Title 3", "Value 3 B"), 
                DataFixtures.CreateDictionary(4, "Title 4", "Value 4 B"),
            };
            ArrayValue arrayValue = new ArrayValue(objlist);
            templateContext.DefineLocalVariable("posts", arrayValue);
            const string tmpl = @"{%
               for post in posts %}{{
                     post.field1 }}{%
                endfor
              %}";

            var ast = _generator.Generate(tmpl);

            // Act
            String result = Render(templateContext, ast);
            Logger.Log("result is " + result);

            // Assert
            Assert.That(result, Is.EqualTo("Title 1Title 2Title 3Title 4"));

        }
コード例 #17
0
 /**
  * Defines constants
  */
 public bool apc_define_constants(Env env,
                                  string key,
                                  ArrayValue values,
                                  @Optional("true") bool caseSensitive)
コード例 #18
0
        public void It_Should_Render_An_Array_Element_From_A_Variable_in_A_Nested_Element_In_a_Tag()
        {
            // Arrange
            TemplateContext templateContext = new TemplateContext();
            var arrayofbool = new ArrayValue(new List<IExpressionConstant> { new BooleanValue(true), new BooleanValue(false) });
            var array1 = new ArrayValue(new List<IExpressionConstant> { arrayofbool });
            var array2 = new ArrayValue(new List<IExpressionConstant> { array1 });
            

            templateContext.DefineLocalVariable("idx1", NumericValue.Create(0));
            templateContext.DefineLocalVariable("idx2", NumericValue.Create(1));
            templateContext.DefineLocalVariable("array1", array1);
            templateContext.DefineLocalVariable("array2", array2);
            templateContext.DefineLocalVariable("arrayofbool", arrayofbool);
            
            // Act
            var ast = _generator.Generate("Result : {% if array2[0][0][idx1] %}first is TRUE{% endif %}{%if array2[0][0][idx2] %}second is TRUE{% endif %}");
            String result = Render(templateContext, ast);
            Logger.Log(result);
            // Assert
            Assert.That(result, Is.EqualTo("Result : first is TRUE"));

        }
コード例 #19
0
        public void It_Should_Return_Empty_When_Index_Is_Empty()
        {
            // Arrange
            TemplateContext templateContext = new TemplateContext();
            var arrayofnums = new ArrayValue(new List<IExpressionConstant> { NumericValue.Create(0), NumericValue.Create(1) });

            templateContext.DefineLocalVariable("arrayofnums", arrayofnums);

            // Arrange
            var ast = _generator.Generate("Result : {{ arrayofnums[4][arrayofnums[4]] }}");

            // Act
            String result = Render(templateContext, ast);
            // Act

            // Assert
            Assert.That(result, Is.EqualTo("Result : "));

        }
コード例 #20
0
        static void Main(string[] args)
        {
            try
            {
                var assemblyPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
                var commandLine  = new CommandLineParser();
                commandLine.Parse(args);

                if (commandLine.Has("help"))
                {
                    Console.WriteLine("编译器可使用下列参数:");
                    Console.Write("-S");
                    Console.WriteLine("\t[编译选项][必选],输入的源程序路径。");
                    Console.WriteLine();

                    Console.Write("-RUN");
                    Console.WriteLine("\t[运行选项][可选],使用该选项后,源程序将不会被编译(忽略编译参数),直接解析运行源程序。");
                    Console.WriteLine();

                    Console.Write("-ARCH");
                    Console.WriteLine("\t[编译选项][可选][默认值:x86],选择目标运行平台的机器架构,可用架构系统:");
                    {
                        var files = Directory.GetFiles(assemblyPath, "*.Loader");
                        var archs = files.Select((s) =>
                        {
                            var temp = Path.GetFileNameWithoutExtension(s).Split('.');
                            if (temp.Length == 3)
                            {
                                return(temp[2]);
                            }
                            return(string.Empty);
                        }).Distinct();
                        foreach (var a in archs)
                        {
                            Console.WriteLine($"\t\t{a}");
                        }
                    }
                    Console.WriteLine();

                    Console.Write("-OS");
                    Console.WriteLine("\t[编译选项][可选][默认值:windows],选择目标运行平台的操作系统,可用系统名称:");
                    {
                        var files = Directory.GetFiles(assemblyPath, "*.Loader");
                        var archs = files.Select((s) =>
                        {
                            var temp = Path.GetFileNameWithoutExtension(s).Split('.');
                            if (temp.Length == 3)
                            {
                                return(temp[1]);
                            }
                            return(string.Empty);
                        }).Distinct();
                        foreach (var a in archs)
                        {
                            Console.WriteLine($"\t\t{a}");
                        }
                    }
                    Console.WriteLine();

                    Console.Write("-I");
                    Console.WriteLine("\t[链接选项][可选][默认值:根据选择的OS和ARCH自动选择],选择函数导入表文件,可用名称:");
                    {
                        var files = Directory.GetFiles(assemblyPath, "*.def");
                        var archs = files.Select((s) => Path.GetFileName(s)).Distinct();
                        foreach (var a in archs)
                        {
                            Console.WriteLine($"\t\t{a}");
                        }
                    }
                    Console.WriteLine();

                    Console.Write("-T");
                    Console.WriteLine("\t[链接选项][可选][默认值:EXE],选择输出文件类型,可用类型:");
                    {
                        Console.WriteLine("\t\tASM\t字节码汇编文件。");
                        Console.WriteLine("\t\tBIN\t字节码文件。");
                        Console.WriteLine("\t\tEXE\t可执行文件。");
                    }
                    Console.WriteLine();

                    Console.Write("-O");
                    Console.WriteLine("\t[链接选项][可选][默认值:output],选择输出文件路径。");
                    Console.WriteLine();


                    Console.Write("-help");
                    Console.WriteLine("\t[帮助选项][可选],显示本页信息。");
                    Console.WriteLine();
                }
                else if (commandLine.Has("S"))
                {
                    var source = commandLine.GetValue("S", "");
                    if (!Path.IsPathRooted(source))
                    {
                        source = Path.GetFullPath(source);
                    }

                    Lexer         lexer  = new Lexer(new SourceInputStream(source));
                    GrammarParser parser = new GrammarParser();
                    var           ast    = parser.ParseProgram(lexer);

                    if (commandLine.Has("RUN"))
                    {
                        Console.Clear();
                        DemoActuator vm    = new DemoActuator();
                        var          vargs = new ArrayValue(args.Length, 1);
                        for (int i = 0; i < args.Length; ++i)//命令行参数
                        {
                            vargs.SetValue(i, 0, new StringValue(args[i]));
                        }
                        vm.GVariableTable["命令行参数"] = vargs;
                        ast.Execute(vm);
                    }
                    else
                    {
                        Compiler compiler   = new Compiler();
                        var      arch       = commandLine.GetValue("ARCH", "x86");
                        var      os         = commandLine.GetValue("OS", "windows");
                        var      importFile = commandLine.GetValue("I", $"import.{arch}.{os}.def");
                        var      type       = commandLine.GetValue("T", "EXE");
                        var      output     = commandLine.GetValue("O", "output");

                        if (!Path.IsPathRooted(importFile))
                        {
                            importFile = Path.Combine(assemblyPath, importFile);
                        }

                        if (!Path.IsPathRooted(output))
                        {
                            output = Path.Combine(Path.GetDirectoryName(source), output);
                        }

                        compiler.LoadImportDefine(importFile);
                        ast.Compile(compiler);

                        if (string.Compare(type, "ASM") == 0)
                        {
                            if (!Path.HasExtension(output))
                            {
                                output += ".asm";
                            }
                            compiler.LinkProgram(output, Compiler.OutputType.ASM, string.Empty);
                        }
                        else if (string.Compare(type, "BIN", true) == 0)
                        {
                            if (!Path.HasExtension(output))
                            {
                                output += ".bin";
                            }
                            compiler.LinkProgram(output, Compiler.OutputType.BIN, string.Empty);
                        }
                        else
                        {
                            if (!Path.HasExtension(output))
                            {
                                if (os == "windows")
                                {
                                    output += ".exe";
                                }
                                else if (os == "linux")
                                {
                                    output += ".elf";
                                }
                            }
                            string loaderPath = Path.Combine(assemblyPath, $"link.{os}.{arch}.Loader");
                            compiler.LinkProgram(output, Compiler.OutputType.EXE, loaderPath);
                        }
                    }
                }
                else
                {
                    throw new ArgumentNullException("S", "必需输入源程序路径.");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
コード例 #21
0
        public void It_Should_Render_An_Array_Element()
        {
            // Arrange
            TemplateContext templateContext = new TemplateContext();
            var list = new ArrayValue(new List<IExpressionConstant> { new StringValue("aaa"), NumericValue.Create(123m) });

            templateContext.DefineLocalVariable("myarray", list);

            // Arrange
            var ast = _generator.Generate("Result : {{ myarray[1] }}");

            // Act
            String result = Render(templateContext, ast);
            // Act

            // Assert
            Assert.That(result, Is.EqualTo("Result : 123.0"));

        }
コード例 #22
0
        static void fillPost(Env env,
                             ArrayValue postArray,
                             ArrayValue files,
                             InputStream @is,
                             string contentType,
                             string encoding,
                             int contentLength,
                             bool addSlashesToValues,
                             bool isAllowUploads)
        {
            long maxPostSize = env.getIniBytes("post_max_size", 0);

            try {
                if (encoding == null)
                {
                    encoding = env.getHttpInputEncoding();
                }

                if (contentType != null &&
                    contentType.startsWith("multipart/form-data"))
                {
                    string boundary = getBoundary(contentType);

                    ReadStream rs = new ReadStream(new VfsStream(@is, null));

                    if (boundary == null)
                    {
                        env.warning(L.l("multipart/form-data POST @is missing boundary"));

                        return;
                    }

                    MultipartStream ms = new MultipartStream(rs, boundary);

                    if (encoding != null)
                    {
                        ms.setEncoding(encoding);
                    }

                    readMultipartStream(env, ms, postArray, files,
                                        addSlashesToValues, isAllowUploads);

                    rs.close();

                    if (rs.getLength() > maxPostSize)
                    {
                        env.warning(L.l("POST length of {0} exceeds max size of {1}",
                                        rs.getLength(),
                                        maxPostSize));

                        postArray.clear();
                        files.clear();

                        return;
                    }
                }
                else
                {
                    StringValue bb = env.createBinaryBuilder();

                    bb.appendReadAll(@is, Integer.MAX_VALUE);

                    if (bb.length() > maxPostSize)
                    {
                        env.warning(L.l("POST length of {0} exceeds max size of {1}",
                                        bb.length(),
                                        maxPostSize));
                        return;
                    }

                    env.setInputData(bb);

                    if (contentType != null &&
                        contentType.startsWith("application/x-www-form-urlencoded"))
                    {
                        StringUtility.parseStr(env, bb, postArray, true, encoding, true);
                    }
                }
            }
            catch (IOException e) {
                env.warning(e);
            }
        }
コード例 #23
0
 public ArrayValue GetAllIndices(ArrayValue array)
 {
     this.log.AppendLine($"Array.GetAllIndices(array: '{array.ToDisplayString()}')");
     return(new ArrayValue());
 }
コード例 #24
0
 private static IExpressionConstant IdAt(ArrayValue result, int index, String field)
 {
     return ((DictionaryValue)result.ArrValue[index].Value).DictValue[field].Value;
 }
コード例 #25
0
 private LiquidExpressionResult Contains(ArrayValue arrayValue, IExpressionConstant expressionConstant)
 {
     return LiquidExpressionResult.Success(new BooleanValue(arrayValue.ArrValue.Any(IsEqual(expressionConstant))));
 }
コード例 #26
0
        private static void addFormFile(Env env,
                                        ArrayValue files,
                                        string name,
                                        string fileName,
                                        string tmpName,
                                        string mimeType,
                                        long fileLength,
                                        bool addSlashesToValues,
                                        long maxFileSize)
        {
            int    p     = name.indexOf('[');
            string index = "";

            if (p >= 0)
            {
                index = name.substring(p);
                name  = name.substring(0, p);
            }

            // php/085j
            name = name.replace("\u0000", "");

            StringValue nameValue = env.createString(name);
            Value       v         = files.get(nameValue).toValue();
            ArrayValue  entry     = null;

            if (v instanceof ArrayValue)
            {
                entry = (ArrayValue)v;
            }

            if (entry == null)
            {
                entry = new ArrayValueImpl();
                files.put(nameValue, entry);
            }

            int error;

            // php/1667
            long uploadMaxFilesize
                = env.getIniBytes("upload_max_filesize", 2 * 1024 * 1024);

            // php/085j
            fileName = fileName.replace("\u0000", "");

            if (fileName.length() == 0)
            {
                // php/0864
                error = FileModule.UPLOAD_ERR_NO_FILE;
            }
            else if (fileLength > uploadMaxFilesize)
            {
                error = FileModule.UPLOAD_ERR_INI_SIZE;
            }
            else if (fileLength > maxFileSize)
            {
                error = FileModule.UPLOAD_ERR_FORM_SIZE;
            }
            else
            {
                error = FileModule.UPLOAD_ERR_OK;
            }

            addFormValue(env, entry, "name" + index, env.createString(fileName),
                         null, addSlashesToValues, true);

            long size;


            if (error == FileModule.UPLOAD_ERR_OK)
            {
                size = fileLength;
            }
            else
            {
                mimeType = "";
                tmpName  = "";
                size     = 0;
            }

            if (mimeType != null)
            {
                addFormValue(env, entry, "type" + index, env.createString(mimeType),
                             null, addSlashesToValues, true);
            }

            addFormValue(env, entry, "tmp_name" + index, env.createString(tmpName),
                         null, addSlashesToValues, true);

            addFormValue(env, entry, "error" + index, LongValue.create(error),
                         null, addSlashesToValues, true);

            addFormValue(env, entry, "size" + index, LongValue.create(size),
                         null, addSlashesToValues, true);

            addFormValue(env, files, name, entry, null, addSlashesToValues, true);
        }
コード例 #27
0
        public ArrayValue GetAllIndices(ArrayValue array)
        {
            int i = 1;

            return(new ArrayValue(array.Values.ToDictionary(value => (i++).ToString(CultureInfo.CurrentCulture))));
        }
コード例 #28
0
 public abstract bool CompareArrayToString(ArrayValue <StringValue> itemValue, StringValue value);
コード例 #29
0
 public bool setOptions(Env env, ArrayValue array)
 {
     return(false);
 }
コード例 #30
0
ファイル: TaggedData.cs プロジェクト: NeoTim/etch
 protected Object FromArrayValue(ArrayValue av)
 {
     return(av.GetArray());
 }
コード例 #31
0
        /// <summary>
        /// Serialises the specified object into a value node
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public ValueNode Serialise(object obj)
        {
            // Sanity check
            if (obj == null) return null;

            Type t = obj.GetType();

            // Is it a map type?
            if (typeof(IDictionary).IsAssignableFrom(t))
            {
                // Create a map type
                MapValue mapVal = new MapValue();
                IDictionary dict = obj as IDictionary;
                foreach (var key in dict.Keys)
                {
                    if (key is string)
                    {
                        ValueNode tmp;
                        if (translateOpts.Serialise(dict[key], out tmp))
                            mapVal.Add(key as string, tmp);
                        else
                            mapVal.Add(key as string, null);
                    }
                }
                return mapVal;
            }

            // Is it an array type?
            else if (t.IsArray)
            {
                // Create an array type
                ArrayValue arrVal = new ArrayValue();
                var arr = obj as Array;
                for (int i = 0; i < arr.Length; i++)
                {
                    ValueNode tmp;
                    if (translateOpts.Serialise(arr.GetValue(i), out tmp))
                        arrVal.Add(tmp);
                    else
                        arrVal.Add(null);
                }
                return arrVal;
            }
            else if (typeof(IList).IsAssignableFrom(t))
            {
                // Create an array type
                ArrayValue arrVal = new ArrayValue();
                var list = obj as IList;
                for (int i = 0; i < list.Count; i++)
                {
                    ValueNode tmp;
                    if (translateOpts.Serialise(list[i], out tmp))
                        arrVal.Add(tmp);
                    else
                        arrVal.Add(null);
                }
                return arrVal;
            }
            else if (typeof(ICollection).IsAssignableFrom(t))
            {
                // Create an array type
                ArrayValue arrVal = new ArrayValue();
                var collection = obj as ICollection;
                foreach (object item in collection)
                {
                    ValueNode tmp;
                    if (translateOpts.Serialise(item, out tmp))
                        arrVal.Add(tmp);
                    else
                        arrVal.Add(null);
                }
                return arrVal;
            }

            // Fill a map via reflection
            MapValue mapValue = new MapValue();
            foreach (var field in t.GetFields(BindingFlags.Public | BindingFlags.Instance))
            {
                ValueNode tmp;
                if (translateOpts.Serialise(field.GetValue(obj), out tmp) && tmp != null)
                    mapValue.Add(field.Name, tmp);
            }
            foreach (var property in t.GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                if (property.GetGetMethod() != null)
                {
                    ValueNode tmp;
                    if (translateOpts.Serialise(property.GetValue(obj, null), out tmp) && tmp != null)
                        mapValue.Add(property.Name, tmp);
                }
            }

            return mapValue;
        }
コード例 #32
0
        public static Value parseStr(Env env,
                                     CharSequence str,
                                     ArrayValue result,
                                     bool isRef,
                                     string encoding,
                                     bool isMagicQuotes,
                                     bool isReplaceSpacesWithUnderscores,
                                     int [] querySeparatorMap)
        {
            try {
                ByteToChar byteToChar = env.getByteToChar();

                if (encoding != null)
                {
                    byteToChar.setEncoding(encoding);
                }

                int len = str.length();

                for (int i = 0; i < len; i++)
                {
                    int ch = 0;
                    byteToChar.clear();

                    for (;
                         i < len && isSeparator(querySeparatorMap, ch = str[i]);
                         i++)
                    {
                    }

                    for (; i < len &&
                         (ch = str[i]) != '=' &&
                         !isSeparator(querySeparatorMap, ch);
                         i++)
                    {
                        i = addQueryChar(byteToChar, str, len, i, ch, querySeparatorMap);
                    }

                    string key = byteToChar.getConvertedString();

                    byteToChar.clear();

                    string value;
                    if (ch == '=')
                    {
                        for (i++; i < len &&
                             !isSeparator(querySeparatorMap, (ch = str[i])); i++)
                        {
                            i = addQueryChar(byteToChar, str, len, i, ch, querySeparatorMap);
                        }

                        value = byteToChar.getConvertedString();
                    }
                    else
                    {
                        value = "";
                    }

                    if (key.length() == 0)
                    {
                        // php/php/080d
                        // http://bugs.caucho.com/view.php?id=4998

                        continue;
                    }
                    else if (isRef)
                    {
                        Post.addFormValue(env, result, key,
                                          new String[] { value },
                                          isMagicQuotes, isReplaceSpacesWithUnderscores);
                    }
                    else
                    {
                        // If key @is an exsiting array, then append
                        // this value to existing array
                        // Only use extract(EXTR_OVERWRITE) on non-array variables or
                        // non-existing arrays
                        int openBracketIndex  = key.indexOf('[');
                        int closeBracketIndex = key.indexOf(']');
                        if (openBracketIndex == 0)
                        {
                            // http://bugs.caucho.com/view.php?id=4998

                            continue;
                        }
                        else if (openBracketIndex > 0)
                        {
                            string arrayName = key.substring(0, openBracketIndex);
                            arrayName = arrayName.replace('.', '_');

                            Value v = env.getVar(arrayName).getRawValue();
                            if (v instanceof ArrayValue)
                            {
                                //Check to make sure valid string (ie: foo[...])
                                if (closeBracketIndex < 0)
                                {
                                    env.warning(L.l("invalid array {0}", key));
                                    return(NullValue.NULL);
                                }

                                if (closeBracketIndex > openBracketIndex + 1)
                                {
                                    string index = key.substring(key.indexOf('[') + 1,
                                                                 key.indexOf(']'));
                                    v.put(env.createString(index), env.createString(value));
                                }
                                else
                                {
                                    v.put(env.createString(value));
                                }
                            }
                            else
                            {
                                Post.addFormValue(env, result, key,
                                                  new String[] { value },
                                                  isMagicQuotes, isReplaceSpacesWithUnderscores);
                            }
                        }
                        else
                        {
                            Post.addFormValue(env, result, key,
                                              new String[] { value },
                                              isMagicQuotes, isReplaceSpacesWithUnderscores);
                        }
                    }
コード例 #33
0
        public void It_Should_Iterate_Through_A_Nested_Collection()
        {
            // Arrange
            const string templateString = "Result : {% for subarray in array1 %}"
                                        + "<tr>{% for item in subarray %}"
                                        + "<td>{{item}}</td>"
                                        + "{% endfor %}"
                                        + "</tr>{% endfor %}";
            TemplateContext ctx = new TemplateContext();
            var numericValues = Enumerable.Range(0, 3).Select(x => (IExpressionConstant) NumericValue.Create(x)).ToList();
            var array2 = new ArrayValue(numericValues);
            //var array1 = Enumerable.Range(0, 3).Select(x => new ArrayValue(array2);
            var array1 = new ArrayValue(new List<IExpressionConstant> { array2, array2, array2 });
            ctx.DefineLocalVariable("array1", array1);
            
            var template = LiquidTemplate.Create(templateString);

            // Act
            String result = template.Render(ctx);

            // Assert
            String row = "<tr><td>0</td><td>1</td><td>2</td></tr>";
            Assert.That(result, Is.EqualTo("Result : "+row + row + row));
        }
コード例 #34
0
 public override bool CompareArrayToString(ArrayValue <StringValue> itemValue, StringValue value)
 {
     return(itemValue.Values.All(x => !Compare(x, value)));
 }
コード例 #35
0
        private static void putRequestMap(Env env,
                                          ArrayValue post,
                                          ArrayValue files,
                                          QuercusHttpServletRequest request,
                                          bool addSlashesToValues,
                                          bool isAllowUploads)
        {
            // this call consumes the inputstream
            Map <String, String[]> map = request.getParameterMap();

            if (map == null)
            {
                return;
            }

            long maxFileSize = Long.MAX_VALUE;

            Value maxFileSizeV = post.get(env.createString("MAX_FILE_SIZE"));

            if (maxFileSizeV.isNull())
            {
                maxFileSize = maxFileSizeV.toLong();
            }

            if (isAllowUploads)
            {
                for (Map.Entry <String, String[]> entry : map.entrySet())
                {
                    string key = entry.getKey();

                    int len = key.length();

                    if (len < 10 || !key.endsWith(".filename"))
                    {
                        continue;
                    }

                    string name = key.substring(0, len - 9);

                    string [] fileNames = request.getParameterValues(name + ".filename");
                    string [] tmpNames  = request.getParameterValues(name + ".file");
                    string [] mimeTypes
                        = request.getParameterValues(name + ".content-type");

                    for (int i = 0; i < fileNames.length; i++)
                    {
                        long fileLength = new FilePath(tmpNames[i]).getLength();

                        addFormFile(env, files, name, fileNames[i], tmpNames[i],
                                    mimeTypes[i],
                                    fileLength,
                                    addSlashesToValues,
                                    maxFileSize);
                    }
                }
            }

            ArrayList <String> keys = new ArrayList <String>();

            keys.addAll(request.getParameterMap().keySet());

            Collections.sort(keys);

            for (String key : keys)
            {
                string [] value = request.getParameterValues(key);

                Post.addFormValue(env, post, key, value, addSlashesToValues, true);
            }
        }
コード例 #36
0
        /// <summary>
        /// Returns true if a ValueNode graph contains a cycle
        /// </summary>
        /// <param name="node">Node to evaluate</param>
        /// <param name="seenNodes">Set of nodes previously seen on the current arc. Callers may pass a non-empty set
        /// to test whether adding that set to this node would create a cycle. Contents will be modified by the walk
        /// and should not be used by the caller after returning</param>
        /// <param name="allNodesSeen">Optional. The set of all nodes encountered during a walk after DetectCycle returns</param>
        /// <returns></returns>
        public static bool DetectCycle(this SingleValue node, HashSet <SingleValue> seenNodes, HashSet <SingleValue>?allNodesSeen)
        {
            if (node == null)
            {
                return(false);
            }

            if (seenNodes.Contains(node))
            {
                return(true);
            }

            seenNodes.Add(node);

            if (allNodesSeen != null)
            {
                allNodesSeen.Add(node);
            }

            bool foundCycle = false;

            switch (node)
            {
            //
            // Leaf nodes
            //
            case UnknownValue:
            case NullValue:
            case SystemTypeValue:
            case RuntimeTypeHandleValue:
            case KnownStringValue:
            case ConstIntValue:
            case MethodParameterValue:
            case MethodThisParameterValue:
            case MethodReturnValue:
            case GenericParameterValue:
            case RuntimeTypeHandleForGenericParameterValue:
            case SystemReflectionMethodBaseValue:
            case RuntimeMethodHandleValue:
            case FieldValue:
                break;

            //
            // Nodes with children
            //
            case ArrayValue:
                ArrayValue av = (ArrayValue)node;
                foundCycle = av.Size.DetectCycle(seenNodes, allNodesSeen);
                foreach (ValueBasicBlockPair pair in av.IndexValues.Values)
                {
                    foreach (var v in pair.Value)
                    {
                        foundCycle |= v.DetectCycle(seenNodes, allNodesSeen);
                    }
                }
                break;

            case RuntimeTypeHandleForNullableValueWithDynamicallyAccessedMembers value:
                foundCycle = value.UnderlyingTypeValue.DetectCycle(seenNodes, allNodesSeen);
                break;

            case NullableValueWithDynamicallyAccessedMembers value:
                foundCycle = value.UnderlyingTypeValue.DetectCycle(seenNodes, allNodesSeen);
                break;

            default:
                throw new Exception(String.Format("Unknown node type: {0}", node.GetType().Name));
            }
            seenNodes.Remove(node);

            return(foundCycle);
        }
コード例 #37
0
 public decimal GetItemCount(ArrayValue array)
 {
     this.log.AppendLine($"Array.GetItemCount(array: '{array.ToDisplayString()}')");
     return(0m);
 }
コード例 #38
0
ファイル: ArrayLibrary.cs プロジェクト: sb/smallbasic-editor
 public bool ContainsIndex(ArrayValue array, string index) => array.ContainsKey(index);
コード例 #39
0
        public void It_Should_Render_An_Array_In_A_Dictionary()
        {
            // Arrange
            TemplateContext templateContext = new TemplateContext();
            var list = new ArrayValue(new List<IExpressionConstant>{ new StringValue("aaa"), NumericValue.Create(123m) } );
            var dict = new Dictionary<String, IExpressionConstant> { { "test", list } };

            templateContext.DefineLocalVariable("mydict", new DictionaryValue(dict));

            // Arrange
            var ast = _generator.Generate("Result : {{ mydict.test[0] }}");

            // Act
            String result = Render(templateContext, ast);
            // Act

            // Assert
            Assert.That(result, Is.EqualTo("Result : aaa"));

        }
コード例 #40
0
ファイル: ArrayLibrary.cs プロジェクト: sb/smallbasic-editor
 public bool ContainsValue(ArrayValue array, string value) => array.Values.Any(existing => existing.ToString() == value);
コード例 #41
0
        public void It_Should_Render_An_Array_Element_From_A_Nested_Index()
        {
            // Arrange
            TemplateContext templateContext = new TemplateContext();
            var indexlist = new ArrayValue(new List<IExpressionConstant> { NumericValue.Create(0), NumericValue.Create(1) });
            var list = new ArrayValue(new List<IExpressionConstant> { new StringValue("aaa"), new StringValue("bbb") });

            templateContext.DefineLocalVariable("indexes", indexlist);
            templateContext.DefineLocalVariable("myarray", list);

            // Arrange
            var ast = _generator.Generate("Result : {{ myarray[indexes[1]] }}");

            // Act
            String result = Render(templateContext, ast);
            // Act

            // Assert
            Assert.That(result, Is.EqualTo("Result : bbb"));

        }
コード例 #42
0
ファイル: ArrayLibrary.cs プロジェクト: sb/smallbasic-editor
        public ArrayValue GetAllIndices(ArrayValue array)
        {
            int i = 1;

            return(new ArrayValue(array.Keys.Select(k => StringValue.Create(k)).ToDictionary(value => (i++).ToString(CultureInfo.CurrentCulture))));
        }
コード例 #43
0
        public void It_Should_Render_An_Array_Element_From_A_Crazy_Chain_of_Nested_Indexes()
        {
            // Arrange
            TemplateContext templateContext = new TemplateContext();
            var arrayofnums = new ArrayValue(new List<IExpressionConstant> { NumericValue.Create(0), NumericValue.Create(1) });
            var array1 = new ArrayValue(new List<IExpressionConstant> { arrayofnums });
            var array2 = new ArrayValue(new List<IExpressionConstant> { array1 });
            var arrayofstr = new ArrayValue(new List<IExpressionConstant> { new StringValue("aaa"), new StringValue("bbb") });

            //templateContext.Define("arrayofnums", new NumericValue(1));
            templateContext.DefineLocalVariable("arrayofnums", arrayofnums);
            templateContext.DefineLocalVariable("array1", array1);
            templateContext.DefineLocalVariable("array2", array2);
            templateContext.DefineLocalVariable("arrayofstr", arrayofstr);

            // Arrange
            var ast = _generator.Generate("Result : {{ arrayofstr[array2[0][0][arrayofnums[arrayofnums[1]]]] }}");

            // Act
            String result = Render(templateContext, ast);
            // Act

            // Assert
            Assert.That(result, Is.EqualTo("Result : bbb"));

        }
コード例 #44
0
ファイル: ArrayLibrary.cs プロジェクト: sb/smallbasic-editor
 public decimal GetItemCount(ArrayValue array) => array.Count;
コード例 #45
0
        public void It_Should_Return_An_Error_If_A_Number_Is_Treated_Like_An_Array()
        {
            // Arrange
            TemplateContext templateContext = new TemplateContext();
            var arrayofnums = new ArrayValue(new List<IExpressionConstant> { NumericValue.Create(0), NumericValue.Create(1) });

            templateContext.DefineLocalVariable("arrayofnums", arrayofnums);
            templateContext.DefineLocalVariable("numeric", NumericValue.Create(1));

            // Arrange
            var ast = _generator.Generate("Result : {{ arrayofnums[4][numeric[4]] }}");

            // Act
            String result = Render(templateContext, ast);

            // Act

            // Assert
            Assert.That(result, Is.StringContaining("cannot apply an index to a numeric."));

        }
コード例 #46
0
 public override Value GetValue(UserItem item)
 {
     return(ArrayValue <StringValue> .Create(item.Item.Tags?.Select(StringValue.Create).ToArray()));
 }
コード例 #47
0
ファイル: Functions.cs プロジェクト: Dugin13/P10
 // Generalized n-argument map
 public static Value Map(Value[] vs)
 {
     int n = vs.Length - 1;
       if (n < 1)
     return ErrorValue.argCountError;
       if (vs[0] is ErrorValue) return vs[0];
       FunctionValue fv = vs[0] as FunctionValue;
       if (fv == null)
     return ErrorValue.argTypeError;
       if (fv.Arity != n)
     return ErrorValue.argCountError;
       ArrayValue[] arrs = new ArrayValue[n];
       for (int i = 0; i < n; i++) {
     Value vi = vs[i + 1];
     if (vi is ArrayValue)
       arrs[i] = vi as ArrayValue;
     else if (vi is ErrorValue)
       return vi;
     else
       return ErrorValue.argTypeError;
       }
       int cols = arrs[0].Cols, rows = arrs[0].Rows;
       for (int i=1; i<n; i++)
     if (arrs[i].Cols != cols || arrs[i].Rows != rows)
       return ErrorValue.Make("#ERR: Array shapes differ");
       Value[] args = new Value[n];
       Value[,] result = new Value[cols, rows];
       for (int c = 0; c < cols; c++)
     for (int r = 0; r < rows; r++) {
       for (int i = 0; i < n; i++)
     args[i] = arrs[i][c, r];
       result[c, r] = fv.Apply(args);
     }
       return new ArrayExplicit(result);
 }
コード例 #48
0
        private static void addFormFile(Env env,
                                        ArrayValue files,
                                        string fileName,
                                        string tmpName,
                                        string mimeType,
                                        long fileLength,
                                        bool addSlashesToValues,
                                        long maxFileSize)
        {
            ArrayValue entry = new ArrayValueImpl();
            int        error;

            // php/1667
            long uploadMaxFilesize
                = env.getIniBytes("upload_max_filesize", 2 * 1024 * 1024);

            // php/085j
            fileName = fileName.replace("\u0000", "");

            if (fileName.length() == 0)
            {
                // php/0864
                error = FileModule.UPLOAD_ERR_NO_FILE;
            }
            else if (fileLength > uploadMaxFilesize)
            {
                error = FileModule.UPLOAD_ERR_INI_SIZE;
            }
            else if (fileLength > maxFileSize)
            {
                error = FileModule.UPLOAD_ERR_FORM_SIZE;
            }
            else
            {
                error = FileModule.UPLOAD_ERR_OK;
            }

            addFormValue(env, entry, "name", env.createString(fileName),
                         null, addSlashesToValues, true);

            long size;

            if (error != FileModule.UPLOAD_ERR_INI_SIZE)
            {
                size = fileLength;
            }
            else
            {
                mimeType = "";
                tmpName  = "";
                size     = 0;
            }

            if (mimeType != null)
            {
                addFormValue(env, entry, "type", env.createString(mimeType),
                             null, addSlashesToValues, true);

                entry.put("type", mimeType);
            }

            addFormValue(env, entry, "tmp_name", env.createString(tmpName),
                         null, addSlashesToValues, true);

            addFormValue(env, entry, "error", LongValue.create(error),
                         null, addSlashesToValues, true);

            addFormValue(env, entry, "size", LongValue.create(size),
                         null, addSlashesToValues, true);

            addFormValue(env, files, null, entry, null, addSlashesToValues, true);
        }
コード例 #49
0
        private static void readMultipartStream(Env env,
                                                MultipartStream ms,
                                                ArrayValue postArray,
                                                ArrayValue files,
                                                bool addSlashesToValues,
                                                bool isAllowUploads)

        {
            ReadStream is;

            while ((@is = ms.openRead()) != null)
            {
                string attr = (String)ms.getAttribute("content-disposition");

                if (attr == null || !attr.startsWith("form-data"))
                {
                    // XXX: @is this an error?
                    continue;
                }

                string name     = getAttribute(attr, "name", addSlashesToValues);
                string filename = getAttribute(attr, "filename", addSlashesToValues);

                if (filename != null)
                {
                    int slashIndex  = filename.lastIndexOf('/');
                    int slashIndex2 = filename.lastIndexOf('\\');

                    slashIndex = Math.max(slashIndex, slashIndex2);

                    if (slashIndex >= 0)
                    {
                        filename = filename.substring(slashIndex + 1);
                    }
                }

                int bracketIndex = -1;

                if (name != null)
                {
                    bracketIndex = name.lastIndexOf(']');
                }

                if (bracketIndex >= 0 && bracketIndex < name.length() - 1)
                {
                    // php/085c
                }
                else if (filename == null)
                {
                    StringValue value = env.createStringBuilder();

                    value.appendReadAll(@is, Integer.MAX_VALUE);

                    if (name != null)
                    {
                        addFormValue(env, postArray, name, value, null, addSlashesToValues, true);
                    }
                    else
                    {
                        env.warning(L.l("file upload @is missing name and filename"));
                    }
                }
                else
                {
                    if (!isAllowUploads)
                    {
                        continue;
                    }

                    string tmpName   = "";
                    long   tmpLength = 0;

                    // A POST file upload with an empty string as the filename does not
                    // create a temp file in the upload directory.

                    if (filename.length() > 0)
                    {
                        string tmpPath = env.getUploadDirectory().createTempFile("php", ".tmp");

                        env.addRemovePath(tmpPath);

                        WriteStream os = tmpPath.openWrite();
                        try {
                            os.writeStream(is);
                        } finally {
                            os.close();
                        }

                        tmpName   = tmpPath.getFullPath();
                        tmpLength = tmpPath.getLength();
                    }

                    // php/0865
                    //
                    // A header like "Content-Type: image/gif" indicates the mime type
                    // for an uploaded file.

                    string mimeType = getAttribute(attr, "mime-type", addSlashesToValues);
                    if (mimeType == null)
                    {
                        mimeType = (String)ms.getAttribute("content-type");

                        // php/085f
                        if (mimeType != null && mimeType.endsWith(";"))
                        {
                            mimeType = mimeType.substring(0, mimeType.length() - 1);
                        }
                    }

                    // php/0864
                    //
                    // mime type @is empty string when no file @is uploaded.

                    if (filename.length() == 0)
                    {
                        mimeType = "";
                    }

                    long maxFileSize = Long.MAX_VALUE;

                    Value maxFileSizeV = postArray.get(env.createString("MAX_FILE_SIZE"));
                    if (!maxFileSizeV.isNull())
                    {
                        maxFileSize = maxFileSizeV.toLong();
                    }

                    if (name != null)
                    {
                        addFormFile(env, files, name, filename, tmpName,
                                    mimeType, tmpLength, addSlashesToValues, maxFileSize);
                    }
                    else
                    {
                        addFormFile(env, files, filename, tmpName,
                                    mimeType, tmpLength, addSlashesToValues, maxFileSize);
                    }
                }
            }
        }
コード例 #50
0
        public static void generate(PrintWriter @out, ArrayValue array)

        {
            int size = array.getSize();
            int bins = size / MAX_SIZE;

            if (size % MAX_SIZE > 0)
            {
                bins++;
            }

            int bin = 0;

            Value [] keys   = array.keysToArray();
            Value [] values = array.valuesToArray();

            @out.print("new ArrayValueComponent[] {");

            while (bin < bins)
            {
                int binSize = MAX_SIZE;

                if (bin != 0)
                {
                    @out.print(", ");
                }

                if (bin + 1 == bins)
                {
                    binSize = size - bin * MAX_SIZE;
                }

                @out.println("new ArrayValueComponent() {");
                @out.println("    public void init() {");

                @out.print("      _keys = new Value[] {");
                for (int i = 0; i < binSize; i++)
                {
                    if (i != 0)
                    {
                        @out.print(", ");
                    }

                    keys[i + bin * MAX_SIZE].generate(out);
                }
                @out.println("};");

                @out.print("      _values = new Value[] {");
                for (int i = 0; i < binSize; i++)
                {
                    if (i != 0)
                    {
                        @out.print(", ");
                    }

                    values[i + bin * MAX_SIZE].generate(out);
                }
                @out.println("};");

                @out.println("    }");
                @out.println("  }");

                bin++;
            }

            @out.print("}");
        }
コード例 #51
0
 /// <summary cref="IValueVisitor.Visit(ArrayValue)"/>
 public void Visit(ArrayValue value) =>
 throw new InvalidCodeGenerationException();
コード例 #52
0
 /**
  * Splices.
  */
 public ArrayValue splice(int start, int end, ArrayValue replace)
 {
     return(getCopyArray().splice(start, end, replace));
 }
コード例 #53
0
 public override bool CompareArrayToString(ArrayValue <StringValue> itemValue, StringValue value)
 {
     return(itemValue.Values.Any(x => x.Equals(value)));
 }
コード例 #54
0
 internal ArrayValueListValue(ArrayValue array)
 {
     this.Array = array;
 }
コード例 #55
0
        /// <summary>
        /// Populates the a .NET object with the specified value node
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="node"></param>
        public void Deserialise(object obj, ValueNode node)
        {
            // Sanity check
            if (obj == null)
            {
                return;
            }

            Type t = obj.GetType();

            // Is it a map type?
            if (typeof(IDictionary).IsAssignableFrom(t) && node is MapValue)
            {
                IDictionary dict   = obj as IDictionary;
                MapValue    mapVal = node.As <MapValue>();

                // Is it a generic dict?
                if (TranslateOptions.IsGenericType(typeof(IDictionary <,>), t))
                {
                    Type[] genArgs = t.GetGenericArguments();
                    if (genArgs[0] != typeof(string))
                    {
                        return;                               // TODO: Throw error?
                    }
                    foreach (var pair in mapVal)
                    {
                        object val;
                        if (translateOpts.Deserialise(genArgs[1], pair.Value, out val))
                        {
                            dict[pair.Key] = val;
                        }
                    }
                }
                else
                {
                    foreach (var pair in mapVal)
                    {
                        object val;
                        if (translateOpts.Deserialise(null, pair.Value, out val))
                        {
                            dict.Add(pair.Key, val);
                        }
                    }
                }
            }

            // Is it an array type?
            else if (t.IsArray)
            {
                Array      arr         = obj as Array;
                ArrayValue arrVal      = node.As <ArrayValue>();
                Type       elementType = t.GetElementType();
                for (int i = 0; i < Math.Min(arrVal.Count, arr.Length); i++)
                {
                    object val;
                    translateOpts.Deserialise(elementType == typeof(object) ? null : elementType, arrVal[i], out val);
                    arr.SetValue(val, i);
                }
            }
            else if (typeof(IList).IsAssignableFrom(t))
            {
                var        list   = obj as IList;
                ArrayValue arrVal = node.As <ArrayValue>();
                list.Clear();

                // Is it a generic list?
                if (TranslateOptions.IsGenericType(typeof(IList <>), t))
                {
                    Type elementType = t.GetGenericArguments()[0];
                    for (int i = 0; i < arrVal.Count; i++)
                    {
                        object val;
                        translateOpts.Deserialise(elementType == typeof(object) ? null : elementType, arrVal[i], out val);
                        list.Add(val);
                    }
                }
                else
                {
                    for (int i = 0; i < arrVal.Count; i++)
                    {
                        object val;
                        translateOpts.Deserialise(null, arrVal[i], out val);
                        list.Add(val);
                    }
                }
            }
            else if (typeof(ICollection).IsAssignableFrom(t))
            {
                throw new NotImplementedException("Can't deserialise into an ICollection");
            }

            MapValue mapValue = node as MapValue;

            if (mapValue == null)
            {
                return;                   // Throw error?
            }
            foreach (var pair in mapValue)
            {
                MemberInfo member = t.GetMember(pair.Key, BindingFlags.Public | BindingFlags.Instance)
                                    .Where(m => m is FieldInfo || m is PropertyInfo)
                                    .SingleOrDefault();
                if (member != null)
                {
                    FieldInfo fieldInfo = member as FieldInfo;
                    if (fieldInfo != null)
                    {
                        object val;
                        translateOpts.Deserialise(fieldInfo.FieldType, pair.Value, out val);
                        if ((val == null && !fieldInfo.FieldType.IsValueType) || fieldInfo.FieldType.IsAssignableFrom(val.GetType()))
                        {
                            fieldInfo.SetValue(obj, val);
                        }
                    }
                    PropertyInfo propertyInfo = member as PropertyInfo;
                    if (propertyInfo != null)
                    {
                        object val;
                        translateOpts.Deserialise(propertyInfo.PropertyType, pair.Value, out val);
                        if ((val == null && !propertyInfo.PropertyType.IsValueType) || propertyInfo.PropertyType.IsAssignableFrom(val.GetType()))
                        {
                            propertyInfo.SetValue(obj, val, null);
                        }
                    }
                }
            }
        }
コード例 #56
0
 public bool ContainsIndex(ArrayValue array, string index)
 {
     this.log.AppendLine($"Array.ContainsIndex(array: '{array.ToDisplayString()}', index: '{index}')");
     return(false);
 }
コード例 #57
0
        public void It_Should_Remove_The_Upper_For_Limit()
        {
            // Arrange
            const string templateString = "Result : {% for item in array%}<li>{{ item }}</li>{% endfor %}";
            ITemplateContext ctx = new TemplateContext()
                .WithNoForLimit();
            var list = new ArrayValue(
                Enumerable.Range(1, 100)
                .Select(NumericValue.Create)
                .Cast<IExpressionConstant>().ToList());
            ctx.DefineLocalVariable("array", list);
            var template = LiquidTemplate.Create(templateString);

            // Act
            String result = template.Render(ctx);

            // Assert
            Assert.That(result, Is.StringContaining("<li>100</li>"));
        }
コード例 #58
0
 public bool ContainsValue(ArrayValue array, string value)
 {
     this.log.AppendLine($"Array.ContainsValue(array: '{array.ToDisplayString()}', value: '{value}')");
     return(false);
 }
コード例 #59
0
        public void It_Should_Return_The_Same_Object_If_Src_And_Dest_Are_The_Same()
        {
            // Arrange
            var original = new ArrayValue(new List<IExpressionConstant>{NumericValue.Create(123.4m), NumericValue.Create(5)});

            // Act
            var result = ValueCaster.Cast<ArrayValue, ArrayValue>(original).SuccessValue<ArrayValue>();

            // Assert
            Assert.That(result, Is.EqualTo(original));
        }
コード例 #60
0
        public static void addFormValue(Env env,
                                        ArrayValue array,
                                        string key,
                                        Value formValue,
                                        string [] formValueList,
                                        bool addSlashesToValues,
                                        bool isReplaceSpacesWithUnderscores)
        {
            int p = -1;
            int q = -1;

            if (key != null)
            {
                p = key.indexOf('[');
                q = key.indexOf(']', p);
            }

            if (p >= 0 && p < q)
            {
                if (p == 0)
                {
                    // php/080e
                    return;
                }

                int keyStart = 0;
                int keyEnd   = p;

                while (p > 0 && p < q)
                {
                    string currentKey = key.substring(keyStart, keyEnd);

                    if (keyStart == 0)
                    {
                        // php/081p
                        currentKey = currentKey.replace('.', '_');
                    }

                    if (isReplaceSpacesWithUnderscores)
                    {
                        // php/080h
                        currentKey = currentKey.replace(' ', '_');

                        // php/080k
                        isReplaceSpacesWithUnderscores = false;
                    }

                    StringValue currentKeyValue = env.createString(currentKey);
                    Value       currentArray    = array.get(currentKeyValue);

                    if (!currentArray.isArray())
                    {
                        currentArray = new ArrayValueImpl();
                    }

                    if (currentKeyValue.length() == 0)
                    {
                        array.append(currentArray);
                    }
                    else
                    {
                        array.put(currentKeyValue, currentArray);
                    }

                    array = currentArray.toArrayValue(env);

                    keyStart = p + 1;
                    keyEnd   = q;

                    p = key.indexOf('[', q + 1);
                    q = key.indexOf(']', p + 1);
                }

                if (keyEnd > 0)
                {
                    key = key.substring(keyStart, keyEnd);
                }
                else
                {
                    key = key.substring(keyStart);
                }

                if (isReplaceSpacesWithUnderscores)
                {
                    // php/080h
                    key = key.replace(' ', '_');
                }

                if (key.length() == 0)
                {
                    if (formValueList != null)
                    {
                        for (int i = 0; i < formValueList.length; i++)
                        {
                            Value value;

                            if (formValueList[i] != null)
                            {
                                value = env.createString(formValueList[i]);
                            }
                            else
                            {
                                value = NullValue.NULL;
                            }

                            put(array, null, value, addSlashesToValues);
                        }
                    }
                    else
                    {
                        array.put(formValue);
                    }
                }
                else if ('0' <= key[0] && key[0] <= '9')
                {
                    put(array,
                        LongValue.create(StringValue.toLong(key)),
                        formValue,
                        addSlashesToValues);
                }
                else
                {
                    put(array, env.createString(key), formValue, addSlashesToValues);
                }
            }
            else
            {
                if (key != null)
                {
                    key = key.replace('.', '_');

                    if (isReplaceSpacesWithUnderscores)
                    {
                        // php/080h
                        key = key.replace(' ', '_');
                    }

                    put(array, env.createString(key), formValue, addSlashesToValues);
                }
                else
                {
                    put(array, null, formValue, addSlashesToValues);
                }
            }
        }