From ea18cdabffee384602878712433198da725279e5 Mon Sep 17 00:00:00 2001 From: norayr Date: Sat, 15 Apr 2017 00:06:22 +0400 Subject: [PATCH] error handling. --- IRC.Mod | 60 ++++++++++++++++++++++++++++++++++++++++---------------- test.Mod | 6 +++--- 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/IRC.Mod b/IRC.Mod index 8f48ee1..04b415c 100644 --- a/IRC.Mod +++ b/IRC.Mod @@ -17,6 +17,8 @@ CONST numRPLCREATED = "003"; numRPLMYINFO = "004"; + errClosingLink = "ERROR :Closing Link:"; + TYPE chn* = ARRAY 32 OF CHAR; chnlist* = POINTER TO ARRAY OF chn; @@ -37,17 +39,27 @@ VAR (* 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 *) PROCEDURE cutLine(VAR src, dst: ARRAY OF CHAR); VAR found: BOOLEAN; pos : INTEGER; i : INTEGER; - pattern : ARRAY 1 OF CHAR; BEGIN - pattern[0] := LF; COPY("", dst); - Strings.FindNext(pattern, src, 0, found, pos); + findChar(LF, src, found, pos); IF found THEN i := 0; REPEAT @@ -63,10 +75,8 @@ PROCEDURE terminateLine(VAR str: ARRAY OF CHAR); VAR found: BOOLEAN; pos : INTEGER; - pattern : ARRAY 1 OF CHAR; BEGIN - pattern[0] := LF; - Strings.FindNext(pattern, str, 0, found, pos); + findChar(LF, str, found, pos); IF found THEN IF (pos + 1) < LEN(str) THEN str[pos + 1] := 0X @@ -139,6 +149,14 @@ BEGIN IF found THEN RETURN TRUE ELSE RETURN FALSE END 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 *) @@ -235,29 +253,37 @@ BEGIN b := Send(inst, str); 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 + b := TRUE; IF isPing(line) THEN Pong(inst, line) END; - - IF serverMsg(line) THEN - IF rplWelcome(line) THEN - Mode(inst); - Join(inst); - ELSE - inst.callback(line); + IF error(line) THEN + Disconnect(inst); + b := FALSE; + ELSE + IF serverMsg(line) THEN + IF rplWelcome(line) THEN + Mode(inst); + Join(inst); + ELSE + inst.callback(line); + END; END; END; + RETURN b; END processResponse; PROCEDURE Loop*(VAR inst: instance); VAR - b : BOOLEAN; + b, b2 : BOOLEAN; str : ARRAY msgLen OF CHAR; BEGIN REPEAT b := Receive(inst, str); - processResponse(inst, str); - UNTIL ~b; + b2 := processResponse(inst, str); + UNTIL ~b OR ~b2; END Loop; BEGIN diff --git a/test.Mod b/test.Mod index 5745938..8c4853b 100644 --- a/test.Mod +++ b/test.Mod @@ -20,9 +20,9 @@ VAR channels : IRC.chnlist; b: BOOLEAN; BEGIN - inst.owner := "norayr_shimamoto"; - inst.user := "nakata_san"; - inst.nick := "oshima"; + inst.owner := "norayr_tanakian"; + inst.user := "norayr_tanakian"; + inst.nick := "vocbot"; inst.host := "irc.freenode.net"; inst.port := "6667"; inst.callback := clbk;