From 2b95ff2e7cbf7240bfe3ddc93f7604d4f9e1b570 Mon Sep 17 00:00:00 2001 From: 1138-4EB <1138-4EB@users.noreply.github.com> Date: Sun, 15 Apr 2018 13:24:50 +0200 Subject: [PATCH] pass Stringified tb_cfg from VUnit, declare jsonLoadStringified (dummy) --- Examples/Boards_VUnit.vhdl | 13 +- VUnit/run.py | 8 +- vhdl/JSON.pkg.vhdl | 329 +++++++++++++++++++------------------ 3 files changed, 182 insertions(+), 168 deletions(-) diff --git a/Examples/Boards_VUnit.vhdl b/Examples/Boards_VUnit.vhdl index f48db089..0cef85cd 100644 --- a/Examples/Boards_VUnit.vhdl +++ b/Examples/Boards_VUnit.vhdl @@ -7,22 +7,23 @@ entity tb_boards is generic ( runner_cfg : string; tb_path : string; - filename : string + tb_cfg : string ); end entity; architecture tb of tb_boards is - constant JSONContent : T_JSON := jsonLoadFile(tb_path & filename); + constant JSONContent : T_JSON := jsonLoadStringified(tb_cfg); begin main: process begin test_runner_setup(runner, runner_cfg); while test_suite loop if run("test") then - info(tb_path&filename); - info("KC705/FPGADevice: " & jsonGetString(JSONContent, "KC705/FPGADevice")); - info("KC705/IIC/0/Devices/1/Type: " & jsonGetString(JSONContent, "KC705/IIC/0/Devices/1/Type")); - info("DE4/Ethernet/2/PHY_ManagementInterface: " & jsonGetString(JSONContent, "DE4/Ethernet/2/PHY_ManagementInterface")); + info(tb_cfg); + --info(tb_path&filename); + --info("KC705/FPGADevice: " & jsonGetString(JSONContent, "KC705/FPGADevice")); + --info("KC705/IIC/0/Devices/1/Type: " & jsonGetString(JSONContent, "KC705/IIC/0/Devices/1/Type")); + --info("DE4/Ethernet/2/PHY_ManagementInterface: " & jsonGetString(JSONContent, "DE4/Ethernet/2/PHY_ManagementInterface")); end if; end loop; test_runner_cleanup(runner); diff --git a/VUnit/run.py b/VUnit/run.py index f1abe0f2..b996917c 100644 --- a/VUnit/run.py +++ b/VUnit/run.py @@ -9,6 +9,12 @@ lib.add_source_files(join(root, "../vhdl/JSON.pkg.vhdl")) lib.add_source_files(join(root, "../Examples/Boards_VUnit.vhdl")) -vu.set_generic("filename","../Data/Boards2.json") +import json + +file = open('../Data/Boards2.json', 'r') + +generics = json.loads(file.read()) + +vu.set_generic("tb_cfg", json.dumps(generics, separators=(',', ':')) ) vu.main() diff --git a/vhdl/JSON.pkg.vhdl b/vhdl/JSON.pkg.vhdl index e0cb5596..dacce273 100644 --- a/vhdl/JSON.pkg.vhdl +++ b/vhdl/JSON.pkg.vhdl @@ -1,17 +1,17 @@ -- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- -- vim: tabstop=2:shiftwidth=2:noexpandtab -- kate: tab-width 2; replace-tabs off; indent-width 2; --- +-- -- ============================================================================= --- _ ____ ___ _ _ __ __ ___ _ ____ _ --- | / ___| / _ \| \ | | / _| ___ _ __ \ \ / / | | | _ \| | --- _ | \___ \| | | | \| |_____| |_ / _ \| '__|___\ \ / /| |_| | | | | | --- | |_| |___) | |_| | |\ |_____| _| (_) | | |_____\ V / | _ | |_| | |___ +-- _ ____ ___ _ _ __ __ ___ _ ____ _ +-- | / ___| / _ \| \ | | / _| ___ _ __ \ \ / / | | | _ \| | +-- _ | \___ \| | | | \| |_____| |_ / _ \| '__|___\ \ / /| |_| | | | | | +-- | |_| |___) | |_| | |\ |_____| _| (_) | | |_____\ V / | _ | |_| | |___ -- \___/|____/ \___/|_| \_| |_| \___/|_| \_/ |_| |_|____/|_____| -- -- ============================================================================= -- Authors: Patrick Lehmann --- +-- -- Package: JSON parser and query routines -- -- Description: @@ -21,13 +21,13 @@ -- License: -- ============================================================================ -- Copyright 2007-2016 Patrick Lehmann - Dresden, Germany --- +-- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at --- +-- -- http://www.apache.org/licenses/LICENSE-2.0 --- +-- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -71,35 +71,36 @@ package JSON is IndexCount : T_UINT16; Error : STRING(1 to C_JSON_ERROR_MESSAGE_LENGTH); end record; - + type T_JSON_PATH_ELEMENT_TYPE is (PATH_ELEM_KEY, PATH_ELEM_INDEX); - + type T_JSON_PATH_ELEMENT is record StringStart : T_UINT16; StringEnd : T_UINT16; ElementType : T_JSON_PATH_ELEMENT_TYPE; end record; - + type T_JSON_PATH is array(NATURAL range <>) of T_JSON_PATH_ELEMENT; - + impure function jsonLoadFile(FileName : STRING) return T_JSON; - + impure function jsonLoadStringified(Stringified : STRING) return T_JSON; + function jsonParsePath(Path : STRING) return T_JSON_PATH; function jsonGetElementIndex(JSONContext : T_JSON; Path : STRING) return T_UINT16; - + function jsonTrim(str : STRING) return STRING; procedure jsonStringAppend(StringBuffer : inout STRING; StringWriter : inout NATURAL; Message : STRING); - procedure jsonStringClear(StringBuffer : inout STRING; StringWriter : inout NATURAL); - + procedure jsonStringClear(StringBuffer : inout STRING; StringWriter : inout NATURAL); + function jsonNoParserError(JSONContext : T_JSON) return BOOLEAN; function jsonGetErrorMessage(JSONContext : T_JSON) return STRING; function jsonGetContent(JSONContext : T_JSON) return STRING; - + procedure jsonReportIndex(Index : T_JSON_INDEX; Content : STRING; StringBuffer : inout STRING; StringWriter : inout NATURAL); - + function jsonGetBoolean(JSONContext : T_JSON; Path : STRING) return BOOLEAN; function jsonGetString(JSONContext : T_JSON; Path : STRING) return STRING; - + function jsonIsBoolean(JSONContext : T_JSON; Path : STRING) return BOOLEAN; function jsonIsNull(JSONContext : T_JSON; Path : STRING) return BOOLEAN; function jsonIsString(JSONContext : T_JSON; Path : STRING) return BOOLEAN; @@ -124,12 +125,12 @@ package body JSON is begin return (CHARACTER'pos('0') <= CHARACTER'pos(chr)) and (CHARACTER'pos(chr) <= CHARACTER'pos('9')); end function; - + -- function chr_isLowerHexDigit(chr : CHARACTER) return BOOLEAN is -- begin -- return (CHARACTER'pos('a') <= CHARACTER'pos(chr)) and (CHARACTER'pos(chr) <= CHARACTER'pos('f')); -- end function; --- +-- -- function chr_isUpperHexDigit(chr : CHARACTER) return BOOLEAN is -- begin -- return (CHARACTER'pos('A') <= CHARACTER'pos(chr)) and (CHARACTER'pos(chr) <= CHARACTER'pos('F')); @@ -149,7 +150,7 @@ package body JSON is begin return (CHARACTER'pos('A') <= CHARACTER'pos(chr)) and (CHARACTER'pos(chr) <= CHARACTER'pos('Z')); end function; - + function chr_isAlpha(chr : CHARACTER) return BOOLEAN is begin return chr_isLowerAlpha(chr) or chr_isUpperAlpha(chr); @@ -159,12 +160,12 @@ package body JSON is begin return (chr = '_') or (chr = '-') or (chr = '.') or (chr = '#') or (chr = '!') or (chr = '$'); end function; - + function chr_isIdentifier(chr : CHARACTER) return BOOLEAN is begin return chr_isAlpha(chr) or chr_isDigit(chr) or chr_isSpecial(chr); end function; - + function jsonStringMatch(str1 : STRING; str2 : STRING) return BOOLEAN is constant len : NATURAL := imin(str1'length, str2'length); begin @@ -180,12 +181,12 @@ package body JSON is return TRUE; end if; end loop; - -- check special cases, + -- check special cases, return (((str1'length = len) and (str2'length = len)) or -- both strings are fully consumed and equal ((str1'length > len) and (str1(str1'low + len) = C_JSON_NUL)) or -- str1 is longer, but jsonStringlength equals len ((str2'length > len) and (str2(str2'low + len) = C_JSON_NUL))); -- str2 is longer, but jsonStringlength equals len end function; - + procedure jsonStringAppend(StringBuffer : inout STRING; StringWriter : inout NATURAL; Message : STRING) is constant StringStart : NATURAL := StringWriter + 1; constant StringEnd : NATURAL := imin(StringBuffer'high, StringWriter + Message'length); @@ -194,13 +195,13 @@ package body JSON is StringBuffer(StringStart to StringEnd) := Message(Message'low to Message'low + Length - 1); StringWriter := StringEnd; end procedure; - + procedure jsonStringClear(StringBuffer : inout STRING; StringWriter : inout NATURAL) is begin StringBuffer := (StringBuffer'range => C_JSON_NUL); StringWriter := 0; end procedure; - + function jsonTrim(str : STRING) return STRING is begin for i in str'range loop @@ -210,7 +211,7 @@ package body JSON is end loop; return str; end function; - + function to_natural_dec(str : STRING) return INTEGER is variable Result : NATURAL; variable Digit : INTEGER; @@ -221,7 +222,7 @@ package body JSON is return Result; -- return INTEGER'value(str); -- 'value(...) is not supported by Vivado Synth 2014.1 end function; - + function errorMessage(str : string) return STRING is constant ConstNUL : STRING(1 to 1) := (others => C_JSON_NUL); variable Result : STRING(1 to C_JSON_ERROR_MESSAGE_LENGTH); @@ -232,22 +233,22 @@ package body JSON is end if; return Result; end function; - + function jsonNoParserError(JSONContext : T_JSON) return BOOLEAN is begin return (JSONContext.Error(1) = C_JSON_NUL); end function; - + function jsonGetErrorMessage(JSONContext : T_JSON) return STRING is begin return jsonTrim(JSONContext.Error); end function; - + function jsonGetContent(JSONContext : T_JSON) return STRING is begin return JSONContext.Content(1 to JSONContext.ContentCount); end function; - + procedure jsonReportIndex(Index : T_JSON_INDEX; Content : STRING; StringBuffer : inout STRING; StringWriter : inout NATURAL) is -- variable StringBuffer : STRING(1 to 2**15); -- variable StringWriter : T_UINT16; @@ -266,20 +267,26 @@ package body JSON is end loop; -- report StringBuffer(1 to StringWriter - 1) severity NOTE; end procedure; - + + impure function jsonLoadStringified(Stringified : STRING) return T_JSON is + variable Result : T_JSON; + begin + return Result; + end function; + impure function jsonLoadFile(FileName : STRING) return T_JSON is file FileHandle : TEXT open READ_MODE is FileName; variable CurrentLine : LINE; variable CurrentChar : CHARACTER; variable IsString : BOOLEAN; - + variable Result : T_JSON; - + constant VERBOSE : BOOLEAN := C_JSON_VERBOSE or FALSE; constant C_JSON_NULL : STRING(1 to 4) := "null"; constant C_JSON_TRUE : STRING(1 to 4) := "true"; constant C_JSON_FALSE : STRING(1 to 5) := "false"; - + type T_PARSER_STATE is ( ST_HEADER, ST_OBJECT, ST_LIST, @@ -295,14 +302,14 @@ package body JSON is State : T_PARSER_STATE; Index : T_UINT16; end record; - + type T_PARSER_STACK is array(NATURAL range <>) of T_PARSER_STACK_ELEMENT; function printPos(Row : T_UINT16; Column : T_UINT16) return STRING is begin return "Row:" & INTEGER'image(Row) & ", Col:" & INTEGER'image(Column); end function; - + procedure printParserStack(ParserStack : T_PARSER_STACK; StringBuffer : inout STRING; StringWriter : inout NATURAL) is -- variable StringBuffer : STRING(1 to 2**15); -- variable StringWriter : T_UINT16; @@ -320,44 +327,44 @@ package body JSON is variable ParserStack : T_PARSER_STACK(0 to PARSER_DEPTH - 1); variable ContentWriter : T_UINT16; variable IndexWriter : T_UINT16; - + variable StringBuffer : STRING(1 to 2**12); variable StringWriter : T_UINT16; - + variable Debug_Row : T_UINT16; variable Debug_Column : T_UINT16; begin jsonStringClear(StringBuffer, StringWriter); - + StackPointer := 0; ParserStack(StackPointer).State := ST_HEADER; ParserStack(StackPointer).Index := 0; ContentWriter := 0; IndexWriter := 0; - + Result.Error := (1 to 64 => C_JSON_NUL); - + loopi : for i in 0 to Result.Index'high loop exit when endfile(FileHandle); readline(FileHandle, CurrentLine); Debug_Row := Debug_Row + 1; Debug_Column := 0; - + loopj : for j in 1 to CurrentLine'high loop read(CurrentLine, CurrentChar, IsString); next loopi when (IsString = FALSE); Debug_Column := Debug_Column + 1; - + jsonStringClear(StringBuffer, StringWriter); if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, Lf & "---------------------------------------------------" & LF & - "Parser State:" & - " CurrentChar='" & CurrentChar & "'" & - " State=" & T_PARSER_STATE'image(ParserStack(StackPointer).State) & + "Parser State:" & + " CurrentChar='" & CurrentChar & "'" & + " State=" & T_PARSER_STATE'image(ParserStack(StackPointer).State) & " StackPointer=" & INTEGER'image(StackPointer) & LF & "---------------------------------------------------" & LF); end if; - + case ParserStack(StackPointer).State is when ST_HEADER => case CurrentChar is @@ -382,26 +389,26 @@ package body JSON is Result.Index(IndexWriter).Index := IndexWriter; Result.Index(IndexWriter).ElementType := ELEM_STRING; Result.Index(IndexWriter).StringStart := ContentWriter + 1; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_STRING; ParserStack(StackPointer).Index := IndexWriter; when '-' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' => ContentWriter := ContentWriter + 1; Result.Content(ContentWriter) := CurrentChar; - + IndexWriter := IndexWriter + 1; if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Found: Number - Add new IndexElement(NUM) at pos " & INTEGER'image(IndexWriter) & " setting Start to " & INTEGER'image(ContentWriter) & LF); end if; Result.Index(IndexWriter).Index := IndexWriter; Result.Index(IndexWriter).ElementType := ELEM_NUMBER; Result.Index(IndexWriter).StringStart := ContentWriter; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_NUMBER; ParserStack(StackPointer).Index := IndexWriter; @@ -423,10 +430,10 @@ package body JSON is Result.Index(IndexWriter).ElementType := ELEM_NULL; Result.Index(IndexWriter).StringStart := 0; Result.Index(IndexWriter).StringEnd := 0; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_NULL_END; ParserStack(StackPointer).Index := IndexWriter; @@ -448,10 +455,10 @@ package body JSON is Result.Index(IndexWriter).ElementType := ELEM_TRUE; Result.Index(IndexWriter).StringStart := 0; Result.Index(IndexWriter).StringEnd := 0; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_TRUE_END; ParserStack(StackPointer).Index := IndexWriter; @@ -473,10 +480,10 @@ package body JSON is Result.Index(IndexWriter).ElementType := ELEM_FALSE; Result.Index(IndexWriter).StringStart := 0; Result.Index(IndexWriter).StringEnd := 0; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_FALSE_END; ParserStack(StackPointer).Index := IndexWriter; @@ -484,7 +491,7 @@ package body JSON is Result.Error := errorMessage("Parsing Header(" & printPos(Debug_Row, Debug_Column) & "): Char '" & CurrentChar & "' is not allowed."); exit loopi; end case; - + when ST_OBJECT => case CurrentChar is when ' ' | HT => next loopj; @@ -494,7 +501,7 @@ package body JSON is Result.Index(IndexWriter).Index := IndexWriter; Result.Index(IndexWriter).ElementType := ELEM_KEY; Result.Index(IndexWriter).StringStart := ContentWriter + 1; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; @@ -509,7 +516,7 @@ package body JSON is Result.Error := errorMessage("Parsing Object(" & printPos(Debug_Row, Debug_Column) & "): Char '" & CurrentChar & "' is not allowed."); exit loopi; end case; - + when ST_LIST => case CurrentChar is when ' ' | HT => next loopj; @@ -518,10 +525,10 @@ package body JSON is if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Found: Object - Add new IndexElement(OBJ) at pos " & INTEGER'image(IndexWriter) & LF); end if; Result.Index(IndexWriter).Index := IndexWriter; Result.Index(IndexWriter).ElementType := ELEM_OBJECT; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_OBJECT; ParserStack(StackPointer).Index := IndexWriter; @@ -530,10 +537,10 @@ package body JSON is if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Found: List - Add new IndexElement(LIST) at pos " & INTEGER'image(IndexWriter) & LF); end if; Result.Index(IndexWriter).Index := IndexWriter; Result.Index(IndexWriter).ElementType := ELEM_LIST; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_LIST; ParserStack(StackPointer).Index := IndexWriter; @@ -552,16 +559,16 @@ package body JSON is Result.Error := errorMessage("Parsing Link(" & printPos(Debug_Row, Debug_Column) & "): Begin of link has a not allowed CHARACTER."); exit loopi; end if; - + IndexWriter := IndexWriter + 1; if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Found: Link - Add new IndexElement(LNK) at pos " & INTEGER'image(IndexWriter) & " setting Start to " & INTEGER'image(ContentWriter + 1) & LF); end if; Result.Index(IndexWriter).Index := IndexWriter; Result.Index(IndexWriter).ElementType := ELEM_LINK; Result.Index(IndexWriter).StringStart := ContentWriter + 1; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_LINK; ParserStack(StackPointer).Index := IndexWriter; @@ -571,26 +578,26 @@ package body JSON is Result.Index(IndexWriter).Index := IndexWriter; Result.Index(IndexWriter).ElementType := ELEM_STRING; Result.Index(IndexWriter).StringStart := ContentWriter + 1; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_STRING; ParserStack(StackPointer).Index := IndexWriter; when '-' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' => ContentWriter := ContentWriter + 1; Result.Content(ContentWriter) := CurrentChar; - + IndexWriter := IndexWriter + 1; if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Found: Number - Add new IndexElement(NUM) at pos " & INTEGER'image(IndexWriter) & " setting Start to " & INTEGER'image(ContentWriter) & LF); end if; Result.Index(IndexWriter).Index := IndexWriter; Result.Index(IndexWriter).ElementType := ELEM_NUMBER; Result.Index(IndexWriter).StringStart := ContentWriter; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_NUMBER; ParserStack(StackPointer).Index := IndexWriter; @@ -612,10 +619,10 @@ package body JSON is Result.Index(IndexWriter).ElementType := ELEM_NULL; Result.Index(IndexWriter).StringStart := 0; Result.Index(IndexWriter).StringEnd := 0; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_NULL_END; ParserStack(StackPointer).Index := IndexWriter; @@ -637,10 +644,10 @@ package body JSON is Result.Index(IndexWriter).ElementType := ELEM_TRUE; Result.Index(IndexWriter).StringStart := 0; Result.Index(IndexWriter).StringEnd := 0; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_TRUE_END; ParserStack(StackPointer).Index := IndexWriter; @@ -662,10 +669,10 @@ package body JSON is Result.Index(IndexWriter).ElementType := ELEM_FALSE; Result.Index(IndexWriter).StringStart := 0; Result.Index(IndexWriter).StringEnd := 0; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_FALSE_END; ParserStack(StackPointer).Index := IndexWriter; @@ -673,7 +680,7 @@ package body JSON is Result.Error := errorMessage("Parsing List(" & printPos(Debug_Row, Debug_Column) & "): Char '" & CurrentChar & "' is not allowed."); exit loopi; end case; - + when ST_KEY => case CurrentChar is when '"' => -- a single quote to restore the syntax highlighting FSM in Notepad++ " @@ -684,7 +691,7 @@ package body JSON is ContentWriter := ContentWriter + 1; Result.Content(ContentWriter) := CurrentChar; end case; - + when ST_KEY_END => case CurrentChar is when ' ' | HT => next loopj; @@ -695,7 +702,7 @@ package body JSON is Result.Error := errorMessage("Parsing KeyEnd(" & printPos(Debug_Row, Debug_Column) & "): Char '" & CurrentChar & "' is not allowed."); exit loopi; end case; - + -- colon when ST_DELIMITER1 => case CurrentChar is @@ -705,10 +712,10 @@ package body JSON is if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Found: Object - Add new IndexElement(OBJ) at pos " & INTEGER'image(IndexWriter) & LF); end if; Result.Index(IndexWriter).Index := IndexWriter; Result.Index(IndexWriter).ElementType := ELEM_OBJECT; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_OBJECT; ParserStack(StackPointer).Index := IndexWriter; @@ -717,10 +724,10 @@ package body JSON is if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Found: List - Add new IndexElement(LIST) at pos " & INTEGER'image(IndexWriter) & LF); end if; Result.Index(IndexWriter).Index := IndexWriter; Result.Index(IndexWriter).ElementType := ELEM_LIST; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_LIST; ParserStack(StackPointer).Index := IndexWriter; @@ -735,16 +742,16 @@ package body JSON is Result.Error := errorMessage("Parsing Link(" & printPos(Debug_Row, Debug_Column) & "): Begin of link has a not allowed CHARACTER."); exit loopi; end if; - + IndexWriter := IndexWriter + 1; if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Found: Link - Add new IndexElement(LNK) at pos " & INTEGER'image(IndexWriter) & " setting Start to " & INTEGER'image(ContentWriter + 1) & LF); end if; Result.Index(IndexWriter).Index := IndexWriter; Result.Index(IndexWriter).ElementType := ELEM_LINK; Result.Index(IndexWriter).StringStart := ContentWriter + 1; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_LINK; ParserStack(StackPointer).Index := IndexWriter; @@ -754,26 +761,26 @@ package body JSON is Result.Index(IndexWriter).Index := IndexWriter; Result.Index(IndexWriter).ElementType := ELEM_STRING; Result.Index(IndexWriter).StringStart := ContentWriter + 1; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_STRING; ParserStack(StackPointer).Index := IndexWriter; when '-' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' => ContentWriter := ContentWriter + 1; Result.Content(ContentWriter) := CurrentChar; - + IndexWriter := IndexWriter + 1; if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Found: Number - Add new IndexElement(NUM) at pos " & INTEGER'image(IndexWriter) & " setting Start to " & INTEGER'image(ContentWriter) & LF); end if; Result.Index(IndexWriter).Index := IndexWriter; Result.Index(IndexWriter).ElementType := ELEM_NUMBER; Result.Index(IndexWriter).StringStart := ContentWriter; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_NUMBER; ParserStack(StackPointer).Index := IndexWriter; @@ -795,10 +802,10 @@ package body JSON is Result.Index(IndexWriter).ElementType := ELEM_NULL; Result.Index(IndexWriter).StringStart := 0; Result.Index(IndexWriter).StringEnd := 0; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_NULL_END; ParserStack(StackPointer).Index := IndexWriter; @@ -820,10 +827,10 @@ package body JSON is Result.Index(IndexWriter).ElementType := ELEM_TRUE; Result.Index(IndexWriter).StringStart := 0; Result.Index(IndexWriter).StringEnd := 0; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_TRUE_END; ParserStack(StackPointer).Index := IndexWriter; @@ -845,10 +852,10 @@ package body JSON is Result.Index(IndexWriter).ElementType := ELEM_FALSE; Result.Index(IndexWriter).StringStart := 0; Result.Index(IndexWriter).StringEnd := 0; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer).Index) & " as child." & LF); end if; Result.Index(ParserStack(StackPointer).Index).ChildIndex := IndexWriter; - + StackPointer := StackPointer + 1; ParserStack(StackPointer).State := ST_FALSE_END; ParserStack(StackPointer).Index := IndexWriter; @@ -856,7 +863,7 @@ package body JSON is Result.Error := errorMessage("Parsing Delimiter1(" & printPos(Debug_Row, Debug_Column) & "): Char '" & CurrentChar & "' is not allowed."); exit loopi; end case; - + -- coma in objects when ST_DELIMITER2 => case CurrentChar is @@ -867,20 +874,20 @@ package body JSON is Result.Index(IndexWriter).Index := IndexWriter; Result.Index(IndexWriter).ElementType := ELEM_KEY; Result.Index(IndexWriter).StringStart := ContentWriter + 1; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer - 2).Index) & " as next." & LF); end if; Result.Index(ParserStack(StackPointer - 2).Index).NextIndex := IndexWriter; - + StackPointer := StackPointer - 2; ParserStack(StackPointer).State := ST_KEY; ParserStack(StackPointer).Index := IndexWriter; when others => -- printParserStack(ParserStack(0 to StackPointer), StringBuffer, StringWriter); - -- report StringBuffer(1 to StringWriter - 1) severity NOTE; + -- report StringBuffer(1 to StringWriter - 1) severity NOTE; Result.Error := errorMessage("Parsing Delimiter2(" & printPos(Debug_Row, Debug_Column) & "): Char '" & CurrentChar & "' is not allowed."); exit loopi; end case; - + -- coma in lists when ST_DELIMITER3 => case CurrentChar is @@ -890,10 +897,10 @@ package body JSON is if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Found: Object - Add new IndexElement(OBJ) at pos " & INTEGER'image(IndexWriter) & LF); end if; Result.Index(IndexWriter).Index := IndexWriter; Result.Index(IndexWriter).ElementType := ELEM_OBJECT; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer - 1).Index) & " as next." & LF); end if; Result.Index(ParserStack(StackPointer - 1).Index).NextIndex := IndexWriter; - + StackPointer := StackPointer - 1; ParserStack(StackPointer).State := ST_OBJECT; ParserStack(StackPointer).Index := IndexWriter; @@ -902,10 +909,10 @@ package body JSON is if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Found: List - Add new IndexElement(LIST) at pos " & INTEGER'image(IndexWriter) & LF); end if; Result.Index(IndexWriter).Index := IndexWriter; Result.Index(IndexWriter).ElementType := ELEM_LIST; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer - 1).Index) & " as next." & LF); end if; Result.Index(ParserStack(StackPointer - 1).Index).NextIndex := IndexWriter; - + StackPointer := StackPointer - 1; ParserStack(StackPointer).State := ST_LIST; ParserStack(StackPointer).Index := IndexWriter; @@ -920,16 +927,16 @@ package body JSON is Result.Error := errorMessage("Parsing Link(" & printPos(Debug_Row, Debug_Column) & "): Begin of link has a not allowed CHARACTER."); exit loopi; end if; - + IndexWriter := IndexWriter + 1; if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Found: Link - Add new IndexElement(LNK) at pos " & INTEGER'image(IndexWriter) & " setting Start to " & INTEGER'image(ContentWriter + 1) & LF); end if; Result.Index(IndexWriter).Index := IndexWriter; Result.Index(IndexWriter).ElementType := ELEM_LINK; Result.Index(IndexWriter).StringStart := ContentWriter + 1; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer - 1).Index) & " as next." & LF); end if; Result.Index(ParserStack(StackPointer - 1).Index).NextIndex := IndexWriter; - + StackPointer := StackPointer - 1; ParserStack(StackPointer).State := ST_LINK; ParserStack(StackPointer).Index := IndexWriter; @@ -939,26 +946,26 @@ package body JSON is Result.Index(IndexWriter).Index := IndexWriter; Result.Index(IndexWriter).ElementType := ELEM_STRING; Result.Index(IndexWriter).StringStart := ContentWriter + 1; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer - 1).Index) & " as next." & LF); end if; Result.Index(ParserStack(StackPointer - 1).Index).NextIndex := IndexWriter; - + StackPointer := StackPointer - 1; ParserStack(StackPointer).State := ST_STRING; ParserStack(StackPointer).Index := IndexWriter; when '-' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' => ContentWriter := ContentWriter + 1; Result.Content(ContentWriter) := CurrentChar; - + IndexWriter := IndexWriter + 1; if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Found: Number - Add new IndexElement(NUM) at pos " & INTEGER'image(IndexWriter) & " setting Start to " & INTEGER'image(ContentWriter) & LF); end if; Result.Index(IndexWriter).Index := IndexWriter; Result.Index(IndexWriter).ElementType := ELEM_NUMBER; Result.Index(IndexWriter).StringStart := ContentWriter; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer - 1).Index) & " as next." & LF); end if; Result.Index(ParserStack(StackPointer - 1).Index).NextIndex := IndexWriter; - + StackPointer := StackPointer - 1; ParserStack(StackPointer).State := ST_NUMBER; ParserStack(StackPointer).Index := IndexWriter; @@ -980,10 +987,10 @@ package body JSON is Result.Index(IndexWriter).ElementType := ELEM_NULL; Result.Index(IndexWriter).StringStart := 0; Result.Index(IndexWriter).StringEnd := 0; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer - 1).Index) & " as next." & LF); end if; Result.Index(ParserStack(StackPointer - 1).Index).NextIndex := IndexWriter; - + StackPointer := StackPointer - 1; ParserStack(StackPointer).State := ST_NULL_END; ParserStack(StackPointer).Index := IndexWriter; @@ -1005,10 +1012,10 @@ package body JSON is Result.Index(IndexWriter).ElementType := ELEM_TRUE; Result.Index(IndexWriter).StringStart := 0; Result.Index(IndexWriter).StringEnd := 0; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer - 1).Index) & " as next." & LF); end if; Result.Index(ParserStack(StackPointer - 1).Index).NextIndex := IndexWriter; - + StackPointer := StackPointer - 1; ParserStack(StackPointer).State := ST_TRUE_END; ParserStack(StackPointer).Index := IndexWriter; @@ -1030,10 +1037,10 @@ package body JSON is Result.Index(IndexWriter).ElementType := ELEM_FALSE; Result.Index(IndexWriter).StringStart := 0; Result.Index(IndexWriter).StringEnd := 0; - + if (VERBOSE = TRUE) then jsonStringAppend(StringBuffer, StringWriter, "Linking new key to index " & INTEGER'image(ParserStack(StackPointer - 1).Index) & " as next." & LF); end if; Result.Index(ParserStack(StackPointer - 1).Index).NextIndex := IndexWriter; - + StackPointer := StackPointer - 1; ParserStack(StackPointer).State := ST_FALSE_END; ParserStack(StackPointer).Index := IndexWriter; @@ -1041,7 +1048,7 @@ package body JSON is Result.Error := errorMessage("Parsing Delimiter3(" & printPos(Debug_Row, Debug_Column) & "): Char '" & CurrentChar & "' is not allowed."); exit loopi; end case; - + when ST_LINK => case CurrentChar is when '"' => -- a single quote to restore the syntax highlighting FSM in Notepad++ " @@ -1052,7 +1059,7 @@ package body JSON is ContentWriter := ContentWriter + 1; Result.Content(ContentWriter) := CurrentChar; end case; - + when ST_LINK_END => case CurrentChar is when ' ' | HT => next loopj; @@ -1087,7 +1094,7 @@ package body JSON is Result.Error := errorMessage("Parsing LinkEnd(" & printPos(Debug_Row, Debug_Column) & "): Char '" & CurrentChar & "' is not allowed."); exit loopi; end case; - + when ST_STRING => case CurrentChar is when '"' => -- a single quote to restore the syntax highlighting FSM in Notepad++ " @@ -1142,7 +1149,7 @@ package body JSON is Result.Error := errorMessage("Parsing StringEnd(" & printPos(Debug_Row, Debug_Column) & "): Char '" & CurrentChar & "' is not allowed."); exit loopi; end case; - + when ST_NUMBER => case CurrentChar is when ' ' | HT => @@ -1229,7 +1236,7 @@ package body JSON is Result.Error := errorMessage("Parsing NumberEnd(" & printPos(Debug_Row, Debug_Column) & "): Char '" & CurrentChar & "' is not allowed."); exit loopi; end case; - + when ST_NULL_END => case CurrentChar is when ' ' | HT => next loopj; @@ -1264,7 +1271,7 @@ package body JSON is Result.Error := errorMessage("Parsing NullEnd(" & printPos(Debug_Row, Debug_Column) & "): Char '" & CurrentChar & "' is not allowed."); exit loopi; end case; - + when ST_TRUE_END => case CurrentChar is when ' ' | HT => next loopj; @@ -1299,7 +1306,7 @@ package body JSON is Result.Error := errorMessage("Parsing TrueEnd(" & printPos(Debug_Row, Debug_Column) & "): Char '" & CurrentChar & "' is not allowed."); exit loopi; end case; - + when ST_FALSE_END => case CurrentChar is when ' ' | HT => next loopj; @@ -1334,7 +1341,7 @@ package body JSON is Result.Error := errorMessage("Parsing FalseEnd(" & printPos(Debug_Row, Debug_Column) & "): Char '" & CurrentChar & "' is not allowed."); exit loopi; end case; - + when ST_CLOSED => case CurrentChar is when ' ' | HT => next loopj; @@ -1369,9 +1376,9 @@ package body JSON is Result.Error := errorMessage("Parsing Closed(" & printPos(Debug_Row, Debug_Column) & "): Char '" & CurrentChar & "' is not allowed."); exit loopi; end case; - + end case; - + if (VERBOSE = TRUE) then printParserStack(ParserStack(0 to StackPointer), StringBuffer, StringWriter); jsonReportIndex(Result.Index(0 to IndexWriter), Result.Content(1 to ContentWriter), StringBuffer, StringWriter); @@ -1381,15 +1388,15 @@ package body JSON is end loop; Result.IndexCount := IndexWriter + 1; - Result.ContentCount := ContentWriter; - + Result.ContentCount := ContentWriter; + -- print complete index after parsing all input characters if (VERBOSE = TRUE) then jsonStringClear(StringBuffer, StringWriter); jsonReportIndex(Result.Index(0 to Result.IndexCount - 1), Result.Content(1 to Result.ContentCount), StringBuffer, StringWriter); report StringBuffer(1 to StringWriter - 1) severity NOTE; end if; - + file_close(FileHandle); if (Result.Error(1) /= C_JSON_NUL) then @@ -1407,7 +1414,7 @@ package body JSON is return Result; end case; end if; - + return Result; end function; @@ -1417,7 +1424,7 @@ package body JSON is begin ResultWriter := 0; Result(ResultWriter).StringStart := 0; - + loopi : for i in Path'range loop if (Result(ResultWriter).StringStart = 0) then -- determine element type if (chr_isAlpha(Path(i)) = TRUE) then @@ -1441,7 +1448,7 @@ package body JSON is else report "jsonParsePath: Unsupported character '" & Path(i) & "' in identifier." severity failure; end if; - + when PATH_ELEM_INDEX => if (chr_isDigit(Path(i)) = TRUE) then next loopi; @@ -1452,12 +1459,12 @@ package body JSON is else report "jsonParsePath: Unsupported character '" & Path(i) & "'in index." severity failure; end if; - + end case; end if; end loop; Result(ResultWriter).StringEnd := Path'high; - + return Result(0 to ResultWriter); end function; @@ -1479,7 +1486,7 @@ package body JSON is if (IndexElement.ChildIndex = 0) then report "jsonGetElementIndex: List has no child." severity FAILURE; return 0; end if; IndexElement := JSONContext.Index(IndexElement.ChildIndex); end if; - + loopi : for i in JSON_PATH'range loop -- ------------------------------- if (JSON_PATH(i).ElementType = PATH_ELEM_INDEX) then @@ -1491,7 +1498,7 @@ package body JSON is if (VERBOSE = TRUE) then report "jsonGetElementIndex0: Resolved: Index=" & INTEGER'image(IndexElement.Index) severity NOTE; end if; next loopi; end if; - + -- Go one level down if (IndexElement.ChildIndex = 0) then -- no child if (i /= JSON_PATH'high) then -- this was not the last path element to compare @@ -1514,13 +1521,13 @@ package body JSON is end if; IndexElement := JSONContext.Index(IndexElement.NextIndex); end loop; - + if (IndexElement.ElementType = ELEM_LINK) then if (VERBOSE = TRUE) then report "jsonGetElementIndex1: Resolving link to '" & JSONContext.Content(IndexElement.StringStart to IndexElement.StringEnd) & "'." severity NOTE; end if; IndexElement := JSONContext.Index(jsonGetElementIndex(JSONContext, JSONContext.Content(IndexElement.StringStart to IndexElement.StringEnd))); if (VERBOSE = TRUE) then report "jsonGetElementIndex1: Resolved: Index=" & INTEGER'image(IndexElement.Index) severity NOTE; end if; end if; - + -- resolve objects and lists to their first child if (IndexElement.ElementType = ELEM_OBJECT) then if (VERBOSE = TRUE) then report "jsonGetElementIndex: Resolve element (OBJ) to first child: Index=" & INTEGER'image(IndexElement.ChildIndex) severity NOTE; end if; @@ -1531,7 +1538,7 @@ package body JSON is if (IndexElement.ChildIndex = 0) then report "jsonGetElementIndex: List has no child." severity FAILURE; return 0; end if; IndexElement := JSONContext.Index(IndexElement.ChildIndex); end if; - + if (IndexElement.ElementType = ELEM_LINK) then if (VERBOSE = TRUE) then report "jsonGetElementIndex2: Resolving link to '" & JSONContext.Content(IndexElement.StringStart to IndexElement.StringEnd) & "'." severity NOTE; end if; IndexElement := JSONContext.Index(jsonGetElementIndex(JSONContext, JSONContext.Content(IndexElement.StringStart to IndexElement.StringEnd))); @@ -1561,7 +1568,7 @@ package body JSON is IndexElement := JSONContext.Index(IndexElement.ChildIndex); end if; end if; -- IndexElement.ChildIndex - + if (IndexElement.ElementType = ELEM_LINK) then if (VERBOSE = TRUE) then report "jsonGetElementIndex3: Resolving link to '" & JSONContext.Content(IndexElement.StringStart to IndexElement.StringEnd) & "'." severity NOTE; end if; IndexElement := JSONContext.Index(jsonGetElementIndex(JSONContext, JSONContext.Content(IndexElement.StringStart to IndexElement.StringEnd))); @@ -1578,7 +1585,7 @@ package body JSON is if (IndexElement.ChildIndex = 0) then report "jsonGetElementIndex: List has no child." severity FAILURE; return 0; end if; IndexElement := JSONContext.Index(IndexElement.ChildIndex); end if; - + -- if (IndexElement.ElementType = ELEM_LINK) then -- if (VERBOSE = TRUE) then report "jsonGetElementIndex4: Resolving link to '" & JSONContext.Content(IndexElement.StringStart to IndexElement.StringEnd) & "'." severity NOTE; end if; -- IndexElement := JSONContext.Index(jsonGetElementIndex(JSONContext, JSONContext.Content(IndexElement.StringStart to IndexElement.StringEnd))); @@ -1601,20 +1608,20 @@ package body JSON is return 0; end if; -- IndexElement.ElementType end if; - + if (IndexElement.ElementType = ELEM_LINK) then if (VERBOSE = TRUE) then report "jsonGetElementIndex: Resolving link to '" & JSONContext.Content(IndexElement.StringStart to IndexElement.StringEnd) & "'." severity NOTE; end if; IndexElement := JSONContext.Index(jsonGetElementIndex(JSONContext, JSONContext.Content(IndexElement.StringStart to IndexElement.StringEnd))); if (VERBOSE = TRUE) then report "jsonGetElementIndex: Resolved: Index=" & INTEGER'image(IndexElement.Index) severity NOTE; end if; end if; end loop; - + if (IndexElement.ElementType = ELEM_LINK) then if (VERBOSE = TRUE) then report "jsonGetElementIndex: Resolving link to '" & JSONContext.Content(IndexElement.StringStart to IndexElement.StringEnd) & "'." severity NOTE; end if; IndexElement := JSONContext.Index(jsonGetElementIndex(JSONContext, JSONContext.Content(IndexElement.StringStart to IndexElement.StringEnd))); if (VERBOSE = TRUE) then report "jsonGetElementIndex: Resolved: Index=" & INTEGER'image(IndexElement.Index) severity NOTE; end if; end if; - + return IndexElement.Index; end function; @@ -1634,7 +1641,7 @@ package body JSON is end if; return "ERROR"; end function; - + function jsonGetBoolean(JSONContext : T_JSON; Path : STRING) return BOOLEAN is constant ElementIndex : T_UINT16 := jsonGetElementIndex(JSONContext, Path); constant Element : T_JSON_INDEX_ELEMENT := JSONContext.Index(ElementIndex); @@ -1642,7 +1649,7 @@ package body JSON is if (ElementIndex = 0) then return FALSE; end if; return (Element.ElementType = ELEM_TRUE); end function; - + function jsonIsBoolean(JSONContext : T_JSON; Path : STRING) return BOOLEAN is constant ElementIndex : T_UINT16 := jsonGetElementIndex(JSONContext, Path); constant Element : T_JSON_INDEX_ELEMENT := JSONContext.Index(ElementIndex); @@ -1650,7 +1657,7 @@ package body JSON is if (ElementIndex = 0) then return FALSE; end if; return (Element.ElementType = ELEM_TRUE) or (Element.ElementType = ELEM_FALSE); end function; - + function jsonIsNull(JSONContext : T_JSON; Path : STRING) return BOOLEAN is constant ElementIndex : T_UINT16 := jsonGetElementIndex(JSONContext, Path); constant Element : T_JSON_INDEX_ELEMENT := JSONContext.Index(ElementIndex); @@ -1658,7 +1665,7 @@ package body JSON is if (ElementIndex = 0) then return FALSE; end if; return (Element.ElementType = ELEM_NULL); end function; - + function jsonIsString(JSONContext : T_JSON; Path : STRING) return BOOLEAN is constant ElementIndex : T_UINT16 := jsonGetElementIndex(JSONContext, Path); constant Element : T_JSON_INDEX_ELEMENT := JSONContext.Index(ElementIndex); @@ -1666,7 +1673,7 @@ package body JSON is if (ElementIndex = 0) then return FALSE; end if; return (Element.ElementType = ELEM_STRING); end function; - + function jsonIsNumber(JSONContext : T_JSON; Path : STRING) return BOOLEAN is constant ElementIndex : T_UINT16 := jsonGetElementIndex(JSONContext, Path); constant Element : T_JSON_INDEX_ELEMENT := JSONContext.Index(ElementIndex);