diff --git a/CharacterStack.Mod b/CharacterStack.Mod deleted file mode 100644 index 6fedef7..0000000 --- a/CharacterStack.Mod +++ /dev/null @@ -1,121 +0,0 @@ -MODULE CharacterStack; -IMPORT List, Out, Sys; - -TYPE - integer* = Sys.integer; - TObject* = Sys.TObject; - - Node* = POINTER TO NodeDesc; - NodeDesc* = List.NodeDesc; - - TChar* = POINTER TO TCharDesc; - - TCharDesc = RECORD (Sys.TObjectDesc) - char* : CHAR - END; - - string = Sys.string; - - CharacterStackType* = POINTER TO CharacterStackTypeDesc; - - CharacterStackTypeDesc* = RECORD (List.TListDesc) - pop*: PROCEDURE(self: CharacterStackType): CHAR; - push*: PROCEDURE(self: CharacterStackType; char: CHAR); - top*: PROCEDURE(self: CharacterStackType) : CHAR; - END; - -VAR - characterStack: CharacterStackType; - -PROCEDURE push(self: CharacterStackType; char: CHAR); -VAR - ch: TChar; - int: integer; -BEGIN - NEW(ch); - ch.char := char; - int := self.Add(self, ch); -END push; - -PROCEDURE pop(self: CharacterStackType): CHAR; -VAR - n: Node; -BEGIN - NEW(n); - - IF self.Count = 0 THEN RETURN 0X END; - - n := self.Get(self, self.Count - 1); - self.Delete(self, self.Count - 1); - RETURN n.obj(TChar).char; -END pop; - -PROCEDURE top(self: CharacterStackType): CHAR; -VAR - n: Node; -BEGIN - NEW(n); - - IF self.Count = 0 THEN RETURN 0X END; - - n := self.Get(self, self.Count - 1); - RETURN n.obj(TChar).char; -END top; - -PROCEDURE Create* () : CharacterStackType; -VAR - l : CharacterStackType; -BEGIN - NEW(l); - l.First := NIL; - l.Last := NIL; - l.Count := 0; - l.Add := List.Add; - l.Append := List.Append; - l.AppendList := List.AppendList; - l.Clear := List.Clear; - l.Free := List.Free; - l.Insert := List.Insert; - l.Delete := List.Delete; - l.Empty := List.Empty; - l.Get := List.Get; - l.res := TRUE; - - l.pop := pop; - l.push:= push; - l.top := top; - RETURN(l); -END Create; - -BEGIN - (* NEW(characterStack); - characterStack := Create(); - characterStack.push(characterStack, 'a'); - characterStack.push(characterStack, 'b'); - characterStack.push(characterStack, 'c'); - - Out.Char(characterStack.top(characterStack)); - Out.Ln(); - Out.Char(characterStack.pop(characterStack)); - Out.Ln(); - Out.Char(characterStack.top(characterStack)); - Out.Ln(); - Out.Char(characterStack.pop(characterStack)); - Out.Ln(); - Out.Char(characterStack.top(characterStack)); - Out.Ln(); - Out.Char(characterStack.pop(characterStack)); - Out.Ln(); - Out.Char(characterStack.top(characterStack)); - Out.Ln(); - Out.Char(characterStack.pop(characterStack)); - Out.Ln(); - Out.Char(characterStack.top(characterStack)); - Out.Ln(); - Out.Char(characterStack.pop(characterStack)); - Out.Ln(); - Out.Char(characterStack.top(characterStack)); - Out.Ln(); - Out.Char(characterStack.pop(characterStack)); - Out.Ln(); *) -END CharacterStack. \ No newline at end of file diff --git a/DependencyResolver.Mod b/DependencyResolver.Mod deleted file mode 100644 index c215a2a..0000000 --- a/DependencyResolver.Mod +++ /dev/null @@ -1,116 +0,0 @@ -MODULE DependencyResolver; -IMPORT JsonParser, Settings, PackageResolver, Strings, Logger; - -CONST ArrayMaxNumber = 30; - -VAR - moduleNames: ARRAY ArrayMaxNumber OF JsonParser.TString; - moduleJson: ARRAY ArrayMaxNumber OF JsonParser.TString; - moduleVersions: ARRAY ArrayMaxNumber OF JsonParser.TString; - - j : LONGINT; - -PROCEDURE ResolveVersionFiles *(jsonString: ARRAY OF CHAR); -VAR - jsonRecord, dependencies: JsonParser.JsonTypePointer; - keyFound: BOOLEAN; - packageName, version, filePath: ARRAY 32 OF CHAR; - returnedJSON: JsonParser.TString; - keys: ARRAY ArrayMaxNumber OF JsonParser.TString; - i, k : LONGINT; -BEGIN - jsonRecord := JsonParser.Create(jsonString); - keyFound := jsonRecord.GetTerminal(jsonRecord, "Package", packageName); - IF keyFound THEN - Logger.Log("Parsing package by name"); - Logger.Log(packageName); - Logger.Log("------------------------"); - ELSE Logger.Log("Value for the Key is not found"); RETURN; END; - - dependencies := jsonRecord.GetNonTerminal(jsonRecord, "Dependencies"); - - IF dependencies = NIL THEN - Logger.Log("Parsing package by name"); - Logger.Log(packageName); - Logger.Log("Error"); - Logger.Log("No dependency"); - Logger.Log("------------------------"); - END; - - dependencies.GetTerminalKeys(dependencies, keys); - - FOR i := 0 TO dependencies.TerminalNumber - 1 DO (* TODO: rewrite with working getter everywhere*) - keyFound := dependencies.GetTerminal(dependencies, keys[i], version); - - IF ~keyFound THEN Logger.Log('ERROR while searching key'); Logger.Log(keys[i]); END; - ASSERT(keyFound); - - COPY("", filePath); - Strings.Append("/", filePath); - Strings.Append(keys[i], filePath); - Strings.Append("/", filePath); - Strings.Append(version, filePath); - Strings.Append("/", filePath); - Strings.Append(Settings.packageFileName, filePath); - - JsonParser.Empty(returnedJSON); - - PackageResolver.ResolveFile( - Settings.host, - Settings.port, - filePath, - keys[i], - Settings.packageFileName, - returnedJSON - ); - - keyFound := FALSE; - IF j >= LEN(moduleNames) THEN - Logger.Log("Out of range in ResolveVersionFiles function in ..."); - END; - ASSERT(j < LEN(moduleNames)); - - FOR k := 0 TO j - 1 DO - IF Strings.Match(moduleNames[k], keys[i]) THEN - keyFound := TRUE; - END; - END; - - - IF ~keyFound THEN - COPY(keys[i], moduleNames[j]); - COPY(version, moduleVersions[j]); - COPY(returnedJSON, moduleJson[j]); - INC(j); - ResolveVersionFiles(returnedJSON); - END; - END; -END ResolveVersionFiles; - -PROCEDURE ResolvePackages*(); -VAR - i: LONGINT; - keyFound: BOOLEAN; - jsonRecord, filesRecord: JsonParser.JsonTypePointer; - values: ARRAY 10 OF JsonParser.TString; - host, port, path, packageName, version: ARRAY 50 OF CHAR; -BEGIN - FOR i := 0 TO j - 1 DO - jsonRecord := JsonParser.Create(moduleJson[i]); - filesRecord := jsonRecord.GetNonTerminal(jsonRecord, "Files"); - - IF filesRecord = NIL THEN - Logger.Log("Error: no files section found"); - END; - - ASSERT(filesRecord # NIL); - keyFound := jsonRecord.GetTerminal(jsonRecord, "Remote", host); - keyFound := jsonRecord.GetTerminal(jsonRecord, "Port", port); - keyFound := jsonRecord.GetTerminal(jsonRecord, "Path", path); - keyFound := jsonRecord.GetTerminal(jsonRecord, "Package", packageName); - keyFound := jsonRecord.GetTerminal(jsonRecord, "Version", version); - PackageResolver.Resolve(host, port, path, packageName, version, filesRecord.TerminalValues); (* TODO: filesRecord.TerminalValues create working getter for this*) - END; -END ResolvePackages; - -END DependencyResolver. \ No newline at end of file diff --git a/FileManager.Mod b/FileManager.Mod deleted file mode 100644 index 8fc2f53..0000000 --- a/FileManager.Mod +++ /dev/null @@ -1,81 +0,0 @@ -MODULE FileManager; -IMPORT Files, Out, Logger, Strings, Platform; - -PROCEDURE WriteString(VAR r : Files.Rider; str : ARRAY OF CHAR); -BEGIN - Files.WriteBytes(r, str, Strings.Length(str)); -END WriteString; - -PROCEDURE Read*(fileName: ARRAY OF CHAR; VAR returnString: ARRAY OF CHAR): BOOLEAN; -VAR - f: Files.File; - r: Files.Rider; - i: LONGINT; -BEGIN - f := Files.Old(fileName); - - IF f = NIL THEN - Logger.Log("-------------------"); - Logger.Log("File Name"); - Logger.Log(fileName); - Logger.Log("File not found"); - Logger.Log("-------------------"); - RETURN FALSE - END; - - Files.Set(r, f, 0); - - i := 0; - REPEAT - Files.Read(r, returnString[i]); - INC(i); - UNTIL r.eof OR (i>=LEN(returnString)); - - RETURN TRUE; -END Read; - -PROCEDURE Write*(fileName, content: ARRAY OF CHAR): BOOLEAN; -VAR - f: Files.File; - r: Files.Rider; - i: LONGINT; -BEGIN - f := Files.New(fileName); - - IF f = NIL THEN - Logger.Log("-------------------"); - Logger.Log("File Name"); - Logger.Log(fileName); - Logger.Log("File not found"); - Logger.Log("-------------------"); - RETURN FALSE - END; - - Files.Set(r, f, 0); - Logger.Log("Writing to file"); - Logger.Log(fileName); - Logger.Log("-------------------"); - WriteString(r, content); - - Files.Register(f); - - RETURN TRUE; -END Write; - -PROCEDURE CreateDirectory*(name, path: ARRAY OF CHAR): BOOLEAN; -VAR - command, path0: ARRAY 100 OF CHAR; - errorCode: LONGINT; -BEGIN - COPY(path, path0); - COPY("mkdir -p ", command); - Strings.Append("/", path0); - Strings.Append(name, path0); - Strings.Append(path0, command); - errorCode := Platform.System(command); - - IF errorCode = 0 THEN RETURN TRUE - ELSE RETURN FALSE END; -END CreateDirectory; - -END FileManager. \ No newline at end of file diff --git a/JsonParser.Mod b/JsonParser.Mod deleted file mode 100644 index e722295..0000000 --- a/JsonParser.Mod +++ /dev/null @@ -1,304 +0,0 @@ -MODULE JsonParser; -IMPORT Logger, CharacterStack, Strings, Out, strutils, Settings; -CONST - ArrayMaxNumber = 30; - ArrayMaxNumberChar = 2000; - (* Const *) - symbolBracketStart = "{"; - symbolBracketEnd = "}"; - (* TODO: Reverse " and ' *) - quote = Settings.quote; - coma = ","; -TYPE - TString* = ARRAY ArrayMaxNumberChar 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); - GetTerminalKeys* : PROCEDURE(self : JsonTypePointer; VAR destination : ARRAY OF TString); - GetTerminalValues* : PROCEDURE(self : JsonTypePointer; VAR destination : ARRAY OF TString); - GetNoneTerminalKeys* : PROCEDURE(self : JsonTypePointer; VAR destination : ARRAY OF TString); - GetTerminalNumber* : PROCEDURE(self : JsonTypePointer): LONGINT; - GetNonTerminalNumber* : PROCEDURE(self : JsonTypePointer): LONGINT; - - TerminalKeys : ARRAY ArrayMaxNumber OF TString; - TerminalValues* : ARRAY ArrayMaxNumber OF TString; - TerminalNumber* : LONGINT; - - NonTerminalKeys : ARRAY ArrayMaxNumber OF TString; - NonTerminalValues : POINTER TO ARRAY OF JsonTypePointer; - NonTerminalNumber* : LONGINT; - END; - -VAR - jsonRecord: JsonTypePointer; - testValue: ARRAY ArrayMaxNumber OF CHAR; - keyFound: BOOLEAN; - -PROCEDURE GetTerminalNumber*(self : JsonTypePointer): LONGINT; -BEGIN RETURN self.TerminalNumber END GetTerminalNumber; - -PROCEDURE GetNonTerminalNumber*(self : JsonTypePointer): LONGINT; -BEGIN RETURN self.NonTerminalNumber END GetNonTerminalNumber; - -PROCEDURE GetNonTerminal(self : JsonTypePointer; key : ARRAY OF CHAR): JsonTypePointer; -VAR - i: LONGINT; -BEGIN - FOR i := 0 TO self.NonTerminalNumber - 1 DO - IF Strings.Match(key, self.NonTerminalKeys[i]) THEN RETURN self.NonTerminalValues[i] END; - END; - - RETURN NIL; -END GetNonTerminal; - -PROCEDURE Empty *(VAR string: ARRAY OF CHAR); -VAR - i : LONGINT; -BEGIN - FOR i := 0 TO LEN(string) - 1 DO string[i] := 0X END; - COPY("", string); -END Empty; - -PROCEDURE GetTerminal *(self: JsonTypePointer; key: ARRAY OF CHAR; VAR returnValue: ARRAY OF CHAR): BOOLEAN; -VAR - i: LONGINT; - noneTerminal: JsonTypePointer; - strings: strutils.strings; - parent, children: ARRAY ArrayMaxNumber OF CHAR; -BEGIN - - FOR i := 0 TO self.TerminalNumber DO - IF Strings.Match(key, self.TerminalKeys[i]) THEN COPY(self.TerminalValues[i], returnValue); RETURN TRUE END; - END; - - strings := strutils.tokenize(key, '.'); - - IF LEN(strings^) < 1 THEN RETURN FALSE END; - - COPY(strings^[0], parent); - - IF Strings.Length(parent) < 1 THEN RETURN FALSE END; - - noneTerminal := self.GetNonTerminal(self, parent); - - IF noneTerminal = NIL THEN RETURN FALSE END; - - FOR i := 1 TO LEN(strings^) - 1 DO - Strings.Append(strings[i], children); - IF i < LEN(strings^) - 1 THEN - Strings.Append(".", children); - END; - END; - - RETURN noneTerminal.GetTerminal(noneTerminal, children, returnValue); - - RETURN FALSE; -END GetTerminal; - -PROCEDURE GetTerminalKeys(self : JsonTypePointer; VAR destination : ARRAY OF TString); -VAR - i: LONGINT; -BEGIN - FOR i := 0 TO self.TerminalNumber DO - COPY(self.TerminalKeys[i], destination[i]); - END; -END GetTerminalKeys; - -PROCEDURE GetTerminalValues(self : JsonTypePointer; VAR destination : ARRAY OF TString); -VAR - i: LONGINT; -BEGIN - FOR i := 0 TO self.TerminalNumber - 1 DO - Empty(destination[i]); - COPY(self.TerminalValues[i], destination[i]); - END; -END GetTerminalValues; - -PROCEDURE GetNoneTerminalKeys(self : JsonTypePointer; VAR destination : ARRAY OF TString); -VAR - i: LONGINT; -BEGIN - FOR i := 0 TO LEN(self.NonTerminalKeys) - 1 DO - destination[i] := self.NonTerminalKeys[i]; - END; -END GetNoneTerminalKeys; -(* - 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(); - Empty(returnString); - 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.Count = 0; (* do not trust top it btings OAX on EOL*) - - IF j >= LEN(returnString) THEN - Logger.Log('ERROR string out of range in JSON parser'); - END; - ASSERT(j < LEN(returnString)); - - 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 ArrayMaxNumberChar OF CHAR; - symbol: CHAR; - symbolStart: CHAR; - quoteStart: BOOLEAN; -BEGIN - NEW(self); - NEW(self.NonTerminalValues, ArrayMaxNumber); - self.GetTerminal := GetTerminal; - self.GetNonTerminal := GetNonTerminal; - self.GetTerminalKeys := GetTerminalKeys; - self.GetNoneTerminalKeys := GetNoneTerminalKeys; - NEW(characterStack); - characterStack := CharacterStack.Create(); - - i := 0; - j := 0; - terminalIterator := 0; - noneTerminalIterator := 0; - - Empty(key); - Empty(val); - Empty(nonTerminalVal); - Empty(string); - - 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]; - - (* Logger.LogIntLn(i); *) - (* IF i > 508 THEN - Logger.Log(text); - END; *) - (* 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; - - Empty(string); - END; - - IF (Strings.Length(key) > 0) & (Strings.Length(val) > 0) THEN - deQuote(key, self.TerminalKeys[terminalIterator]); - deQuote(val, self.TerminalValues[terminalIterator]); - - INC(terminalIterator); - - Empty(key); - Empty(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; - - Empty(string); - END; - - IF (Strings.Length(key) > 0) & (Strings.Length(nonTerminalVal) > 0) THEN - deQuote(key, self.NonTerminalKeys[noneTerminalIterator]); - self.NonTerminalValues[noneTerminalIterator] := Create(nonTerminalVal); - - INC(noneTerminalIterator); - - Empty(key); - Empty(nonTerminalVal); - END; - - INC(i); - UNTIL (i >= LEN(text) - 1) OR (text[i] = 0X); - - self.NonTerminalNumber := noneTerminalIterator; - self.TerminalNumber := terminalIterator; - - 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; - - keyFound := jsonRecord.GetTerminal(jsonRecord, "test2.sub", testValue); - - IF keyFound THEN - Logger.Log('found KEY'); - Logger.Log(testValue); - ELSE Logger.Log('Value for the Key is not found') END; *) -END JsonParser. \ No newline at end of file diff --git a/PackageFileParser.Mod b/PackageFileParser.Mod deleted file mode 100644 index f1f816b..0000000 --- a/PackageFileParser.Mod +++ /dev/null @@ -1,34 +0,0 @@ -MODULE PackageFileParser; -IMPORT - JsonParser, - FileManager, - http, - Logger, - DependencyResolver, - Settings; -CONST - MAXARRAYNUMBER = 1000; -PROCEDURE install*; -VAR - jsonData: ARRAY MAXARRAYNUMBER OF CHAR; - success: BOOLEAN; -BEGIN - Logger.Log("Starting install process"); - success := FileManager.Read(Settings.packageFileName, jsonData); - - IF ~success THEN Logger.Log("Some ERROR occured while reading VERSIONFILE") END; - ASSERT(success); - - Logger.Log("Starting resolving dependencies"); - - DependencyResolver.ResolveVersionFiles(jsonData); - DependencyResolver.ResolvePackages(); - Logger.Log("======================"); - Logger.Log("======================"); - Logger.Log("Installation complete"); - Logger.Log("Thanks for using OPIUM!"); -END install; - -BEGIN - -END PackageFileParser. \ No newline at end of file diff --git a/RemoteClient.Mod b/RemoteClient.Mod deleted file mode 100644 index 2c45e8c..0000000 --- a/RemoteClient.Mod +++ /dev/null @@ -1,6 +0,0 @@ -MODULE RemoteClient; -IMPORT - httpClient -BEGIN - -END RemoteClient. \ No newline at end of file diff --git a/Settings.Mod b/Settings.Mod deleted file mode 100644 index 9c5fdb1..0000000 --- a/Settings.Mod +++ /dev/null @@ -1,8 +0,0 @@ -MODULE Settings; -CONST - packageFileName* = "VersionFile.json"; - host* = "localhost"; - port* = "80"; - installPath* = "dependencies"; - quote* = '"'; -END Settings. \ No newline at end of file diff --git a/http.Mod b/http.Mod deleted file mode 100644 index eaf1bd4..0000000 --- a/http.Mod +++ /dev/null @@ -1,144 +0,0 @@ -MODULE http; -IMPORT Strings, Internet, Logger, Out; -CONST - MAXARRAYNUMBER = 10000; - MAXARRAYNUMBEREXTENDED = 100000; - -TYPE - PSTRING = POINTER TO ARRAY OF CHAR; - -VAR - buff, buff2: ARRAY MAXARRAYNUMBEREXTENDED OF CHAR; - -PROCEDURE Empty *(VAR string: ARRAY OF CHAR); -VAR - i : LONGINT; -BEGIN - FOR i := 0 TO LEN(string) - 1 DO string[i] := 0X END; - COPY("", string); -END Empty; - -PROCEDURE getClean *(buff: ARRAY OF CHAR; VAR clean: ARRAY OF CHAR); -VAR - i: INTEGER; - newLine: ARRAY 2 OF CHAR; - lineIsHeader, EOL, notFirstLine: BOOLEAN; -BEGIN - i := 0; - notFirstLine := FALSE; - lineIsHeader := FALSE; - EOL := FALSE; - - REPEAT - IF EOL THEN - lineIsHeader := FALSE; - EOL := FALSE; - notFirstLine := TRUE - END; - - IF buff[i] = ":" THEN lineIsHeader := TRUE END; - - IF ((buff[i - 1] = 0DX) & (buff[i] = 0AX)) THEN EOL := TRUE END; - - INC(i); - UNTIL (i + 2 > Strings.Length(buff)) OR (~lineIsHeader & EOL & notFirstLine); - - Strings.Extract(buff, i, Strings.Length(buff), clean); -END getClean; - -PROCEDURE AppendEOLAndClean(buff: ARRAY OF CHAR; VAR buffClean: PSTRING); -VAR i: LONGINT; -BEGIN - i := Strings.Length(buff); - - NEW(buffClean, i + 3); - - COPY(buff, buffClean^); - - buffClean[i] := 0DX; - buffClean[i + 1] := 0AX; - buffClean[i + 2] := " "; -END AppendEOLAndClean; - -PROCEDURE addHeader(key, val: ARRAY OF CHAR; VAR buff: PSTRING); -VAR - header: ARRAY MAXARRAYNUMBER OF CHAR; -BEGIN - Empty(header); - Strings.Append(key, header); - Strings.Append(": ", header); - Strings.Append(val, header); - AppendEOLAndClean(header, buff); -END addHeader; - -PROCEDURE getHeader(buff, key: ARRAY OF CHAR; VAR val: ARRAY OF CHAR); -VAR - positionStart, valPositionStart, i: LONGINT; -BEGIN - positionStart := Strings.Pos(key, buff, 0); - valPositionStart := positionStart + Strings.Length(key) + 1; - i := 0; - REPEAT - val[i] := buff[valPositionStart + i]; - INC(i); - UNTIL (ORD(val[i]) = 10) (* 0DX number(newline)*) OR - (i > Strings.Length(buff)); -END getHeader; - -PROCEDURE get *(host, port, path: ARRAY OF CHAR; VAR buff: ARRAY OF CHAR); -VAR - socket : Internet.Socket; - connectionFlag: BOOLEAN; - valueContentLength: REAL; - send, valueContentLengthString: ARRAY MAXARRAYNUMBER OF CHAR; - sendClean: PSTRING; - httpTail: ARRAY 16 OF CHAR; - endOfLine: ARRAY 3 OF CHAR; - tmpBuff: ARRAY MAXARRAYNUMBER OF CHAR; -BEGIN - Empty( buff); - httpTail := " HTTP/1.1"; - - connectionFlag := Internet.Connect(host, port, socket); - - send := "GET "; - - Strings.Append(path, send); - Strings.Append(httpTail, send); - - - AppendEOLAndClean(send, sendClean); - connectionFlag := Internet.Write(socket, sendClean^); - - addHeader("HOST", host, sendClean); - connectionFlag := Internet.Write(socket, sendClean^); - - addHeader("User-Agent", "oberon-http-client/1.0", sendClean); - connectionFlag := Internet.Write(socket, sendClean^); - - addHeader("Accept", "*/*", sendClean); - connectionFlag := Internet.Write(socket, sendClean^); - - AppendEOLAndClean("", sendClean); - connectionFlag := Internet.Write(socket, sendClean^); - REPEAT - Empty( tmpBuff); - - connectionFlag := Internet.Read(socket, tmpBuff); - Strings.Append(tmpBuff, buff); - getHeader(buff, "Content-Length", valueContentLengthString); - Strings.StrToReal(valueContentLengthString, valueContentLength); - (* Out.Real(valueContentLength, 6); - Out.Ln; - Logger.LogIntLn(Strings.Length(buff)); - *) - (* Logger.Log(buff); *) - UNTIL ~connectionFlag OR (Strings.Length(buff) > valueContentLength); - Internet.Disconnect(socket); -END get; - -BEGIN - (* get("norayr.am", "/tmp/", "80", buff); - getClean(buff, buff2); - Logger.Log(buff2); *) -END http. \ No newline at end of file