TITLE 'ICATS PARSE ROUTINE' PAR00010 *********************************************************************** PAR00020 * * PAR00030 * MODULE NAME = PARSE * PAR00040 * * PAR00050 * FUNCTION = TAKE AN UNPARSED CHARACTER STRING, SUCH AS THAT FROM * PAR00060 * AN SMSG OR A CONSOLE READ, AND PARSE THAT STRING * PAR00070 * INTO 15 8-BYTE TOKENS USING CMS'S PARSE ROUTINE. * PAR00080 * THE PARSED TOKENS GET PUT INTO THE 120-BYTE AREA * PAR00090 * POINTED TO BY R0. * PAR00100 * * PAR00110 * ENTRY POINTS = PARSE * PAR00120 * * PAR00130 * LINKAGE = BALR R14,R15 FROM ANYWHERE IN ICATS PROGRAM. * PAR00140 * THE ADDRESS OF THIS ROUTINE IS KEPT IN AN ADDRESS * PAR00150 * CONSTANT IN THE ICATS COMMON DATA AREA (ICDATA). * PAR00160 * FOR EXAMPLE, * PAR00170 * LA R0,WHERE PARSED PARMS ARE TO GO * PAR00180 * LA R1,CHARACTER LENGTH + STRING * PAR00190 * L R15,APARSE * PAR00200 * BALR R14,R15 * PAR00210 * * PAR00220 * REGISTER CONTENTS UPON ENTRY = * PAR00230 * R0 = CONTAINS THE ADDRESS OF THE 120-BYTE BUFFER WHERE THE * PAR00240 * PARSED PARAMETERS ARE TO GO. THIS AREA IS INITIALIZED * PAR00250 * TO ALL BLANKS, THEN UP TO 16 8-BYTE PARMS ARE MOVED IN. * PAR00260 * R1 = CONTAINS THE ADDRESS OF THE CHARACTER STRING LENGTH AND * PAR00270 * THE STRING ITSELF IN THIS FORMAT, * PAR00280 * DS CL1 CHARACTER STRING LENGTH * PAR00290 * DS CL?? CHARACTER STRING TO BE PARSED * PAR00300 * R2 = POINTS TO THE ICATS COMMON DATA AREA AS ALWAYS. * PAR00310 * R14 = RETURN ADDRESS BACK TO CALLER. * PAR00320 * R15 = ADDRESS OF THIS SUBROUTINE (USED FOR BASE REG). * PAR00330 * * PAR00340 * REGISTER USAGE: * PAR00350 * R0 = FREE * PAR00360 * R2 = USED TO ADDRESS ICDATA. * PAR00370 * R3-R13 = FREE * PAR00380 * R14 = RETURN ADDRESS FOR WHEN I CALL SUBROUTINES * PAR00390 * R15 = SUBROUTINE ADDRESS * PAR00400 * * PAR00410 * MODULE LOGIC = * PAR00420 * I) BRANCH TO CMS'S SCAN ROUTINE (ADDRESS IS IN NUCON) * PAR00430 * TO HAVE HIM PARSE THE CHARACTER STRING. * PAR00440 * II) MOVE PARSED TOKENS INTO USERS BUFFER AREA AFTER * PAR00450 * PADDING WITH BLANKS. * PAR00460 * * PAR00470 * NORMAL EXIT = * PAR00480 * R15 = 0 * PAR00490 * * PAR00500 * EXTERNAL REFERENCES = USES ASCANN IN NUCON WHICH IS THE ADDRESS * PAR00510 * OF CMS'S PARSE ROUTINE * PAR00520 * * PAR00530 * CONTROL BLOCKS = ICDATA (ICATS COMMON DATA AREA) * PAR00540 * * PAR00550 * NON-STANDARD MACROS (FOUND IN ICATS MACLIB) * PAR00560 * ICDATA = ICATS COMMON DATA AREA DSECT. * PAR00570 * * PAR00580 * CHANGE ACTIVITY * PAR00590 * DATE NAME REASON FOR CHANGE * PAR00600 * 04/18/83 RICK JASPER BROKEN AWAY FROM ICATS MAINLINE INTO * PAR00610 * SEPARATE SUBROUTINE * PAR00620 * 09/15/83 RICK JASPER RESTRUCTURED MODULE TO HAVE CALLER * PAR00630 * SPECIFY OUTPUT BUFFER. * PAR00640 * * PAR00650 *********************************************************************** PAR00660 EJECT PAR00670 PRINT GEN,NODATA PAR00680 PARSE CSECT PAR00690 USING NUCON,R0 NUCON DOESN'T NEED A BASE REGISTER PAR00700 USING ICDATA,R2 ADDRESS ICATS COMMON DATA AREA PAR00710 USING PARSE,R15 USE R15 FOR NEXT INSTRUCTION ONLY PAR00720 STM R0,R14,PARSREGS SAVE CALLERS REGISTERS PAR00730 USING PARSE,R11 SWITCH BASE REG CAUSE PARSE CALL USES R15 PAR00740 LR R11,R15 PAR00750 DROP R15 PAR00760 LR R6,R0 SAVE CALLER'S OUTPUT BUFFER ADDRESS PAR00770 SR R0,R0 PAR00780 ICM R0,1,0(R1) GET CHARACTER STRING LENGTH PAR00790 LA R1,1(R1) POINT TO START OF CHARACTER STRING PAR00800 L R15,ASCANN GET CMS'S SCAN ROUTINE ADDRESS FROM NUCON PAR00810 SPKA 0(0) PSW KEY MUST BE 0 FOR CMS'S SCAN ROUTINE PAR00820 BALR R14,R15 GO PARSE THE COMMAND LINE PAR00830 SPKA X'E0' SET IT BACK TO NORMAL PAR00840 *********************************************************************** PAR00850 * ON RETURN FROM ASCANN, * PAR00860 * R0 = BYTE COUNT OF THE NUMBER OF PARMS HE FOUND INCLUDING AN * PAR00870 * 8-BYTE DELIMITER OF 8X'FF'. * PAR00880 * R1 = ADDRESS OF WHERE PARSED PARAMETERS ARE. THE PARMS ARE * PAR00890 * SITTING IN CONSECUTIVE DOUBLEWORDS PADDED WITH BLANKS. * PAR00900 *********************************************************************** PAR00910 MVI 0(R6),C' ' BLANK OUT PARM AREA PAR00920 MVC 1(119,R6),0(R6) PAR00930 LR R15,R0 GET BYTE COUNT OF PARMS PAR00940 SRL R15,3 DIVIDE BY 8 PAR00950 BCTR R15,R0 DECREMENT PARM COUNT-DON'T WANT DELIMITER PAR00960 C R15,=F'15' MAKE SURE WE DON'T GET MORE THAN 15 PARMS PAR00970 BNH PARSCONA PAR00980 LA R15,15 MOVE ONLY THE FIRST 15 PARMS PAR00990 PARSCONA DS 0H PAR01000 LTR R15,R15 MAKE SURE THERE WERE SOME PARMS PAR01010 BZ PARSEBYE IF NOT, DON'T BOTHER MOVING ANYTHING PAR01020 SLL R15,3 GET BYTE COUNT OF # PARMS TO MOVE PAR01030 BCTR R15,R0 DECREMENT BYTE COUNT FOR THE MVC INSTR. PAR01040 EX R15,PARSEMVC MOVE TOKENIZED PARMS INTO PLACE PAR01050 PARSEBYE DS 0H PAR01060 LM R0,R14,PARSREGS RESTORE CALLERS REGISTERS PAR01070 BR R14 BYE PAR01080 PARSREGS DS 16F PAR01090 PARSEMVC MVC 0(0,R6),0(R1) PAR01100 LTORG PAR01110 ICDATA PAR01120 NUCON PAR01130 END PAR01140