/* Copyright (c) 1996 by R. A. Vowels, from "Introduction to PL/I, Algorithms, and */
/* Structured Programming". Permission is given to reproduce and to use these procedures */
/* as part of a program, and to include them as part of a larger work to be sold for profit. */
/* However, the user is not permitted to sell the procedures separately. Provided always */
/* that these procedures and this copyright notice are reproduced in full. */
DECLARE HEX GENERIC
(HEXG WHEN (GRAPHIC),
HEXC WHEN (CHARACTER),
HEXF WHEN (FLOAT),
HEXFB WHEN (FIXED BINARY),
HEXC2 WHEN (CHARACTER, CHARACTER),
HEX2_graphic WHEN (GRAPHIC, *),
HEXF2 WHEN (FLOAT, CHARACTER),
HEXFB2 WHEN (FIXED BINARY, CHARACTER) );
/* Add others as appropriate. */
/* This function procedure returns the hexadecimal image of the character argument. */
HEXC:
PROCEDURE (STRING) RETURNS (CHARACTER (1000) VARYING);
DECLARE STRING CHARACTER (*);
DECLARE S CHARACTER (2*LENGTH(STRING) );
DECLARE Byte BIT (8);
DECLARE Nibble BIT (4);
DECLARE (J, K) FIXED BINARY (31);
DECLARE Hex_digit(0:15) CHARACTER (1) STATIC INITIAL
( '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' );
K = 1;
DO J = 1 TO LENGTH (STRING);
Byte = TRUE_BYTE (SUBSTR(STRING, J, 1) );
Nibble = SUBSTR (Byte, 1, 4);
SUBSTR (S, K, 1) = Hex_digit (Nibble);
K = K + 1;
Nibble = SUBSTR (Byte, 5, 4);
SUBSTR (S, K, 1) = Hex_digit (Nibble);
K = K + 1;
END;
RETURN (S);
END HEXC;
/* This function procedure returns the hexadecimal image of the graphic argument. */
HEXG:
PROCEDURE (STRING) RETURNS (CHARACTER (1000) VARYING);
DECLARE STRING GRAPHIC (*);
DECLARE S CHARACTER (4*LENGTH(STRING) );
DECLARE Double_Byte BIT (16);
DECLARE Nibble BIT (4);
DECLARE (J, K) FIXED BINARY (31);
DECLARE Hex_digit(0:15) CHARACTER (1) STATIC INITIAL
( '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' );
K = 1;
DO J = 1 TO LENGTH (STRING);
Double_Byte = UNSPEC (SUBSTR(STRING, J, 1) );
Nibble = SUBSTR (Double_Byte, 1, 4);
SUBSTR (S, K, 1) = Hex_digit (Nibble);
K = K + 1;
Nibble = SUBSTR (Double_Byte, 5, 4);
SUBSTR (S, K, 1) = Hex_digit (Nibble);
K = K + 1;
Nibble = SUBSTR (Double_Byte, 9, 4);
SUBSTR (S, K, 1) = Hex_digit (Nibble);
K = K + 1;
Nibble = SUBSTR (Double_Byte, 13, 4);
SUBSTR (S, K, 1) = Hex_digit (Nibble);
K = K + 1;
END;
RETURN (S);
END HEXG;
/* This function procedure returns the hexadecimal image of the floating-point argument. */
HEXF:
PROCEDURE (FPN) RETURNS (CHARACTER (100) VARYING);
DECLARE FPN FLOAT (16);
DECLARE S CHARACTER (100) VARYING;
DECLARE B BIT (8*LENGTH(FPN) );
DECLARE Nibble BIT (4);
DECLARE (J, K) FIXED BINARY (31);
DECLARE Hex_digit(0:15) CHARACTER (1) STATIC INITIAL
( '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' );
B = UNSPEC (FPN); K = 1;
DO J = 1 TO LENGTH (B) BY 4;
Nibble = SUBSTR (B, J, 4);
SUBSTR (S, K, 1) = Hex_digit (Nibble);
K = K + 1;
END;
RETURN (S);
END HEXF;
/* This function procedure returns the hexadecimal image of the fixed-point binary argument. */
HEXFB:
PROCEDURE (FB) RETURNS (CHARACTER (16) VARYING);
DECLARE FB FIXED BINARY (31);
DECLARE S CHARACTER (16) VARYING;
DECLARE B BIT (32);
DECLARE Nibble BIT (4);
DECLARE (J, K) FIXED BINARY (31);
DECLARE Hex_digit(0:15) CHARACTER (1) STATIC INITIAL
( '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' );
B = UNSPEC (FB); K = 1;
DO J = 1 TO LENGTH (B) BY 4;
Nibble = SUBSTR (B, J, 4);
SUBSTR (S, K, 1) = Hex_digit (Nibble);
K = K + 1;
END;
RETURN (S);
END HEXFB;
/* This function procedure returns the hexadecimal image of the character argument. */
/* After every 8 characters of the hexadecimal image, the character Gap is inserted. */
HEXC2:
PROCEDURE (STRING, Gap) RETURNS (CHARACTER (1000) VARYING);
/* INCOMING: STRING = the string to be displayed in hexadecimal. */
/* Gap = a spacing character, to be inserted in the hexadecimal string */
/* every eighth digit. */
DECLARE STRING CHARACTER (*);
DECLARE Gap CHARACTER (1);
DECLARE S CHARACTER (2*LENGTH(STRING)+ (LENGTH(STRING)+7)/8);
DECLARE Byte BIT (8);
DECLARE Nibble BIT (4);
DECLARE (J, K) FIXED BINARY (31);
DECLARE Hex_digit(0:15) CHARACTER (1) STATIC INITIAL
( '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' );
K = 1;
DO J = 1 TO LENGTH (STRING);
Byte = TRUE_BYTE (SUBSTR(STRING, J, 1) );
Nibble = SUBSTR (Byte, 1, 4);
SUBSTR (S, K, 1) = Hex_digit (Nibble);
K = K + 1;
Nibble = SUBSTR (Byte, 5, 4);
SUBSTR (S, K, 1) = Hex_digit (Nibble);
IF MOD(J, 8) = 0 THEN /* 8 hex digits written; insert the character Gap.*/
DO;
K = K + 1;
SUBSTR(S, K, 1) = Gap;
END;
K = K + 1;
END;
RETURN (S);
END HEXC2;
/* This function procedure returns the hexadecimal image of the graphic argument. */
/* After every 8 characters of the hexadecimal image, the character Gap is inserted. */
HEX2_graphic:
PROCEDURE (STRING, Gap) RETURNS (CHARACTER (1000) VARYING);
/* INCOMING: STRING = the string to be displayed in hexadecimal. */
/* Gap = a spacing character, to be inserted in the hexadecimal string */
/* every eighth digit. */
DECLARE STRING GRAPHIC (*);
DECLARE Gap CHARACTER (1);
DECLARE S CHARACTER (4*LENGTH(STRING)+ (LENGTH(STRING)+7)/8);
DECLARE Double_Byte BIT (16);
DECLARE Nibble BIT (4);
DECLARE (J, K) FIXED BINARY (31);
DECLARE Hex_digit(0:15) CHARACTER (1) STATIC INITIAL
( '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' );
K = 1;
DO J = 1 TO LENGTH (STRING);
Double_Byte = UNSPEC (SUBSTR(STRING, J, 1) );
Nibble = SUBSTR (Double_Byte, 1, 4);
SUBSTR (S, K, 1) = Hex_digit (Nibble);
K = K + 1;
Nibble = SUBSTR (Double_Byte, 5, 4);
SUBSTR (S, K, 1) = Hex_digit (Nibble);
K = K + 1;
Nibble = SUBSTR (Double_Byte, 9, 4);
SUBSTR (S, K, 1) = Hex_digit (Nibble);
K = K + 1;
Nibble = SUBSTR (Double_Byte, 13, 4);
SUBSTR (S, K, 1) = Hex_digit (Nibble);
IF MOD(J, 8) = 0 THEN /* 8 hex digits written; insert the character Gap.*/
DO;
K = K + 1;
SUBSTR(S, K, 1) = Gap;
END;
K = K + 1;
END;
RETURN (S);
END HEX2_graphic;
/* This function procedure returns the hexadecimal image of the floating-point argument. */
HEXF2:
PROCEDURE (FPN, Gap) RETURNS (CHARACTER (100) VARYING);
DECLARE FPN FLOAT (16);
DECLARE Gap CHARACTER (1);
DECLARE S CHARACTER (100) VARYING;
DECLARE B BIT (8*LENGTH(FPN) );
DECLARE Nibble BIT (4);
DECLARE (J, K) FIXED BINARY (31);
DECLARE Hex_digit(0:15) CHARACTER (1) STATIC INITIAL
( '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' );
B = UNSPEC (FPN); K = 1;
DO J = 1 TO LENGTH (B) BY 4;
Nibble = SUBSTR (B, J, 4);
SUBSTR (S, K, 1) = Hex_digit (Nibble);
K = K + 1;
END;
RETURN (S);
END HEXF2;
/* This function procedure returns the hexadecimal image of the fixed-point binary argument. */
HEXFB2:
PROCEDURE (FB, Gap) RETURNS (CHARACTER (16) VARYING);
DECLARE FB FIXED BINARY (31);
DECLARE Gap CHARACTER (1);
DECLARE S CHARACTER (16);
DECLARE B BIT (32);
DECLARE Nibble BIT (4);
DECLARE (J, K) FIXED BINARY (31);
DECLARE Hex_digit(0:15) CHARACTER (1) STATIC INITIAL
( '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' );
B = UNSPEC (FB); K = 1;
DO J = 1 TO LENGTH (B) BY 4;
Nibble = SUBSTR (B, J, 4);
SUBSTR (S, K, 1) = Hex_digit (Nibble);
K = K + 1;
END;
RETURN (S);
END HEXFB2;