
  PROCEDURE [INLINE] clp$store_expandable_string
    (    text: ^clt$string_value;
         lexical_units: ^clt$lexical_units;
     VAR expandable_string {input, output} : clt$expandable_string);

?? PUSH (LISTEXT := ON) ??

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


    IF expandable_string.area = NIL THEN
      current_area_size := 0;
    ELSE
      current_area_size := #SIZE (expandable_string.area^);
    IFEND;

    IF text <> NIL THEN
      old_text := text;
    ELSE
      old_text := expandable_string.text;
    IFEND;

    needed_area_size := #SIZE (old_text^) + 1;
    IF lexical_units <> NIL THEN
      needed_area_size := needed_area_size + #SIZE (lexical_units^);
    IFEND;

    IF (needed_area_size <= current_area_size) AND
          (expandable_string.area <> NIL) THEN
      IF text <> NIL THEN
        RESET expandable_string.area;
        NEXT expandable_string.text: [STRLENGTH (text^)] IN
              expandable_string.area;
        expandable_string.text^ := text^;
      IFEND;
    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: [STRLENGTH (old_text^)] IN new_area;
      new_text^ := old_text^;
      IF expandable_string.area <> NIL THEN
        FREE expandable_string.area IN osv$task_shared_heap^;
      IFEND;
      expandable_string.area := new_area;
      expandable_string.text := new_text;
    IFEND;

    IF lexical_units = NIL THEN
      expandable_string.lexical_units := NIL;
    ELSE
      NEXT expandable_string.lexical_units:
            [1 .. UPPERBOUND (lexical_units^)] IN expandable_string.area;
      expandable_string.lexical_units^ := lexical_units^;
    IFEND;

  PROCEND clp$store_expandable_string;

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