Rewrite IRC-MSG to return string pointers.

This commit is contained in:
Quinn Evans 2015-10-03 15:30:50 -06:00
parent d8ceb17fe4
commit 06ded93ce6
1 changed files with 54 additions and 37 deletions

View File

@ -1,58 +1,75 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. "IRC-MSG".
PROGRAM-ID. "PARSE-IRC-MSG".
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WORK PIC X(480).
01 MSG-POINTER PIC 9(3).
01 WORK-PARAMETER.
03 WORK PIC X(999).
88 BLANK-PARAM VALUE SPACES.
03 WORK-1 REDEFINES WORK PIC X(6).
88 REST-PARAMETER VALUE "$COLN$".
03 WORK-DELIM PIC X(6).
88 IDENT-SPEC VALUE "!".
88 HOST-SPEC VALUE "@".
88 END-PREFIX VALUE SPACES.
01 MSG-POINTER PIC 999.
01 LOOP-STATE PIC 99.
88 DONE VALUE 99.
LINKAGE SECTION.
01 BUFFER.
03 MSG-BODY PIC X(999).
03 MSG-BODY-1 REDEFINES MSG-BODY PIC X(6).
88 HAS-PREFIX VALUE "$COLN$".
01 IRC-MESSAGE.
01 IRC-PARAMETERS.
03 NUM-PARAMETERS PIC 99.
03 PREFIX.
05 NICK PIC X(16).
05 IDENT PIC X(16).
05 HOST PIC X(64).
03 COMMAND PIC X(16).
03 PARAMETERS.
05 TARGET PIC X(50).
05 REST PIC X(480).
05 REST-PREFIX REDEFINES REST PIC X(6).
88 REST-PARAM VALUE "$COLN$".
05 MSG-SRC PIC 999.
05 IDENT PIC 999.
05 HOST PIC 999.
03 COMMAND PIC 999.
03 PARAMS.
05 PARAM PIC 999 OCCURS 15 TIMES.
PROCEDURE DIVISION USING BUFFER, IRC-MESSAGE.
MOVE SPACES TO IRC-MESSAGE.
PROCEDURE DIVISION USING BUFFER, IRC-PARAMETERS.
MOVE 0 TO LOOP-STATE.
MOVE 0 TO IRC-PARAMETERS.
MOVE SPACES TO WORK.
MOVE 1 TO MSG-POINTER.
IF HAS-PREFIX THEN
PERFORM WITH-PREFIX
ELSE
MOVE 1 TO MSG-POINTER.
UNSTRING MSG-BODY,
DELIMITED BY SPACES,
INTO COMMAND, TARGET
WITH POINTER MSG-POINTER.
UNSTRING MSG-BODY DELIMITED BY "$NUL$",
INTO REST,
WITH POINTER MSG-POINTER.
IF REST-PARAM THEN
MOVE REST TO WORK
MOVE 7 TO MSG-POINTER
UNSTRING WORK
INTO REST
WITH POINTER MSG-POINTER.
MOVE MSG-POINTER TO COMMAND.
UNSTRING MSG-BODY DELIMITED BY SPACES
INTO WORK
WITH POINTER MSG-POINTER.
PERFORM GET-PARAMETER
VARYING NUM-PARAMETERS FROM 1, BY 1
UNTIL DONE OR
NUM-PARAMETERS IS GREATER THAN OR EQUAL TO 15.
EXIT PROGRAM.
GET-PARAMETER.
MOVE MSG-POINTER TO PARAM(NUM-PARAMETERS).
MOVE SPACES TO WORK.
UNSTRING MSG-BODY DELIMITED BY SPACES
INTO WORK
WITH POINTER MSG-POINTER.
IF BLANK-PARAM OR REST-PARAMETER THEN
MOVE 99 TO LOOP-STATE.
IF BLANK-PARAM THEN
SUBTRACT 1 FROM NUM-PARAMETERS.
WITH-PREFIX.
MOVE 7 TO MSG-POINTER.
UNSTRING MSG-BODY,
DELIMITED BY SPACES,
INTO WORK,
WITH POINTER MSG-POINTER.
MOVE 7 TO MSG-POINTER, MSG-SRC.
PERFORM GET-PREFIX-PART UNTIL END-PREFIX.
MOVE SPACES TO WORK-DELIM.
GET-PREFIX-PART.
UNSTRING WORK,
DELIMITED BY "$EXC$" OR "$AT$",
INTO NICK,
IDENT,
HOST.
DELIMITED BY "$EXC$", OR "$AT$", OR SPACES,
INTO WORK, DELIMITER IN WORK-DELIM,
WITH POINTER MSG-POINTER.
IF IDENT-SPEC THEN MOVE MSG-POINTER TO IDENT.
IF HOST-SPEC THEN MOVE MSG-POINTER TO HOST.