?? RIGHT := 110 ??
?? NEWTITLE := 'NOS/VE:  Object Library Generator' ??
MODULE ocm$nlm_processors;


{ PURPOSE:                            }
{   To handle all searches, additions,}
{   deletions, removals, and creations}
{   in the New Library Module List.   }
?? PUSH (LISTEXT := ON) ??
*copyc oce$library_generator_errors
*copyc oct$new_library_module_list
*copyc ost$status
?? POP ??
*copyc OSP$SET_STATUS_ABNORMAL
*copyc ocv$nlm_list
*copyc ocv$olg_working_heap
?? NEWTITLE := '  OCP$SEARCH_NLM_LIST' ??
?? EJECT ??

  PROCEDURE {[XDCL]} ocp$search_nlm_list ALIAS 'ocpsnl' (module_name: pmt$program_name;
    VAR nlm: ^oct$new_library_module_list;
    VAR module_found: boolean);




    REPEAT
      nlm := nlm^.f_link;

    UNTIL (nlm^.name = module_name) OR (nlm^.name = osc$null_name);

    module_found := (nlm^.name = module_name);


  PROCEND ocp$search_nlm_list;
?? OLDTITLE ??

?? NEWTITLE := '  OCP$SEARCH_NLM_TREE' ??
?? EJECT ??

  PROCEDURE [XDCL] ocp$search_nlm_tree ALIAS 'ocpsnt' (module_name: pmt$program_name;
    VAR nlm: ^oct$new_library_module_list;
    VAR module_found: boolean);

    nlm := ocv$nlm_list;

    REPEAT
      IF module_name = nlm^.name THEN
        module_found := TRUE;
        RETURN;
      ELSE
        IF module_name < nlm^.name THEN
          nlm := nlm^.l_link;
        ELSE
          nlm := nlm^.r_link;
        IFEND;
      IFEND;
    UNTIL nlm = NIL;

    module_found := FALSE;

  PROCEND ocp$search_nlm_tree;
?? OLDTITLE ??
?? NEWTITLE := '  OCP$CREATE_AN_NLM' ??
?? EJECT ??

  PROCEDURE [XDCL] ocp$create_an_nlm ALIAS 'ocpcan' (module_description: ^oct$module_description;
    VAR nlm: ^oct$new_library_module_list;
    VAR status: ost$status);


    ALLOCATE nlm IN ocv$olg_working_heap^;
    IF nlm = NIL THEN
      osp$set_status_abnormal ('OC', oce$e_internal_olg_seg_overflow, '', status);
      RETURN;
    IFEND;

    nlm^.name := module_description^.name;
    nlm^.description := module_description;
    nlm^.changed_info := NIL;

    nlm^.f_link := NIL;
    nlm^.b_link := NIL;
    nlm^.r_link := NIL;
    nlm^.l_link := NIL;
    nlm^.t_link := NIL;

  PROCEND ocp$create_an_nlm;
?? OLDTITLE ??

?? NEWTITLE := '  OCP$ADD_AN_NLM' ??
?? EJECT ??

  PROCEDURE [XDCL] ocp$add_an_nlm ALIAS 'ocpaan' (module_before: ^oct$new_library_module_list;
    new_nlm: ^oct$new_library_module_list);




    ocp$add_an_nlm_to_list (module_before, new_nlm);

    ocp$add_an_nlm_to_tree (new_nlm);


  PROCEND ocp$add_an_nlm;
?? OLDTITLE ??
?? NEWTITLE := '  OCP$ADD_AN_NLM_TO_LIST' ??
?? EJECT ??

  PROCEDURE [XDCL] ocp$add_an_nlm_to_list ALIAS 'ocpantl' (module_before: ^oct$new_library_module_list;
    new_nlm: ^oct$new_library_module_list);





    new_nlm^.b_link := module_before;
    new_nlm^.f_link := module_before^.f_link;

    module_before^.f_link^.b_link := new_nlm;
    module_before^.f_link := new_nlm;



  PROCEND ocp$add_an_nlm_to_list;
?? OLDTITLE ??
?? NEWTITLE := '  OCP$ADD_AN_NLM_TO_TREE' ??
?? EJECT ??

  PROCEDURE [XDCL] ocp$add_an_nlm_to_tree ALIAS 'ocpantt' (new_nlm: ^oct$new_library_module_list);


    VAR
      nlm: ^oct$new_library_module_list;


    nlm := ocv$nlm_list;

    REPEAT
      IF new_nlm^.name < nlm^.name THEN
        IF nlm^.l_link = NIL THEN
          nlm^.l_link := new_nlm;
          new_nlm^.t_link := nlm;
          RETURN;
        ELSE
          nlm := nlm^.l_link;
        IFEND;
      ELSE
        IF nlm^.r_link = NIL THEN
          nlm^.r_link := new_nlm;
          new_nlm^.t_link := nlm;
          RETURN;
        ELSE
          nlm := nlm^.r_link;
        IFEND;
      IFEND;
    UNTIL FALSE;


  PROCEND ocp$add_an_nlm_to_tree;
?? OLDTITLE ??
?? NEWTITLE := '  OCP$DELETE_AN_NLM' ??
?? EJECT ??

  PROCEDURE [XDCL] ocp$delete_an_nlm ALIAS 'ocpdan' (nlm: ^oct$new_library_module_list);


    VAR
      nlm_to_delete: ^oct$new_library_module_list;

    nlm_to_delete := nlm;

    ocp$extract_nlm_from_list (nlm_to_delete);

    ocp$extract_nlm_from_tree (nlm_to_delete);

    FREE nlm_to_delete IN ocv$olg_working_heap^;


  PROCEND ocp$delete_an_nlm;
?? OLDTITLE ??
?? NEWTITLE := '  OCP$EXTRACT_NLM_FROM_LIST' ??
?? EJECT ??

  PROCEDURE [XDCL] ocp$extract_nlm_from_list ALIAS 'ocpenfl' (nlm: ^oct$new_library_module_list);




    nlm^.b_link^.f_link := nlm^.f_link;
    nlm^.f_link^.b_link := nlm^.b_link;
    nlm^.b_link := NIL;
    nlm^.f_link := NIL;


  PROCEND ocp$extract_nlm_from_list;
?? OLDTITLE ??
?? NEWTITLE := '  OCP$EXTRACT_NLM_FROM_TREE' ??
?? EJECT ??

  PROCEDURE [XDCL] ocp$extract_nlm_from_tree ALIAS 'ocpenft' (nlm: ^oct$new_library_module_list);


    VAR
      nlm_ptr: ^^oct$new_library_module_list,
      next_nlm: ^oct$new_library_module_list;


    IF nlm^.name < nlm^.t_link^.name THEN
      nlm_ptr := ^nlm^.t_link^.l_link;
    ELSE
      nlm_ptr := ^nlm^.t_link^.r_link;
    IFEND;

    IF (nlm^.l_link = NIL) OR (nlm^.r_link = NIL) THEN
      IF (nlm^.l_link = NIL) AND (nlm^.r_link = NIL) THEN
        nlm_ptr^ := NIL;
      ELSE
        IF nlm^.l_link = NIL THEN
          nlm_ptr^ := nlm^.r_link;
          nlm^.r_link^.t_link := nlm^.t_link;
        ELSE
          nlm_ptr^ := nlm^.l_link;
          nlm^.l_link^.t_link := nlm^.t_link;
        IFEND;
      IFEND;
    ELSE
      next_nlm := nlm^.l_link;

      WHILE next_nlm^.r_link <> NIL DO
        next_nlm := next_nlm^.r_link;
      WHILEND;

      next_nlm^.r_link := nlm^.r_link;
      nlm^.r_link^.t_link := next_nlm;

      nlm_ptr^ := nlm^.l_link;
      nlm^.l_link^.t_link := nlm^.t_link;
    IFEND;

    nlm^.l_link := NIL;
    nlm^.r_link := NIL;


  PROCEND ocp$extract_nlm_from_tree;
?? OLDTITLE ??




MODEND ocm$nlm_processors.
