/* File:      flrlibman.P -- Flora includes and libraries definitions
**
** Author(s): Guizhen Yang
**            Michael Kifer
**
** Contact:   flora-users@lists.sourceforge.net
**
** Copyright (C) The Research Foundation of SUNY, 1999-2001
**
** FLORA-2 is free software; you can redistribute it and/or modify it under the
** terms of the GNU Library General Public License as published by the Free
** Software Foundation; either version 2 of the License, or (at your option)
** any later version.
**
** FLORA-2 is distributed in the hope that it will be useful, but WITHOUT ANY
** WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
** FOR A PARTICULAR PURPOSE.  See the GNU Library General Public License for
** more details.
**
** You should have received a copy of the GNU Library General Public License
** along with FLORA-2; if not, write to the Free Software Foundation,
** Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
**
**
*/


:- compiler_options([xpp_on]).


#include "flora_terms.flh"
#include "flora_exceptions.flh"

?- bootstrap_flora.

/**********************************************************************
  flora_register_syslib(+LibBaseFile)
**********************************************************************/
flora_register_syslib(LibBaseFile) :-
	assert(flora_syslib_loaded(LibBaseFile)).


/**********************************************************************
  flora_load_library(+List)
  flora_load_library(+LibID)

  Note: This predicate always succeeds.
**********************************************************************/
flora_load_library(LibID) :-
	var(LibID),
	!,
	flora_error_line('Uninstantiated FLORA system library name! Loading failed!').

flora_load_library([]) :- !.

flora_load_library([H|T]) :-
	!,
	flora_load_library(H),
	flora_load_library(T).

flora_load_library(LibID) :-
	( flora_library_file(LibID,BaseFileName,SubDir) ->
	    ( flora_syslib_loaded(BaseFileName) -> true
	    ;
	      flora_configuration(installdir,FloraDir),
	      flora_slash(S),
	      flora_concat_atoms([FloraDir,S,SubDir,S,BaseFileName,'.P'],
				 FullLibPath),
		%% Because LibID implies BaseFilename, we register base
		%% filename rather than the library name
		%% (several LibID can correspond to one file).
	      consult(FullLibPath),
	      flora_register_syslib(BaseFileName)
	    )
	;
	  flora_error_line('Invalid FLORA system library name %S ! Loading failed!',
			   args(LibID))
	),
	!.

flora_load_library(_LibID).


/**********************************************************************
  flora_register_sysmod(+SysModID)
**********************************************************************/
flora_register_sysmod(SysModID) :-
	assert(flora_sysmod_loaded(SysModID)).


/**********************************************************************
  flora_load_system_module(+List)
  flora_load_system_module(+SysModID)

  Note: This predicate always succeeds.
**********************************************************************/
flora_load_system_module(SysModID) :-
	var(SysModID),
	!,
	flora_error_line('Uninstantiated FLORA system module ID! Loading failed!').

flora_load_system_module([]) :- !.

flora_load_system_module([H|T]) :-
	!,
	flora_load_system_module(H),
	flora_load_system_module(T).

flora_load_system_module(SysModID) :-
	( flora_sysmod_loaded(SysModID) -> true
	;
	    %% Register the Flora system module ID.
	    flora_register_sysmod(SysModID),
	    %% Maybe we should unregister on error? Use throw/catch?
	    flora_load_system_module_internal(SysModID)
	),
	!.

flora_load_system_module(_SysModID).


/********************************************************************
  flora_include(+ID,+FilePath)
  indicates which file to be included in the output file. The file
  path contains the subdir relative to the Flora home dir.
********************************************************************/
flora_include(ID,IncFile) :-
	atom(ID),
	flora_slash(S),
	flora_library_file(ID,BaseFilename,SubDir),
	!,
	flora_concat_atoms([SubDir,'inc',S,BaseFilename,'_inc.flh'], IncFile).


/****************************************************************************
  flora_library_file(+LibName,+BaseFileName,+SubDir)

  These libraries implement:
  * Flora aggregation syntax
  * Flora shell commands
  * module specification with variables
  * control structure such as if-then-else and while-loop
*****************************************************************************/
flora_library_file(FLLIBMIN,flraggmin,syslib) :- !.
flora_library_file(FLLIBMAX,flraggmax,syslib) :- !.
flora_library_file(FLLIBSUM,flraggsum,syslib) :- !.
flora_library_file(FLLIBAVG,flraggavg,syslib) :- !.
flora_library_file(FLLIBCOUNT,flraggcount,syslib) :- !.
flora_library_file(FLLIBCOLLECTSET,flraggcolset,syslib) :- !.
flora_library_file(FLLIBCOLLECTBAG,flraggcolbag,syslib) :- !.
flora_library_file(FLLIBLOAD,flrload,syslib) :- !.
flora_library_file(FLLIBANSWER,flranswer,syslib) :- !.
flora_library_file(FLLIBSHELLANS,flranswer,syslib) :- !.
flora_library_file(FLLIBPROGRAMANS,flranswer,syslib) :- !.
flora_library_file(FLLIBDISPLAY,flrdisplay,syslib) :- !.
flora_library_file(FLLIBDBOP,flrdbop,syslib) :- !.
flora_library_file(FLLIBINSERT,flrdbop,syslib) :- !.
flora_library_file(FLLIBINSERTALL,flrdbop,syslib) :- !.
flora_library_file(FLLIBDELETE,flrdbop,syslib) :- !.
flora_library_file(FLLIBDELETEALL,flrdbop,syslib) :- !.
flora_library_file(FLLIBERASE,flrdbop,syslib) :- !.
flora_library_file(FLLIBERASEALL,flrdbop,syslib) :- !.
flora_library_file(FLLIBBTDBOP,flrbtdbop,syslib) :- !.
flora_library_file(FLLIBBTINSERT,flrbtdbop,syslib) :- !.
flora_library_file(FLLIBBTINSERTALL,flrbtdbop,syslib) :- !.
flora_library_file(FLLIBBTDELETE,flrbtdbop,syslib) :- !.
flora_library_file(FLLIBBTDELETEALL,flrbtdbop,syslib) :- !.
flora_library_file(FLLIBBTERASE,flrbtdbop,syslib) :- !.
flora_library_file(FLLIBBTERASEALL,flrbtdbop,syslib) :- !.
flora_library_file(FLLIBREFRESH,flrtables,syslib) :- !.
flora_library_file(FLLIBTABLES,flrtables,syslib) :- !.
flora_library_file(FLLIBSHDIRECT,flrshdirect,syslib) :- !.
flora_library_file(FLLIBDYNMOD,flrdynmod,syslib) :- !.
flora_library_file(FLLIBMODLIT,flrdynmod,syslib) :- !.
flora_library_file(FLLIBMODOBJ,flrdynmod,syslib) :- !.
flora_library_file(FLLIBEQUALITY,flrequality,syslib) :- !.

flora_library_file(FLLIBDYNRULE,flrdynrule,syslib) :- !.
flora_library_file(FLLIBNEWMODULE,flrdynrule,syslib) :- !.
flora_library_file(FLLIBINSERTRULE_A,flrdynrule,syslib) :- !.
flora_library_file(FLLIBINSERTRULE_Z,flrdynrule,syslib) :- !.
flora_library_file(FLLIBDELETERULE_A,flrdynrule,syslib) :- !.
flora_library_file(FLLIBDELETERULE_Z,flrdynrule,syslib) :- !.
flora_library_file(FLLIBDELETERULE,flrdynrule,syslib) :- !.

flora_library_file(FLLIBCONTROL,flrcontrol,syslib) :- !.
flora_library_file(FLLIBIFTHENELSE,flrcontrol,syslib) :- !.
flora_library_file(FLLIBIFTHEN,flrcontrol,syslib) :- !.
flora_library_file(FLLIBUNLESSDO,flrcontrol,syslib) :- !.
flora_library_file(FLLIBWHILEDO,flrcontrol,syslib) :- !.
flora_library_file(FLLIBDOUNTIL,flrcontrol,syslib) :- !.
flora_library_file(FLLIBWHILELOOP,flrcontrol,syslib) :- !.
flora_library_file(FLLIBLOOPUNTIL,flrcontrol,syslib) :- !.

flora_library_file(FLLIBMETAOPS,flrmetaops,syslib) :- !.
flora_library_file(FLLIBUNIVEQFORM,flrmetaops,syslib) :- !.
%% This handles both =.. and ~..
flora_library_file(FLLIBMETAUNIV,flrmetaops,syslib) :- !.

flora_library_file(FLLIBIMPORTEDCALLS,flrimportedcalls,syslib) :- !.

flora_library_file(FLLIBCATCH,flrerrhandler,syslib) :- !.
flora_library_file(FLLIBTHROW,flrerrhandler,syslib) :- !.
flora_library_file(FLLIBERRHANDLER,flrerrhandler,syslib) :- !.


/**************************************************************************
  Flora headers and trailers inclusion files
***************************************************************************/
flora_library_file(FLHEADER,flrheader,header) :- !.
flora_library_file(FLHEADER2,flrheader2,header) :- !.
flora_library_file(FLDEFINITION,flrdefinition,header) :- !.
flora_library_file(FLPATCH,flrpatch,header) :- !.
flora_library_file(FLTRAILER,flrtrailer,header) :- !.
flora_library_file(FLEQLTRAILER,flreqltrailer,header) :- !.
flora_library_file(FLSCALAREQL,flrscalareql,header) :- !.

%% support for undefinedness
flora_library_file(FLPREDDEF,flrpreddef,header) :- !.
flora_library_file(FLINDEX_P,flrindex_P,header) :- !.

%% for dynamically inserted rules
flora_library_file(FLDYNA,flrdyna,header) :- !.
flora_library_file(FLDYNZ,flrdynz,header) :- !.

%% for refreshing tables
flora_library_file(FLREFRESHTABLE,flrrefreshtable,header) :- !.

flora_library_file(FLLIBIMPORTEDCALLS,flrimportedcalls,header) :- !.

/**************************************************************************
  Flora system modules use the system libraries mechanism to include
  their header files, but use different mechanism to load.
***************************************************************************/
flora_library_file(SysModID,BaseFile,SubDir) :-
	flora_sysmod_file(SysModID,BaseFile,SubDir),
	!.


/**************************************************************************
  catch error
***************************************************************************/
flora_library_file(S,F,_) :-
	flora_error_line("Unknown library ID `%S' or file `%S'", args(S,F)),
	flora_abort.


/*****************************************************************************
  flora_sysmod_file(+SysModID,+BaseFileName,+SubDir).

  Flora system modules accessible by the @flora(mod) syntax
*****************************************************************************/
flora_sysmod_file(FLSYSMODPP,flrprettyprint,lib) :- !.
flora_sysmod_file(FLSYSMODIO,flrio,lib) :- !.
flora_sysmod_file(FLSYSMODSYSTEM,flrsystem,lib) :- !.
flora_sysmod_file(FLSYSMODDATABASE,flrstorage,lib) :- !.

flora_system_module(SysModID) :- flora_sysmod_file(SysModID,_BaseFileName,_SubDir).


syntax highlighted by Code2HTML, v. 0.9.1