error handling.

This commit is contained in:
norayr 2017-04-15 00:06:22 +04:00
parent f3c9e3e006
commit ea18cdabff
2 changed files with 46 additions and 20 deletions

60
IRC.Mod
View file

@ -17,6 +17,8 @@ CONST
numRPLCREATED = "003"; numRPLCREATED = "003";
numRPLMYINFO = "004"; numRPLMYINFO = "004";
errClosingLink = "ERROR :Closing Link:";
TYPE TYPE
chn* = ARRAY 32 OF CHAR; chn* = ARRAY 32 OF CHAR;
chnlist* = POINTER TO ARRAY OF chn; chnlist* = POINTER TO ARRAY OF chn;
@ -37,17 +39,27 @@ VAR
(* string operations *) (* string operations *)
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 *) (* cuts line, takes the part till the eol *)
PROCEDURE cutLine(VAR src, dst: ARRAY OF CHAR); PROCEDURE cutLine(VAR src, dst: ARRAY OF CHAR);
VAR VAR
found: BOOLEAN; found: BOOLEAN;
pos : INTEGER; pos : INTEGER;
i : INTEGER; i : INTEGER;
pattern : ARRAY 1 OF CHAR;
BEGIN BEGIN
pattern[0] := LF;
COPY("", dst); COPY("", dst);
Strings.FindNext(pattern, src, 0, found, pos); findChar(LF, src, found, pos);
IF found THEN IF found THEN
i := 0; i := 0;
REPEAT REPEAT
@ -63,10 +75,8 @@ PROCEDURE terminateLine(VAR str: ARRAY OF CHAR);
VAR VAR
found: BOOLEAN; found: BOOLEAN;
pos : INTEGER; pos : INTEGER;
pattern : ARRAY 1 OF CHAR;
BEGIN BEGIN
pattern[0] := LF; findChar(LF, str, found, pos);
Strings.FindNext(pattern, str, 0, found, pos);
IF found THEN IF found THEN
IF (pos + 1) < LEN(str) THEN IF (pos + 1) < LEN(str) THEN
str[pos + 1] := 0X str[pos + 1] := 0X
@ -139,6 +149,14 @@ BEGIN
IF found THEN RETURN TRUE ELSE RETURN FALSE END IF found THEN RETURN TRUE ELSE RETURN FALSE END
END rplWelcome; END rplWelcome;
PROCEDURE error(VAR line: ARRAY OF CHAR): BOOLEAN;
VAR
b : BOOLEAN;
pos: INTEGER;
BEGIN
Strings.FindNext(errClosingLink, line, 0, b, pos);
RETURN b
END error;
(* instance functions *) (* instance functions *)
@ -235,29 +253,37 @@ BEGIN
b := Send(inst, str); b := Send(inst, str);
END Join; END Join;
PROCEDURE processResponse(VAR inst: instance; VAR line: ARRAY OF CHAR); PROCEDURE processResponse(VAR inst: instance; VAR line: ARRAY OF CHAR): BOOLEAN;
VAR
b : BOOLEAN;
BEGIN BEGIN
b := TRUE;
IF isPing(line) THEN Pong(inst, line) END; IF isPing(line) THEN Pong(inst, line) END;
IF error(line) THEN
IF serverMsg(line) THEN Disconnect(inst);
IF rplWelcome(line) THEN b := FALSE;
Mode(inst); ELSE
Join(inst); IF serverMsg(line) THEN
ELSE IF rplWelcome(line) THEN
inst.callback(line); Mode(inst);
Join(inst);
ELSE
inst.callback(line);
END;
END; END;
END; END;
RETURN b;
END processResponse; END processResponse;
PROCEDURE Loop*(VAR inst: instance); PROCEDURE Loop*(VAR inst: instance);
VAR VAR
b : BOOLEAN; b, b2 : BOOLEAN;
str : ARRAY msgLen OF CHAR; str : ARRAY msgLen OF CHAR;
BEGIN BEGIN
REPEAT REPEAT
b := Receive(inst, str); b := Receive(inst, str);
processResponse(inst, str); b2 := processResponse(inst, str);
UNTIL ~b; UNTIL ~b OR ~b2;
END Loop; END Loop;
BEGIN BEGIN

View file

@ -20,9 +20,9 @@ VAR
channels : IRC.chnlist; channels : IRC.chnlist;
b: BOOLEAN; b: BOOLEAN;
BEGIN BEGIN
inst.owner := "norayr_shimamoto"; inst.owner := "norayr_tanakian";
inst.user := "nakata_san"; inst.user := "norayr_tanakian";
inst.nick := "oshima"; inst.nick := "vocbot";
inst.host := "irc.freenode.net"; inst.host := "irc.freenode.net";
inst.port := "6667"; inst.port := "6667";
inst.callback := clbk; inst.callback := clbk;