?? RIGHT := 110 ??
MODULE ocm$process_command_dictionary;
*copyc osd$default_pragmats
?? PUSH (LISTEXT := ON) ??
*copyc oce$metapatch_generator_errors
*copyc llt$section_address
*copyc llt$command_dictionary
*copyc llt$load_module_header
*copyc llt$library_member_header
*copyc oct$offset_change_list
*copyc ocp$new_global_offset
*copyc osp$set_status_abnormal
?? POP ??

*copyc och$process_command_dictionary

  PROCEDURE [XDCL] ocp$process_command_dictionary (command_dictionary: ^llt$command_dictionary;
        mod_dictionary_ocv: ^oct$offset_change_list;
        int_ol: ^SEQ ( * );
    VAR status: ost$status);

    VAR
      module_header: record
        case boolean of
        = TRUE =
          pointer: ^llt$load_module_header,
        = FALSE =
          pva: ^cell,
        casend,
      recend,

      library_member_header: record
        case boolean of
        = TRUE =
          pointer: ^llt$library_member_header,
        = FALSE =
          pva: ^cell,
        casend,
      recend,

      application_member_header: record
        case boolean of
        = TRUE =
          pointer: ^llt$application_member_header,
        = FALSE =
          pva: ^cell,
        casend,
      recend,

      i: llt$module_index,
      length: integer,
      message: string (100),
      new_offset: llt$section_address_range;

    FOR i := 1 TO UPPERBOUND (command_dictionary^) DO
      CASE command_dictionary^ [i].module_kind OF
      = llc$load_module =
        module_header.pointer := #PTR (command_dictionary^ [i].module_header, int_ol^);
        new_offset := ocp$new_global_offset (#offset (module_header.pointer), mod_dictionary_ocv);
        module_header.pva := #address (#ring (module_header.pointer), #segment (module_header.pointer),
              new_offset);
        command_dictionary^ [i].module_header := #REL (module_header.pointer, int_ol^);
      = llc$command_procedure =
        library_member_header.pointer := #PTR (command_dictionary^ [i].command_header, int_ol^);
        new_offset := ocp$new_global_offset (#offset (library_member_header.pointer), mod_dictionary_ocv);
        library_member_header.pva := #address (#ring (library_member_header.pointer), #segment
              (library_member_header.pointer), new_offset);
        command_dictionary^ [i].command_header := #REL (library_member_header.pointer, int_ol^);
      = llc$command_description =
        library_member_header.pointer := #PTR (command_dictionary^ [i].command_description_header, int_ol^);
        new_offset := ocp$new_global_offset (#offset (library_member_header.pointer), mod_dictionary_ocv);
        library_member_header.pva := #address (#ring (library_member_header.pointer), #segment
              (library_member_header.pointer), new_offset);
        command_dictionary^ [i].command_description_header := #REL (library_member_header.pointer, int_ol^);
      = llc$program_description =
        library_member_header.pointer := #PTR (command_dictionary^ [i].program_header, int_ol^);
        new_offset := ocp$new_global_offset (#offset (library_member_header.pointer), mod_dictionary_ocv);
        library_member_header.pva := #address (#ring (library_member_header.pointer), #segment
              (library_member_header.pointer), new_offset);
        command_dictionary^ [i].program_header := #REL (library_member_header.pointer, int_ol^);
      = llc$applic_command_procedure =
        application_member_header.pointer := #PTR (command_dictionary^ [i].applic_command_header, int_ol^);
        new_offset := ocp$new_global_offset (#offset (application_member_header.pointer), mod_dictionary_ocv);
        application_member_header.pva := #address (#ring (application_member_header.pointer), #segment
              (application_member_header.pointer), new_offset);
        command_dictionary^ [i].applic_command_header := #REL (application_member_header.pointer, int_ol^);
      = llc$applic_command_description =
        application_member_header.pointer := #PTR (command_dictionary^ [i].applic_command_description_hdr,
              int_ol^);
        new_offset := ocp$new_global_offset (#offset (application_member_header.pointer), mod_dictionary_ocv);
        application_member_header.pva := #address (#ring (application_member_header.pointer), #segment
              (application_member_header.pointer), new_offset);
        command_dictionary^ [i].applic_command_description_hdr := #REL (application_member_header.pointer,
              int_ol^);
      = llc$applic_program_description =
        application_member_header.pointer := #PTR (command_dictionary^ [i].applic_program_header, int_ol^);
        new_offset := ocp$new_global_offset (#offset (application_member_header.pointer), mod_dictionary_ocv);
        application_member_header.pva := #address (#ring (application_member_header.pointer), #segment
              (application_member_header.pointer), new_offset);
        command_dictionary^ [i].applic_program_header := #REL (application_member_header.pointer, int_ol^);
      ELSE
        STRINGREP (message, length, command_dictionary^ [i].module_kind);
        osp$set_status_abnormal (occ$status_id, oce$unexpected_record_kind, message (1, length), status);
        RETURN;
      CASEND;
    FOREND;
  PROCEND ocp$process_command_dictionary;
MODEND ocm$process_command_dictionary;
