diff --git a/DependencyResolver.Mod b/DependencyResolver.Mod new file mode 100644 index 0000000..f03d9b2 --- /dev/null +++ b/DependencyResolver.Mod @@ -0,0 +1,6 @@ +MODULE DependencyResolver; +IMPORT + JsonParser +BEGIN + +END DependencyResolver. \ No newline at end of file diff --git a/HashMapString.Mod b/HashMapString.Mod deleted file mode 100644 index 5b1e736..0000000 --- a/HashMapString.Mod +++ /dev/null @@ -1,199 +0,0 @@ -MODULE HashMap; -IMPORT Logger, CharacterStack, Strings, Out; -CONST - ArrayMaxNumber = 100; - (* Const *) - symbolBracketStart = "{"; - symbolBracketEnd = "}"; - (* TODO: Reverse " and ' *) - quote = "'"; - coma = ","; -TYPE - TString = ARRAY ArrayMaxNumber OF CHAR; - - JsonTypePointer* = POINTER TO JsonType; - - JsonType* = RECORD - GetTerminal* : PROCEDURE(self : JsonTypePointer; string : ARRAY OF CHAR; VAR returnValue : ARRAY OF CHAR): BOOLEAN; - GetNonTerminal* : PROCEDURE(self : JsonTypePointer; key : ARRAY OF CHAR): JsonTypePointer; - HasKey* : PROCEDURE(self : JsonTypePointer; key : ARRAY OF CHAR): BOOLEAN; - TypeOfTheKey* : PROCEDURE(self : JsonTypePointer; key : ARRAY OF CHAR; VAR returnValue : ARRAY OF CHAR); - - TerminalKeys : ARRAY ArrayMaxNumber OF TString; - TerminalsValues : ARRAY ArrayMaxNumber OF TString; - - NonTerminalKeys : ARRAY ArrayMaxNumber OF TString; - NonTerminalValues : POINTER TO ARRAY OF JsonTypePointer; - END; - -VAR - jsonRecord: JsonTypePointer; - testValue: ARRAY ArrayMaxNumber OF CHAR; - 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; - -(* - TODO: - Create a good validation for comas - Create a good validation for name repetition -*) - -PROCEDURE PushDownString( - string: ARRAY OF CHAR; - startCharacter: CHAR; - endCharacter: CHAR; - i: LONGINT; - VAR returnString: ARRAY OF CHAR): LONGINT; -VAR - characterStack: CharacterStack.CharacterStackType; - j , k: LONGINT; -BEGIN - NEW(characterStack); - j := i; - characterStack := CharacterStack.Create(); - REPEAT - IF (characterStack.Count > 1) & (string[j] = endCharacter) THEN - REPEAT UNTIL characterStack.pop(characterStack) = startCharacter; - ELSE - characterStack.push(characterStack, string[j]); - INC(j); - END; - UNTIL characterStack.top(characterStack) = 0AX; - - FOR k := i TO j DO - returnString[k - i] := string[k]; - END; - - RETURN j; (* returning next symbol of quote *) -END PushDownString; - -PROCEDURE deQuote(text: ARRAY OF CHAR; VAR result: ARRAY OF CHAR); -VAR - i, j: LONGINT; -BEGIN - j := 0; - FOR i := 0 TO Strings.Length(text) DO - IF text[i] # quote THEN - result[j] := text[i]; - INC(j); - END; - END; -END deQuote; - -PROCEDURE Create*(text: ARRAY OF CHAR): JsonTypePointer; -VAR - self: JsonTypePointer; - i, j, terminalIterator, noneTerminalIterator: LONGINT; - characterStack: CharacterStack.CharacterStackType; - key, val, nonTerminalVal, string: ARRAY ArrayMaxNumber OF CHAR; - symbol: CHAR; - symbolStart: CHAR; - quoteStart: BOOLEAN; -BEGIN - NEW(self); - NEW(self.NonTerminalValues, ArrayMaxNumber); - self.GetTerminal := GetTerminal; - - NEW(characterStack); - characterStack := CharacterStack.Create(); - - i := 0; - j := 0; - terminalIterator := 0; - noneTerminalIterator := 0; - - - COPY("", key); - COPY("", val); - COPY("", nonTerminalVal); - - quoteStart := FALSE; - - REPEAT - IF (text[i] = symbolBracketStart) & (i = 0) THEN - INC(i); - Logger.Log("Starting Parse Json"); - END; - - IF symbol = symbolBracketStart THEN - Logger.Log("End Parsing Json"); - END; - - symbol := text[i]; - - (* terminals *) - IF symbol = quote THEN - i := PushDownString(text, quote, quote, i, string); - END; - - IF (Strings.Length(string) > 0) & (symbol = quote) 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 - deQuote(key, self.TerminalKeys[terminalIterator]); - deQuote(val, self.TerminalsValues[terminalIterator]); - INC(terminalIterator); - - COPY("", key); - COPY("", val); - END; - - (* none terminals *) - IF symbol = symbolBracketStart THEN - i := PushDownString(text, symbolBracketStart, symbolBracketEnd, i, string); - END; - - IF (Strings.Length(string) > 0) & (symbol = symbolBracketStart) THEN - IF Strings.Length(key) > 0 THEN - COPY(string, nonTerminalVal) - END; - - COPY("", string); - END; - - - - IF (Strings.Length(key) > 0) & (Strings.Length(nonTerminalVal) > 0) THEN - deQuote(key, self.NonTerminalKeys[noneTerminalIterator]); - self.NonTerminalValues[noneTerminalIterator] := Create(nonTerminalVal); - - INC(noneTerminalIterator); - - COPY("", key); - COPY("", nonTerminalVal); - RETURN self; - END; - - INC(i); - UNTIL i > LEN(text) - 1; - - RETURN self; -END Create; - -BEGIN - NEW(jsonRecord); - jsonRecord := Create("{'foo': 'bar', 'test': 'test1', 'test2': {'sub': 'dub'}}"); - - keyFound := jsonRecord.GetTerminal(jsonRecord, "foo", testValue); - - IF keyFound THEN - Logger.Log('found KEY'); - Logger.Log(testValue); - ELSE Logger.Log('Value for the Key is not found') END; - -END HashMap. \ No newline at end of file diff --git a/JsonParser.Mod b/JsonParser.Mod index 693977d..b26ff96 100644 --- a/JsonParser.Mod +++ b/JsonParser.Mod @@ -1,4 +1,199 @@ MODULE JsonParser; +IMPORT Logger, CharacterStack, Strings, Out; +CONST + ArrayMaxNumber = 100; + (* Const *) + symbolBracketStart = "{"; + symbolBracketEnd = "}"; + (* TODO: Reverse " and ' *) + quote = "'"; + coma = ","; +TYPE + TString = ARRAY ArrayMaxNumber OF CHAR; + + JsonTypePointer* = POINTER TO JsonType; + + JsonType* = RECORD + GetTerminal* : PROCEDURE(self : JsonTypePointer; string : ARRAY OF CHAR; VAR returnValue : ARRAY OF CHAR): BOOLEAN; + GetNonTerminal* : PROCEDURE(self : JsonTypePointer; key : ARRAY OF CHAR): JsonTypePointer; + HasKey* : PROCEDURE(self : JsonTypePointer; key : ARRAY OF CHAR): BOOLEAN; + TypeOfTheKey* : PROCEDURE(self : JsonTypePointer; key : ARRAY OF CHAR; VAR returnValue : ARRAY OF CHAR); + + TerminalKeys : ARRAY ArrayMaxNumber OF TString; + TerminalsValues : ARRAY ArrayMaxNumber OF TString; + + NonTerminalKeys : ARRAY ArrayMaxNumber OF TString; + NonTerminalValues : POINTER TO ARRAY OF JsonTypePointer; + END; + +VAR + jsonRecord: JsonTypePointer; + testValue: ARRAY ArrayMaxNumber OF CHAR; + 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; + +(* + TODO: + Create a good validation for comas + Create a good validation for name repetition +*) + +PROCEDURE PushDownString( + string: ARRAY OF CHAR; + startCharacter: CHAR; + endCharacter: CHAR; + i: LONGINT; + VAR returnString: ARRAY OF CHAR): LONGINT; +VAR + characterStack: CharacterStack.CharacterStackType; + j , k: LONGINT; +BEGIN + NEW(characterStack); + j := i; + characterStack := CharacterStack.Create(); + REPEAT + IF (characterStack.Count > 1) & (string[j] = endCharacter) THEN + REPEAT UNTIL characterStack.pop(characterStack) = startCharacter; + ELSE + characterStack.push(characterStack, string[j]); + INC(j); + END; + UNTIL characterStack.top(characterStack) = 0AX; + + FOR k := i TO j DO + returnString[k - i] := string[k]; + END; + + RETURN j; (* returning next symbol of quote *) +END PushDownString; + +PROCEDURE deQuote(text: ARRAY OF CHAR; VAR result: ARRAY OF CHAR); +VAR + i, j: LONGINT; +BEGIN + j := 0; + FOR i := 0 TO Strings.Length(text) DO + IF text[i] # quote THEN + result[j] := text[i]; + INC(j); + END; + END; +END deQuote; + +PROCEDURE Create*(text: ARRAY OF CHAR): JsonTypePointer; +VAR + self: JsonTypePointer; + i, j, terminalIterator, noneTerminalIterator: LONGINT; + characterStack: CharacterStack.CharacterStackType; + key, val, nonTerminalVal, string: ARRAY ArrayMaxNumber OF CHAR; + symbol: CHAR; + symbolStart: CHAR; + quoteStart: BOOLEAN; +BEGIN + NEW(self); + NEW(self.NonTerminalValues, ArrayMaxNumber); + self.GetTerminal := GetTerminal; + + NEW(characterStack); + characterStack := CharacterStack.Create(); + + i := 0; + j := 0; + terminalIterator := 0; + noneTerminalIterator := 0; + + + COPY("", key); + COPY("", val); + COPY("", nonTerminalVal); + + quoteStart := FALSE; + + REPEAT + IF (text[i] = symbolBracketStart) & (i = 0) THEN + INC(i); + Logger.Log("Starting Parse Json"); + END; + + IF symbol = symbolBracketStart THEN + Logger.Log("End Parsing Json"); + END; + + symbol := text[i]; + + (* terminals *) + IF symbol = quote THEN + i := PushDownString(text, quote, quote, i, string); + END; + + IF (Strings.Length(string) > 0) & (symbol = quote) 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 + deQuote(key, self.TerminalKeys[terminalIterator]); + deQuote(val, self.TerminalsValues[terminalIterator]); + INC(terminalIterator); + + COPY("", key); + COPY("", val); + END; + + (* none terminals *) + IF symbol = symbolBracketStart THEN + i := PushDownString(text, symbolBracketStart, symbolBracketEnd, i, string); + END; + + IF (Strings.Length(string) > 0) & (symbol = symbolBracketStart) THEN + IF Strings.Length(key) > 0 THEN + COPY(string, nonTerminalVal) + END; + + COPY("", string); + END; + + + + IF (Strings.Length(key) > 0) & (Strings.Length(nonTerminalVal) > 0) THEN + deQuote(key, self.NonTerminalKeys[noneTerminalIterator]); + self.NonTerminalValues[noneTerminalIterator] := Create(nonTerminalVal); + + INC(noneTerminalIterator); + + COPY("", key); + COPY("", nonTerminalVal); + RETURN self; + END; + + INC(i); + UNTIL i > LEN(text) - 1; + + RETURN self; +END Create; + +BEGIN + NEW(jsonRecord); + jsonRecord := Create("{'foo': 'bar', 'test': 'test1', 'test2': {'sub': 'dub'}}"); + + keyFound := jsonRecord.GetTerminal(jsonRecord, "foo", testValue); + + IF keyFound THEN + Logger.Log('found KEY'); + Logger.Log(testValue); + ELSE Logger.Log('Value for the Key is not found') END; -PROCEDURE END JsonParser. \ No newline at end of file diff --git a/Opium.Mod b/Opium.Mod new file mode 100644 index 0000000..bf956c9 --- /dev/null +++ b/Opium.Mod @@ -0,0 +1,7 @@ +MODULE opium; +IMPORT + Args, + PackageFileParser +BEGIN + +END opium. \ No newline at end of file diff --git a/PackageFileParser.Mod b/PackageFileParser.Mod new file mode 100644 index 0000000..ee94092 --- /dev/null +++ b/PackageFileParser.Mod @@ -0,0 +1,6 @@ +MODULE PackageFileParser; +IMPORT + JsonParser +BEGIN + +END PackageFileParser. \ No newline at end of file diff --git a/PackegeResolver.Mod b/PackegeResolver.Mod new file mode 100644 index 0000000..71f1670 --- /dev/null +++ b/PackegeResolver.Mod @@ -0,0 +1,6 @@ +MODULE PackegeResolver; +IMPORT + JsonParser +BEGIN + +END PackegeResolver. \ No newline at end of file diff --git a/RemoteClient.Mod b/RemoteClient.Mod new file mode 100644 index 0000000..2c45e8c --- /dev/null +++ b/RemoteClient.Mod @@ -0,0 +1,6 @@ +MODULE RemoteClient; +IMPORT + httpClient +BEGIN + +END RemoteClient. \ No newline at end of file diff --git a/makefile b/makefile index 1c8c4e9..0719970 100644 --- a/makefile +++ b/makefile @@ -9,13 +9,13 @@ all: ../diaspora2hugo/src/lists/Sys.Mod \ ../diaspora2hugo/src/lists/List.Mod \ ../CharacterStack.Mod \ - ../HashMapString.Mod -m + ../JsonParser.Mod -m clean: cd builds && rm * & run: - ./builds/HashMap + ./builds/JsonParser test: clean all run \ No newline at end of file