CFLAGS= -O
CFILES1=addstr.cpp divE.cpp divS.cpp divert.cpp dochain.cpp docomb.cpp doctr.cpp dodefs.cpp \
	doesc.cpp doextern.cpp dofile.cpp doflag.cpp dohash.cpp doinit.cpp doique.cpp \
	doistak.cpp doivar.cpp dolimdup.cpp domacro.cpp donodup.cpp donormal.cpp doopt.cpp \
	dopermute.cpp dopoisson.cpp doprob.cpp dorang.cpp dorepcnt.cpp dorg.cpp doseed.cpp \
	doseq.cpp dosque.cpp dosstak.cpp dostart.cpp dosubs.cpp dosvar.cpp doterm.cpp \
	findref.cpp fixsvst.cpp forcit.cpp freeearr.cpp freeparr.cpp gencomb1.cpp \
	genperm1.cpp kn1.cpp kn2.cpp kn3.cpp main.cpp mkadv.cpp mkbigc.cpp mkbigs.cpp \
	mkcadv.cpp mkclist.cpp mkclst.cpp mkearr.cpp mkelst.cpp mkfadv.cpp mkgetstr.cpp \
	mkgtst.cpp mkhdrs.cpp mkinterp.cpp mkinterp2.cpp mkmain.cpp mkpadv.cpp mkparr.cpp \
	mkprsvar.cpp mkptst.cpp mkradv.cpp mkrdsvar.cpp mksinit.cpp mkslst.cpp mkstarls.cpp \
	mkstarr.cpp mkstruct.cpp mksvcp.cpp mksvfr.cpp mksvrs.cpp mksvsv.cpp mkvinit.cpp \
	pt.cpp ptree.cpp readsstar.cpp readstar.cpp saveall.cpp saveindv.cpp checkname.cpp \
	savename.cpp savestar.cpp savestnm.cpp savid.cpp savvar.cpp sigcln.cpp sr0.cpp \
	sr1.cpp sr2.cpp starfree.cpp strtinit.cpp undivert.cpp \
	xfree.cpp xstack.cpp yyerror.cpp dohead.cpp dobin.cpp dodouble.cpp \
	dofloat.cpp dobinfld.cpp doirque.cpp mkqinit.cpp estack.cpp doexp.cpp genexp.cpp \
	mkitos.cpp dosorter.cpp doksorter.cpp dokeyed.cpp savkey.cpp doukeyed.cpp \
	doreadfile.cpp doFileParser.cpp doureadfile.cpp dowreadfile.cpp doWFileParser.cpp \
	dowureadfile.cpp dosreadfile.cpp doenumerate.cpp doremove.cpp dobarrier.cpp \
	dorestart.cpp doClearChain.cpp docvar.cpp doobject.cpp doObjectEnd.cpp \
	StartList.cpp dolist.cpp dodlist.cpp dolongdouble.cpp doubin.cpp InitCvar.cpp \
	StartGraph.cpp dograph.cpp docgraph.cpp dotree.cpp dobipartite.cpp dodag.cpp \
	AddDim.cpp AddDim2.cpp doline.cpp itox.cpp genname.cpp StartBinTree.cpp \
	dobintree.cpp doSearchTree.cpp doRBTree.cpp doDatabase.cpp doDBTable.cpp \
	doDBQuery.cpp doDBField.cpp DBStart.cpp mkisnum.cpp doIterator.cpp doWhile.cpp doArgument.cpp \
	AddMap.cpp doSection.cpp doSmap.cpp fixSectionMap.cpp dozrang.cpp zr1.cpp \
	dozctr.cpp doIPart.cpp dopartition.cpp dofib.cpp dosubset.cpp articulate.cpp \
	PowerLaw.cpp PowerLawDir.cpp dogeometric.cpp ICDF.cpp DCDF.cpp ICDFX.cpp NewSearchID.cpp \
	MakeBinomialPMF.cpp MakeBinomialPMFD.cpp MakeHyperPMF.cpp MakePowerLawPMF.cpp \
	mkCDFNode.cpp mkCDFNodeD.cpp mkCDFNodeX.cpp dobinomial.cpp dohypergeom.cpp \
	doPLDist.cpp dobeta.cpp donegbinom.cpp dogamma.cpp doexpvariate.cpp dozigexp.cpp \
	donorvariate.cpp dozignor.cpp rngcode.cpp rngdata.cpp rngdefines.cpp rngproto.cpp \
	dorng.cpp mksilst.cpp isnumeric.cpp dowsreadfile.cpp domseq.cpp dorandom.cpp \
	docompare.cpp dochoice.cpp dominmax.cpp doindirect.cpp doinitializer.cpp \
	doterminator.cpp doginitializer.cpp doforce.cpp mkCommandParser.cpp mkCpDefines.cpp \
	dononterminal.cpp doconnective.cpp dosubstring.cpp domatch.cpp doformat.cpp \
	dofrang.cpp dofexp.cpp fsr0.cpp fsr1.cpp fsr2.cpp fgenexp.cpp stackname.cpp \
	dofctr.cpp dooutfile.cpp doinfile.cpp dodocument.cpp doicvar.cpp InitICvar.cpp \
	doDegreeDist.cpp GenPQSort.cpp doBPDegreeDist.cpp doBPPowerLaw.cpp doDSTCreator.cpp \
	MakeStaticDST.cpp doMatrix.cpp doisorter.cpp dofsorter.cpp dorepcount.cpp dogetlength.cpp \
	mkMakeGraphical.cpp doDoAll.cpp doFor.cpp

CFILES2=decytok.cpp dglparse.cpp dglscan.cpp whatis.cpp whatrng.cpp 

OFILES= main.o addstr.o decytok.o dglgbls.o dglparse.o dglscan.o divE.o \
	divS.o divert.o dochain.o docomb.o doctr.o dodefs.o doesc.o \
	doextern.o dofile.o doflag.o dohash.o doinit.o doique.o \
	doistak.o doivar.o dolimdup.o domacro.o donodup.o donormal.o \
	doopt.o dopermute.o dopoisson.o doprob.o dorang.o dorepcnt.o \
	dorg.o doseed.o doseq.o dosque.o dosstak.o dostart.o dosubs.o \
	dosvar.o doterm.o findref.o fixsvst.o forcit.o freeearr.o \
	freeparr.o gencomb1.o genperm1.o kn1.o kn2.o kn3.o  \
	mkadv.o mkbigc.o mkbigs.o mkcadv.o mkclist.o mkclst.o \
	mkearr.o mkelst.o mkfadv.o mkgetstr.o mkgtst.o mkhdrs.o \
	mkinterp.o mkinterp2.o mkmain.o mkpadv.o mkparr.o mkprsvar.o \
	mkptst.o mkradv.o mkrdsvar.o mksinit.o mkslst.o mkstarls.o \
	mkstarr.o mkstruct.o mksvcp.o mksvfr.o mksvrs.o mksvsv.o \
	mkvinit.o pt.o ptree.o readsstar.o readstar.o saveall.o \
	saveindv.o savename.o savestar.o savestnm.o checkname.o \
	savid.o savvar.o sigcln.o sr0.o sr1.o sr2.o \
	starfree.o strtinit.o undivert.o whatis.o xfree.o xstack.o \
	yyerror.o dohead.o dobin.o dodouble.o \
	dofloat.o dobinfld.o doirque.o mkqinit.o estack.o doexp.o genexp.o \
	mkitos.o dosorter.o doksorter.o dokeyed.o savkey.o doukeyed.o \
	doreadfile.o doFileParser.o doureadfile.o dowreadfile.o doWFileParser.o \
	dowureadfile.o dosreadfile.o doenumerate.o doremove.o dobarrier.o \
	dorestart.o doClearChain.o docvar.o doobject.o doObjectEnd.o \
	StartList.o dolist.o dodlist.o dolongdouble.o doubin.o InitCvar.o \
	StartGraph.o dograph.o docgraph.o dotree.o dobipartite.o dodag.o \
	AddDim.o AddDim2.o doline.o itox.o genname.o StartBinTree.o \
	dobintree.o doSearchTree.o doRBTree.o doDatabase.o doDBTable.o \
	doDBQuery.o doDBField.o DBStart.o mkisnum.o doIterator.o doWhile.o doArgument.o \
	AddMap.o doSection.o doSmap.o fixSectionMap.o dozrang.o zr1.o \
	dozctr.o doIPart.o dopartition.o dofib.o dosubset.o articulate.o \
	PowerLaw.o PowerLawDir.o dogeometric.o ICDF.o DCDF.o ICDFX.o NewSearchID.o \
	MakeBinomialPMF.o MakeBinomialPMFD.o MakeHyperPMF.o MakePowerLawPMF.o \
	mkCDFNode.o mkCDFNodeD.o mkCDFNodeX.o dobinomial.o dohypergeom.o \
	doPLDist.o dobeta.o donegbinom.o dogamma.o doexpvariate.o dozigexp.o \
	donorvariate.o dozignor.o whatrng.o rngcode.o rngdata.o rngdefines.o rngproto.o  \
	dorng.o mksilst.o isnumeric.o dowsreadfile.o domseq.o dorandom.o \
	docompare.o dochoice.o dominmax.o doindirect.o doinitializer.o \
	doterminator.o doginitializer.o doforce.o mkCpDefines.o \
	dononterminal.o doconnective.o dosubstring.o domatch.o doformat.o \
	dofrang.o dofexp.o fsr0.o fsr1.o fsr2.o fgenexp.o stackname.o \
	dofctr.o dooutfile.o doinfile.o dodocument.o doicvar.o InitICvar.o \
	doDegreeDist.o GenPQSort.o doBPDegreeDist.o doBPPowerLaw.o doDSTCreator.o \
	MakeStaticDST.o doMatrix.o doisorter.o dofsorter.o dorepcount.o dogetlength.o \
	mkMakeGraphical.o doDoAll.o doFor.cpp

dgl: $(OFILES) mkCommandParser.o
	g++ $(CFLAGS) -o dgl $(OFILES) mkCommandParser.o -lm

# Debugging tool. Make as needed.
tokenstream: tokenstream.o decytok.o dglscan.o dglgbls.o whatis.o yyerror.o
	cc tokenstream.o decytok.o dglscan.o dglgbls.o whatis.o yyerror.o -o tokenstream

# Debugging tool. Make as needed.
etokenstream: etokenstream.o decytok.o dglscan.o dglgbls.o whatis.o yyerror.o
	cc etokenstream.o decytok.o dglscan.o dglgbls.o whatis.o yyerror.o -o etokenstream

$(OFILES): dglgbls.h dgltok.h

mkCommandParser.o: mkCommandParser.cpp dglgbls.h dgltok.h whatcmd.h

whatcmd.h: frame whatcmd.cpp
	frame <whatcmd.cpp >whatcmd.h

.c.o:
	cc -c $(CFLAGS) $*.c

.cpp.o:
	g++ -c $(CFLAGS) $*.cpp

dglparse.cpp dgltok.h: dgl.yacc
	bison -d dgl.yacc
	mv dgl.tab.cacc dglparse.cpp
	mv dgl.tab.hacc dgltok.h

dglscan.cpp: dgl.lex
	flex -l dgl.lex
	mv lex.yy.c dglscan.cpp

# Debugging tool
# A "reverse" whatis.c
decytok.cpp: dgltok.h tokdec
	tokdec dgltok.h decytok >decytok.cpp

# tool for creating Debugging tools
tokdec: tokdec.cpp
	g++ $(CFLAGS) tokdec.cpp -o tokdec

# whatis.cpp is a fast keyword decoder to avoid LEX clutter (faster than native LEX)
whatis.cpp: mkwhat mkulwhat whatis.data
	mkulwhat STRING dgltok.h whatis <whatis.data >whatis.cpp

# whatrng.cpp is a fast RNG ID decoder to avoid LEX clutter (faster than native LEX)
whatrng.cpp: mkwhat mkulwhat whatrng.data
	mkulwhat -x badrng dglgbls.h whatrng <whatrng.data >whatrng.cpp

# whatcmd.cpp is a fast command-name decoder
whatcmd.cpp: mkwhat mkulwhat whatcmd.data
	mkulwhat CmdOther dglgbls.h whatcmd <whatcmd.data >whatcmd.cpp

# Makes case-sensitive fast keyword decoders from the .h output of yacc
mkwhat: mkwhat.cpp
	g++ $(CFLAGS) mkwhat.cpp -o mkwhat

# Makes case-INsensitive fast keyword decoders from the .h output of yacc
mkulwhat: mkulwhat.cpp
	g++ $(CFLAGS) mkulwhat.cpp -o mkulwhat

frame: frame.cpp
	g++ $(CFLAGS) frame.cpp -o frame

# erase all extraneous files created during "make"
clean:
	rm -f $(OFILES)
	rm -f dglparse.cpp dgltok.h dglscan.cpp tokdec decytok.cpp mkwhat mkulwhat whatis.cpp

#blythely assuming we know where the correct bin directory is.
install: dgl
	strip dgl
	mv dgl ../bin

# is this really of any value? Make as needed
lib: $(OFILES)
	ar rcs libdgl.a $(OFILES)
	mv libdgl.a ../lib

# code size for bragging rights
bulk:
	wc -l $(CFILES1) dglgbls.h dgl.lex dgl.yacc mkwhat.cpp mkulwhat.cpp tokdec.cpp frame.cpp

#do these actually work?
.dgl:
	dgl <$*.dgl >$*.cpp
	g++ $(CFLAGS) $*.cpp -o $*
.dgl.cpp:
	dgl <$*.dgl >$*.cpp

.SUFFIXES: .dgl
