?? RIGHT := 110 ??
?? NEWTITLE := 'NOS/VE SCL Interpreter : Convert Real to String' ??
MODULE clm$convert_real_to_string;

{
{ PURPOSE:
{   This module contains the procedure that converts a real number to its
{   string representation.
{

?? NEWTITLE := 'Global Declarations', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc clc$max_real_number_size
*copyc clk$convert_real_to_string
*copyc clt$real
*copyc clt$real_number_digit_count
*copyc ost$status
*copyc ost$string
?? POP ??
*copyc clp$longreal_classify
*copyc mlp$output_floating_number

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

  PROCEDURE [XDCL, #GATE] clp$convert_real_to_string
    (    real_number: longreal;
         number_of_digits: clt$real_number_digit_count;
     VAR str: ost$string;
     VAR status: ost$status);

    VAR
*IF NOT $true(osv$unix)
      conversion_status: mlt$error,
      format: mlt$output_format,
      i: 1 .. clc$max_real_number_size + 1,
      temp_str: string (clc$max_real_number_size),
      size: mlt$string_length;
*ELSE
      line: string (256),
      length: integer;
*IFEND


    status.normal := TRUE;

    str.size := 0;
    str.value := '';

*IF NOT $true(osv$unix)
    format.justification := mlc$left_justify;
    format.sign := mlc$minus_if_negative;
    format.format := mlc$list_directed;
    format.width := clc$max_real_number_size;
    format.digits := number_of_digits;
    format.exponent_character := 'E';
*IFEND

    CASE clp$longreal_classify (real_number) OF

    = clc$real_indefinite =
      str.value := '$INDEFINITE';
      str.size := 11;

    = clc$real_negative_infinite =
      str.value := '-$INFINITY';
      str.size := 10;

    = clc$real_zero =
      str.value := '0.0';
      str.size := 3;

    = clc$real_positive_infinite =
      str.value := '$INFINITY';
      str.size := 9;

    ELSE { clc$real_negative_standard, clc$real_positive_standard }
*IF NOT $true(osv$unix)
      mlp$output_floating_number (^real_number, mlc$double_precision, ^temp_str, format, size,
            conversion_status);
      i := 1;
      WHILE i <= size DO
        IF temp_str (i) <> '.' THEN
          str.size := str.size + 1;
          str.value (str.size) := temp_str (i);
        ELSEIF (i = 1) OR (temp_str (i - 1) < '0') OR (temp_str (i - 1) > '9') THEN
          str.value (str.size + 1, 2) := '0.';
          str.size := str.size + 2;
        ELSEIF (i = size) OR (temp_str (i + 1) < '0') OR (temp_str (i + 1) > '9') THEN
          str.value (str.size + 1, 2) := '.0';
          str.size := str.size + 2;
        ELSE
          str.size := str.size + 1;
          str.value (str.size) := '.';
        IFEND;
        i := i + 1;
      WHILEND;
*ELSE
      STRINGREP (line, length, real_number);
      str.value := line;
      str.size := length;
*IFEND
    CASEND;

  PROCEND clp$convert_real_to_string;

MODEND clm$convert_real_to_string;
