*DECK IPUCIAN
USETEXT TEXTIPL
PROC IPUCIAN ((CHARADDR), IPADDR);
*CALL COPYRITE CDCNET - COPYRIGHT CONTROL DATA. 1992.
# TITLE IPUCIAN - CONVERT IP ADDRESS FROM DISPLAY TO NUMERIC #
BEGIN # IPUCIAN #
#
**** IPUCIAN - CONVERT IP ADDRESS FROM DISPLAY TO NUMERIC.
*
* THIS PROCEDURE CONVERTS A DISPLAY CODED ADDRESS IN INTERNET FORM
* TO THE THREE WORD ADDRESS FORMAT USED TO COMMUNICATE TO THE
* TCP/IP CDCNET GATEWAY.
*
* PROC IPPCIAN
*
* ENTRY CHARADDR = ADDRESS IN DISPLAY CODE IP FORMAT.
*
* EXIT IPADDR = ADDRESS IN NUMERIC FORM AS DEFINED BY
* BASED ARRAY IP$ADDR$REC.
*
* METHOD EXTRACT THE FOUR OCTETS FROM *IPADDR*, EACH OCTET IS
* TERMINATED BY A NON-NUMERIC CHARACTER. EACH OCTET IS
* CONVERTED FROM CHARACTER TO NUMBER BY THE *XDXB* ROUTINE
* AND SAVED IN THE OCTET NUMBER ARRAY. THE IP$ADDR$REC
* BASED ARRAY IS SET TO THE *IPADDR* LOCATION. THE FIELDS
* IN USE FIELD IS SET TO BOTH. THE ADDRESS CLASS IS
* DETERMINED BY EXAMINING THE FIRST 2 BITS OF THE FIRST
* OCTET, BASED ON THE ADDRESS TYPE THE APPROPRIATE NUMBER
* OF OCTETS ARE SAVED IN THE NETWORK AND HOST FIELDS OF THE
* ADDRESS.
*
* CLASS A ADDRESS - FIRST BIT = 0.
* NETWORK FIELD - FIRST OCTET.
* HOST FIELD - SECOND, THIRD, AND FOURTH OCTET.
*
* CLASS B ADDRESS - FIRST 2 BITS OF FIRST OCTET = 2.
* NETWORK FIELD - FIRST AND SECOND OCTET.
* HOST FIELD - THIRD AND FOURTH OCTET.
*
* CLASS C ADDRESS - FIRST 2 BITS OF THE FIRST OCTET = 3.
* NETWORK FIELD - FIRST, SECOND, AND THIRD OCTET.
* HOST FIELD - FOURTH OCTET.
*
#
#
**** PROC IPUCIAN - XREF LIST
#
XREF
BEGIN
PROC IPUMCLR; # CLEAR MEMORY #
PROC XDXB; # SRVLIB CONVERT DISPLAY TO BIN #
END
ITEM CHARADDR C(20); # ADDRESS IN DISPLAY TO CONVERT #
ARRAY IPADDR [00:00] S(1);; # ADDRESS IN NUMERIC FORM #
#
**
#
ARRAY OCTET [1:4] S(1); # FOUR WORD ARRAY FOR ADDRESS #
BEGIN
ITEM OCTET$NUM U(00,00,60); # OCTET IN NUMERIC FORM #
END
ITEM DPOS I; # DESTINATION POSITION IN OCTET #
ITEM INDEX I; # LOOP INDEX #
ITEM LOOP I; # LOOP INDEX #
ITEM OCTETCHAR C(10); # DISPLAY CODE OF OCTET TO CONV #
ITEM OCTETNUM U; # VALUE OF CONVERTED OCTET #
ITEM SPOS I; # SOURCE POSITION IN *CHARADDR* #
CONTROL EJECT;
#
**** THE FOUR OCTETS ARE EXTRACTED FROM THE DISPLAY CODE ADDRESS.
* EACH OCTET TERMINATES WITH A PERIOD, THE FINAL WITH A SPACE.
#
SPOS = 0;
FOR INDEX = 1 STEP 1 UNTIL 4
DO
BEGIN
OCTETCHAR = CHARSP$;
DPOS = 0;
FOR LOOP = 0
WHILE (C<SPOS, 1>CHARADDR GQ CHAR0$) AND
(C<SPOS, 1>CHARADDR LQ CHAR9$)
DO
BEGIN
C<DPOS, 1>OCTETCHAR = C<SPOS, 1>CHARADDR;
SPOS = SPOS + 1;
DPOS = DPOS + 1;
END
XDXB (OCTETCHAR, 1, OCTETNUM); # CONVERT TO NUMERIC #
OCTET$NUM [INDEX] = OCTETNUM;
SPOS = SPOS + 1; # SKIP NON NUMERIC CHARACTER #
END
#
**** SET THE IP_ADDRESS_REC TO THE PASSED *IPADDR* LOCATION AND MOVE
* THE OCTET ARRAY TO THE APPROPRIATE FIELDS.
#
IPUMCLR (LOC (IPADDR), 3);
P<IP$ADDR$REC> = LOC (IPADDR);
IP$IPFIU [0] = IP$FIU"BOTH";
#
**** IF THE FIRST BIT OF THE FIRST OCTET = 0, THEN CLASS A ADDRESS.
* (NETWORK = 1 OCTET)
#
IF B<52, 1> OCTET$NUM [1] EQ 0
THEN
BEGIN # CLASS A #
IP$IPNET [0] = OCTET$NUM [1];
IP$IPHOST [0] = (OCTET$NUM [2] * X"10000") +
(OCTET$NUM [3] * X"100") + OCTET$NUM [4];
END # CLASS A #
#
**** IF THE FIRST 2 BITS OF THE FIRST OCTET = 2 THEN CLASS B ADDRESS.
* (NETWORK = 2 OCTETS)
#
ELSE IF B<52, 2> OCTET$NUM [1] EQ 2
THEN
BEGIN # CLASS B #
IP$IPNET [0] = (OCTET$NUM [1] * X"100") + OCTET$NUM [2];
IP$IPHOST [0] = (OCTET$NUM [3] * X"100") + OCTET$NUM [4];
END # CLASS B #
#
**** IF THE FIRST 3 BITS OF THE FIRST OCTET = 3 THEN CLASS C ADDRESS.
* (NETWORK = 3 OCTETS)
#
ELSE IF B<52, 2> OCTET$NUM [1] EQ 3
THEN
BEGIN # CLASS C #
IP$IPNET [0] = (OCTET$NUM [1] * X"10000") +
(OCTET$NUM [2] * X"100") + OCTET$NUM [3];
IP$IPHOST [0] = OCTET$NUM [4];
END # CLASS C #
RETURN;
END # IPUCIAN #
TERM