separated string helper functions to a different module

added wirth styled timestamps
renamed makefile to lowercase
This commit is contained in:
norayr 2017-05-18 12:56:38 +04:00
parent c56cf32567
commit d94bf140dc
9 changed files with 161 additions and 155 deletions

159
IRC.Mod
View file

@ -1,5 +1,5 @@
MODULE IRC; MODULE IRC; (*noch 23.2.2017 / 18.5.2017*)
IMPORT Internet, Out, Strings := ooc2Strings, types; IMPORT Internet, Out, Strings := ooc2Strings, sh := stringHelpers, types;
CONST CONST
msgLen* = 512; (* message length not more than 512 characters *) msgLen* = 512; (* message length not more than 512 characters *)
@ -49,75 +49,6 @@ CONST
VAR VAR
eol* : ARRAY 3 OF CHAR; eol* : ARRAY 3 OF CHAR;
(* string operations *)
PROCEDURE zeroStr(VAR str: ARRAY OF CHAR);
VAR
i, j : LONGINT;
BEGIN
i := LEN(str);
j := 0;
REPEAT
str[j] := 0X;
INC(j)
UNTIL j = i;
END zeroStr;
PROCEDURE appendLFCR(VAR str: ARRAY OF CHAR);
VAR
l : INTEGER;
BEGIN
l := Strings.Length(str);
str[l] := LF;
str[l+1] := CR;
str[l+2] := 0X;
END appendLFCR;
PROCEDURE findChar(ch: CHAR; VAR line: ARRAY OF CHAR; VAR b: BOOLEAN; VAR pos: INTEGER);
VAR
i : INTEGER;
BEGIN
i := -1; pos := -1;
b := FALSE;
REPEAT
INC(i);
IF line[i] = ch THEN b := TRUE; pos := i END;
UNTIL b OR (i = LEN(line) - 1);
END findChar;
(* cuts line, takes the part till the eol *)
PROCEDURE cutLine(VAR src, dst: ARRAY OF CHAR);
VAR
found: BOOLEAN;
pos : INTEGER;
i : INTEGER;
BEGIN
COPY("", dst);
findChar(LF, src, found, pos);
IF found THEN
i := 0;
REPEAT
dst[i] := src[i];
INC(i);
UNTIL (i = pos) OR (i = LEN(dst)-2);
dst[i] := src[i];
dst[i+1] := 0X
END;
END cutLine;
PROCEDURE terminateLine(VAR str: ARRAY OF CHAR);
VAR
found: BOOLEAN;
pos : INTEGER;
BEGIN
findChar(LF, str, found, pos);
IF found THEN
IF (pos + 1) < LEN(str) THEN
str[pos + 1] := 0X
END
END;
END terminateLine;
PROCEDURE formUserNickLine(VAR user, owner, nick, res: ARRAY OF CHAR); PROCEDURE formUserNickLine(VAR user, owner, nick, res: ARRAY OF CHAR);
VAR VAR
l : INTEGER; l : INTEGER;
@ -167,7 +98,7 @@ BEGIN
Strings.Append(" ", str); Strings.Append(" ", str);
Strings.Append(nick, str); Strings.Append(nick, str);
Strings.Append(" +C", str); Strings.Append(" +C", str);
appendLFCR(str); sh.appendLFCR(str);
(*Strings.Append(eol, str);*) (*Strings.Append(eol, str);*)
i := 0; i := 0;
@ -179,7 +110,7 @@ BEGIN
IF i = LEN(channels^) THEN IF i = LEN(channels^) THEN
Strings.Append(eol, str); Strings.Append(eol, str);
ELSE ELSE
appendLFCR(str); sh.appendLFCR(str);
END; END;
UNTIL i = LEN(channels^); UNTIL i = LEN(channels^);
END formModeJoinLine; END formModeJoinLine;
@ -201,27 +132,6 @@ BEGIN
IF line[0] = ':' THEN RETURN TRUE ELSE RETURN FALSE END IF line[0] = ':' THEN RETURN TRUE ELSE RETURN FALSE END
END serverMsg; END serverMsg;
PROCEDURE contains (VAR line : ARRAY OF CHAR; pattern: ARRAY OF CHAR): BOOLEAN;
VAR
found: BOOLEAN;
pos : INTEGER;
i : INTEGER;
patternLength: INTEGER;
tmpline: POINTER TO ARRAY OF CHAR;
BEGIN
i := 0;
patternLength := Strings.Length(pattern);
NEW(tmpline, patternLength+1);
found := FALSE;
REPEAT
Strings.Extract(line, i, patternLength, tmpline^);
Out.String("COMPARING: "); Out.String(pattern); Out.String (" "); Out.String (tmpline^); Out.Ln;
found := Strings.Equal(pattern, tmpline^);
INC(i);
UNTIL found OR (i = LEN(line) - patternLength - 1);
IF found THEN RETURN TRUE ELSE RETURN FALSE END
END contains;
PROCEDURE rplWelcome(VAR line : ARRAY OF CHAR): BOOLEAN; PROCEDURE rplWelcome(VAR line : ARRAY OF CHAR): BOOLEAN;
VAR VAR
found: BOOLEAN; found: BOOLEAN;
@ -252,12 +162,11 @@ PROCEDURE Receive*(VAR inst: instance; VAR str: ARRAY OF CHAR): BOOLEAN;
VAR VAR
b: BOOLEAN; b: BOOLEAN;
BEGIN BEGIN
(*COPY ("", str);*) sh.zeroStr(str);
zeroStr(str);
b := Internet.Read(inst.connection, str); b := Internet.Read(inst.connection, str);
IF b THEN IF b THEN
Out.String("received:"); Out.Ln; Out.String("received: '"); Out.Ln;
Out.String(str); Out.String("|"); Out.Ln; Out.String(str); Out.String("'"); Out.Ln;
ELSE ELSE
Out.String("receive failed"); Out.Ln; Out.String("receive failed"); Out.Ln;
END; END;
@ -308,7 +217,7 @@ VAR
tmp: ARRAY msgLen OF CHAR; tmp: ARRAY msgLen OF CHAR;
b : BOOLEAN; b : BOOLEAN;
BEGIN BEGIN
cutLine(line, tmp); sh.cutLine(line, tmp);
tmp[1] := 'O'; (* replace "PING" by "PONG" *) tmp[1] := 'O'; (* replace "PING" by "PONG" *)
b := Send(inst, tmp); b := Send(inst, tmp);
END Pong; END Pong;
@ -318,7 +227,7 @@ VAR
str : ARRAY msgLen OF CHAR; str : ARRAY msgLen OF CHAR;
b : BOOLEAN; b : BOOLEAN;
BEGIN BEGIN
zeroStr(str); sh.zeroStr(str);
formModeLine(str, inst.nick); formModeLine(str, inst.nick);
b := Send(inst, str); b := Send(inst, str);
END Mode; END Mode;
@ -327,7 +236,7 @@ PROCEDURE ModeAndJoin*(VAR inst : instance);
VAR str: ARRAY msgLen OF CHAR; VAR str: ARRAY msgLen OF CHAR;
b: BOOLEAN; b: BOOLEAN;
BEGIN BEGIN
zeroStr(str); sh.zeroStr(str);
formModeJoinLine(str, inst.nick, inst.channelList); formModeJoinLine(str, inst.nick, inst.channelList);
b := Send(inst, str); b := Send(inst, str);
END ModeAndJoin; END ModeAndJoin;
@ -337,7 +246,7 @@ VAR
str: ARRAY msgLen OF CHAR; str: ARRAY msgLen OF CHAR;
b: BOOLEAN; b: BOOLEAN;
BEGIN BEGIN
zeroStr(str); sh.zeroStr(str);
formJoinLine(str, inst.channelList^[0]); formJoinLine(str, inst.channelList^[0]);
Out.String("SENDING JOIN LINE"); Out.Ln; Out.String("SENDING JOIN LINE"); Out.Ln;
b := Send(inst, str); b := Send(inst, str);
@ -348,7 +257,7 @@ VAR
pos: INTEGER; pos: INTEGER;
found: BOOLEAN; found: BOOLEAN;
BEGIN BEGIN
zeroStr(user); sh.zeroStr(user);
Strings.FindNext(" ", line, 1, found, pos); Strings.FindNext(" ", line, 1, found, pos);
IF found THEN IF found THEN
Strings.Extract(line, 1, pos - 1, user); Strings.Extract(line, 1, pos - 1, user);
@ -361,7 +270,7 @@ VAR
pos0, pos1: INTEGER; pos0, pos1: INTEGER;
found: BOOLEAN; found: BOOLEAN;
BEGIN BEGIN
zeroStr(mtype); sh.zeroStr(mtype);
Strings.FindNext(" ", line, 0, found, pos0); Strings.FindNext(" ", line, 0, found, pos0);
IF found THEN IF found THEN
Strings.FindNext(" ", line, pos0+1, found, pos1); Strings.FindNext(" ", line, pos0+1, found, pos1);
@ -372,44 +281,17 @@ BEGIN
RETURN found RETURN found
END getMsgType; END getMsgType;
PROCEDURE getNextWord(VAR src: ARRAY OF CHAR; spos: INTEGER; VAR dst: ARRAY OF CHAR);
VAR
i, j: INTEGER;
BEGIN
zeroStr(dst);
i := 0;
j := spos+1;
REPEAT
dst[i] := src[i+j];
INC(i);
UNTIL (i+j = Strings.Length(src)) OR (src[i+j] <= ' ');
END getNextWord;
PROCEDURE getTillEOL(VAR src: ARRAY OF CHAR; spos: INTEGER; VAR dst: ARRAY OF CHAR); (* actually get till any character < ' ' *)
VAR
i, j: INTEGER;
BEGIN
zeroStr(dst);
i := 0;
j := spos+1;
REPEAT
dst[i] := src[i+j];
INC(i);
UNTIL (i+j = Strings.Length(src)) OR (src[i+j] < ' ');
END getTillEOL;
PROCEDURE getRecipient(VAR line, room: ARRAY OF CHAR): BOOLEAN; PROCEDURE getRecipient(VAR line, room: ARRAY OF CHAR): BOOLEAN;
VAR VAR
pos0, pos1: INTEGER; pos0, pos1: INTEGER;
found: BOOLEAN; found: BOOLEAN;
BEGIN BEGIN
zeroStr(room); sh.zeroStr(room);
Strings.FindNext(" ", line, 0, found, pos1); Strings.FindNext(" ", line, 0, found, pos1);
IF found THEN IF found THEN
Strings.FindNext(" ", line, pos1+1, found, pos0); Strings.FindNext(" ", line, pos1+1, found, pos0);
IF found THEN IF found THEN
getNextWord(line, pos0, room); sh.getNextWord(line, pos0, room);
END; END;
END; END;
RETURN found RETURN found
@ -420,13 +302,13 @@ VAR
pos0, pos1: INTEGER; pos0, pos1: INTEGER;
found: BOOLEAN; found: BOOLEAN;
BEGIN BEGIN
zeroStr(msg); sh.zeroStr(msg);
Strings.FindNext(" ", line, 0, found, pos0); Strings.FindNext(" ", line, 0, found, pos0);
IF found THEN IF found THEN
Strings.FindNext(" ", line, pos0+1, found, pos1); Strings.FindNext(" ", line, pos0+1, found, pos1);
IF found THEN IF found THEN
Strings.FindNext(" ", line, pos1+1, found, pos0); Strings.FindNext(" ", line, pos1+1, found, pos0);
getTillEOL(line, pos0+1, msg); sh.getTillEOL(line, pos0+1, msg);
END; END;
END; END;
RETURN found RETURN found
@ -437,7 +319,7 @@ VAR
i: INTEGER; i: INTEGER;
b: BOOLEAN; b: BOOLEAN;
BEGIN BEGIN
zeroStr(username); sh.zeroStr(username);
Strings.FindNext("!", user, 0, b, i); Strings.FindNext("!", user, 0, b, i);
IF b THEN IF b THEN
Strings.Extract(user, 0, i, username); Strings.Extract(user, 0, i, username);
@ -450,7 +332,7 @@ VAR
i, j: INTEGER; i, j: INTEGER;
b: BOOLEAN; b: BOOLEAN;
BEGIN BEGIN
zeroStr(ident); sh.zeroStr(ident);
Strings.FindNext("~", user, 0, b, i); Strings.FindNext("~", user, 0, b, i);
IF b THEN IF b THEN
Strings.FindNext("@", user, i, b, j); Strings.FindNext("@", user, i, b, j);
@ -466,7 +348,7 @@ VAR
i: INTEGER; i: INTEGER;
b: BOOLEAN; b: BOOLEAN;
BEGIN BEGIN
zeroStr(host); sh.zeroStr(host);
Strings.FindNext("@", user, 0, b, i); Strings.FindNext("@", user, 0, b, i);
IF b THEN IF b THEN
Strings.Extract(user, i+1, Strings.Length(user)-i-1, host); Strings.Extract(user, i+1, Strings.Length(user)-i-1, host);
@ -528,7 +410,6 @@ BEGIN
END; END;
END parse; END parse;
PROCEDURE processResponse(VAR inst: instance; VAR line: ARRAY OF CHAR): BOOLEAN; PROCEDURE processResponse(VAR inst: instance; VAR line: ARRAY OF CHAR): BOOLEAN;
VAR VAR
b : BOOLEAN; b : BOOLEAN;

View file

@ -1,4 +1,4 @@
MODULE Internet; MODULE Internet; (*noch 14.4.2017 / 14.4.2017*)
IMPORT sockets, netdb, types, Strings, Out, Platform, SYSTEM; IMPORT sockets, netdb, types, Strings, Out, Platform, SYSTEM;
TYPE TYPE

View file

@ -1,11 +0,0 @@
VOC = /opt/voc/bin/voc
all:
$(VOC) -s types.Mod sockets.Mod netdb.Mod Internet.Mod IRC.Mod test.Mod -m
clean:
rm *.h
rm *.c
rm *.o
rm *.sym

11
makefile Normal file
View file

@ -0,0 +1,11 @@
VOC = /opt/voc/bin/voc
all:
$(VOC) -s types.Mod sockets.Mod netdb.Mod Internet.Mod stringHelpers.Mod IRC.Mod test.Mod -m
clean:
rm *.h
rm *.c
rm *.o
rm *.sym

View file

@ -1,4 +1,4 @@
MODULE netdb; MODULE netdb; (*noch 23.2.2017 / 14.4.2017*)
IMPORT SYSTEM; IMPORT SYSTEM;

View file

@ -1,4 +1,4 @@
MODULE sockets; MODULE sockets; (*noch 23.2.2017 / 14.4.2017*)
IMPORT types, SYS := SYSTEM; IMPORT types, SYS := SYSTEM;
TYPE TYPE

125
stringHelpers.Mod Normal file
View file

@ -0,0 +1,125 @@
MODULE stringHelpers; (*noch 18.5.2017 / 18.5.2017*)
IMPORT Strings := ooc2Strings;
CONST
CR* = 0DX;
LF* = 0AX;
(** feels whole array with zeroes, useful when one needs to get several strings which contain characters < ' ' and not necessarily end with 0X *)
PROCEDURE zeroStr*(VAR str: ARRAY OF CHAR);
VAR
i, j : LONGINT;
BEGIN
i := LEN(str);
j := 0;
REPEAT
str[j] := 0X;
INC(j)
UNTIL j = i;
END zeroStr;
PROCEDURE appendLFCR*(VAR str: ARRAY OF CHAR);
VAR
l : INTEGER;
BEGIN
l := Strings.Length(str);
str[l] := LF;
str[l+1] := CR;
str[l+2] := 0X;
END appendLFCR;
PROCEDURE findChar*(ch: CHAR; VAR line: ARRAY OF CHAR; VAR b: BOOLEAN; VAR pos: INTEGER);
VAR
i : INTEGER;
BEGIN
i := -1; pos := -1;
b := FALSE;
REPEAT
INC(i);
IF line[i] = ch THEN b := TRUE; pos := i END;
UNTIL b OR (i = LEN(line) - 1);
END findChar;
(* cuts line, takes the part till the eol *)
PROCEDURE cutLine*(VAR src, dst: ARRAY OF CHAR);
VAR
found: BOOLEAN;
pos : INTEGER;
i : INTEGER;
BEGIN
COPY("", dst);
findChar(LF, src, found, pos);
IF found THEN
i := 0;
REPEAT
dst[i] := src[i];
INC(i);
UNTIL (i = pos) OR (i = LEN(dst)-2);
dst[i] := src[i];
dst[i+1] := 0X
END;
END cutLine;
(* put 0X after eol in the string *)
PROCEDURE terminateLine*(VAR str: ARRAY OF CHAR);
VAR
found: BOOLEAN;
pos : INTEGER;
BEGIN
findChar(LF, str, found, pos);
IF found THEN
IF (pos + 1) < LEN(str) THEN
str[pos + 1] := 0X
END
END;
END terminateLine;
PROCEDURE getTillEOL*(VAR src: ARRAY OF CHAR; spos: INTEGER; VAR dst: ARRAY OF CHAR); (* actually get till any character < ' ' *)
VAR
i, j: INTEGER;
BEGIN
zeroStr(dst);
i := 0;
j := spos+1;
REPEAT
dst[i] := src[i+j];
INC(i);
UNTIL (i+j = Strings.Length(src)) OR (src[i+j] < ' ');
END getTillEOL;
(* get next word starting from spos till the ' ' *)
PROCEDURE getNextWord*(VAR src: ARRAY OF CHAR; spos: INTEGER; VAR dst: ARRAY OF CHAR);
VAR
i, j: INTEGER;
BEGIN
zeroStr(dst);
i := 0;
j := spos+1;
REPEAT
dst[i] := src[i+j];
INC(i);
UNTIL (i+j = Strings.Length(src)) OR (src[i+j] <= ' ');
END getNextWord;
PROCEDURE contains* (VAR line : ARRAY OF CHAR; pattern: ARRAY OF CHAR): BOOLEAN;
VAR
found: BOOLEAN;
pos : INTEGER;
i : INTEGER;
patternLength: INTEGER;
tmpline: POINTER TO ARRAY OF CHAR;
BEGIN
i := 0;
patternLength := Strings.Length(pattern);
NEW(tmpline, patternLength+1);
found := FALSE;
REPEAT
Strings.Extract(line, i, patternLength, tmpline^);
found := Strings.Equal(pattern, tmpline^);
INC(i);
UNTIL found OR (i = LEN(line) - patternLength - 1);
IF found THEN RETURN TRUE ELSE RETURN FALSE END
END contains;
END stringHelpers.

View file

@ -1,4 +1,4 @@
MODULE test; MODULE test; (* noch 13.4.2017 / 18.5.2017*)
IMPORT IRC, Out, Strings := ooc2Strings; IMPORT IRC, Out, Strings := ooc2Strings;

View file

@ -1,4 +1,4 @@
MODULE types; MODULE types; (*noch 23.2.2017 / 13.4.2017*)
IMPORT SYS := SYSTEM; IMPORT SYS := SYSTEM;