SUBROUTINE PARSER C C **************************************************************** C C KERMIT for the MODCOMP MAXIV operating system C C Compliments of: C C SETPOINT, Inc. C 10245 Brecksville Rd. C Brecksville, Ohio 44141 C C C KERMIT is a copyrighted protocol of Columbia Univ. The authors C of this version hereby grant permission to copy this software C provided that it is not used for an explicitly commercial C purpose and that proper credit be given. SETPOINT, Inc. makes C no warranty whatsoever regarding the accuracy of this package C and will assume no liability resulting from it's use. C C **************************************************************** C C Abstract: Main Command Parser C C MODIFICATION HISTORY C C BY DATE REASON PROGRAMS AFFECTED C C **************************************************************** C C Author: Rick Burke Version: A.0 Date: Aug-86 C C Calling Parameters: None C C **************************************************************** C C Messages generated by this module : None C C **************************************************************** C C Subroutines called directly : IAND, ISHFT, READ4, SCONNE, C SHELP, SKIPBL, SQUIT, SRECEI, C SSEND, SSET, SSTATU, UPPER C C **************************************************************** C C Files referenced : None C C **************************************************************** C C Local variable definitions : C C ACOUNT - Index variable into ALIN C CCOUNT - Index variable into CLIN C CMDLEN - Max length of each command in CMDTBL C FOUND - Number of matches - 1 found in CMDTBL C I - Index variable C IEND - Number of chars in CLIN to search for the C the end of the user-entered word C J - Index variable C NDX - Index variable C NUMCMD - Number of commands in CMDTBL C TV1 - Temporary variable C WCHCMD - Index into CMDTBL to command requested by the C the user C ALIN(132) - Command line entered by user C CLIN(132) - Upper case command line entered by user C CMDTBL(8,8) - Table of commands allowed by Kermit C C **************************************************************** C C Commons referenced : KER, KERPAR, and UFTTBL local commons C C **************************************************************** C C (*$END.DOCUMENT*) C C **************************************************************** C * * C * D I M E N S I O N S T A T E M E N T S * C * * C **************************************************************** C IMPLICIT INTEGER (A-Z) INTEGER*2 CMDTBL(8,8) INTEGER*2 ALIN(132), CLIN(132) C C **************************************************************** C * * C * T Y P E S T A T E M E N T S * C * * C **************************************************************** C C C **************************************************************** C * * C * C O M M O N S T A T E M E N T S * C * * C **************************************************************** C INCLUDE USL/KERCOM INCLUDE USL/KERPMC INCLUDE USL/UFTTBC C C **************************************************************** C * * C * E Q U I V A L E N C E S T A T E M E N T S * C * * C **************************************************************** C C C **************************************************************** C * * C * D A T A S T A T E M E N T S * C * * C **************************************************************** C C-----> Implemented commands are: C C 1) CONNECT - hooks to a dummy routine provided C 2) EXIT C 3) HELP C 4) QUIT C 5) RECEIVE C 6) SET C 7) SEND C 8) STATUS C DATA CMDTBL /67,79,78,78,69,67,84,10002, > 69,88,73,84,10002,0,0,0, > 72,69,76,80,10002,0,0,0, > 81,85,73,84,10002,0,0,0, > 82,69,67,69,73,86,69,10002, > 83,69,84,10002,0,0,0,0, > 83,69,78,68,10002,0,0,0, > 83,84,65,84,85,83,10002,0/ DATA NUMCMD /8/, CMDLEN /8/ C C **************************************************************** C C Code starts here : C 10 CONTINUE WRITE (LOCALO,1000) 1000 FORMAT (' KERMIT MAXIV> ') C C-----> Read a line from the keyboard and convert it to C-----> uppercase. C DO 11 I=1,32 ALIN(I) = 0 CLIN(I) = 0 11 CONTINUE CALL READ4 (IUFT(1,2),CLIN,132,.TRUE.) IF (IAND (IUFT(1,2),4Z0020) .NE. 0) CALL SQUIT C C-----> Unpack the line so the other character manipulation C-----> routines will work. C ACOUNT = 1 CCOUNT = 1 12 CONTINUE TV1 = ISHFT (CLIN(CCOUNT),-8) IF (TV1 .EQ. 0) GO TO 13 ALIN(ACOUNT) = TV1 ACOUNT = ACOUNT + 1 TV1 = IAND (CLIN(CCOUNT),4Z00FF) IF (TV1 .EQ. 0) GO TO 13 ALIN(ACOUNT) = TV1 ACOUNT = ACOUNT + 1 CCOUNT = CCOUNT + 1 GO TO 12 13 CONTINUE IF (ALIN(ACOUNT-1) .EQ. BLANK) ACOUNT = ACOUNT - 1 ALIN(ACOUNT) = LF ALIN(ACOUNT+1) = EOS C CALL UPPER (ALIN,CLIN) C C-----> Extract the first word in the command line and remove C-----> any leading blanks. C TV1 = 1 CALL SKIPBL (CLIN,TV1) DO 20 I=1,132 ALIN(I) = 0 20 CONTINUE IEND = 81 - TV1 DO 30 NDX=1,IEND ALIN(NDX) = CLIN(NDX+TV1-1) IF (ALIN(NDX) .EQ. LF .OR. > ALIN(NDX) .EQ. BLANK ) GO TO 40 30 CONTINUE NDX = IEND + 1 40 CONTINUE ALIN(NDX) = LF ALIN(NDX+1) = EOS C C-----> Loop to compare word from command line to all commands. C FOUND = -1 WCHCMD = 0 DO 70 J=1,NUMCMD DO 50 I=1,CMDLEN C C-----> Check for end of word. If end of word then we have a match. C IF (ALIN(I) .EQ. LF) GO TO 60 C C-----> Check for end of key word. If end of key word found then C-----> we don't have a match. C IF (CMDTBL(I,J) .EQ. EOS) GO TO 70 C C-----> Compare the characters. C IF (ALIN(I) .NE. CMDTBL(I,J)) GO TO 70 50 CONTINUE GO TO 70 60 CONTINUE C C-----> Here user's command matches a keyword, so remember which C-----> command was matched and bump the counter for number of C-----> matches found and loop back to check the next command. C WCHCMD = J FOUND = FOUND + 1 70 CONTINUE C C-----> Branch based on the number of matches found between the C-----> user's command and the command table. C IF (FOUND) 200,100,300 100 CONTINUE C C-----> User's command matched only one keyword, so process it. C GOTO (110,120,130,120,150,160,170,180),WCHCMD 110 CONTINUE C C-----> CONNECT keyword. C CALL SCONNE GO TO 10 120 CONTINUE C C-----> EXIT keyword. C CALL SQUIT 130 CONTINUE C C-----> HELP keyword. C CALL SHELP GO TO 10 150 CONTINUE C C-----> RECEIVE keyword. C CALL SRECEI GO TO 10 160 CONTINUE C C-----> SET keyword. C CALL SSET (CLIN(TV1+NDX-1)) GO TO 10 170 CONTINUE C C-----> SEND keyword. C CALL SSEND (CLIN(TV1+NDX-1)) GO TO 10 180 CONTINUE C C-----> STATUS keyword. C CALL SSTATU GO TO 10 200 CONTINUE C C-----> User's command does not match any valid key word. C WRITE (LOCALO,1010) 1010 FORMAT (' UNRECOGNIZED COMMAND - TYPE "HELP"') GO TO 10 300 CONTINUE C C-----> User's command word matches more than 1 valid keyword. C WRITE (LOCALO,1020) 1020 FORMAT (' AMBIGUOUS COMMAND - TYPE "HELP"') GO TO 10 400 CONTINUE RETURN END