
  PROCEDURE [INLINE] clp$append_expandable_string
    (    retain_size: clt$string_size;
         append_text: ^clt$string_value;
     VAR expandable_string {input, output} : clt$expandable_string);

?? PUSH (LISTEXT := ON) ??

    VAR
      needed_area_size: integer,
      new_area: ^SEQ ( * ),
      new_text: ^clt$string_value;


    needed_area_size := retain_size + STRLENGTH (append_text^);

    IF needed_area_size <= #SIZE (expandable_string.area^) THEN
      RESET expandable_string.area;
      NEXT expandable_string.text: [retain_size + STRLENGTH (append_text^)] IN
            expandable_string.area;
    ELSE
      ALLOCATE new_area: [[REP ((needed_area_size + clc$expansion_chunk_size -
            1) DIV clc$expansion_chunk_size) * clc$expansion_chunk_size OF
            cell]] IN osv$task_shared_heap^;
      RESET new_area;
      NEXT new_text: [retain_size + STRLENGTH (append_text^)] IN new_area;
      new_text^ (1, retain_size) := expandable_string.text^ (1, retain_size);
      FREE expandable_string.area IN osv$task_shared_heap^;
      expandable_string.area := new_area;
      expandable_string.text := new_text;
    IFEND;

    expandable_string.text^ (retain_size + 1,
          STRLENGTH (append_text^)) := append_text^;

  PROCEND clp$append_expandable_string;

*copyc clt$expandable_string
*copyc clt$string_size
*copyc clt$string_value
?? POP ??
*copyc osv$task_shared_heap
