
  PROCEDURE [INLINE] clp$evaluate_unsigned_decimal
    (    text: string ( * );
     VAR number: integer;
     VAR status: ost$status);

?? PUSH (LISTEXT := ON) ??

    CONST
      max_positive_integer = '9223372036854775807',
      max_positive_integer_digits = 19;

    VAR
      digit: 0 .. 9,
      i: integer,
      non_zero_digit_found: boolean,
      number_of_digits: integer;


    status.normal := TRUE;
    number := 0;

    #SCAN (clv$non_zero_digit, text, i, non_zero_digit_found);
    IF NOT non_zero_digit_found THEN
      RETURN;
    IFEND;

    number_of_digits := STRLENGTH (text) - i + 1;
    IF (number_of_digits > max_positive_integer_digits) OR
          ((number_of_digits = max_positive_integer_digits) AND
          (text (i, number_of_digits) > max_positive_integer)) THEN
      osp$set_status_abnormal ('CL', cle$integer_literal_too_large, text,
            status);
      RETURN;
    IFEND;

    FOR i := i TO STRLENGTH (text) DO
      CASE text (i) OF
      = '0' .. '9' =
        digit := $INTEGER (text (i)) - $INTEGER ('0');
      ELSE
        osp$set_status_abnormal ('CL', cle$improper_integer, text, status);
        RETURN;
      CASEND;
      number := (number * 10) + digit;
    FOREND;

  PROCEND clp$evaluate_unsigned_decimal;

*copyc cle$ecc_lexical
*copyc ost$status
?? POP ??
*copyc clv$non_zero_digit
*copyc osp$set_status_abnormal
