:- use_module(library(lineutils), [file_filter_with_init/5, split/3, glue/3]). :- use_module(library(lists), [append/2, append/3]). :- initialization(main). :- dynamic globals/1. :- yap_flag(write_strings,on). :- style_check(all). file_filter_with_initialization(A,B,C,D,E) :- file_filter_with_init(A,B,C,D,E). main :- warning(Warning), %file_filter_with_initialization('misc/HEAPFIELDS','H/hstruct.h',gen_struct,Warning,['hstruct.h','HEAPFIELDS']), %file_filter_with_initialization('misc/HEAPFIELDS','H/dhstruct.h',gen_dstruct,Warning,['dhstruct.h','HEAPFIELDS']), %file_filter_with_initialization('misc/HEAPFIELDS','H/rhstruct.h',gen_hstruct,Warning,['rhstruct.h','HEAPFIELDS']), %file_filter_with_initialization('misc/HEAPFIELDS','H/ihstruct.h',gen_init,Warning,['ihstruct.h','HEAPFIELDS']), file_filter_with_initialization('misc/GLOBALS','H/hglobals.h',gen_struct,Warning,['hglobals.h','GLOBALS']), file_filter_with_initialization('misc/GLOBALS','H/dglobals.h',gen_dstruct,Warning,['dglobals.h','GLOBALS']), file_filter_with_initialization('misc/GLOBALS','H/rglobals.h',gen_hstruct,Warning,['rglobals.h','GLOBALS']), file_filter_with_initialization('misc/GLOBALS','H/iglobals.h',gen_init,Warning,['iglobals.h','GLOBALS']), file_filter_with_initialization('misc/LOCALS','H/hlocals.h',gen_struct,Warning,['hlocals.h','LOCALS']), file_filter_with_initialization('misc/LOCALS','H/dlocals.h',gen_dstruct,Warning,['dlocals.h','LOCALS']), file_filter_with_initialization('misc/LOCALS','H/rlocals.h',gen_hstruct,Warning,['rlocals.h','LOCALS']), file_filter_with_initialization('misc/LOCALS','H/ilocals.h',gen_init,Warning,['ilocals.h','LOCALS']). warning('~n /* This file, ~a, was generated automatically by \"yap -L misc/buildlocalglobal\"~n please do not update, update misc/~a instead */~n~n'). /* define the field */ gen_struct(Inp,"") :- Inp = [0'/,0'/|_], !. gen_struct(Inp,"") :- Inp = [0'/,0'*|_], !. gen_struct(Inp, Out) :- Inp = [0'#|_], !, Out = Inp. % ' gen_struct(Inp,"") :- Inp = [0'.|_], !. %' gen_struct(Inp,Out) :- Inp = "START_WORKER_LOCAL", !, Out = "typedef struct worker_local {". gen_struct(Inp,Out) :- Inp = "END_WORKER_LOCAL", !, Out = "} w_local;". gen_struct(Inp,Out) :- Inp = "START_GLOBAL_DATA", !, Out = "typedef struct global_data {". gen_struct(Inp,Out) :- Inp = "END_GLOBAL_DATA", !, Out = "} w_shared;". gen_struct(Inp,Out) :- Inp = "ATOMS", !, Out = "#include \"tatoms.h\"". gen_struct(Inp,Out) :- split(Inp," ",["struct",Type, Field|_]), !, append([" struct ",Type," ",Field,"_",";"], Out). gen_struct(Inp,Out) :- split(Inp," ",["union",Type, Field|_]), !, append([" union ",Type," ",Field,"_",";"], Out). gen_struct(Inp,Out) :- split(Inp," ",["const",Type, Field|_]), !, append(["const ", Type," ",Field,"_",";"], Out). gen_struct(Inp,"") :- split(Inp," ",["void","void"|_]), !. gen_struct(Inp,Out) :- split(Inp," ",[Type, Field|_]), split(Field,"[",[RField,VECField]), !, append([" ",Type," ",RField,"_","[",VECField,";"], Out). gen_struct(Inp,Out) :- split(Inp," ",[Type, Field|_]), !, append([" ",Type," ",Field,"_",";"], Out). gen_struct(Inp,_) :- split(Inp," ",[_, _, _| _]), format(user_error,"OOPS: could not gen_struct for ~s~n",[Inp]). gen_dstruct(Inp,"") :- Inp = [0'/,0'/|_], !. gen_dstruct(Inp,"") :- Inp = [0'/,0'*|_], !. gen_dstruct(Inp, Out) :- Inp = [0'#|_], !, Out = Inp. % ' gen_dstruct(Inp,"") :- Inp = "START_WORKER_LOCAL", !, assert(globals(worker)). gen_dstruct(Inp,"") :- Inp = "END_WORKER_LOCAL", !, retract(globals(worker)). gen_dstruct(Inp,"") :- Inp = "START_GLOBAL_DATA", !, assert(globals(all)). gen_dstruct(Inp,"") :- Inp = "END_GLOBAL_DATA", !, retract(globals(all)). gen_dstruct(Inp,Out) :- Inp = "ATOMS", !, Out = "". gen_dstruct(Inp,"") :- split(Inp," ",["void","void"|_]), !. gen_dstruct(Inp,Out) :- split(Inp," ",["struct"|Inp2]), !, glue(Inp2, " ", Inp3), gen_dstruct(Inp3, Out). gen_dstruct(Inp,Out) :- split(Inp," ",["union"|Inp2]), !, glue(Inp2, " ", Inp3), gen_dstruct(Inp3, Out). gen_dstruct(Inp,Out) :- split(Inp," ",["const"|Inp2]), !, glue(Inp2, " ", Inp3), gen_dstruct(Inp3, Out). gen_dstruct(Inp,Out) :- split(Inp," ",[".", Field,_|_]), !, cut_c_stuff(Field, RField), split(RField,".",[_,MField]), fetch_name(Global,Global2,RField,MField), append(["#define ",Global," ",Global2], Out). gen_dstruct(Inp,Out) :- split(Inp," ",[_, Field,_|_]), !, cut_c_stuff(Field, RField), fetch_name(Global,Global2,RField," "), append(["#define ",Global," ",Global2], Out). gen_dstruct(Inp,_) :- split(Inp," ",[_, _, _| _]), format(user_error,"OOPS: could not gen_dstruct for ~s~n",[Inp]). fetch_name(Global,Global2,RField," ") :- globals(all), !, append(["GLOBAL_", RField],Global), append(["Yap_global->", RField,"_"],Global2). fetch_name(Global,Global2,RField," ") :- globals(worker), append(["LOCAL_", RField],Global), append(["LOCAL->", RField,"_"],Global2). fetch_name(Global,Global2,RField," ") :- globals(worker), !, append(["REMOTE_", RField,"(wid)"],Global), append(["REMOTE(wid)->", RField,"_"],Global2). fetch_name(Global,Global2,RField,MField) :- globals(worker), append(["REMOTE_", MField,"(wid)"],Global), append(["REMOTE(wid)->", RField],Global2). fetch_name(Global,Global2,RField,MField) :- globals(worker),!, append(["LOCAL_", MField],Global), append(["LOCAL->", RField],Global2). fetch_name(Global, RField) :- globals(worker_init), !, append(["REMOTE_", RField,"(wid)"],Global). fetch_name(Global, RField) :- globals(all), !, append(["GLOBAL_", RField],Global). % handle *field[4] cut_c_stuff([0'*|Name], RName) :- !, % 'cut * cut_c_stuff(Name, RName). cut_c_stuff(Name, RName) :- cut_mat(Name, RName). cut_mat([], []). cut_mat([0'[|_], []) :- !. %' cut_mat(H.Name, H.RName) :- cut_mat(Name, RName). gen_hstruct(Inp,"") :- Inp = [0'/,0'/|_], !. gen_hstruct(Inp,"") :- Inp = [0'.|_], !. %' gen_hstruct(Inp,"") :- Inp = [0'/,0'*|_], !. gen_hstruct(Inp,Out) :- Inp = "ATOMS", !, Out = "#include \"ratoms.h\"". gen_hstruct(Inp,Out) :- Inp = "START_WORKER_LOCAL", !, Out = "static void RestoreWorker(int wid USES_REGS) {", assert(globals(worker_init)). gen_hstruct(Inp,Out) :- Inp = "END_WORKER_LOCAL", !, Out = "}", retract(globals(worker_init)). gen_hstruct(Inp,Out) :- Inp = "START_GLOBAL_DATA", !, Out = "static void RestoreGlobal(void) {", assert(globals(all)). gen_hstruct(Inp,Out) :- Inp = "END_GLOBAL_DATA", !, Out = "}", retract(globals(all)). gen_hstruct(Inp, Out) :- Inp = [0'#|_], !, Out = Inp. % ' gen_hstruct(Inp,Out) :- split(Inp," ",["struct"|Inp2]), !, glue(Inp2, " ", Inp3), gen_hstruct(Inp3,Out). gen_hstruct(Inp,Out) :- split(Inp," ",["const"|Inp2]), !, glue(Inp2, " ", Inp3), gen_hstruct(Inp3,Out). gen_hstruct(Inp,Out) :- split(Inp," ",["union"|Inp2]), !, glue(Inp2, " ", Inp3), gen_hstruct(Inp3,Out). gen_hstruct(Inp,Out) :- split(Inp," ",[_, Field, "MkAT", _]), !, fetch_name(Global,Field), append([" ",Global,Field," = AtomTermAdjust(Yap_heap_regs->",Field,");"], Out). gen_hstruct(Inp,Out) :- split(Inp," ",[_, Field, "MkPred"| _]), !, cut_c_stuff(Field, RField), fetch_name(Global,RField), append([" ",Global,RField," = PtoPredAdjust(Yap_heap_regs->",RField,");"], Out). gen_hstruct(Inp,Out) :- split(Inp," ",[_, Field, "MkOp", Name]), !, fetch_name(Global,Field), append([" ",Global,Field," = Yap_opcode(",Name,");"], Out). gen_hstruct(Inp,Out) :- split(Inp," ",[_, Field, "MkLock"]), !, fetch_name(Global,Field), append([" REINIT_LOCK(",Global,");"], Out). gen_hstruct(Inp,Out) :- split(Inp," ",[_, Field,"MkRWLock"]), !, fetch_name(Global,Field), append([" REINIT_RWLOCK(",Global,Field,");"], Out). gen_hstruct(Inp,Out) :- split(Inp," ",[_, Field,"MkInstE",OP]), !, cut_c_stuff(Field, RField), fetch_name(Global,RField), append([" ",Global,RField,"->opc = Yap_opcode(",OP,");"], Out). gen_hstruct(Inp,"") :- split(Inp," ",[_, _, _]), !. gen_hstruct(Inp,"") :- split(Inp," ",[_, _, _, "void"]), !. gen_hstruct(Inp,Restore) :- split(Inp," ",[_, _, _, Restore0]), append("Restore",_,Restore0), !, append([" ",Restore0,";"],Restore). %' gen_hstruct(Inp,Out) :- split(Inp," ",[_, Field, _, Adjust]), append(Adjust,"Adjust",_), !, cut_c_stuff(Field, RField), fetch_name(Global,RField), append([" ",Global," = ",Adjust,"(",Global,");"], Out). gen_hstruct(Inp,_) :- split(Inp," ",[_, _, _| _]), format(user_error,"OOPS: could not gen_hstruct for ~s~n",[Inp]). gen_init(Inp,"") :- Inp = [0'/,0'*|_], !. gen_init(Inp,"") :- Inp = [0'/,0'/|_], !. gen_init(Inp, Out) :- Inp = [0'#|_], !, Out = Inp. % ' gen_init(Inp,Out) :- Inp = "ATOMS", !, Out = "#include \"iatoms.h\"". gen_init(Inp,Out) :- Inp = "START_WORKER_LOCAL", !, Out = "static void InitWorker(int wid) {", assert(globals(worker_init)). gen_init(Inp,Out) :- Inp = "END_WORKER_LOCAL", !, Out = "}", retract(globals(worker_init)). gen_init(Inp,Out) :- Inp = "START_GLOBAL_DATA", !, Out = "static void InitGlobal(void) {", assert(globals(all)). gen_init(Inp,Out) :- Inp = "END_GLOBAL_DATA", !, Out = "}", retract(globals(all)). gen_init(Inp,Out) :- split(Inp," ",["struct"|Inp2]), !, glue(Inp2, " ", Inp3), gen_init(Inp3, Out). gen_init(Inp,Out) :- split(Inp," ",["union"|Inp2]), !, glue(Inp2, " ", Inp3), gen_init(Inp3, Out). gen_init(Inp,"") :- split(Inp," ",[_, _, "void"|_]), !. gen_init(Inp,"") :- split(Inp," ",["const"|_]), !. gen_init(Inp,Init) :- split(Inp," ",[_, _, Init0| _]), append("Init",_,Init0), !, append([" ",Init0,";"],Init). gen_init(Inp,Init) :- split(Inp," ",[_, _, Init0| _]), append("Yap_Init",_,Init0), !, append([" ",Init0,";"],Init). gen_init(Inp,Init) :- split(Inp," ",[_, _, Init0| _]), append("Yap_init",_,Init0), !, append([" ",Init0,";"],Init). gen_init(Inp,Out) :- split(Inp," ",[_, Field, "MkAT", AtomName]), !, cut_c_stuff(Field, RField), fetch_name(Global,RField), append([" ",Global," = MkAtomTerm(",AtomName,");"], Out). gen_init(Inp,Out) :- split(Inp," ",[_, Field, "MkOp", Name]), !, fetch_name(Global,Field), append([" ",Global," = Yap_opcode(",Name,");"], Out). gen_init(Inp,Out) :- split(Inp," ",[_, Field, "MkLock"]), !, fetch_name(Global,Field), append([" INIT_LOCK(",Global,");"], Out). gen_init(Inp,Out) :- split(Inp," ",[_, Field, "MkRWLock"]), !, fetch_name(Global,Field), append([" INIT_RWLOCK(",Global,");"], Out). gen_init(Inp,Out) :- split(Inp," ",[_, Field, "MkInstE",OP]), !, cut_c_stuff(Field, RField), fetch_name(Global,RField), append([" ",Global,"->opc = Yap_opcode(",OP,");"], Out). gen_init(Inp,Out) :- split(Inp," ",[_, Field, "MkPred", Atom, "0", Module]), !, cut_c_stuff(Field, RField), fetch_name(Global,RField), append([" ",Global," = RepPredProp(PredPropByAtom(",Atom,",",Module,"));"], Out). gen_init(Inp,Out) :- split(Inp," ",[_, Field, "MkPred", Atom, Arity, Module]), !, cut_c_stuff(Field, RField), fetch_name(Global,RField), append([" ",Global," = RepPredProp(PredPropByFunc(Yap_MkFunctor(",Atom,",",Arity,"),",Module,"));"], Out). gen_init(Inp,Out) :- split(Inp," ",[_, Field, "MkPred", Fun, Module]), !, cut_c_stuff(Field, RField), fetch_name(Global,RField), append([" ",Global," = RepPredProp(PredPropByFunc(",Fun,",",Module,"));"], Out). gen_init(Inp,Out) :- split(Inp," ",[".", Field,F0|_]), !, cut_c_stuff(Field, RField), split(RField,".",[_,MField]), append("=",F,F0), !, fetch_name(Global,MField), append([" ",Global," = ",F,";"], Out). gen_init(Inp,Out) :- split(Inp," ",[_, Field, F0|_]), append("=",F,F0), !, cut_c_stuff(Field, RField), fetch_name(Global,RField), append([" ",Global," = ",F,";"], Out). gen_init(Inp,_) :- split(Inp," ",[_, _, _| _]), format(user_error,"OOPS: could not gen_init for ~s~n",[Inp]).