! !======================================================================! !++ ! +-------------------------------------------------+ ! I I ! I N E T D U M I ! I - - - - - - I ! I I ! +-------------------------------------------------+ ! ! FUNCTION: ! ! GENERAL PURPOSE NETWORK DUMMY PROGRAM ! ! ! AUTHOR: BOB STEWART, DIGITAL EQUIPMENT CORP. DISTRIBUTED SYSTEMS ! ! UNDER DEVELOPMENT AND, UNFORTUNATELY, NOT COMMENTED. ! !-- !======================================================================! ! SUBROUTINE ABOCOM(LINE,LENGTH,CURPOS,LINLUN,LINEST,QUIT) INTEGER*2 LENGTH,CURPOS,LINLUN,STABLO(2),OUTLEN BYTE LINE(1),OUTDAT(16) LOGICAL*1 LINEST,QUIT ! CALL GETOPT(LINE,LENGTH,CURPOS,OUTDAT,OUTLEN) IF (OUTLEN.LT.0) GOTO 1099 CALL ABTNTW(LINLUN,STABLO,OUTLEN,OUTDAT) IF (STABLO(1).GT.0) GOTO 1198 CALL PRIERR('ABTNTW',STABLO(1)) GOTO 1199 1198 CONTINUE LINEST=.FALSE. TYPE 20 20 FORMAT (X,'Aborted') 1199 CONTINUE 1099 CONTINUE RETURN END SUBROUTINE CONCOM(LINE,LENGTH,CURPOS,LINLUN,LINEST,QUIT) INTEGER*2 LENGTH,CURPOS,LINLUN,ARGLEN,NODIND,NODLEN,TASIND,TASLEN INTEGER*2 OBJECT,INTNUM,CONBLO(36),STABLO(2),OUTLEN BYTE LINE(1),OUTDAT(16),INDAT(16) LOGICAL*1 LINEST,QUIT,EMPTY,OK ! TASLEN=-1 IF (.NOT.EMPTY(LINE,LENGTH,CURPOS)) GOTO 1001 TYPE 10 10 FORMAT (X,'Must specify a node name') GOTO 1099 1001 CONTINUE NODIND=CURPOS NODLEN=ARGLEN(LINE,LENGTH,CURPOS) CALL LOW2UP(LINE(CURPOS),NODLEN) CURPOS=CURPOS+NODLEN IF (.NOT.EMPTY(LINE,LENGTH,CURPOS)) GOTO 1101 TYPE 20 20 FORMAT (X,'Must specify an object type') GOTO 1199 1101 CONTINUE IF (INTNUM(LINE,LENGTH,CURPOS,OBJECT)) GOTO 1201 TYPE 30 30 FORMAT (X,'Invalid object type') GOTO 1299 1201 CONTINUE IF (OBJECT.EQ.0) GOTO 1301 TASIND=1 TASLEN=0 GOTO 1399 1301 CONTINUE IF (.NOT.EMPTY(LINE,LENGTH,CURPOS)) GOTO 1401 TYPE 40 40 FORMAT (X,'Must specify task name') GOTO 1499 1401 CONTINUE TASIND=CURPOS TASLEN=ARGLEN(LINE,LENGTH,CURPOS) CALL LOW2UP(LINE(CURPOS),TASLEN) CURPOS=CURPOS+TASLEN 1499 CONTINUE 1399 CONTINUE IF (TASLEN.GE.0) CALL GETOPT(LINE,LENGTH,CURPOS,OUTDAT,OUTLEN) IF (OUTLEN.LT.0) TASLEN=-1 1299 CONTINUE 1199 CONTINUE 1099 CONTINUE IF (TASLEN.LT.0) GOTO 1599 CALL PARNOD(OK,CONBLO,NODLEN,LINE(NODIND)) IF (.NOT.OK) GOTO 1699 IF (OBJECT.NE.0) CALL BFMT0(OK,CONBLO,NODLEN,LINE(NODIND), & OBJECT) IF (OBJECT.EQ.0) CALL BFMT1(OK,CONBLO,NODLEN,LINE(NODIND), & OBJECT,TASLEN,LINE(TASIND)) IF (OK) GOTO 1701 TYPE 50 50 FORMAT (X,'One of your connect parameters is invalid') GOTO 1799 1701 CONTINUE CALL BACC(,CONBLO) CALL CONNTW(LINLUN,STABLO,CONBLO,OUTLEN,OUTDAT,16,INDAT) IF (STABLO(1).GT.0) GOTO 1801 CALL PRIERR('CONNTW',STABLO(1)) GOTO 1899 1801 CONTINUE LINEST=.TRUE. TYPE 80 80 FORMAT (X,'Connected') 1899 CONTINUE IF (STABLO(1).GT.0.OR.STABLO(1).EQ.-12) CALL PRIOPT(INDAT, & STABLO(2)) 1799 CONTINUE 1699 CONTINUE 1599 CONTINUE RETURN END SUBROUTINE DECCOM(LINE,LENGTH,CURPOS) INTEGER*2 LENGTH,CURPOS,LOW,HIGH,IOR,ISHFT,TOPBIT BYTE LINE(1) LOGICAL*1 OCTNUM,ERROR,EMPTY,TWOBYT ! DATA TOPBIT /"177400/ ! CALL SKIDEL(LINE,LENGTH,CURPOS) IF (OCTNUM(LINE,LENGTH,CURPOS,LOW)) GOTO 1001 TYPE 10 10 FORMAT (X,'Invalid octal number') GOTO 1099 1001 CONTINUE ERROR=.FALSE. IF (.NOT.EMPTY(LINE,LENGTH,CURPOS)) GOTO 1101 TWOBYT=.FALSE. HIGH=0 GOTO 1199 1101 CONTINUE TWOBYT=.TRUE. ERROR=.NOT.OCTNUM(LINE,LENGTH,CURPOS,HIGH) 1199 CONTINUE IF (.NOT.ERROR) GOTO 1201 TYPE 10 GOTO 1299 1201 CONTINUE IF (LOW.LE."377.AND.HIGH.LE."377) GOTO 1301 TYPE 20 20 FORMAT (X,'377 is the maximum value of a byte') GOTO 1399 1301 CONTINUE IF (TWOBYT) GOTO 1401 IF (LOW.GE."200) LOW=IOR(LOW,TOPBIT) GOTO 1499 1401 CONTINUE LOW=IOR(LOW,ISHFT(HIGH,8)) 1499 CONTINUE TYPE 30,LOW 30 FORMAT (X,'Decimal =',I7) 1399 CONTINUE 1299 CONTINUE 1099 CONTINUE RETURN END SUBROUTINE DISCOM(LINE,LENGTH,CURPOS,LINLUN,LINEST,QUIT) INTEGER*2 LENGTH,CURPOS,LINLUN,STABLO(2),OUTLEN BYTE LINE(1),OUTDAT(16) LOGICAL*1 LINEST,QUIT ! CALL GETOPT(LINE,LENGTH,CURPOS,OUTDAT,OUTLEN) IF (OUTLEN.LT.0) GOTO 1099 CALL DSCNTW(LINLUN,STABLO,OUTLEN,OUTDAT) IF (STABLO(1).GT.0) GOTO 1198 CALL PRIERR('DSCNTW',STABLO(1)) GOTO 1199 1198 CONTINUE LINEST=.FALSE. TYPE 20 20 FORMAT (X,'Disconnected') 1199 CONTINUE 1099 CONTINUE RETURN END SUBROUTINE EVECOM(LINE,LENGTH,CURPOS,LINEST,QUIT) PARAMETER BUFMAX=300,NETLUN=1 INTEGER*2 LENGTH,CURPOS,STABLO(2),BUFLEN INTEGER*2 ARGLEN,NAMIND,NAMLEN,TASIND,TASLEN BYTE LINE(1),BUFFER(BUFMAX) LOGICAL*1 LINEST,QUIT,EMPTY ! IF (.NOT.EMPTY(LINE,LENGTH,CURPOS)) GOTO 1001 TYPE 10 10 FORMAT (X,'Must specify a task name') GOTO 1099 1001 CONTINUE NAMIND=CURPOS NAMLEN=ARGLEN(LINE,LENGTH,CURPOS) CALL LOW2UP(LINE(CURPOS),NAMLEN) CURPOS=CURPOS+NAMLEN IF (NAMLEN.LE.6) GOTO 1101 TYPE 20 20 FORMAT (X,'Task name longer than 6 characters') GOTO 1199 1101 CONTINUE BUFFER(3)=0 BUFFER(4)=0 CALL IRAD50(NAMLEN,LINE(NAMIND),BUFFER) BUFLEN=BUFMAX-4 CALL GETDAT(LINE,LENGTH,CURPOS,BUFFER(5),BUFLEN) IF (BUFLEN.LE.0) GOTO 1299 CALL PEMNTW(NETLUN,STABLO,BUFLEN+4,BUFFER) IF (STABLO(1).GT.0) GOTO 1301 CALL PRIERR('PEMNTW',STABLO(1)) LINEST=.FALSE. GOTO 1399 1301 CONTINUE TYPE 40 40 FORMAT (X,'Transmitted') 1399 CONTINUE 1299 CONTINUE 1199 CONTINUE 1099 CONTINUE RETURN END SUBROUTINE GETDAT(LINE,LENGTH,CURPOS,BUFFER,BUFLEN) INTEGER*2 LENGTH,CURPOS,BUFLEN,COUNT,NUMBER BYTE LINE(1),BUFFER(1) LOGICAL*1 EMPTY,OCTNUM ! COUNT=0 1000 IF (COUNT.GE.BUFLEN.OR.EMPTY(LINE,LENGTH,CURPOS)) GOTO 1099 IF (OCTNUM(LINE,LENGTH,CURPOS,NUMBER)) GOTO 1101 TYPE 10 10 FORMAT (X,'Invalid octal number') COUNT=BUFLEN+1 GOTO 1199 1101 CONTINUE IF(NUMBER.LE."377) GOTO 1201 TYPE 20 20 FORMAT (X,'377 is the biggest octal number allowed') COUNT=BUFLEN+1 GOTO 1299 1201 CONTINUE COUNT=COUNT+1 BUFFER(COUNT)=NUMBER 1299 CONTINUE 1199 CONTINUE GOTO 1000 1099 CONTINUE IF (COUNT.NE.0) GOTO 1301 TYPE 30 30 FORMAT (X,'Must include some data') BUFLEN=-1 GOTO 1399 1301 CONTINUE IF (COUNT.LE.BUFLEN) GOTO 1401 BUFLEN=-1 GOTO 1499 1401 CONTINUE IF (EMPTY(LINE,LENGTH,CURPOS)) GOTO 1501 TYPE 40,BUFLEN 40 FORMAT (X,'Maximum number of bytes =',I4) BUFLEN=-1 GOTO 1599 1501 CONTINUE BUFLEN=COUNT 1599 CONTINUE 1499 CONTINUE 1399 CONTINUE RETURN END SUBROUTINE GETOPT(LINE,LENGTH,CURPOS,BUFFER,BUFLEN) INTEGER*2 LENGTH,CURPOS,BUFLEN BYTE LINE(1),BUFFER(1) LOGICAL*1 EMPTY ! IF (EMPTY(LINE,LENGTH,CURPOS)) GOTO 1001 BUFLEN=16 CALL GETDAT(LINE,LENGTH,CURPOS,BUFFER,BUFLEN) GOTO 1099 1001 CONTINUE BUFLEN=0 1099 CONTINUE END SUBROUTINE HELCOM(LINE,LENGTH,CURPOS) INTEGER*2 LENGTH,CURPOS BYTE LINE(1) ! TYPE 10 10 FORMAT (X,'The commands are:'/ & /X,'ABORT abort the logical link', & /X,' form = ABORT [data]', & /X,'CONNECT connect the logical link', & /X,' form = CONNECT node object [task] [data]', & /X,' (Note: task is included only for object = 0)', & /X,'DECIMAL convert octal to decimal', & /X,' form = DECIMAL low-byte [high-byte]', & /X,'DISCONNECT disconnect the logical link', & /X,' form = DISCONNECT [data]', & /X,'EVENT transmit an event', & /X,' form = EVENT task data', & /X,'EXIT exit this program', & /X,'INTERRUPT transmit an interrupt message', & /X,' form = INTERRUPT data', & /X,'OCTAL convert decimal or text to octal', & /X,' form = OCTAL decimal-number', & /X,' or = OCTAL ''text-string', & /X,' or = OCTAL "text-string', & /X,'TEXT convert octal to text', & /X,' form = TEXT data', & /X,'TRANSMIT transmit a message', & /X,' form = TRANSMIT data', & /X,'VERSION output version date', & //X,'In the commands for which it is applicable, data is in the', & /X,'form of octal bytes.') RETURN END SUBROUTINE INTCOM(LINE,LENGTH,CURPOS,LINLUN,LINEST,QUIT) PARAMETER BUFMAX=16 INTEGER*2 LENGTH,CURPOS,LINLUN,STABLO(2),BUFLEN BYTE LINE(1),BUFFER(BUFMAX) LOGICAL*1 LINEST,QUIT ! BUFLEN=BUFMAX CALL GETDAT(LINE,LENGTH,CURPOS,BUFFER,BUFLEN) IF (BUFLEN.LE.0) GOTO 1099 CALL XMINTW(LINLUN,STABLO,BUFLEN,BUFFER) IF (STABLO(1).GT.0) GOTO 1101 CALL PRIERR('XMINTW',STABLO(1)) LINEST=.FALSE. GOTO 1199 1101 CONTINUE TYPE 20 20 FORMAT (X,'Interrupt transmitted') 1199 CONTINUE 1099 CONTINUE RETURN END PROGRAM NETDUM PARAMETER GNDMAX=114,RECMAX=300,NETLUN=1,LINLUN=2,NETFLA=21 INTEGER*2 GNDSB(2),RECSB(2),TERSB(2),GNDTYP,ITERBU(41) BYTE ACCHAR,GNDBUF(GNDMAX),RECBUF(RECMAX),TERBUF(82),PROMPT(2) LOGICAL*1 GNDENA,RECENA,QUIT,LINEST,ACDIS ! EQUIVALENCE (ITERBU(1),TERBUF(1)) ! COMMON GNDBUF,RECBUF !FORCE WORD ALLIGNMENT ! DATA GNDENA,RECENA,QUIT,LINEST /4*.FALSE./ DATA ACDIS /.TRUE./ DATA TERSB(1) /0/ DATA PROMPT /"12,'!'/ ! CALL GCINIT(4,5,.TRUE.,PROMPT,2,TERBUF) TYPE 10 10 FORMAT (X,'DECnet dummy running.') CALL OPNNTW(NETLUN,GNDSB,,1) IF (GNDSB(1).GT.0) GOTO 1001 CALL PRIERR('OPNNTW',GNDSB(1)) GOTO 1099 1001 CONTINUE 1100 IF (QUIT) GOTO 1199 IF (ACDIS) CALL ACINIT(5,NETFLA,TERSB) ACDIS=.FALSE. IF (GNDENA) GOTO 1299 GNDSB(1)=0 CALL GNDNT(GNDSB,GNDTYP,GNDMAX,GNDBUF) GNDENA=.TRUE. 1299 CONTINUE IF (RECENA.OR..NOT.LINEST) GOTO 1399 RECSB(1)=0 CALL RECNT(LINLUN,RECSB,RECMAX,RECBUF) RECENA=.TRUE. 1399 CONTINUE CALL WAITNT(,TERSB,GNDSB,RECSB) IF (TERSB(1).EQ.0) GOTO 1401 CALL ACTERM ACDIS=.TRUE. CALL PROTER(TERSB,TERBUF,LINLUN,LINEST,QUIT) TERSB(1)=0 GOTO 1499 1401 IF (RECSB(1).EQ.0) GOTO 1402 RECENA=.FALSE. CALL PROREC(RECSB,RECBUF,LINEST) GOTO 1499 1402 CONTINUE GNDENA=.FALSE. CALL PROGND(GNDSB,GNDTYP,GNDBUF,NETLUN,LINLUN,LINEST,QUIT) 1499 CONTINUE GOTO 1100 1199 CONTINUE 1099 CONTINUE CALL CLSNTW TYPE 30 30 FORMAT (X,'DECnet dummy stopped.') END SUBROUTINE OCTCOM(LINE,LENGTH,CURPOS) INTEGER*2 LENGTH,CURPOS,NUMBER,REMLEN,IAND,ISHFT BYTE LINE(1) LOGICAL*1 EMPTY,INTNUM ! IF (.NOT.EMPTY(LINE,LENGTH,CURPOS)) GOTO 1001 TYPE 10 10 FORMAT (X,'You must include something to convert') GOTO 1099 1001 CONTINUE IF (LINE(CURPOS).EQ.'"'.OR.LINE(CURPOS).EQ.'''') GOTO 1101 IF (INTNUM(LINE,LENGTH,CURPOS,NUMBER)) GOTO 1201 TYPE 20 20 FORMAT (X,'Invalid decimal number') GOTO 1299 1201 CONTINUE TYPE 30,IAND(NUMBER,"377),ISHFT(NUMBER,-8) 30 FORMAT (X,'Octal =',O4,',',O4) 1299 CONTINUE GOTO 1199 1101 CONTINUE CURPOS=CURPOS+1 REMLEN=LENGTH-CURPOS+1 IF (REMLEN.GT.0) GOTO 1301 TYPE 40 40 FORMAT (X,'You must include some text') GOTO 1399 1301 CONTINUE TYPE 50,(LINE(I),I=CURPOS,CURPOS+REMLEN-1) 50 FORMAT ((X,10(O3,2X))) 1399 CONTINUE 1199 CONTINUE 1099 CONTINUE RETURN END SUBROUTINE PARNOD(OK,CONBLO,NODLEN,LINE) INTEGER*2 CONBLO(1),NODLEN,INDLIS(4),LENLIS(4),LININD LOGICAL*1 OK BYTE LINE(1) ! LININD=1 DO 1099 I=1,4 INDLIS(I)=LININD 1100 IF (LININD.GT.NODLEN.OR.LINE(LININD).EQ.'/') GOTO 1199 LININD=LININD+1 GOTO 1100 1199 CONTINUE LENLIS(I)=LININD-INDLIS(I) LININD=LININD+1 1099 CONTINUE OK=.FALSE. IF (LININD.GT.NODLEN) GOTO 1201 TYPE 10 10 FORMAT (X,'Too many slashes after node name') GOTO 1299 1201 IF (LENLIS(1).GT.0) GOTO 1202 TYPE 20 20 FORMAT (X,'Must specify a node name') GOTO 1299 1202 CONTINUE CALL BACC(OK,CONBLO,LENLIS(2),LINE(INDLIS(2)),LENLIS(3), & LINE(INDLIS(3)),LENLIS(4),LINE(INDLIS(4))) IF (OK) GOTO 1301 TYPE 30 30 FORMAT (X,'One of your access control parameters is invalid') GOTO 1399 1301 CONTINUE NODLEN=LENLIS(1) 1399 CONTINUE 1299 CONTINUE RETURN END SUBROUTINE PRIERR(MODULE,STABLO) ! BYTE MODULE(6) INTEGER*2 STABLO(2) ! LENGTH=1 1000 IF (MODULE(LENGTH+1).EQ.0) GOTO 1099 LENGTH=LENGTH+1 GOTO 1000 1099 CONTINUE TYPE 10,(MODULE(I),I=1,LENGTH),STABLO(1) 10 FORMAT (X,A1' failed, return =',I6) IF (STABLO(1).EQ.-7) TYPE 20,STABLO(2) 20 FORMAT (X,'Rejection reason =',I6) RETURN END SUBROUTINE PRIOPT(BUFFER,LENGTH) BYTE BUFFER(1),LENGTH ! IF (LENGTH.LE.0) GOTO 1099 TYPE 10,LENGTH 10 FORMAT (X,'Optional data received, length =',I3, & /,X,'Data =') TYPE 20,(BUFFER(I),I=1,LENGTH) 20 FORMAT ((X,10(O3,2X))) 1099 CONTINUE RETURN END SUBROUTINE PRIVER(VERRET,ACCINF) BYTE VERRET,ACCINF(46) ! TYPE 10,VERRET,ACCINF(1),ACCINF(19),ACCINF(29) 10 FORMAT (X,'Verification status =',I4/X,'Requestor id length =',I4, & ', password length =',I4,', account length =',I4) IF (ACCINF(1).LE.0) GOTO 1099 TYPE 20,(ACCINF(I),I=3,2+ACCINF(1)) 20 FORMAT (X,'Requestor id = "',A1,'"') 1099 CONTINUE IF (ACCINF(19).LE.0) GOTO 1199 TYPE 30,(ACCINF(I),I=21,20+ACCINF(19)) 30 FORMAT (X,'Password = "',A1,'"') 1199 CONTINUE IF (ACCINF(29).LE.0) GOTO 1299 TYPE 40,(ACCINF(I),I=31,30+ACCINF(29)) 40 FORMAT (X,'Account = "',A1,'"') 1299 CONTINUE RETURN END SUBROUTINE PROGND(STABLO,TYPE,BUFFER,NETLUN,LINLUN,LINEST,QUIT) INTEGER*2 STABLO(2),TYPE,NETLUN,LINLUN,INDEX,COUNT,OUTLEN,LENGTH INTEGER*2 RETURN,CURPOS BYTE BUFFER(1),OUTDAT(16),LINE(80),NAME(6) LOGICAL*1 LINEST,QUIT,CNFRM,ACCEPT ! IF (STABLO(1).GT.0) GOTO 1001 CALL PRIERR('GNDNT',STABLO(1)) GOTO 1099 1001 CONTINUE IF (TYPE.NE.1) GOTO 1101 TYPE 20,(BUFFER(I),I=25,30),BUFFER(31),BUFFER(32) 20 FORMAT (X,'Connect requested, node = "',6A1,'", format =',I2, & ', object type =',I4) IF (BUFFER(31).EQ.0) GOTO 1299 INDEX=33 IF (BUFFER(27).EQ.2) INDEX=37 COUNT=BUFFER(INDEX) TYPE 30,(BUFFER(I),I=INDEX+2,INDEX+1+COUNT) 30 FORMAT (X,'Task name = "',A1,'"') 1299 CONTINUE CALL PRIVER(STABLO(2)/256,BUFFER(51)) CALL PRIOPT(BUFFER(99),BUFFER(97)) ACCEPT=CNFRM('Accept') TYPE 35 35 FORMAT (X,'Optional data: ',$) LENGTH=80 CALL REATER(LINE,LENGTH,RETURN) CURPOS=1 IF (RETURN.GT.0) CALL GETOPT(LINE,LENGTH,CURPOS,OUTDAT,OUTLEN) QUIT=RETURN.LT.0 IF (QUIT) OUTLEN=-1 IF (OUTLEN.LT.0) GOTO 1399 IF (ACCEPT) GOTO 1501 CALL REJNTW(STABLO,BUFFER,OUTLEN,OUTDAT) IF (STABLO(1).GT.0) GOTO 1699 CALL PRIERR('REJNTW',STABLO(1)) 1699 CONTINUE GOTO 1599 1501 CONTINUE CALL ACCNTW(LINLUN,STABLO,BUFFER,OUTLEN,OUTDAT) IF (STABLO(1).GT.0) GOTO 1701 CALL PRIERR('ACCNTW',STABLO(1)) GOTO 1799 1701 CONTINUE LINEST=.TRUE. 1799 CONTINUE 1599 CONTINUE 1399 CONTINUE GOTO 1199 1101 IF (TYPE.NE.2) GOTO 1102 COUNT=IAND(STABLO(2),"377) TYPE 60,COUNT 60 FORMAT (X,'Interrupt received, length =',I3) IF (COUNT.LE.0) GOTO 1899 TYPE 70 70 FORMAT (X,'Contents =') TYPE 80,(BUFFER(I),I=1,COUNT) 80 FORMAT ((X,10(O3,2X))) 1899 CONTINUE GOTO 1199 1102 IF (TYPE.NE.3) GOTO 1103 TYPE 90 90 FORMAT (X,'User disconnect received') CALL PRIOPT(BUFFER,STABLO(2)) GOTO 1199 1103 IF (TYPE.NE.4) GOTO 1104 TYPE 100 100 FORMAT (X,'User abort received') CALL PRIOPT(BUFFER,STABLO(2)) GOTO 1199 1104 IF (TYPE.NE.5) GOTO 1105 TYPE 110,IAND(STABLO(2),"377) 110 FORMAT (X,'Network abort received, reason =',I4) GOTO 1199 1105 IF (TYPE.NE.6) GOTO 1106 COUNT=IAND(STABLO(2),"377) CALL R50ASC(6,BUFFER,NAME) TYPE 115,COUNT,NAME 115 FORMAT (X,'Network event received, length =',I3, & ', task name = ',6A1) IF (COUNT.LE.4) GOTO 1999 TYPE 70 TYPE 80,(BUFFER(I),I=5,COUNT) 1999 CONTINUE GOTO 1199 1106 CONTINUE TYPE 120,TYPE 120 FORMAT (X,'Invalid GND type =',I6) 1199 CONTINUE 1099 CONTINUE RETURN END SUBROUTINE PROREC(STABLO,BUFFER,LINEST) INTEGER*2 STABLO(2) BYTE BUFFER(1) LOGICAL*1 LINEST ! IF (STABLO(1).GT.0) GOTO 1001 CALL PRIERR('RECNT',STABLO(1)) LINEST=.FALSE. GOTO 1099 1001 CONTINUE TYPE 20,STABLO(2) 20 FORMAT (X,'Message received, length =',I4) IF (STABLO(2).LE.0) GOTO 1199 TYPE 30 30 FORMAT (X,'Message contents =') TYPE 40,(BUFFER(I),I=1,STABLO(2)) 40 FORMAT ((X,10(O3,2X))) 1199 CONTINUE 1099 CONTINUE STABLO(1)=0 RETURN END SUBROUTINE PROTER(STABLO,TERBUF,LINLUN,LINEST,QUIT) PARAMETER CTRLC="3,CTRLZ="32 INTEGER*2 STABLO(2),LINLUN,LENGTH,CURPOS,COMID BYTE TERBUF(1),COMLIS(112),ACCHAR,PROMPT(2),CHAR LOGICAL*1 LINEST,QUIT,MATKW,EMPTY,INTNUM,OCTNUM,DONE,GCFILE,GCREAD ! DATA COMLIS / & 1,0,'C','O','N','N','E','C','T',0, & 2,0,'I','N','T','E','R','R','U','P','T',0, & 3,0,'T','R','A','N','S','M','I','T',0, & 4,0,'A','B','O','R','T',0, & 5,0,'D','I','S','C','O','N','N','E','C','T',0, & 6,0,'H','E','L','P',0, & 7,0,'T','E','X','T',0, & 8,0,'D','E','C','I','M','A','L',0, & 9,0,'O','C','T','A','L',0, & 10,0,'V','E','R','S','I','O','N',0, & 11,0,'E','X','I','T',0, & 12,0,'E','V','E','N','T',0, & 0/ ! CHAR=ACCHAR() IF (CHAR.NE.CTRLC.AND.CHAR.NE.CTRLZ) GOTO 1001 QUIT=.TRUE. GOTO 1099 1001 CONTINUE DONE=.FALSE. 1100 IF (DONE) GOTO 1199 IF (GCREAD(LENGTH)) GOTO 1201 DONE=.TRUE. QUIT=LENGTH.EQ.-10 IF (.NOT.QUIT) CALL GCPRIN(LENGTH) GOTO 1299 1201 CONTINUE CURPOS=1 DONE=EMPTY(TERBUF,LENGTH,CURPOS) IF (DONE.OR.TERBUF(CURPOS).EQ.';') GOTO 1399 IF (MATKW(COMLIS,TERBUF,LENGTH,CURPOS,3,COMID)) GOTO 1401 TYPE 20 20 FORMAT (X,'Unrecognized command.') GOTO 1499 1401 CONTINUE GOTO (1501,1502,1503,1504,1505,1506,1507,1508,1509, & 1510,1511,1512) COMID 1501 CONTINUE CALL CONCOM(TERBUF,LENGTH,CURPOS,LINLUN,LINEST,QUIT) GOTO 1599 1502 CONTINUE CALL INTCOM(TERBUF,LENGTH,CURPOS,LINLUN,LINEST,QUIT) GOTO 1599 1503 CONTINUE CALL TRACOM(TERBUF,LENGTH,CURPOS,LINLUN,LINEST,QUIT) GOTO 1599 1504 CONTINUE CALL ABOCOM(TERBUF,LENGTH,CURPOS,LINLUN,LINEST,QUIT) GOTO 1599 1505 CONTINUE CALL DISCOM(TERBUF,LENGTH,CURPOS,LINLUN,LINEST,QUIT) GOTO 1599 1506 CONTINUE CALL HELCOM(TERBUF,LENGTH,CURPOS) GOTO 1599 1507 CONTINUE CALL TEXCOM(TERBUF,LENGTH,CURPOS) GOTO 1599 1508 CONTINUE CALL DECCOM(TERBUF,LENGTH,CURPOS) GOTO 1599 1509 CONTINUE CALL OCTCOM(TERBUF,LENGTH,CURPOS) GOTO 1599 1510 CONTINUE TYPE 30 30 FORMAT (X,'3 January 1980') GOTO 1599 1511 CONTINUE QUIT=.TRUE. GOTO 1599 1512 CONTINUE CALL EVECOM(TERBUF,LENGTH,CURPOS,LINEST,QUIT) 1599 CONTINUE 1499 CONTINUE 1399 CONTINUE IF (.NOT.DONE) DONE=QUIT.OR..NOT.GCFILE() 1299 CONTINUE GOTO 1100 1199 CONTINUE 1099 CONTINUE RETURN END SUBROUTINE REATER(BUFFER,LENGTH,RETURN) BYTE BUFFER(LENGTH) INTEGER*2 LENGTH,NEWLEN,RETURN ! RETURN=0 1000 IF (RETURN.NE.0) GOTO 1099 READ (5,10,END=1111,ERR=1112) NEWLEN,BUFFER 10 FORMAT (Q,A1) GOTO 1199 1111 RETURN=-10 GOTO 1199 1112 RETURN=-1 1199 IF (RETURN.NE.0) GOTO 1301 IF (NEWLEN.GT.LENGTH) GOTO 1201 LENGTH=NEWLEN RETURN=1 GOTO 1299 1201 CONTINUE TYPE 20 20 FORMAT (X,'Line too long') RETURN=-1 1299 CONTINUE GOTO 1399 1301 CONTINUE LENGTH=0 1399 CONTINUE GOTO 1000 1099 RETURN END SUBROUTINE TRACOM(LINE,LENGTH,CURPOS,LINLUN,LINEST,QUIT) PARAMETER BUFMAX=300 INTEGER*2 LENGTH,CURPOS,LINLUN,STABLO(2),BUFLEN BYTE LINE(1),BUFFER(BUFMAX) LOGICAL*1 LINEST,QUIT ! BUFLEN=BUFMAX CALL GETDAT(LINE,LENGTH,CURPOS,BUFFER,BUFLEN) IF (BUFLEN.LE.0) GOTO 1099 CALL SNDNTW(LINLUN,STABLO,BUFLEN,BUFFER) IF (STABLO(1).GT.0) GOTO 1101 CALL PRIERR('SNDNTW',STABLO(1)) LINEST=.FALSE. GOTO 1199 1101 CONTINUE TYPE 20 20 FORMAT (X,'Transmitted') 1199 CONTINUE 1099 CONTINUE RETURN END SUBROUTINE TEXCOM(LINE,LENGTH,CURPOS) PARAMETER BUFMAX=20 INTEGER*2 LENGTH,CURPOS,BUFLEN BYTE LINE(1),BUFFER(BUFMAX) ! BUFLEN=BUFMAX CALL GETDAT(LINE,LENGTH,CURPOS,BUFFER,BUFLEN) IF (BUFLEN.LE.0) GOTO 1099 TYPE 10,(BUFFER(I),I=1,BUFLEN) 10 FORMAT (X,'"',A1,'"') 1099 CONTINUE RETURN END