mirror of
https://github.com/vishapoberon/vipak.git
synced 2026-04-05 20:42:26 +00:00
Flat JSON workssssss
This commit is contained in:
parent
ab05eb8bd5
commit
78085b1079
2 changed files with 45 additions and 43 deletions
|
|
@ -19,9 +19,9 @@ TYPE
|
||||||
CharacterStackType* = POINTER TO CharacterStackTypeDesc;
|
CharacterStackType* = POINTER TO CharacterStackTypeDesc;
|
||||||
|
|
||||||
CharacterStackTypeDesc* = RECORD (List.TListDesc)
|
CharacterStackTypeDesc* = RECORD (List.TListDesc)
|
||||||
pop: PROCEDURE(self: CharacterStackType): CHAR;
|
pop*: PROCEDURE(self: CharacterStackType): CHAR;
|
||||||
push: PROCEDURE(self: CharacterStackType; char: CHAR);
|
push*: PROCEDURE(self: CharacterStackType; char: CHAR);
|
||||||
top: PROCEDURE(self: CharacterStackType) : CHAR;
|
top*: PROCEDURE(self: CharacterStackType) : CHAR;
|
||||||
END;
|
END;
|
||||||
|
|
||||||
VAR
|
VAR
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
MODULE HashMap;
|
MODULE HashMap;
|
||||||
IMPORT Logger, CharacterStack, Strings;
|
IMPORT Logger, CharacterStack, Strings, Out;
|
||||||
CONST
|
CONST
|
||||||
ArrayMaxNumber = 5000;
|
ArrayMaxNumber = 5000;
|
||||||
TYPE
|
TYPE
|
||||||
|
|
@ -22,13 +22,23 @@ TYPE
|
||||||
|
|
||||||
VAR
|
VAR
|
||||||
jsonRecord: JsonTypePointer;
|
jsonRecord: JsonTypePointer;
|
||||||
testValue: ARRAY OF CHAR;
|
testValue: ARRAY ArrayMaxNumber OF CHAR;
|
||||||
keyFound: BOOLEAN;
|
keyFound: BOOLEAN;
|
||||||
|
|
||||||
|
PROCEDURE GetTerminal *(self: JsonTypePointer; key: ARRAY OF CHAR; VAR returnValue: ARRAY OF CHAR): BOOLEAN;
|
||||||
|
VAR
|
||||||
|
i: LONGINT;
|
||||||
|
BEGIN
|
||||||
|
FOR i := 0 TO LEN(self.TerminalKeys) - 1 DO
|
||||||
|
IF Strings.Match(key, self.TerminalKeys[i]) THEN COPY(self.TerminalsValues[i], returnValue); RETURN TRUE END;
|
||||||
|
END;
|
||||||
|
RETURN FALSE;
|
||||||
|
END GetTerminal;
|
||||||
|
|
||||||
PROCEDURE Create*(text: ARRAY OF CHAR): JsonTypePointer;
|
PROCEDURE Create*(text: ARRAY OF CHAR): JsonTypePointer;
|
||||||
VAR
|
VAR
|
||||||
self: JsonTypePointer;
|
self: JsonTypePointer;
|
||||||
i,j,k,s: INTEGER;
|
i,j,k,s: LONGINT;
|
||||||
characterStack: CharacterStack.CharacterStackType;
|
characterStack: CharacterStack.CharacterStackType;
|
||||||
key, val, string: ARRAY ArrayMaxNumber OF CHAR;
|
key, val, string: ARRAY ArrayMaxNumber OF CHAR;
|
||||||
symbol: CHAR;
|
symbol: CHAR;
|
||||||
|
|
@ -44,8 +54,7 @@ BEGIN
|
||||||
|
|
||||||
NEW(self);
|
NEW(self);
|
||||||
NEW(self.NonTerminalValues, ArrayMaxNumber);
|
NEW(self.NonTerminalValues, ArrayMaxNumber);
|
||||||
self.GetTerminal = GetTerminal;
|
self.GetTerminal := GetTerminal;
|
||||||
|
|
||||||
|
|
||||||
NEW(characterStack);
|
NEW(characterStack);
|
||||||
characterStack := CharacterStack.Create();
|
characterStack := CharacterStack.Create();
|
||||||
|
|
@ -53,6 +62,8 @@ BEGIN
|
||||||
i := 0;
|
i := 0;
|
||||||
j := 0;
|
j := 0;
|
||||||
k := 0;
|
k := 0;
|
||||||
|
|
||||||
|
quoteStart := FALSE;
|
||||||
|
|
||||||
REPEAT
|
REPEAT
|
||||||
symbol := text[i];
|
symbol := text[i];
|
||||||
|
|
@ -64,59 +75,50 @@ BEGIN
|
||||||
Logger.Log("End Parsing Json");
|
Logger.Log("End Parsing Json");
|
||||||
END;
|
END;
|
||||||
|
|
||||||
IF quoteStart = FALSE & symbol = quote THEN quoteStart = TRUE
|
IF ~quoteStart & (symbol = quote) THEN quoteStart := TRUE
|
||||||
ELSE IF quoteStart & symbol #= quote THEN characterStack.push(symbol)
|
ELSIF quoteStart & (symbol # quote) THEN characterStack.push(characterStack, symbol)
|
||||||
ELSE IF quoteStart & symbol = quote THEN
|
ELSIF quoteStart & (symbol = quote) THEN
|
||||||
j := 0;
|
j := characterStack.Count;
|
||||||
WHILE characterStack.top #= 0AX DO
|
WHILE characterStack.top(characterStack) # 0AX DO
|
||||||
str[j] = characterStack.pop;
|
DEC(j);
|
||||||
|
string[j] := characterStack.pop(characterStack);
|
||||||
END;
|
END;
|
||||||
quoteStart := FALSE;
|
quoteStart := FALSE;
|
||||||
ELSE.
|
|
||||||
|
|
||||||
|
|
||||||
IF Strings.Length(string) & quoteStart #= FALSE THEN
|
|
||||||
|
|
||||||
IF Strings.Length(key) #= 0 THEN COPY(string, val)
|
|
||||||
ELSE COPY(string, val) #= 0 END;
|
|
||||||
|
|
||||||
COPY([], string);
|
|
||||||
END;
|
END;
|
||||||
|
|
||||||
IF Strings.Length(key) #= 0 & Strings.Length(val) #= 0 THEN
|
IF (Strings.Length(string) > 0) & ~quoteStart THEN
|
||||||
|
|
||||||
|
IF Strings.Length(key) > 0 THEN
|
||||||
|
COPY(string, val)
|
||||||
|
ELSE
|
||||||
|
COPY(string, key)
|
||||||
|
END;
|
||||||
|
|
||||||
|
COPY("", string);
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF (Strings.Length(key) > 0) & (Strings.Length(val) > 0) THEN
|
||||||
COPY(key, self.TerminalKeys[k]);
|
COPY(key, self.TerminalKeys[k]);
|
||||||
COPY(val, self.TerminalsValues[k]);
|
COPY(val, self.TerminalsValues[k]);
|
||||||
INC(k);
|
INC(k);
|
||||||
COPY([], key);
|
COPY("", key);
|
||||||
COPY([], val);
|
COPY("", val);
|
||||||
END.
|
END;
|
||||||
|
|
||||||
INC(i);
|
INC(i);
|
||||||
UNTIL i > LEN(text) - 1;
|
UNTIL i > LEN(text) - 1;
|
||||||
(* UNTIL text[i] = 0AX; TODO: Ask Norayr *)
|
|
||||||
(* WHY you write AND as & and OR as OR? *)
|
|
||||||
|
|
||||||
RETURN jsonRecord;
|
RETURN self;
|
||||||
END Create;
|
END Create;
|
||||||
|
|
||||||
PROCEDURE *GetTerminal(self: JsonTypePointer, key: ARRAY OF CHAR, VAR returnValue ARRAY OF CHAR): BOOLEAN
|
|
||||||
VAR
|
|
||||||
i: LONGINT;
|
|
||||||
BEGIN
|
|
||||||
FOR i := 0 TO LEN(self.TerminalKeys): DO
|
|
||||||
IF Strings.Match(key, self.TerminalKeys[i]) THEN COPY(self.TerminalsValues[i], val) RETURN TRUE;
|
|
||||||
END
|
|
||||||
RETURN FALSE;
|
|
||||||
END GetTerminal;
|
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
NEW(jsonRecord);
|
NEW(jsonRecord);
|
||||||
jsonRecord := Create("{'asdasd': 'test'}");
|
jsonRecord := Create("{'foo': 'bar', 'test': 'test1'}");
|
||||||
keyFound := jsonRecord.GetNonTerminal("asdasd", testValue);
|
keyFound := jsonRecord.GetTerminal(jsonRecord, "test", testValue);
|
||||||
|
|
||||||
IF keyFound THEN
|
IF keyFound THEN
|
||||||
Logger.Log('found KEY');
|
Logger.Log('found KEY');
|
||||||
Logger.Log(testValue);
|
Logger.Log(testValue);
|
||||||
ELSE Logger.Log('VAlue for the Key is not found') END;
|
ELSE Logger.Log('Value for the Key is not found') END;
|
||||||
|
|
||||||
END HashMap.
|
END HashMap.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue