
  PROCEDURE [INLINE] clp$find_variable_access
    (    name: clt$variable_name;
         hashed_name: clt$variable_name;
         hash: clt$variable_name_hash;
         allowed_data_classes: clt$internal_variable_classes;
         block: ^clt$block;
     VAR variable_access_info: ^clt$variable_access_info);

?? PUSH (LISTEXT := ON) ??

    VAR
      current_access: ^clt$variable_access,
      environment_variable_set: clt$internal_variable_classes,
      index: clt$parameter_name_index,
      found: boolean;


    variable_access_info := NIL;
    environment_variable_set := $clt$internal_variable_classes [clc$env_variable, clc$lib_variable,
          clc$pushed_variable];

    current_access := block^.variables.hash_groups [hash].root;
    IF ((allowed_data_classes * (-$clt$internal_variable_classes [clc$param_variable]))
          <> $clt$internal_variable_classes []) AND
          ((block^.variables.hash_groups [hash].procedure_variables_in_group > 0) OR
          (block^.variables.hash_groups [hash].environment_variables_in_group > 0)) THEN
      IF (block^.variables.hash_groups [hash].environment_variables_in_group = 0) AND
            (allowed_data_classes <= environment_variable_set) THEN
        RETURN;
      IFEND;

    /search_variables/
      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
          IF current_access^.info.class IN allowed_data_classes THEN
            variable_access_info := ^current_access^.info;
            RETURN;
          ELSE
            EXIT /search_variables/;
          IFEND;
        IFEND;
      WHILEND /search_variables/;

    IFEND;

    IF (clc$param_variable IN allowed_data_classes) AND block^.parameters.evaluated AND
          block^.parameters.procedure_parameters THEN
      clp$search_parameter_names (name, block^.parameters.names, index, found);
      IF found THEN
        variable_access_info := ^block^.parameters.accesses^ [block^.parameters.names^ [index].position].info;
      IFEND;
    IFEND;

  PROCEND clp$find_variable_access;

*copyc clt$block
*copyc clt$internal_variable_classes
*copyc clt$variable_access
*copyc clt$variable_access_info
*copyc clt$variable_name
*copyc clt$variable_name_hash
?? POP ??
*copyc clp$search_parameter_names
