?? RIGHT := 110 ??
?? NEWTITLE := 'NOS/VE SCL Interpreter : Convert Integer to String' ??
MODULE clm$convert_integer_to_string ALIAS 'clmi2s';

{
{ PURPOSE:
{   This module contains procedures that convert an integer to its string representation.
{

?? NEWTITLE := 'Global Declarations', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc cle$ecc_expression_result
*IF NOT $true(osv$unix)
*copyc oss$mainframe_paged_literal
*IFEND
*copyc ost$status
*copyc ost$string
?? POP ??
*copyc osp$set_status_abnormal

  CONST
    max_digits = 64;

  VAR
*IF NOT $true(osv$unix)
    digit_char: [STATIC, READ, oss$mainframe_paged_literal] array [-15 .. 15] of char := ['F', 'E', 'D', 'C',
*ELSE
    digit_char: [STATIC, READ] array [-15 .. 15] of char := ['F', 'E', 'D', 'C',
*IFEND
          'B', 'A', '9', '8', '7', '6', '5', '4', '3', '2', '1', '0', '1', '2', '3', '4', '5', '6', '7', '8',
          '9', 'A', 'B', 'C', 'D', 'E', 'F'];

?? TITLE := 'clp$convert_integer_to_string', EJECT ??
*copyc clh$convert_integer_to_string

  PROCEDURE [XDCL, #GATE] clp$convert_integer_to_string ALIAS 'clpci2s'
    (    int: integer;
         radix: 2 .. 16;
         include_radix_specifier: boolean;
     VAR str: ost$string;
     VAR status: ost$status);

    VAR
      actual_radix: 2 .. 16,
      digits: array [1 .. max_digits] of -15 .. 15,
      digit_count: 0 .. max_digits,
      current_int: integer;

    status.normal := TRUE;
    current_int := int;
    digit_count := 0;

    IF (2 <= radix) AND (radix <= 16) THEN
      actual_radix := radix;
    ELSE
      actual_radix := 10;
    IFEND;

    REPEAT
      digit_count := digit_count + 1;
      digits [digit_count] := current_int MOD actual_radix;
      current_int := current_int DIV actual_radix;
    UNTIL current_int = 0;

    str.size := 0;
    str.value := '  ';
    IF int < 0 THEN
      str.size := 1;
      str.value (1) := '-';
    IFEND;

    IF (digits [digit_count] >= 10) OR (digits [digit_count] <= -10) THEN
      str.size := str.size + 1;
      str.value (str.size) := '0';
    IFEND;

    REPEAT
      str.size := str.size + 1;
      str.value (str.size) := digit_char [digits [digit_count]];
      digit_count := digit_count - 1;
    UNTIL digit_count <= 0;

    IF include_radix_specifier THEN
      str.size := str.size + 1;
      str.value (str.size) := '(';
      IF actual_radix >= 10 THEN
        str.size := str.size + 1;
        str.value (str.size) := '1';
      IFEND;
      str.size := str.size + 1;
      str.value (str.size) := digit_char [actual_radix MOD 10];
      str.size := str.size + 1;
      str.value (str.size) := ')';
    IFEND;

  PROCEND clp$convert_integer_to_string;
*IF NOT $true(osv$unix)
?? TITLE := 'clp$convert_integer_to_rjstring', EJECT ??
*copyc clh$convert_integer_to_rjstring

  PROCEDURE [XDCL, #GATE] clp$convert_integer_to_rjstring ALIAS 'clpcirs'
    (    int: integer;
         radix: 2 .. 16;
         include_radix_specifier: boolean;
         fill_character: char;
     VAR str: string ( * );
     VAR status: ost$status);

    VAR
      actual_radix: 2 .. 16,
      digits: array [1 .. max_digits] of -15 .. 15,
      digit_count: 0 .. max_digits,
      i: 1 .. osc$max_string_size,
      current_int: integer,
      string_index: ost$string_size;

  /convert/
    BEGIN

      status.normal := TRUE;
      string_index := STRLENGTH (str);
      current_int := int;
      digit_count := 0;

      IF (2 <= radix) AND (radix <= 16) THEN
        actual_radix := radix;
      ELSE
        actual_radix := 10;
      IFEND;

      REPEAT
        digit_count := digit_count + 1;
        digits [digit_count] := current_int MOD actual_radix;
        current_int := current_int DIV actual_radix;
      UNTIL current_int = 0;

      IF (digit_count + $INTEGER (int < 0) + ($INTEGER (include_radix_specifier) *
            (3 + $INTEGER (actual_radix >= 10)))) > string_index THEN
        osp$set_status_abnormal ('CL', cle$string_too_short, ' for integer conversion', status);
        EXIT /convert/;
      IFEND;

      IF include_radix_specifier THEN
        str (string_index) := ')';
        string_index := string_index - 1;
        str (string_index) := digit_char [actual_radix MOD 10];
        string_index := string_index - 1;
        IF actual_radix >= 10 THEN
          str (string_index) := '1';
          string_index := string_index - 1;
        IFEND;
        str (string_index) := '(';
        string_index := string_index - 1;
      IFEND;

      FOR i := 1 TO digit_count DO
        str (string_index) := digit_char [digits [i]];
        string_index := string_index - 1;
      FOREND;

      IF ((digits [digit_count] >= 10) OR (digits [digit_count] <= -10)) AND
            (string_index > $INTEGER (int < 0)) THEN
        str (string_index) := '0';
        string_index := string_index - 1;
      IFEND;

      FOR i := 1 TO string_index DO
        str (i) := fill_character;
      FOREND;

      IF int < 0 THEN
        IF fill_character = ' ' THEN
          str (string_index) := '-';
        ELSE
          str (1) := '-';
        IFEND;
      IFEND;

    END /convert/;

  PROCEND clp$convert_integer_to_rjstring;
*IFEND

MODEND clm$convert_integer_to_string;
