;<134-TENEX>HOSTS.MAC;52     3-SEP-75 09:40:02    EDIT BY CALVIN
; INCREASED SIZE OF NHSTN & NHOSTS
;<133-TENEX>HOSTS.MAC;51     1-JAN-75 08:56:31    EDIT BY TOMLINSON
; FIX EOF FIX
;<133-TENEX>HOSTS.MAC;50    31-DEC-74 10:29:37    EDIT BY TOMLINSON
; TURN OFF EOF PSI CHANNEL WHILE READING FILE
;<TENEX-132>HOSTS.MAC;49    22-JUN-74 12:37:42    EDIT BY TOMLINSON
;<TENEX-132>HOSTS.MAC;48    20-JUN-74 13:11:59    EDIT BY TOMLINSON
; ADDED "NEW" KEEYWORD TO INDICATE NEW PROTOCOL HOSTS
;<TENEX-132>HOSTS.MAC;47     4-JUN-74 15:33:34    EDIT BY CLEMENTS
;<TENEX-132>HOSTS.MAC;46    31-MAR-74 12:41:29	EDIT BY CLEMENTS
;<TENEX-132>HOSTS.MAC;45    30-MAR-74 18:12:22	EDIT BY CLEMENTS
;<TENEX-132>HOSTS.MAC;44    28-MAR-74 18:20:15	EDIT BY TOMLINSON
;<TENEX-132>HOSTS.MAC;43    28-MAR-74 14:13:04	EDIT BY TOMLINSON
; SETUP GETAB TABLES WITH COUNTS
	SEARCH	PROLOG,STENEX
	TITLE	HOSTS
	SUBTTL	BUILD HOST NAME TABLES FROM FILE
	USE SWAPPC

INTERN	HSTINI,NHOSTS,NHSTN
EXTERN	GTBNHN,GTBHST
EXTERN	NWPBT,BITS
EXTERN	MSPACS,MRPACS,FPTA,SKPRET

; BITS AND FIELD VALUES FOR B0-8 OF HOSTN TABLE

SERVER==400000
USER==200000
NICKNAME==100000

TENEX==1000
ITS==2000
DEC==3000
TIP==4000
MTIP==5000
ELF==6000
ANTS==7000
MULTICS==10000

NHOSTS==400
NHSTN==600
MNHSTS==-NHOSTS

NGS(HOSTN,NHOSTS)
NGS(HSTNAM,NHSTN)
NGS(MHOSTS,1)

HSTINI:	PUSH P,7
	PUSH P,6
	PUSH P,5
	MOVEI 1,400000
	RCM			; GET CHANNELS THAT ARE ON
	PUSH P,1		; REMEMBER THEM
	MOVEI 1,400000
	MOVSI 2,(1B10)
	DIC			; TURN OFF EOF CHANNEL
	MOVSI 1,(1B2+1B17)
	HRROI 2,[ASCIZ \HOST-NAME/DESCRIPTOR-FILE.TXT\]
	GTJFN
	  JRST HSTINF		; FAIL
	PUSH P,1
	MOVE 2,[7B5+1B19]
	OPENF
	 JRST [	POP P,1
		RLJFN
		 JFCL
		JRST HSTINF]	; FAIL
	SETZM HSTNAM		; CLEAR OLD STUFF IN TABLE
	MOVSI 4,HSTNAM		; (TELNET FAILS IF THIS ISN'T DONE
	HRRI 4,HSTNAM+1		; AND IT LOOKS NEATER TO HAVE WHOLE
	BLT 4,HSTNAM+NHSTN-1	; WORD OF NULL AFTER EACH NAME)
	SETZM NWPBT		; ALSO CLEAR NEW PROTOCOL BIT TABLE
	MOVSI 4,NWPBT
	HRRI 4,NWPBT+1
	BLT 4,NWPBT+^D<<256+35>/36>-1
	MOVEI 4,HOSTN
	MOVEI 5,HSTNAM
LUP0:	PUSHJ P,GCH
	 JRST DONE
	MOVEM 3,7		; SAVE IN CASE THIS IS ALINE
	CAIN 2,12
	 JRST LUP0
	CAIGE 4,HOSTN+NHOSTS
	CAIL 5,HSTNAM+NHSTN
	 JRST FULL
	BKJFN
	 JFCL
	RFPTR
	 JFCL
	PUSH P,2
	MOVEI 3,10
	NIN
	 JRST [	HRLI 6,[ASCIZ /BAD NUMBER/]
		POP P,3
		JRST SYNERR]
	POP P,3
	CAILE 2,0
	CAILE 2,377
	 JRST [	HRLI 6,[ASCIZ /HOST NUMBER OUT OF RANGE/]
		JRST SYNERR]
	HRLZM 2,0(4)		; STORE HOST NUMBER
	BKJFN
	 JFCL
LUP4:	PUSHJ P,GCH
	 JRST PEOF
	CAIE 2,","
	 JRST [	HRLI 6,[ASCIZ /MISSING COMMA AFTER HOST NUMBER/]
		JRST SYNERR]
	MOVE 6,5		; TEMP FOR BYTE POINTER
	SUBI 6,HSTNAM		; MAKE RELATIVE POINTER
	HRRM 6,0(4)		; STORE IN RH OF HOSTN
	MOVE 6,5		; TEMP POINTER AGAIN
	HRLI 6,440700		; 7 BIT LEFT JUSTIFIED

LUP1:	PUSHJ P,GCH		; READ NEXT CHARACTER
	 JRST PEOF
	CAIE 2,12		; TERMINATE ON END OF LINE
	CAIN 2,","
	 SETZ 2,		; OR COMMA
	IBP 6
	HRRZ 1,6		; WHERE ARE WE GOING TO PUT THIS?
	CAIL 1,HSTNAM+NHSTN	; OFF END OF TABLE?
	 JRST FULL		; YES, SAY FULL
	DPB 2,6			; STORE THE BYTE
	JUMPN 2,LUP1		; LOOP IF NOT THE END
	MOVE 1,0(P)
	BKJFN			; GET THE TERMINATOR AGAIN
	 JFCL
LUP2:	PUSHJ P,GCH
	 JRST PEOF
LUP2A:	CAIN 2,12
	 JRST LUP2X		; DONE IF END OF LINE
	CAIE 2,","		; SCAN UNTIL COMMA FOUND
	 JRST LUP2
LUP3:	PUSHJ P,GCH		; GET FIRST LETTER OF WORD
	 JRST PEOF
	CAIN 2,","
	 JRST LUP2A		; JUMP IF NULL WORD
	CAIN 2,12
	 JRST LUP2X		; DONE IF END OF LINE

GWORD:	SETZ 1,			; PUT VALUE OF WORD HERE
	CAIN 2,"A"
	 MOVSI 1,ANTS
	CAIN 2,"D"
	 MOVSI 1,DEC
	CAIN 2,"E"
	 MOVSI 1,ELF
	CAIN 2,"I"
	 MOVSI 1,ITS
	CAIN 2,"M"
	 JRST [	PUSHJ P,GCH
		 JRST PEOF
		CAIN 2,"U"
		 MOVSI 1,MULTICS
		CAIN 2,"T"
		 MOVSI 1,MTIP
		JRST ELUP3]
	CAIN 2,"N"
	 JRST [	PUSHJ P,GCH
		 JRST PEOF
		CAIN 2,"E"
		 JRST SETNWP
		CAIN 2,"I"
		 MOVSI 1,NICKNAME
		JRST ELUP3]
	CAIN 2,"S"
	 MOVSI 1,SERVER
	CAIN 2,"T"
	 JRST [	PUSHJ P,GCH
		 JRST PEOF
		CAIN 2,"E"
		 MOVSI 1,TENEX
		CAIN 2,"I"
		 MOVSI 1,TIP
		JRST ELUP3]
	CAIN 2,"U"
	 MOVSI 1,USER
ELUP3:	HRLI 6,[ASCIZ /UNRECOGNIZED FLAG NAME/]
	JUMPE 1,SYNERR		; JUMP IF NO MATCH FOUND
	MOVSI 2,(17B8)
	HRLI 6,[ASCIZ /MULTIPLE SYSTEM TYPE SPECIFICATION/]
	TDNE 2,0(4)		; ALREADY HAVE A SYSTEM TYPE?
	TDNN 2,1		; YES AND IS THIS TRYING TO SET IT?
	 SKIPA
	  JRST SYNERR		; YES. ERROR
	IORM 1,0(4)		; ACCUMULATE BITS
	JRST LUP2		; AND SKIP TO COMMA/EOL

LUP2X:	MOVEI 5,1(6)		; START NEXT STRING IN NEXT WORD
	AOJA 4,LUP0		; STEP TO NEXT HOSTN SLOT AND LOOP

SETNWP:	LDB 1,[POINT 8,0(4),17]	; GET HOST NUMBER
	IDIVI 1,^D36
	MOVE 2,BITS(2)
	IORM 2,NWPBT(1)
	JRST LUP2

PEOF:	MOVE 1,0(P)
	RFPTR
	 JFCL
	MOVE 3,2
	HRLI 6,[ASCIZ /PREMATURE END OF FILE/]
SYNERR:	HLRO 1,6
	PSOUT
	HRROI 1,[ASCIZ / IN HOST DESCRIPTOR FILE
/]
	PSOUT
	MOVE 2,7
	MOVE 1,0(P)
	SFPTR			; SET BACK TO BEGINNING OF LINE
	 JFCL
	SETO 7,
PERLP:	MOVE 1,0(P)
	RFPTR
	 JFCL
	CAME 2,3
	 JRST PERLP1
	MOVEI 1,101
	RFPOS
	HRRZ 7,2
PERLP1:	MOVE 1,0(P)
	PUSHJ P,GCH1
	 MOVEI 2,12
	CAIN 2,12
	 JRST PERLPX
	MOVE 1,2
	PBOUT
	JRST PERLP

PERLPX:	HRROI 1,[ASCIZ /
/]
	PSOUT
	JUMPLE 7,PMRK
	MOVEI 1,40
	PBOUT
	SOJG 7,.-1
PMRK:	MOVEI 1,"^"
	PBOUT
	HRROI 1,[ASCIZ /

/]
	PSOUT
	JRST LUP0

FULL:	HRROI 1,[ASCIZ /HOST TABLES FULL BEFORE END OF FILE
/]
	PSOUT
	JRST DONE

DONE:	PUSH P,5
	MOVE 2,4
	SUBI 2,HOSTN
	MOVNM 2,MHOSTS		; SAVE FOR CVHST, ...
	MOVEI 1,GTBHST
	CALL SETGTB
	POP P,2
	SUBI 2,HSTNAM
	MOVEI 1,GTBNHN
	CALL SETGTB
	POP P,1
	CLOSF
	 JFCL
	AOS -4(P)		; SUCCESS RETURN
HSTINF:	POP P,2			; GET CHANNELS THAT WERE ON BEFORE
	MOVEI 1,400000
	AIC			; TURN THEM BACK ON
	POP P,5
	POP P,6
	POP P,7
	POPJ P,

SETGTB:	PUSH P,2
	PUSH P,1
	CALL FPTA
	PUSH P,1
	CALL MRPACS
	HRLZ 2,1
	PUSH P,2
	TLO 2,40000
	MOVE 1,-1(P)
	CALL MSPACS
	MOVE 2,-3(P)
	HRLM 2,@-2(P)
	POP P,2
	POP P,1
	CALL MSPACS
	POP P,1
	POP P,2
	POPJ P,

GCH:	MOVE 1,-1(P)
	RFPTR
	 JFCL
	MOVEM 2,3
GCH2:	PUSHJ P,GCH1
	 POPJ P,
	CAIN 2,";"
	 JRST GCHSMC
	CAIE 2,11
	CAIN 2,40
	 JRST GCH2
GCHX:	CAIN 2,37
	 MOVEI 2,12
	AOS 0(P)
	POPJ P,

GCH1:	BIN
	CAIE 2,15
	CAIN 2,14
	 JRST GCH1
	JUMPN 2,SKPRET
GCHNUL:	GTSTS
	TLNE 2,1000
	 POPJ P,
	JRST GCH1

GCHSMC:	BIN
	CAIE 2,37
	CAIN 2,12
	 JRST GCHX
	JUMPN 2,GCHSMC
	GTSTS
	TLNN 2,1000
	 JRST GCHSMC
	POPJ P,

	END
