
  PROCEDURE [INLINE] clp$add_variable_to_tree
    (    hashed_name: clt$variable_name;
         hash: clt$variable_name_hash;
         class: clt$internal_variable_class;
     VAR {input, output} variables: clt$variables;
     VAR variable_access: ^clt$variable_access);

    VAR
      current_access: ^^clt$variable_access;


    variable_access := NIL;
    current_access := ^variables.hash_groups [hash].root;

  /locate_node/
    WHILE current_access^ <> NIL DO
      IF hashed_name < current_access^^.hashed_name THEN
        current_access := ^current_access^^.left_search_tree;
      ELSEIF hashed_name > current_access^^.hashed_name THEN
        current_access := ^current_access^^.right_search_tree;
      ELSE
        RETURN;
      IFEND;
    WHILEND /locate_node/;

    ALLOCATE variable_access IN osv$task_shared_heap^;

    variable_access^.left_search_tree := NIL;
    variable_access^.right_search_tree := NIL;
    variable_access^.forward_thread := variables.thread;
    IF variables.thread <> NIL THEN
      variables.thread^.backward_thread := variable_access;
    IFEND;
    variables.thread := variable_access;
    variable_access^.backward_thread := NIL;
    variable_access^.hashed_name := hashed_name;
    variable_access^.info.class := class;
    variable_access^.info.parameter_passed := TRUE;
    current_access^ := variable_access;

    CASE class OF
    = clc$env_variable, clc$lib_variable, clc$pushed_variable =
      variables.hash_groups [hash].environment_variables_in_group :=
            variables.hash_groups [hash].environment_variables_in_group + 1;
    ELSE
      variables.hash_groups [hash].procedure_variables_in_group :=
            variables.hash_groups [hash].procedure_variables_in_group + 1;
    CASEND;

  PROCEND clp$add_variable_to_tree;

?? PUSH (LISTEXT := ON) ??
*copyc clt$internal_variable_class
*copyc clt$variable_access
*copyc clt$variable_name
*copyc clt$variable_name_hash
*copyc clt$variables
*copyc osv$task_shared_heap
?? POP ??
