From 303baf27cf34c2a57db97c4c567fd744241fa14b Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Wed, 2 Jul 2008 08:01:00 -0700 Subject: [PATCH] Version abc80702 --- Makefile | 11 +- abc.dsp | 96 +- abc.rc | 5 +- src/aig/aig/aig.h | 2 +- src/aig/aig/aigInter.c | 4 +- src/aig/aig/aigObj.c | 3 +- src/aig/aig/aigOper.c | 2 +- src/aig/aig/aigPart.c | 4 - src/aig/aig/aigPartReg.c | 4 +- src/aig/aig/aigRepr.c | 19 +- src/aig/aig/aigShow.c | 2 +- src/aig/aig/aigUtil.c | 26 +- src/aig/bbr/bbrImage.c | 2 +- src/aig/bbr/bbrNtbdd.c | 1 - src/aig/bbr/bbrReach.c | 8 +- src/aig/bdc/bdcDec.c | 19 +- src/aig/csw/cswCut.c | 2 +- src/aig/dar/darCore.c | 2 +- src/aig/fra/fraClau.c | 1 - src/aig/fra/fraClaus.c | 4 +- src/aig/fra/fraInd.c | 3 +- src/aig/fra/fraPart.c | 4 +- src/aig/hop/hop.h | 12 +- src/aig/hop/hopDfs.c | 8 +- src/aig/hop/hopMem.c | 2 +- src/aig/hop/hopOper.c | 2 +- src/aig/hop/hopUtil.c | 28 +- src/aig/ioa/ioaWriteAig.c | 6 +- src/aig/ivy/ivyBalance.c | 2 +- src/aig/ivy/ivyCanon.c | 2 +- src/aig/ivy/ivyCut.c | 3 +- src/aig/ivy/ivyDfs.c | 2 +- src/aig/ivy/ivyFastMap.c | 40 +- src/aig/ivy/ivyFraig.c | 13 +- src/aig/ivy/ivyMem.c | 2 +- src/aig/ivy/ivyMulti.c | 12 +- src/aig/ivy/ivyRwr.c | 20 +- src/aig/ivy/ivySeq.c | 21 +- src/aig/ivy/ivyShow.c | 2 +- src/aig/kit/cloud.h | 4 +- src/aig/kit/kitBdd.c | 2 +- src/aig/kit/kitCloud.c | 8 +- src/aig/kit/kitDsd.c | 18 +- src/aig/kit/kitSop.c | 4 +- src/aig/mfx/mfxCore.c | 1 - src/aig/ntl/ntlCheck.c | 2 +- src/aig/ntl/ntlExtract.c | 46 +- src/aig/ntl/ntlObj.c | 2 +- src/aig/ntl/ntlReadBlif.c | 24 +- src/aig/ntl/ntlTime.c | 29 +- src/aig/ntl/ntlWriteBlif.c | 4 +- src/aig/nwk/nwkFanio.c | 2 +- src/aig/nwk/nwkFlow.c | 2 +- src/aig/nwk/nwkMan.c | 10 +- src/aig/nwk/nwkSpeedup.c | 4 +- src/aig/nwk/nwkTiming.c | 14 +- src/aig/nwk/nwkUtil.c | 12 +- src/aig/rwt/rwtDec.c | 2 +- src/aig/saig/saigInter.c | 9 +- src/aig/saig/saigRetMin.c | 15 +- src/aig/saig/saigScl.c | 2 +- src/aig/saig/saigTrans.c | 2 +- src/base/abc/abc.h | 4 +- src/base/abc/abcBlifMv.c | 2 +- src/base/abc/abcCheck.c | 12 +- src/base/abc/abcDfs.c | 23 +- src/base/abc/abcFanio.c | 8 +- src/base/abc/abcLatch.c | 6 +- src/base/abc/abcNtk.c | 2 +- src/base/abc/abcObj.c | 2 +- src/base/abc/abcShow.c | 3 + src/base/abc/abcSop.c | 2 +- src/base/abc/abcUtil.c | 6 +- src/base/abci/abc.c | 27 +- src/base/abci/abcAbc8.c | 1 - src/base/abci/abcBalance.c | 1 - src/base/abci/abcBmc.c | 4 +- src/base/abci/abcCut.c | 6 +- src/base/abci/abcDar.c | 5 +- src/base/abci/abcDelay.c | 4 +- src/base/abci/abcDsd.c | 17 +- src/base/abci/abcFpga.c | 4 +- src/base/abci/abcFraig.c | 17 +- src/base/abci/abcIf.c | 12 +- src/base/abci/abcIvy.c | 5 +- src/base/abci/abcLut.c | 12 +- src/base/abci/abcMap.c | 2 +- src/base/abci/abcNtbdd.c | 2 +- src/base/abci/abcOdc.c | 14 +- src/base/abci/abcPart.c | 14 +- src/base/abci/abcPrint.c | 24 +- src/base/abci/abcProve.c | 2 +- src/base/abci/abcReach.c | 7 +- src/base/abci/abcRec.c | 15 +- src/base/abci/abcReconv.c | 7 +- src/base/abci/abcRefactor.c | 2 +- src/base/abci/abcRestruct.c | 20 +- src/base/abci/abcResub.c | 28 +- src/base/abci/abcRewrite.c | 4 +- src/base/abci/abcRr.c | 30 +- src/base/abci/abcSat.c | 72 +- src/base/abci/abcStrash.c | 6 +- src/base/abci/abcSweep.c | 12 +- src/base/abci/abcVerify.c | 20 +- src/base/abci/abcXsim.c | 6 +- src/base/cmd/cmd.c | 4 +- src/base/io/io.c | 81 +- src/base/io/ioReadAiger.c | 53 +- src/base/io/ioReadBaf.c | 6 +- src/base/io/ioReadBench.c | 2 +- src/base/io/ioReadBlif.c | 58 +- src/base/io/ioReadBlifAig.c | 8 +- src/base/io/ioReadBlifMv.c | 17 +- src/base/io/ioReadEdif.c | 2 +- src/base/io/ioReadEqn.c | 2 +- src/base/io/ioReadPla.c | 8 +- src/base/io/ioUtil.c | 4 +- src/base/io/ioWriteAiger.c | 148 ++- src/base/io/ioWriteBaf.c | 14 +- src/base/io/ioWriteBlif.c | 4 +- src/base/io/ioWriteBlifMv.c | 2 +- src/base/io/ioWriteDot.c | 4 +- src/base/io/ioWriteEqn.c | 2 +- src/base/io/ioWritePla.c | 12 +- src/base/io/ioWriteVerilog.c | 2 +- src/base/main/mainUtils.c | 12 +- src/base/ver/verCore.c | 25 +- src/base/ver/verFormula.c | 10 +- src/bdd/cas/casCore.c | 22 +- src/bdd/cudd/cuddAddIte.c | 2 +- src/bdd/cudd/cuddAddWalsh.c | 3 +- src/bdd/cudd/cuddBddIte.c | 2 +- src/bdd/cudd/cuddDecomp.c | 3 +- src/bdd/cudd/cuddGroup.c | 4 +- src/bdd/cudd/cuddHarwell.c | 2 +- src/bdd/cudd/cuddLinear.c | 2 +- src/bdd/cudd/cuddPriority.c | 3 +- src/bdd/cudd/cuddReorder.c | 4 +- src/bdd/cudd/cuddSubsetSP.c | 6 +- src/bdd/cudd/cuddSymmetry.c | 6 +- src/bdd/cudd/cuddTable.c | 6 +- src/bdd/cudd/cuddUtil.c | 3 +- src/bdd/cudd/cuddZddGroup.c | 2 +- src/bdd/cudd/cuddZddReord.c | 5 +- src/bdd/cudd/cuddZddSymm.c | 4 +- src/bdd/dsd/dsdCheck.c | 4 +- src/bdd/dsd/dsdProc.c | 59 +- src/bdd/dsd/dsdTree.c | 6 - src/bdd/parse/parseCore.c | 3 +- src/bdd/reo/reoSwap.c | 122 +-- src/bdd/reo/reoTransfer.c | 10 +- src/bdd/reo/reoUnits.c | 2 +- src/map/fpga/fpga.c | 2 +- src/map/fpga/fpgaCreate.c | 6 +- src/map/fpga/fpgaCut.c | 16 +- src/map/fpga/fpgaCutUtils.c | 15 +- src/map/fpga/fpgaInt.h | 24 +- src/map/fpga/fpgaLib.c | 4 +- src/map/fpga/fpgaMatch.c | 10 +- src/map/fpga/fpgaTime.c | 4 +- src/map/fpga/fpgaTruth.c | 8 +- src/map/fpga/fpgaUtils.c | 7 +- src/map/fpga/fpgaVec.c | 4 +- src/map/if/if.h | 2 +- src/map/if/ifLib.c | 4 +- src/map/if/ifMan.c | 2 +- src/map/mapper/mapper.c | 2 +- src/map/mapper/mapperCanon.c | 5 +- src/map/mapper/mapperCreate.c | 2 +- src/map/mapper/mapperCut.c | 16 +- src/map/mapper/mapperCutUtils.c | 3 +- src/map/mapper/mapperLib.c | 5 + src/map/mapper/mapperMatch.c | 3 +- src/map/mapper/mapperSuper.c | 5 +- src/map/mapper/mapperTable.c | 2 +- src/map/mapper/mapperTree.c | 2 +- src/map/mapper/mapperTruth.c | 2 +- src/map/mapper/mapperUtils.c | 1 - src/map/mio/mio.c | 6 + src/map/mio/mioRead.c | 5 +- src/map/super/superAnd.c | 16 +- src/map/super/superGate.c | 7 +- src/misc/bzlib/bzlib.h | 3 +- src/misc/bzlib/manual.pdf | Bin 288134 -> 0 bytes src/misc/espresso/cofactor.c | 6 +- src/misc/espresso/contain.c | 8 +- src/misc/espresso/cvrin.c | 3 +- src/misc/espresso/cvrm.c | 2 +- src/misc/espresso/cvrout.c | 8 +- src/misc/espresso/equiv.c | 2 +- src/misc/espresso/espresso.h | 48 +- src/misc/espresso/expand.c | 12 +- src/misc/espresso/gimpel.c | 5 +- src/misc/espresso/globals.c | 42 +- src/misc/espresso/hack.c | 14 +- src/misc/espresso/irred.c | 4 +- src/misc/espresso/map.c | 34 +- src/misc/espresso/opo.c | 2 +- src/misc/espresso/pair.c | 25 +- src/misc/espresso/set.c | 2 +- src/misc/espresso/setc.c | 22 +- src/misc/espresso/verify.c | 2 +- src/misc/extra/extra.h | 14 +- src/misc/extra/extraBddAuto.c | 18 +- src/misc/extra/extraBddImage.c | 2 +- src/misc/extra/extraBddKmap.c | 20 + src/misc/extra/extraBddMisc.c | 2 +- src/misc/extra/extraBddSymm.c | 14 +- src/misc/extra/extraBddUnate.c | 4 +- src/misc/extra/extraUtilCanon.c | 15 +- src/misc/extra/extraUtilMemory.c | 2 +- src/misc/extra/extraUtilMisc.c | 12 +- src/misc/extra/extraUtilReader.c | 4 +- src/misc/mvc/mvcDivide.c | 3 +- src/misc/nm/nmApi.c | 8 +- src/misc/nm/nmTable.c | 3 +- src/misc/util/port_type.h | 18 + src/misc/vec/vecAtt.h | 133 +-- src/misc/vec/vecFlt.h | 4 +- src/misc/vec/vecInt.h | 6 +- src/misc/vec/vecPtr.h | 4 +- src/misc/vec/vecStr.h | 4 +- src/misc/vec/vecVec.h | 4 +- src/misc/zlib/1.c | 35 + src/misc/zlib/README | 125 +++ src/misc/zlib/adler32.c | 149 +++ src/misc/zlib/algorithm.txt | 209 ++++ src/misc/zlib/compress_.c | 79 ++ src/misc/zlib/crc32.c | 423 ++++++++ src/misc/zlib/crc32.h | 441 ++++++++ src/misc/zlib/deflate.c | 1736 ++++++++++++++++++++++++++++++ src/misc/zlib/deflate.h | 331 ++++++ src/misc/zlib/gzio.c | 1026 ++++++++++++++++++ src/misc/zlib/infback.c | 623 +++++++++++ src/misc/zlib/inffast.c | 318 ++++++ src/misc/zlib/inffast.h | 11 + src/misc/zlib/inffixed.h | 94 ++ src/misc/zlib/inflate.c | 1368 +++++++++++++++++++++++ src/misc/zlib/inflate.h | 115 ++ src/misc/zlib/inftrees.c | 329 ++++++ src/misc/zlib/inftrees.h | 55 + src/misc/zlib/link.txt | 1 + src/misc/zlib/module.make | 12 + src/misc/zlib/trees.c | 1219 +++++++++++++++++++++ src/misc/zlib/trees.h | 128 +++ src/misc/zlib/uncompr.c | 61 ++ src/misc/zlib/zconf.h | 332 ++++++ src/misc/zlib/zlib.h | 1357 +++++++++++++++++++++++ src/misc/zlib/zutil.c | 318 ++++++ src/misc/zlib/zutil.h | 269 +++++ src/opt/cut/cutMan.c | 11 - src/opt/cut/cutNode.c | 8 +- src/opt/cut/cutOracle.c | 6 +- src/opt/cut/cutPre22.c | 74 +- src/opt/cut/cutTruth.c | 7 +- src/opt/dec/decAbc.c | 8 +- src/opt/dec/decFactor.c | 1 - src/opt/dec/decMan.c | 2 +- src/opt/dec/decUtil.c | 13 +- src/opt/fret/fretInit.c | 4 +- src/opt/fret/fretMain.c | 2 +- src/opt/fxu/fxu.c | 10 +- src/opt/fxu/fxuCreate.c | 8 +- src/opt/fxu/fxuInt.h | 2 +- src/opt/fxu/fxuPair.c | 2 +- src/opt/fxu/fxuReduce.c | 8 +- src/opt/fxu/fxuSingle.c | 8 +- src/opt/lpk/lpkAbcDec.c | 1 - src/opt/lpk/lpkAbcDsd.c | 6 +- src/opt/lpk/lpkCore.c | 8 +- src/opt/lpk/lpkCut.c | 31 +- src/opt/lpk/lpkMap.c | 2 +- src/opt/lpk/lpkMulti.c | 25 +- src/opt/mfs/mfsCore.c | 2 +- src/opt/mfs/mfsStrash.c | 8 +- src/opt/res/resSat.c | 59 +- src/opt/ret/retArea.c | 17 +- src/opt/ret/retDelay.c | 6 +- src/opt/ret/retFlow.c | 3 +- src/opt/ret/retIncrem.c | 15 +- src/opt/ret/retInit.c | 28 +- src/opt/ret/retLvalue.c | 4 +- src/opt/rwr/rwrDec.c | 2 +- src/opt/rwr/rwrEva.c | 14 +- src/opt/rwr/rwrExp.c | 12 +- src/opt/sim/simMan.c | 2 +- src/opt/sim/simSupp.c | 8 +- src/opt/sim/simUtils.c | 4 +- src/sat/csat/csat_apis.c | 6 +- src/sat/fraig/fraigFeed.c | 1 - src/sat/fraig/fraigInt.h | 2 +- src/sat/fraig/fraigMan.c | 9 +- src/sat/msat/msatRead.c | 4 +- src/sat/msat/msatSolverCore.c | 2 - src/sat/msat/msatVec.c | 4 +- 295 files changed, 12850 insertions(+), 1357 deletions(-) delete mode 100644 src/misc/bzlib/manual.pdf create mode 100644 src/misc/zlib/1.c create mode 100644 src/misc/zlib/README create mode 100644 src/misc/zlib/adler32.c create mode 100644 src/misc/zlib/algorithm.txt create mode 100644 src/misc/zlib/compress_.c create mode 100644 src/misc/zlib/crc32.c create mode 100644 src/misc/zlib/crc32.h create mode 100644 src/misc/zlib/deflate.c create mode 100644 src/misc/zlib/deflate.h create mode 100644 src/misc/zlib/gzio.c create mode 100644 src/misc/zlib/infback.c create mode 100644 src/misc/zlib/inffast.c create mode 100644 src/misc/zlib/inffast.h create mode 100644 src/misc/zlib/inffixed.h create mode 100644 src/misc/zlib/inflate.c create mode 100644 src/misc/zlib/inflate.h create mode 100644 src/misc/zlib/inftrees.c create mode 100644 src/misc/zlib/inftrees.h create mode 100644 src/misc/zlib/link.txt create mode 100644 src/misc/zlib/module.make create mode 100644 src/misc/zlib/trees.c create mode 100644 src/misc/zlib/trees.h create mode 100644 src/misc/zlib/uncompr.c create mode 100644 src/misc/zlib/zconf.h create mode 100644 src/misc/zlib/zlib.h create mode 100644 src/misc/zlib/zutil.c create mode 100644 src/misc/zlib/zutil.h diff --git a/Makefile b/Makefile index 788293547..e550f4dcf 100644 --- a/Makefile +++ b/Makefile @@ -6,21 +6,24 @@ CP := cp PROG := abc -MODULES := src/base/abc src/base/abci src/base/cmd \ +MODULES := \ + src/base/abc src/base/abci src/base/cmd \ src/base/io src/base/main src/base/ver \ src/bdd/cudd src/bdd/dsd src/bdd/epd src/bdd/mtr \ src/bdd/parse src/bdd/reo src/bdd/cas \ - src/map/fpga src/map/mapper src/map/mio src/map/super src/map/if \ + src/map/fpga src/map/mapper src/map/mio src/map/super \ + src/map/if \ src/misc/extra src/misc/mvc src/misc/st src/misc/util \ src/misc/espresso src/misc/nm src/misc/vec src/misc/hash \ + src/misc/bzlib src/misc/zlib \ src/opt/cut src/opt/dec src/opt/fxu src/opt/rwr src/opt/mfs \ src/opt/sim src/opt/ret src/opt/res src/opt/lpk src/opt/fret \ src/sat/bsat src/sat/csat src/sat/msat src/sat/fraig \ src/aig/ivy src/aig/hop src/aig/rwt src/aig/deco \ src/aig/mem src/aig/dar src/aig/fra src/aig/cnf \ src/aig/csw src/aig/ioa src/aig/aig src/aig/kit \ - src/aig/bdc src/aig/bar src/aig/ntl src/aig/nwk src/aig/mfx \ - src/aig/tim src/aig/saig src/aig/bbr src/misc/bzlib + src/aig/bdc src/aig/bar src/aig/ntl src/aig/nwk \ + src/aig/mfx src/aig/tim src/aig/saig src/aig/bbr default: $(PROG) diff --git a/abc.dsp b/abc.dsp index 78cc76508..5ed8166f3 100644 --- a/abc.dsp +++ b/abc.dsp @@ -42,7 +42,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /I "src/base/abc" /I "src/base/abci" /I "src/base/cmd" /I "src/base/io" /I "src/base/main" /I "src/base/ver" /I "src/bdd/cudd" /I "src/bdd/dsd" /I "src/bdd/epd" /I "src/bdd/mtr" /I "src/bdd/parse" /I "src/bdd/reo" /I "src/bdd/cas" /I "src/map/fpga" /I "src/map/mapper" /I "src/map/mio" /I "src/map/super" /I "src/map/if" /I "src/map/pcm" /I "src/map/ply" /I "src/misc/extra" /I "src/misc/mvc" /I "src/misc/st" /I "src/misc/util" /I "src/misc/espresso" /I "src/misc/nm" /I "src/misc/vec" /I "src/misc/hash" /I "src/misc/bzlib" /I "src/opt/cut" /I "src/opt/dec" /I "src/opt/fxu" /I "src/opt/rwr" /I "src/opt/sim" /I "src/opt/ret" /I "src/opt/res" /I "src/opt/lpk" /I "src/sat/bsat" /I "src/sat/csat" /I "src/sat/msat" /I "src/sat/fraig" /I "src/aig/ivy" /I "src/aig/hop" /I "src/aig/rwt" /I "src/aig/deco" /I "src/aig/mem" /I "src/aig/dar" /I "src/aig/fra" /I "src/aig/cnf" /I "src/aig/csw" /I "src/aig/ioa" /I "src/aig/aig" /I "src/aig/kit" /I "src/aig/bdc" /I "src/aig/bar" /I "src/aig/ntl" /I "src/aig/nwk" /I "src/aig/tim" /I "src/opt/mfs" /I "src/aig/mfx" /I "src/aig/saig" /I "src/aig/bbr" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "__STDC__" /D ABC_DLL=DLLEXPORT /FR /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /I "src/base/abc" /I "src/base/abci" /I "src/base/cmd" /I "src/base/io" /I "src/base/main" /I "src/base/ver" /I "src/bdd/cudd" /I "src/bdd/dsd" /I "src/bdd/epd" /I "src/bdd/mtr" /I "src/bdd/parse" /I "src/bdd/reo" /I "src/bdd/cas" /I "src/map/fpga" /I "src/map/mapper" /I "src/map/mio" /I "src/map/super" /I "src/map/if" /I "src/map/pcm" /I "src/map/ply" /I "src/misc/extra" /I "src/misc/mvc" /I "src/misc/st" /I "src/misc/util" /I "src/misc/espresso" /I "src/misc/nm" /I "src/misc/vec" /I "src/misc/hash" /I "src/misc/bzlib" /I "src/misc/zlib" /I "src/opt/cut" /I "src/opt/dec" /I "src/opt/fxu" /I "src/opt/rwr" /I "src/opt/sim" /I "src/opt/ret" /I "src/opt/res" /I "src/opt/lpk" /I "src/sat/bsat" /I "src/sat/csat" /I "src/sat/msat" /I "src/sat/fraig" /I "src/aig/ivy" /I "src/aig/hop" /I "src/aig/rwt" /I "src/aig/deco" /I "src/aig/mem" /I "src/aig/dar" /I "src/aig/fra" /I "src/aig/cnf" /I "src/aig/csw" /I "src/aig/ioa" /I "src/aig/aig" /I "src/aig/kit" /I "src/aig/bdc" /I "src/aig/bar" /I "src/aig/ntl" /I "src/aig/nwk" /I "src/aig/tim" /I "src/opt/mfs" /I "src/aig/mfx" /I "src/aig/saig" /I "src/aig/bbr" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "__STDC__" /D ABC_DLL=DLLEXPORT /FR /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -66,7 +66,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "src/base/abc" /I "src/base/abci" /I "src/base/cmd" /I "src/base/io" /I "src/base/main" /I "src/base/ver" /I "src/bdd/cudd" /I "src/bdd/dsd" /I "src/bdd/epd" /I "src/bdd/mtr" /I "src/bdd/parse" /I "src/bdd/reo" /I "src/bdd/cas" /I "src/map/fpga" /I "src/map/mapper" /I "src/map/mio" /I "src/map/super" /I "src/map/if" /I "src/map/pcm" /I "src/map/ply" /I "src/misc/extra" /I "src/misc/mvc" /I "src/misc/st" /I "src/misc/util" /I "src/misc/espresso" /I "src/misc/nm" /I "src/misc/vec" /I "src/misc/hash" /I "src/misc/bzlib" /I "src/opt/cut" /I "src/opt/dec" /I "src/opt/fxu" /I "src/opt/rwr" /I "src/opt/sim" /I "src/opt/ret" /I "src/opt/res" /I "src/opt/lpk" /I "src/sat/bsat" /I "src/sat/csat" /I "src/sat/msat" /I "src/sat/fraig" /I "src/aig/ivy" /I "src/aig/hop" /I "src/aig/rwt" /I "src/aig/deco" /I "src/aig/mem" /I "src/aig/dar" /I "src/aig/fra" /I "src/aig/cnf" /I "src/aig/csw" /I "src/aig/ioa" /I "src/aig/aig" /I "src/aig/kit" /I "src/aig/bdc" /I "src/aig/bar" /I "src/aig/ntl" /I "src/aig/nwk" /I "src/aig/tim" /I "src/opt/mfs" /I "src/aig/mfx" /I "src/aig/saig" /I "src/aig/bbr" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "__STDC__" /D ABC_DLL=DLLEXPORT /FR /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "src/base/abc" /I "src/base/abci" /I "src/base/cmd" /I "src/base/io" /I "src/base/main" /I "src/base/ver" /I "src/bdd/cudd" /I "src/bdd/dsd" /I "src/bdd/epd" /I "src/bdd/mtr" /I "src/bdd/parse" /I "src/bdd/reo" /I "src/bdd/cas" /I "src/map/fpga" /I "src/map/mapper" /I "src/map/mio" /I "src/map/super" /I "src/map/if" /I "src/map/pcm" /I "src/map/ply" /I "src/misc/extra" /I "src/misc/mvc" /I "src/misc/st" /I "src/misc/util" /I "src/misc/espresso" /I "src/misc/nm" /I "src/misc/vec" /I "src/misc/hash" /I "src/misc/bzlib" /I "src/misc/zlib" /I "src/opt/cut" /I "src/opt/dec" /I "src/opt/fxu" /I "src/opt/rwr" /I "src/opt/sim" /I "src/opt/ret" /I "src/opt/res" /I "src/opt/lpk" /I "src/sat/bsat" /I "src/sat/csat" /I "src/sat/msat" /I "src/sat/fraig" /I "src/aig/ivy" /I "src/aig/hop" /I "src/aig/rwt" /I "src/aig/deco" /I "src/aig/mem" /I "src/aig/dar" /I "src/aig/fra" /I "src/aig/cnf" /I "src/aig/csw" /I "src/aig/ioa" /I "src/aig/aig" /I "src/aig/kit" /I "src/aig/bdc" /I "src/aig/bar" /I "src/aig/ntl" /I "src/aig/nwk" /I "src/aig/tim" /I "src/opt/mfs" /I "src/aig/mfx" /I "src/aig/saig" /I "src/aig/bbr" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "__STDC__" /D ABC_DLL=DLLEXPORT /FR /YX /FD /GZ /c # SUBTRACT CPP /X # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" @@ -2489,6 +2489,98 @@ SOURCE=.\src\misc\bzlib\huffman.c SOURCE=.\src\misc\bzlib\randtable.c # End Source File # End Group +# Begin Group "zlib" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\src\misc\zlib\adler32.c +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\compress_.c +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\crc32.c +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\crc32.h +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\deflate.c +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\deflate.h +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\gzio.c +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\infback.c +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\inffast.c +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\inffast.h +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\inffixed.h +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\inflate.c +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\inflate.h +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\inftrees.c +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\inftrees.h +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\trees.c +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\trees.h +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\uncompr.c +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\zconf.h +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\zlib.h +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\zutil.c +# End Source File +# Begin Source File + +SOURCE=.\src\misc\zlib\zutil.h +# End Source File +# End Group # End Group # Begin Group "ai" diff --git a/abc.rc b/abc.rc index 7ca0e2771..526a08de5 100644 --- a/abc.rc +++ b/abc.rc @@ -1,7 +1,7 @@ # global parameters -set check # checks intermediate networks +#set check # checks intermediate networks #set checkfio # prints warnings when fanins/fanouts are duplicated -set checkread # checks new networks after reading from file +#set checkread # checks new networks after reading from file set backup # saves backup networks retrived by "undo" and "recall" set savesteps 1 # sets the maximum number of backup networks to save set progressbar # display the progress bar @@ -51,6 +51,7 @@ alias psy print_symm alias pun print_unate alias q quit alias r read +alias ra read_aiger alias r3 retime -M 3 alias r3f retime -M 3 -f alias r3b retime -M 3 -b diff --git a/src/aig/aig/aig.h b/src/aig/aig/aig.h index 1f1015846..96aa1c93d 100644 --- a/src/aig/aig/aig.h +++ b/src/aig/aig/aig.h @@ -327,7 +327,7 @@ static inline Aig_Obj_t * Aig_ObjFanout0( Aig_Man_t * p, Aig_Obj_t * pObj ) { static inline Aig_Obj_t * Aig_ObjEquiv( Aig_Man_t * p, Aig_Obj_t * pObj ) { return p->pEquivs? p->pEquivs[pObj->Id] : NULL; } static inline Aig_Obj_t * Aig_ObjRepr( Aig_Man_t * p, Aig_Obj_t * pObj ) { return p->pReprs? p->pReprs[pObj->Id] : NULL; } static inline Aig_Obj_t * Aig_ObjHaig( Aig_Obj_t * pObj ) { assert( Aig_Regular(pObj)->pHaig ); return Aig_NotCond( Aig_Regular(pObj)->pHaig, Aig_IsComplement(pObj) ); } -static inline int Aig_ObjPioNum( Aig_Obj_t * pObj ) { assert( !Aig_ObjIsNode(pObj) ); return (int)(long)pObj->pNext; } +static inline int Aig_ObjPioNum( Aig_Obj_t * pObj ) { assert( !Aig_ObjIsNode(pObj) ); return (int)(PORT_PTRINT_T)pObj->pNext; } static inline int Aig_ObjWhatFanin( Aig_Obj_t * pObj, Aig_Obj_t * pFanin ) { if ( Aig_ObjFanin0(pObj) == pFanin ) return 0; diff --git a/src/aig/aig/aigInter.c b/src/aig/aig/aigInter.c index b58b758db..801987539 100644 --- a/src/aig/aig/aigInter.c +++ b/src/aig/aig/aigInter.c @@ -51,7 +51,7 @@ void Aig_ManInterFast( Aig_Man_t * pManOn, Aig_Man_t * pManOff, int fVerbose ) Cnf_Dat_t * pCnfOn, * pCnfOff; Aig_Obj_t * pObj, * pObj2; int Lits[3], status, i; - int clk = clock(); +// int clk = clock(); assert( Aig_ManPiNum(pManOn) == Aig_ManPiNum(pManOff) ); assert( Aig_ManPoNum(pManOn) == Aig_ManPoNum(pManOff) ); @@ -154,7 +154,7 @@ Aig_Man_t * Aig_ManInter( Aig_Man_t * pManOn, Aig_Man_t * pManOff, int fRelation Aig_Obj_t * pObj, * pObj2; int Lits[3], status, i; int clk; - int iLast; + int iLast = -1; // Suppress "might be used uninitialized" assert( Aig_ManPiNum(pManOn) == Aig_ManPiNum(pManOff) ); diff --git a/src/aig/aig/aigObj.c b/src/aig/aig/aigObj.c index 86117f100..3ceed0949 100644 --- a/src/aig/aig/aigObj.c +++ b/src/aig/aig/aigObj.c @@ -322,7 +322,8 @@ void Aig_ObjPrint( Aig_Man_t * p, Aig_Obj_t * pObj ) if ( fShowFanouts && p->pFanData ) { Aig_Obj_t * pFanout; - int i, iFan; + int i; + int iFan = -1; // Suppress "might be used uninitialized" printf( "\nFanouts:\n" ); Aig_ObjForEachFanout( p, pObj, pFanout, iFan, i ) { diff --git a/src/aig/aig/aigOper.c b/src/aig/aig/aigOper.c index 6e9d37ba5..208e2d447 100644 --- a/src/aig/aig/aigOper.c +++ b/src/aig/aig/aigOper.c @@ -236,7 +236,7 @@ Aig_Obj_t * Aig_Exor( Aig_Man_t * p, Aig_Obj_t * p0, Aig_Obj_t * p1 ) p1 = Aig_Regular(p1); pGhost = Aig_ObjCreateGhost( p, p0, p1, AIG_OBJ_EXOR ); // check the table - if ( pResult = Aig_TableLookup( p, pGhost ) ) + if ( (pResult = Aig_TableLookup( p, pGhost )) ) return Aig_NotCond( pResult, fCompl ); pResult = Aig_ObjCreate( p, pGhost ); return Aig_NotCond( pResult, fCompl ); diff --git a/src/aig/aig/aigPart.c b/src/aig/aig/aigPart.c index 392de03e6..d9ec616ab 100644 --- a/src/aig/aig/aigPart.c +++ b/src/aig/aig/aigPart.c @@ -1514,10 +1514,6 @@ void Aig_ManChoiceEval( Aig_Man_t * p ) { if ( !Aig_ObjIsChoice(p, pNode) ) continue; - if ( pNode->Id == 4225 ) - { - int x = 0; - } Counter = 0; for ( pTemp = pNode; pTemp; pTemp = Aig_ObjEquiv(p, pTemp) ) Counter++; diff --git a/src/aig/aig/aigPartReg.c b/src/aig/aig/aigPartReg.c index 96ad18121..79761a41d 100644 --- a/src/aig/aig/aigPartReg.c +++ b/src/aig/aig/aigPartReg.c @@ -119,7 +119,9 @@ void Aig_ManRegManStop( Aig_ManPre_t * p ) int Aig_ManRegFindSeed( Aig_ManPre_t * p ) { Vec_Int_t * vRegs; - int i, k, iReg, iMax, nRegsCur, nRegsMax = -1; + int i, k, iReg; + int iMax = -1; // Suppress "might be used uninitialized" + int nRegsCur, nRegsMax = -1; for ( i = 0; i < Aig_ManRegNum(p->pAig); i++ ) { if ( p->pfUsedRegs[i] ) diff --git a/src/aig/aig/aigRepr.c b/src/aig/aig/aigRepr.c index b0605c1e6..eeca69bf3 100644 --- a/src/aig/aig/aigRepr.c +++ b/src/aig/aig/aigRepr.c @@ -526,15 +526,16 @@ int Aig_TransferMappedClasses( Aig_Man_t * pAig, Aig_Man_t * pPart, int * pMapBa Aig_Obj_t * pObj; int nClasses, k; nClasses = 0; - if ( pPart->pReprs ) - Aig_ManForEachObj( pPart, pObj, k ) - { - if ( pPart->pReprs[pObj->Id] == NULL ) - continue; - nClasses++; - Aig_ObjSetRepr( pAig, - Aig_ManObj(pAig, pMapBack[pObj->Id]), - Aig_ManObj(pAig, pMapBack[pPart->pReprs[pObj->Id]->Id]) ); + if ( pPart->pReprs ) { + Aig_ManForEachObj( pPart, pObj, k ) + { + if ( pPart->pReprs[pObj->Id] == NULL ) + continue; + nClasses++; + Aig_ObjSetRepr( pAig, + Aig_ManObj(pAig, pMapBack[pObj->Id]), + Aig_ManObj(pAig, pMapBack[pPart->pReprs[pObj->Id]->Id]) ); + } } return nClasses; } diff --git a/src/aig/aig/aigShow.c b/src/aig/aig/aigShow.c index 8dc67c795..1e9e10acb 100644 --- a/src/aig/aig/aigShow.c +++ b/src/aig/aig/aigShow.c @@ -329,7 +329,7 @@ void Aig_WriteDotAig( Aig_Man_t * pMan, char * pFileName, int fHaig, Vec_Ptr_t * void Aig_ManShow( Aig_Man_t * pMan, int fHaig, Vec_Ptr_t * vBold ) { extern void Abc_ShowFile( char * FileNameDot ); - static Counter = 0; + static int Counter = 0; char FileNameDot[200]; FILE * pFile; // create the file name diff --git a/src/aig/aig/aigUtil.c b/src/aig/aig/aigUtil.c index 7b64d5622..211b2d9f5 100644 --- a/src/aig/aig/aigUtil.c +++ b/src/aig/aig/aigUtil.c @@ -699,7 +699,7 @@ void Aig_ManDumpBlif( Aig_Man_t * p, char * pFileName, Vec_Ptr_t * vPiNames, Vec fprintf( pFile, ".inputs" ); Aig_ManForEachPiSeq( p, pObj, i ) if ( vPiNames ) - fprintf( pFile, " %s", Vec_PtrEntry(vPiNames, i) ); + fprintf( pFile, " %s", (char*)Vec_PtrEntry(vPiNames, i) ); else fprintf( pFile, " n%0*d", nDigits, pObj->iData ); fprintf( pFile, "\n" ); @@ -707,7 +707,7 @@ void Aig_ManDumpBlif( Aig_Man_t * p, char * pFileName, Vec_Ptr_t * vPiNames, Vec fprintf( pFile, ".outputs" ); Aig_ManForEachPoSeq( p, pObj, i ) if ( vPoNames ) - fprintf( pFile, " %s", Vec_PtrEntry(vPoNames, i) ); + fprintf( pFile, " %s", (char*)Vec_PtrEntry(vPoNames, i) ); else fprintf( pFile, " n%0*d", nDigits, pObj->iData ); fprintf( pFile, "\n" ); @@ -719,11 +719,11 @@ void Aig_ManDumpBlif( Aig_Man_t * p, char * pFileName, Vec_Ptr_t * vPiNames, Vec { fprintf( pFile, ".latch" ); if ( vPoNames ) - fprintf( pFile, " %s", Vec_PtrEntry(vPoNames, Aig_ManPoNum(p)-Aig_ManRegNum(p)+i) ); + fprintf( pFile, " %s", (char*)Vec_PtrEntry(vPoNames, Aig_ManPoNum(p)-Aig_ManRegNum(p)+i) ); else fprintf( pFile, " n%0*d", nDigits, pObjLi->iData ); if ( vPiNames ) - fprintf( pFile, " %s", Vec_PtrEntry(vPiNames, Aig_ManPiNum(p)-Aig_ManRegNum(p)+i) ); + fprintf( pFile, " %s", (char*)Vec_PtrEntry(vPiNames, Aig_ManPiNum(p)-Aig_ManRegNum(p)+i) ); else fprintf( pFile, " n%0*d", nDigits, pObjLo->iData ); fprintf( pFile, " 0\n" ); @@ -738,11 +738,11 @@ void Aig_ManDumpBlif( Aig_Man_t * p, char * pFileName, Vec_Ptr_t * vPiNames, Vec { fprintf( pFile, ".names" ); if ( vPiNames && Aig_ObjIsPi(Aig_ObjFanin0(pObj)) ) - fprintf( pFile, " %s", Vec_PtrEntry(vPiNames, Aig_ObjPioNum(Aig_ObjFanin0(pObj))) ); + fprintf( pFile, " %s", (char*)Vec_PtrEntry(vPiNames, Aig_ObjPioNum(Aig_ObjFanin0(pObj))) ); else fprintf( pFile, " n%0*d", nDigits, Aig_ObjFanin0(pObj)->iData ); if ( vPiNames && Aig_ObjIsPi(Aig_ObjFanin1(pObj)) ) - fprintf( pFile, " %s", Vec_PtrEntry(vPiNames, Aig_ObjPioNum(Aig_ObjFanin1(pObj))) ); + fprintf( pFile, " %s", (char*)Vec_PtrEntry(vPiNames, Aig_ObjPioNum(Aig_ObjFanin1(pObj))) ); else fprintf( pFile, " n%0*d", nDigits, Aig_ObjFanin1(pObj)->iData ); fprintf( pFile, " n%0*d\n", nDigits, pObj->iData ); @@ -753,11 +753,11 @@ void Aig_ManDumpBlif( Aig_Man_t * p, char * pFileName, Vec_Ptr_t * vPiNames, Vec { fprintf( pFile, ".names" ); if ( vPiNames && Aig_ObjIsPi(Aig_ObjFanin0(pObj)) ) - fprintf( pFile, " %s", Vec_PtrEntry(vPiNames, Aig_ObjPioNum(Aig_ObjFanin0(pObj))) ); + fprintf( pFile, " %s", (char*)Vec_PtrEntry(vPiNames, Aig_ObjPioNum(Aig_ObjFanin0(pObj))) ); else fprintf( pFile, " n%0*d", nDigits, Aig_ObjFanin0(pObj)->iData ); if ( vPoNames ) - fprintf( pFile, " %s\n", Vec_PtrEntry(vPoNames, Aig_ObjPioNum(pObj)) ); + fprintf( pFile, " %s\n", (char*)Vec_PtrEntry(vPoNames, Aig_ObjPioNum(pObj)) ); else fprintf( pFile, " n%0*d\n", nDigits, pObj->iData ); fprintf( pFile, "%d 1\n", !Aig_ObjFaninC0(pObj) ); @@ -901,9 +901,9 @@ void Aig_ManSetPioNumbers( Aig_Man_t * p ) Aig_Obj_t * pObj; int i; Aig_ManForEachPi( p, pObj, i ) - pObj->pNext = (Aig_Obj_t *)i; + pObj->PioNum = i; Aig_ManForEachPo( p, pObj, i ) - pObj->pNext = (Aig_Obj_t *)i; + pObj->PioNum = i; } /**Function************************************************************* @@ -961,7 +961,7 @@ int Aig_ManCountChoices( Aig_Man_t * p ) void Aig_ManPrintControlFanouts( Aig_Man_t * p ) { Aig_Obj_t * pObj, * pFanin0, * pFanin1, * pCtrl; - int i, Counter = 0; + int i; pCtrl = Aig_ManPi( p, Aig_ManPiNum(p) - 1 ); @@ -1072,8 +1072,8 @@ void Aig_ManRandomTest1() } -#define NUMBER1 3716960521 -#define NUMBER2 2174103536 +#define NUMBER1 3716960521u +#define NUMBER2 2174103536u /**Function************************************************************* diff --git a/src/aig/bbr/bbrImage.c b/src/aig/bbr/bbrImage.c index 234ae3f8d..f362162c3 100644 --- a/src/aig/bbr/bbrImage.c +++ b/src/aig/bbr/bbrImage.c @@ -939,7 +939,7 @@ int Bbr_FindBestVariable( DdManager * dd, int iVarBest, v; double CostBest, CostCur; - CostBest = 100000000000000; + CostBest = 100000000000000.0; iVarBest = -1; for ( v = 0; v < nVars; v++ ) if ( pVars[v] ) diff --git a/src/aig/bbr/bbrNtbdd.c b/src/aig/bbr/bbrNtbdd.c index 5e51a1575..05c98fe1b 100644 --- a/src/aig/bbr/bbrNtbdd.c +++ b/src/aig/bbr/bbrNtbdd.c @@ -48,7 +48,6 @@ static inline void Aig_ObjCleanGlobalBdd( DdManager * dd, Aig_Obj_t * pObj ) DdNode * Bbr_NodeGlobalBdds_rec( DdManager * dd, Aig_Obj_t * pNode, int nBddSizeMax, int fDropInternal, ProgressBar * pProgress, int * pCounter, int fVerbose ) { DdNode * bFunc, * bFunc0, * bFunc1; - int fDetectMuxes = 1; assert( !Aig_IsComplement(pNode) ); if ( Cudd_ReadKeys(dd)-Cudd_ReadDead(dd) > (unsigned)nBddSizeMax ) { diff --git a/src/aig/bbr/bbrReach.c b/src/aig/bbr/bbrReach.c index a78a3fb2b..94d6dbfcf 100644 --- a/src/aig/bbr/bbrReach.c +++ b/src/aig/bbr/bbrReach.c @@ -206,10 +206,12 @@ DdNode ** Aig_ManCreatePartitions( DdManager * dd, Aig_Man_t * p, int fReorder, int Aig_ManComputeReachable( DdManager * dd, Aig_Man_t * p, DdNode ** pbParts, DdNode * bInitial, DdNode ** pbOutputs, int nBddMax, int nIterMax, int fPartition, int fReorder, int fVerbose, int fSilent ) { int fInternalReorder = 0; - Bbr_ImageTree_t * pTree; - Bbr_ImageTree2_t * pTree2; + Bbr_ImageTree_t * pTree = NULL; // Suppress "might be used uninitialized" + Bbr_ImageTree2_t * pTree2 = NULL; // Supprses "might be used uninitialized" DdNode * bReached, * bCubeCs; - DdNode * bCurrent, * bNext, * bTemp; + DdNode * bCurrent; + DdNode * bNext = NULL; // Suppress "might be used uninitialized" + DdNode * bTemp; DdNode ** pbVarsY; Aig_Obj_t * pLatch; int i, nIters, nBddSize; diff --git a/src/aig/bdc/bdcDec.c b/src/aig/bdc/bdcDec.c index 55ce97a01..ccf6248fc 100644 --- a/src/aig/bdc/bdcDec.c +++ b/src/aig/bdc/bdcDec.c @@ -41,7 +41,8 @@ ***********************************************************************/ void Bdc_SuppMinimize2( Bdc_Man_t * p, Bdc_Isf_t * pIsf ) { - int v, clk; + int v; + int clk = 0; // Suppress "might be used uninitialized" if ( p->pPars->fVerbose ) clk = clock(); // compute support @@ -82,7 +83,8 @@ void Bdc_SuppMinimize2( Bdc_Man_t * p, Bdc_Isf_t * pIsf ) ***********************************************************************/ void Bdc_SuppMinimize( Bdc_Man_t * p, Bdc_Isf_t * pIsf ) { - int v, clk; + int v; + int clk = 0; // Suppress "might be used uninitialized" if ( p->pPars->fVerbose ) clk = clock(); // go through the support variables @@ -245,7 +247,9 @@ int Bdc_DecomposeFindInitialVarSet( Bdc_Man_t * p, Bdc_Isf_t * pIsf, Bdc_Isf_t * ***********************************************************************/ int Bdc_DecomposeWeakOr( Bdc_Man_t * p, Bdc_Isf_t * pIsf, Bdc_Isf_t * pIsfL, Bdc_Isf_t * pIsfR ) { - int v, VarCost, VarBest, Cost, VarCostBest = 0; + int v, VarCost; + int VarBest = -1; // Suppress "might be used uninitialized" + int Cost, VarCostBest = 0; for ( v = 0; v < p->nVars; v++ ) { @@ -542,7 +546,7 @@ int Bdc_DecomposeStepMux( Bdc_Man_t * p, Bdc_Isf_t * pIsf, Bdc_Isf_t * pIsfL, Bd { int Var, VarMin, nSuppMin, nSuppCur; unsigned uSupp0, uSupp1; - int clk; + int clk = 0; // Suppress "might be used uninitialized" if ( p->pPars->fVerbose ) clk = clock(); VarMin = -1; @@ -667,13 +671,14 @@ Bdc_Fun_t * Bdc_ManCreateGate( Bdc_Man_t * p, Bdc_Fun_t * pFunc0, Bdc_Fun_t * pF ***********************************************************************/ Bdc_Fun_t * Bdc_ManDecompose_rec( Bdc_Man_t * p, Bdc_Isf_t * pIsf ) { - int static Counter = 0; - int LocalCounter = Counter++; +// int static Counter = 0; +// int LocalCounter = Counter++; Bdc_Type_t Type; Bdc_Fun_t * pFunc, * pFunc0, * pFunc1; Bdc_Isf_t IsfL, * pIsfL = &IsfL; Bdc_Isf_t IsfB, * pIsfR = &IsfB; - int iVar, clk; + int iVar; + int clk = 0; // Suppress "might be used uninitialized" /* printf( "Init function (%d):\n", LocalCounter ); Extra_PrintBinary( stdout, pIsf->puOn, 1<<4 );printf("\n"); diff --git a/src/aig/csw/cswCut.c b/src/aig/csw/cswCut.c index b3b7152b3..a3d9b04ec 100644 --- a/src/aig/csw/cswCut.c +++ b/src/aig/csw/cswCut.c @@ -555,7 +555,7 @@ p->timeCuts += clock() - clk; } if ( nVars == 2 && nFanins > 2 && fUseResub ) { - if ( pObjNew = Csw_ObjTwoVarCut( p, pCut ) ) + if ( (pObjNew = Csw_ObjTwoVarCut( p, pCut )) ) { p->nNodesTriv2++; return pObjNew; diff --git a/src/aig/dar/darCore.c b/src/aig/dar/darCore.c index e82cce221..ed461de51 100644 --- a/src/aig/dar/darCore.c +++ b/src/aig/dar/darCore.c @@ -264,7 +264,7 @@ Aig_MmFixed_t * Dar_ManComputeCuts( Aig_Man_t * pAig, int nCutsMax, int fVerbose printf( "Nodes = %6d. Total cuts = %6d. 4-input cuts = %6d.\n", Aig_ManObjNum(pAig), nCuts, nCutsK ); printf( "Cut size = %2d. Truth size = %2d. Total mem = %5.2f Mb ", - sizeof(Dar_Cut_t), 4, 1.0*Aig_MmFixedReadMemUsage(p->pMemCuts)/(1<<20) ); + sizeof(Dar_Cut_t), (int)4, 1.0*Aig_MmFixedReadMemUsage(p->pMemCuts)/(1<<20) ); PRT( "Runtime", clock() - clk ); /* Aig_ManForEachNode( pAig, pObj, i ) diff --git a/src/aig/fra/fraClau.c b/src/aig/fra/fraClau.c index fc239a40f..919d00005 100644 --- a/src/aig/fra/fraClau.c +++ b/src/aig/fra/fraClau.c @@ -441,7 +441,6 @@ int Fra_ClauCheckClause( Cla_Man_t * p, Vec_Int_t * vClause, Vec_Int_t * vCex ) { int nBTLimit = 0; int RetValue, iVar, i; - int nClauseSize = Vec_IntSize( vClause ); // complement literals Vec_IntPush( vClause, toLit( p->nSatVarsTestCur++ ) ); // helper positive Vec_IntComplement( vClause ); // helper negative (the clause is C v h') diff --git a/src/aig/fra/fraClaus.c b/src/aig/fra/fraClaus.c index 6f0a2012a..91b707028 100644 --- a/src/aig/fra/fraClaus.c +++ b/src/aig/fra/fraClaus.c @@ -813,7 +813,9 @@ clk = clock(); p->nClauses = Vec_IntSize( p->vClauses ); if ( Vec_IntSize( p->vClausesProven ) > 0 ) { - int RetValue, k, Beg, End, * pStart; + int RetValue, k, Beg; + int End = -1; // Suppress "might be used uninitialized" + int * pStart; // reset the solver if ( p->pSatMain ) sat_solver_delete( p->pSatMain ); p->pSatMain = Cnf_DataWriteIntoSolver( p->pCnf, 1, 0 ); diff --git a/src/aig/fra/fraInd.c b/src/aig/fra/fraInd.c index 89c4c6773..ab0764728 100644 --- a/src/aig/fra/fraInd.c +++ b/src/aig/fra/fraInd.c @@ -388,7 +388,8 @@ Aig_Man_t * Fra_FraigInduction( Aig_Man_t * pManAig, Fra_Ssw_t * pParams ) Cnf_Dat_t * pCnf; Aig_Man_t * pManAigNew = NULL; int nNodesBeg, nRegsBeg; - int nIter, i, clk = clock(), clk2; + int nIter = -1; // Suppress "might be used uninitialized" + int i, clk = clock(), clk2; int TimeToStop = (pParams->TimeLimit == 0.0)? 0 : clock() + (int)(pParams->TimeLimit * CLOCKS_PER_SEC); if ( Aig_ManNodeNum(pManAig) == 0 ) diff --git a/src/aig/fra/fraPart.c b/src/aig/fra/fraPart.c index f4964746c..1766b9782 100644 --- a/src/aig/fra/fraPart.c +++ b/src/aig/fra/fraPart.c @@ -76,7 +76,7 @@ clk = clock(); { vSup = Vec_VecEntry( vSupps, i ); Vec_IntForEachEntry( vSup, Entry, k ) - Vec_VecPush( vSuppsIn, Entry, (void *)i ); + Vec_VecPush( vSuppsIn, Entry, (void *)(PORT_PTRUINT_T)i ); } PRT( "Inverse ", clock() - clk ); @@ -212,7 +212,7 @@ clk = clock(); break; vSup = Vec_VecEntry( vSupps, i ); Vec_IntForEachEntry( vSup, Entry, k ) - Vec_VecPush( vSuppsIn, Entry, (void *)i ); + Vec_VecPush( vSuppsIn, Entry, (void *)(PORT_PTRUINT_T)i ); } PRT( "Inverse ", clock() - clk ); diff --git a/src/aig/hop/hop.h b/src/aig/hop/hop.h index 05e6471e3..db4799cad 100644 --- a/src/aig/hop/hop.h +++ b/src/aig/hop/hop.h @@ -166,13 +166,13 @@ static inline int Hop_ObjIsMarkA( Hop_Obj_t * pObj ) { return pObj- static inline void Hop_ObjSetMarkA( Hop_Obj_t * pObj ) { pObj->fMarkA = 1; } static inline void Hop_ObjClearMarkA( Hop_Obj_t * pObj ) { pObj->fMarkA = 0; } -static inline void Hop_ObjSetTravId( Hop_Obj_t * pObj, int TravId ) { pObj->pData = (void *)(long)TravId; } -static inline void Hop_ObjSetTravIdCurrent( Hop_Man_t * p, Hop_Obj_t * pObj ) { pObj->pData = (void *)(long)p->nTravIds; } -static inline void Hop_ObjSetTravIdPrevious( Hop_Man_t * p, Hop_Obj_t * pObj ) { pObj->pData = (void *)(long)(p->nTravIds - 1); } -static inline int Hop_ObjIsTravIdCurrent( Hop_Man_t * p, Hop_Obj_t * pObj ) { return (int)((int)(long)pObj->pData == p->nTravIds); } -static inline int Hop_ObjIsTravIdPrevious( Hop_Man_t * p, Hop_Obj_t * pObj ) { return (int)((int)(long)pObj->pData == p->nTravIds - 1); } +static inline void Hop_ObjSetTravId( Hop_Obj_t * pObj, int TravId ) { pObj->pData = (void *)(PORT_PTRINT_T)TravId; } +static inline void Hop_ObjSetTravIdCurrent( Hop_Man_t * p, Hop_Obj_t * pObj ) { pObj->pData = (void *)(PORT_PTRINT_T)p->nTravIds; } +static inline void Hop_ObjSetTravIdPrevious( Hop_Man_t * p, Hop_Obj_t * pObj ) { pObj->pData = (void *)(PORT_PTRINT_T)(p->nTravIds - 1); } +static inline int Hop_ObjIsTravIdCurrent( Hop_Man_t * p, Hop_Obj_t * pObj ) { return (int)((int)(PORT_PTRINT_T)pObj->pData == p->nTravIds); } +static inline int Hop_ObjIsTravIdPrevious( Hop_Man_t * p, Hop_Obj_t * pObj ) { return (int)((int)(PORT_PTRINT_T)pObj->pData == p->nTravIds - 1); } -static inline int Hop_ObjTravId( Hop_Obj_t * pObj ) { return (int)pObj->pData; } +static inline int Hop_ObjTravId( Hop_Obj_t * pObj ) { return (int)(PORT_PTRINT_T)pObj->pData; } static inline int Hop_ObjPhase( Hop_Obj_t * pObj ) { return pObj->fPhase; } static inline int Hop_ObjRefs( Hop_Obj_t * pObj ) { return pObj->nRefs; } static inline void Hop_ObjRef( Hop_Obj_t * pObj ) { pObj->nRefs++; } diff --git a/src/aig/hop/hopDfs.c b/src/aig/hop/hopDfs.c index d798bc354..29963f6d1 100644 --- a/src/aig/hop/hopDfs.c +++ b/src/aig/hop/hopDfs.c @@ -123,15 +123,15 @@ int Hop_ManCountLevels( Hop_Man_t * p ) vNodes = Hop_ManDfs( p ); Vec_PtrForEachEntry( vNodes, pObj, i ) { - Level0 = (int)Hop_ObjFanin0(pObj)->pData; - Level1 = (int)Hop_ObjFanin1(pObj)->pData; - pObj->pData = (void *)(1 + Hop_ObjIsExor(pObj) + AIG_MAX(Level0, Level1)); + Level0 = (int)(PORT_PTRUINT_T)Hop_ObjFanin0(pObj)->pData; + Level1 = (int)(PORT_PTRUINT_T)Hop_ObjFanin1(pObj)->pData; + pObj->pData = (void *)(PORT_PTRUINT_T)(1 + Hop_ObjIsExor(pObj) + AIG_MAX(Level0, Level1)); } Vec_PtrFree( vNodes ); // get levels of the POs LevelsMax = 0; Hop_ManForEachPo( p, pObj, i ) - LevelsMax = AIG_MAX( LevelsMax, (int)Hop_ObjFanin0(pObj)->pData ); + LevelsMax = AIG_MAX( LevelsMax, (int)(PORT_PTRUINT_T)Hop_ObjFanin0(pObj)->pData ); return LevelsMax; } diff --git a/src/aig/hop/hopMem.c b/src/aig/hop/hopMem.c index 0665470a1..60f89d536 100644 --- a/src/aig/hop/hopMem.c +++ b/src/aig/hop/hopMem.c @@ -95,7 +95,7 @@ void Hop_ManAddMemory( Hop_Man_t * p ) pMemory = ALLOC( char, nBytes ); Vec_PtrPush( p->vChunks, pMemory ); // align memory at the 32-byte boundary - pMemory = pMemory + 64 - (((int)pMemory) & 63); + pMemory = pMemory + 64 - (((int)(PORT_PTRUINT_T)pMemory) & 63); // remember the manager in the first entry Vec_PtrPush( p->vPages, pMemory ); // break the memory down into nodes diff --git a/src/aig/hop/hopOper.c b/src/aig/hop/hopOper.c index a31ca0f2f..0ecb8d61b 100644 --- a/src/aig/hop/hopOper.c +++ b/src/aig/hop/hopOper.c @@ -116,7 +116,7 @@ Hop_Obj_t * Hop_And( Hop_Man_t * p, Hop_Obj_t * p0, Hop_Obj_t * p1 ) // return Hop_Exor( p, pFan0, pFan1 ); // check the table pGhost = Hop_ObjCreateGhost( p, p0, p1, AIG_AND ); - if ( pResult = Hop_TableLookup( p, pGhost ) ) + if ( (pResult = Hop_TableLookup( p, pGhost )) ) return pResult; return Hop_ObjCreate( p, pGhost ); } diff --git a/src/aig/hop/hopUtil.c b/src/aig/hop/hopUtil.c index 87fdb15e4..d9dbbcaa9 100644 --- a/src/aig/hop/hopUtil.c +++ b/src/aig/hop/hopUtil.c @@ -333,7 +333,7 @@ void Hop_ObjPrintEqn( FILE * pFile, Hop_Obj_t * pObj, Vec_Vec_t * vLevels, int L // PI case if ( Hop_ObjIsPi(pObj) ) { - fprintf( pFile, "%s%s", fCompl? "!" : "", pObj->pData ); + fprintf( pFile, "%s%s", fCompl? "!" : "", (char*)pObj->pData ); return; } // AND case @@ -380,7 +380,7 @@ void Hop_ObjPrintVerilog( FILE * pFile, Hop_Obj_t * pObj, Vec_Vec_t * vLevels, i // PI case if ( Hop_ObjIsPi(pObj) ) { - fprintf( pFile, "%s%s", fCompl? "~" : "", pObj->pData ); + fprintf( pFile, "%s%s", fCompl? "~" : "", (char*)pObj->pData ); return; } // EXOR case @@ -516,13 +516,13 @@ void Hop_ManDumpBlif( Hop_Man_t * p, char * pFileName ) // collect nodes in the DFS order vNodes = Hop_ManDfs( p ); // assign IDs to objects - Hop_ManConst1(p)->pData = (void *)Counter++; + Hop_ManConst1(p)->pData = (void *)(PORT_PTRUINT_T)Counter++; Hop_ManForEachPi( p, pObj, i ) - pObj->pData = (void *)Counter++; + pObj->pData = (void *)(PORT_PTRUINT_T)Counter++; Hop_ManForEachPo( p, pObj, i ) - pObj->pData = (void *)Counter++; + pObj->pData = (void *)(PORT_PTRUINT_T)Counter++; Vec_PtrForEachEntry( vNodes, pObj, i ) - pObj->pData = (void *)Counter++; + pObj->pData = (void *)(PORT_PTRUINT_T)Counter++; nDigits = Hop_Base10Log( Counter ); // write the file pFile = fopen( pFileName, "w" ); @@ -532,34 +532,34 @@ void Hop_ManDumpBlif( Hop_Man_t * p, char * pFileName ) // write PIs fprintf( pFile, ".inputs" ); Hop_ManForEachPi( p, pObj, i ) - fprintf( pFile, " n%0*d", nDigits, (int)pObj->pData ); + fprintf( pFile, " n%0*d", nDigits, (int)(PORT_PTRUINT_T)pObj->pData ); fprintf( pFile, "\n" ); // write POs fprintf( pFile, ".outputs" ); Hop_ManForEachPo( p, pObj, i ) - fprintf( pFile, " n%0*d", nDigits, (int)pObj->pData ); + fprintf( pFile, " n%0*d", nDigits, (int)(PORT_PTRUINT_T)pObj->pData ); fprintf( pFile, "\n" ); // write nodes Vec_PtrForEachEntry( vNodes, pObj, i ) { fprintf( pFile, ".names n%0*d n%0*d n%0*d\n", - nDigits, (int)Hop_ObjFanin0(pObj)->pData, - nDigits, (int)Hop_ObjFanin1(pObj)->pData, - nDigits, (int)pObj->pData ); + nDigits, (int)(PORT_PTRUINT_T)Hop_ObjFanin0(pObj)->pData, + nDigits, (int)(PORT_PTRUINT_T)Hop_ObjFanin1(pObj)->pData, + nDigits, (int)(PORT_PTRUINT_T)pObj->pData ); fprintf( pFile, "%d%d 1\n", !Hop_ObjFaninC0(pObj), !Hop_ObjFaninC1(pObj) ); } // write POs Hop_ManForEachPo( p, pObj, i ) { fprintf( pFile, ".names n%0*d n%0*d\n", - nDigits, (int)Hop_ObjFanin0(pObj)->pData, - nDigits, (int)pObj->pData ); + nDigits, (int)(PORT_PTRUINT_T)Hop_ObjFanin0(pObj)->pData, + nDigits, (int)(PORT_PTRUINT_T)pObj->pData ); fprintf( pFile, "%d 1\n", !Hop_ObjFaninC0(pObj) ); if ( Hop_ObjIsConst1(Hop_ObjFanin0(pObj)) ) pConst1 = Hop_ManConst1(p); } if ( pConst1 ) - fprintf( pFile, ".names n%0*d\n 1\n", nDigits, (int)pConst1->pData ); + fprintf( pFile, ".names n%0*d\n 1\n", nDigits, (int)(PORT_PTRUINT_T)pConst1->pData ); fprintf( pFile, ".end\n\n" ); fclose( pFile ); Vec_PtrFree( vNodes ); diff --git a/src/aig/ioa/ioaWriteAig.c b/src/aig/ioa/ioaWriteAig.c index aa7314635..12de42add 100644 --- a/src/aig/ioa/ioaWriteAig.c +++ b/src/aig/ioa/ioaWriteAig.c @@ -208,13 +208,13 @@ Vec_Str_t * Ioa_WriteEncodeLiterals( Vec_Int_t * vLits ) int Pos = 0, Lit, LitPrev, Diff, i; vBinary = Vec_StrAlloc( 2 * Vec_IntSize(vLits) ); LitPrev = Vec_IntEntry( vLits, 0 ); - Pos = Ioa_WriteAigerEncode( Vec_StrArray(vBinary), Pos, LitPrev ); + Pos = Ioa_WriteAigerEncode( (unsigned char *)Vec_StrArray(vBinary), Pos, LitPrev ); Vec_IntForEachEntryStart( vLits, Lit, i, 1 ) { Diff = Lit - LitPrev; Diff = (Lit < LitPrev)? -Diff : Diff; Diff = (Diff << 1) | (int)(Lit < LitPrev); - Pos = Ioa_WriteAigerEncode( Vec_StrArray(vBinary), Pos, Diff ); + Pos = Ioa_WriteAigerEncode( (unsigned char *)Vec_StrArray(vBinary), Pos, Diff ); LitPrev = Lit; if ( Pos + 10 > vBinary->nCap ) Vec_StrGrow( vBinary, vBinary->nCap+1 ); @@ -254,7 +254,7 @@ void Ioa_WriteAiger( Aig_Man_t * pMan, char * pFileName, int fWriteSymbols, int // Bar_Progress_t * pProgress; FILE * pFile; Aig_Obj_t * pObj, * pDriver; - int i, nNodes, Pos, nBufferSize; + int i, nNodes, nBufferSize, Pos; unsigned char * pBuffer; unsigned uLit0, uLit1, uLit; diff --git a/src/aig/ivy/ivyBalance.c b/src/aig/ivy/ivyBalance.c index e0b2bef2c..b5c77e397 100644 --- a/src/aig/ivy/ivyBalance.c +++ b/src/aig/ivy/ivyBalance.c @@ -72,7 +72,7 @@ Ivy_Man_t * Ivy_ManBalance( Ivy_Man_t * p, int fUpdateLevel ) Ivy_ObjCreatePo( pNew, Ivy_EdgeToNode(pNew, NewNodeId) ); } Vec_VecFree( vStore ); - if ( i = Ivy_ManCleanup( pNew ) ) + if ( (i = Ivy_ManCleanup( pNew )) ) { // printf( "Cleanup after balancing removed %d dangling nodes.\n", i ); } diff --git a/src/aig/ivy/ivyCanon.c b/src/aig/ivy/ivyCanon.c index 5768b87e6..db5918de8 100644 --- a/src/aig/ivy/ivyCanon.c +++ b/src/aig/ivy/ivyCanon.c @@ -53,7 +53,7 @@ Ivy_Obj_t * Ivy_CanonPair_rec( Ivy_Man_t * p, Ivy_Obj_t * pGhost ) // consider the case when the pair is canonical if ( !Ivy_ObjIsLatch(Ivy_ObjFanin0(pGhost)) || !Ivy_ObjIsLatch(Ivy_ObjFanin1(pGhost)) ) { - if ( pResult = Ivy_TableLookup( p, pGhost ) ) + if ( (pResult = Ivy_TableLookup( p, pGhost )) ) return pResult; return Ivy_ObjCreate( p, pGhost ); } diff --git a/src/aig/ivy/ivyCut.c b/src/aig/ivy/ivyCut.c index e257d8a62..b0dd6db7d 100644 --- a/src/aig/ivy/ivyCut.c +++ b/src/aig/ivy/ivyCut.c @@ -300,7 +300,8 @@ int Ivy_ManFindBoolCutCost( Ivy_Obj_t * pObj ) ***********************************************************************/ int Ivy_ManFindBoolCut( Ivy_Man_t * p, Ivy_Obj_t * pRoot, Vec_Ptr_t * vFront, Vec_Ptr_t * vVolume, Vec_Ptr_t * vLeaves ) { - Ivy_Obj_t * pObj, * pFaninC, * pFanin0, * pFanin1, * pPivot; + Ivy_Obj_t * pObj = NULL; // Suppress "might be used uninitialized" + Ivy_Obj_t * pFaninC, * pFanin0, * pFanin1, * pPivot; int RetValue, LevelLimit, Lev, k; assert( !Ivy_IsComplement(pRoot) ); // clear the frontier and collect the nodes diff --git a/src/aig/ivy/ivyDfs.c b/src/aig/ivy/ivyDfs.c index c27cba311..9594c0d24 100644 --- a/src/aig/ivy/ivyDfs.c +++ b/src/aig/ivy/ivyDfs.c @@ -382,7 +382,7 @@ int Ivy_ManIsAcyclic( Ivy_Man_t * p ) Ivy_ManForEachCo( p, pObj, i ) { // traverse the output logic cone - if ( fAcyclic = Ivy_ManIsAcyclic_rec(p, Ivy_ObjFanin0(pObj)) ) + if ( (fAcyclic = Ivy_ManIsAcyclic_rec(p, Ivy_ObjFanin0(pObj))) ) continue; // stop as soon as the first loop is detected fprintf( stdout, " (cone of %s \"%d\")\n", Ivy_ObjIsLatch(pObj)? "latch" : "PO", Ivy_ObjId(pObj) ); diff --git a/src/aig/ivy/ivyFastMap.c b/src/aig/ivy/ivyFastMap.c index c4a043f28..6ee177a45 100644 --- a/src/aig/ivy/ivyFastMap.c +++ b/src/aig/ivy/ivyFastMap.c @@ -309,7 +309,7 @@ int Ivy_FastMapArea( Ivy_Man_t * pAig ) SeeAlso [] ***********************************************************************/ -static inline Ivy_ObjIsNodeInt1( Ivy_Obj_t * pObj ) +static inline int Ivy_ObjIsNodeInt1( Ivy_Obj_t * pObj ) { return Ivy_ObjIsNode(pObj) && Ivy_ObjRefs(pObj) == 1; } @@ -325,7 +325,7 @@ static inline Ivy_ObjIsNodeInt1( Ivy_Obj_t * pObj ) SeeAlso [] ***********************************************************************/ -static inline Ivy_ObjIsNodeInt2( Ivy_Obj_t * pObj ) +static inline int Ivy_ObjIsNodeInt2( Ivy_Obj_t * pObj ) { return Ivy_ObjIsNode(pObj) && Ivy_ObjRefs(pObj) <= 2; } @@ -612,30 +612,30 @@ void Ivy_FastMapNode( Ivy_Man_t * pAig, Ivy_Obj_t * pObj, int nLimit ) pFaninA = Ivy_ObjFanin0(pFanin0); pFaninB = Ivy_ObjFanin1(pFanin0); if ( Ivy_ObjIsNodeInt1(pFaninA) && Ivy_ObjIsNodeInt1(pFaninB) ) - pSupp->pArray[pSupp->nSize++] = Ivy_ObjId(pFanin0); + pSupp->pArray[(int)(pSupp->nSize++)] = Ivy_ObjId(pFanin0); else { - pSupp->pArray[pSupp->nSize++] = Ivy_ObjId(pFaninA); - pSupp->pArray[pSupp->nSize++] = Ivy_ObjId(pFaninB); + pSupp->pArray[(int)(pSupp->nSize++)] = Ivy_ObjId(pFaninA); + pSupp->pArray[(int)(pSupp->nSize++)] = Ivy_ObjId(pFaninB); } } else - pSupp->pArray[pSupp->nSize++] = Ivy_ObjId(pFanin0); + pSupp->pArray[(int)(pSupp->nSize++)] = Ivy_ObjId(pFanin0); // process the second fanin if ( Ivy_ObjIsNodeInt1(pFanin1) ) { pFaninA = Ivy_ObjFanin0(pFanin1); pFaninB = Ivy_ObjFanin1(pFanin1); if ( Ivy_ObjIsNodeInt1(pFaninA) && Ivy_ObjIsNodeInt1(pFaninB) ) - pSupp->pArray[pSupp->nSize++] = Ivy_ObjId(pFanin1); + pSupp->pArray[(int)(pSupp->nSize++)] = Ivy_ObjId(pFanin1); else { - pSupp->pArray[pSupp->nSize++] = Ivy_ObjId(pFaninA); - pSupp->pArray[pSupp->nSize++] = Ivy_ObjId(pFaninB); + pSupp->pArray[(int)(pSupp->nSize++)] = Ivy_ObjId(pFaninA); + pSupp->pArray[(int)(pSupp->nSize++)] = Ivy_ObjId(pFaninB); } } else - pSupp->pArray[pSupp->nSize++] = Ivy_ObjId(pFanin1); + pSupp->pArray[(int)(pSupp->nSize++)] = Ivy_ObjId(pFanin1); // sort the fanins Vec_IntSelectSort( pSupp->pArray, pSupp->nSize ); pSupp->nSize = Vec_IntRemoveDup( pSupp->pArray, pSupp->nSize ); @@ -681,30 +681,30 @@ void Ivy_FastMapNode( Ivy_Man_t * pAig, Ivy_Obj_t * pObj, int nLimit ) pFaninA = Ivy_ObjFanin0(pFanin0); pFaninB = Ivy_ObjFanin1(pFanin0); if ( Ivy_ObjIsNodeInt1(pFaninA) && Ivy_ObjIsNodeInt1(pFaninB) ) - pSupp->pArray[pSupp->nSize++] = Ivy_ObjId(pFanin0); + pSupp->pArray[(int)(pSupp->nSize++)] = Ivy_ObjId(pFanin0); else { - pSupp->pArray[pSupp->nSize++] = Ivy_ObjId(pFaninA); - pSupp->pArray[pSupp->nSize++] = Ivy_ObjId(pFaninB); + pSupp->pArray[(int)(pSupp->nSize++)] = Ivy_ObjId(pFaninA); + pSupp->pArray[(int)(pSupp->nSize++)] = Ivy_ObjId(pFaninB); } } else - pSupp->pArray[pSupp->nSize++] = Ivy_ObjId(pFanin0); + pSupp->pArray[(int)(pSupp->nSize++)] = Ivy_ObjId(pFanin0); // process the second fanin if ( Ivy_ObjIsNodeInt1(pFanin1) ) { pFaninA = Ivy_ObjFanin0(pFanin1); pFaninB = Ivy_ObjFanin1(pFanin1); if ( Ivy_ObjIsNodeInt1(pFaninA) && Ivy_ObjIsNodeInt1(pFaninB) ) - pSupp->pArray[pSupp->nSize++] = Ivy_ObjId(pFanin1); + pSupp->pArray[(int)(pSupp->nSize++)] = Ivy_ObjId(pFanin1); else { - pSupp->pArray[pSupp->nSize++] = Ivy_ObjId(pFaninA); - pSupp->pArray[pSupp->nSize++] = Ivy_ObjId(pFaninB); + pSupp->pArray[(int)(pSupp->nSize++)] = Ivy_ObjId(pFaninA); + pSupp->pArray[(int)(pSupp->nSize++)] = Ivy_ObjId(pFaninB); } } else - pSupp->pArray[pSupp->nSize++] = Ivy_ObjId(pFanin1); + pSupp->pArray[(int)(pSupp->nSize++)] = Ivy_ObjId(pFanin1); // sort the fanins Vec_IntSelectSort( pSupp->pArray, pSupp->nSize ); pSupp->nSize = Vec_IntRemoveDup( pSupp->pArray, pSupp->nSize ); @@ -1497,10 +1497,6 @@ void Ivy_FastMapNodeRecover( Ivy_Man_t * pAig, Ivy_Obj_t * pObj, int nLimit, Vec AreaBef = Ivy_FastMapNodeAreaRefed( pAig, pObj ); // if ( AreaBef == 1 ) // return; - if ( pObj->Id == 102 ) - { - int x = 0; - } // the cut is non-trivial Ivy_FastMapNodePrepare( pAig, pObj, nLimit, vFront, vFrontOld ); // iteratively modify the cut diff --git a/src/aig/ivy/ivyFraig.c b/src/aig/ivy/ivyFraig.c index 0d9d42a3b..c306c3945 100644 --- a/src/aig/ivy/ivyFraig.c +++ b/src/aig/ivy/ivyFraig.c @@ -141,7 +141,7 @@ static inline Ivy_Obj_t * Ivy_ObjNodeHashNext( Ivy_Obj_t * pObj ) static inline Ivy_Obj_t * Ivy_ObjEquivListNext( Ivy_Obj_t * pObj ) { return pObj->pPrevFan0; } static inline Ivy_Obj_t * Ivy_ObjEquivListPrev( Ivy_Obj_t * pObj ) { return pObj->pPrevFan1; } static inline Ivy_Obj_t * Ivy_ObjFraig( Ivy_Obj_t * pObj ) { return pObj->pEquiv; } -static inline int Ivy_ObjSatNum( Ivy_Obj_t * pObj ) { return (int)pObj->pNextFan0; } +static inline int Ivy_ObjSatNum( Ivy_Obj_t * pObj ) { return (int)(PORT_PTRUINT_T)pObj->pNextFan0; } static inline Vec_Ptr_t * Ivy_ObjFaninVec( Ivy_Obj_t * pObj ) { return (Vec_Ptr_t *)pObj->pNextFan1; } static inline void Ivy_ObjSetSim( Ivy_Obj_t * pObj, Ivy_FraigSim_t * pSim ) { pObj->pFanout = (Ivy_Obj_t *)pSim; } @@ -152,7 +152,7 @@ static inline void Ivy_ObjSetNodeHashNext( Ivy_Obj_t * pObj, Ivy_Obj_t * static inline void Ivy_ObjSetEquivListNext( Ivy_Obj_t * pObj, Ivy_Obj_t * pNext ) { pObj->pPrevFan0 = pNext; } static inline void Ivy_ObjSetEquivListPrev( Ivy_Obj_t * pObj, Ivy_Obj_t * pPrev ) { pObj->pPrevFan1 = pPrev; } static inline void Ivy_ObjSetFraig( Ivy_Obj_t * pObj, Ivy_Obj_t * pNode ) { pObj->pEquiv = pNode; } -static inline void Ivy_ObjSetSatNum( Ivy_Obj_t * pObj, int Num ) { pObj->pNextFan0 = (Ivy_Obj_t *)Num; } +static inline void Ivy_ObjSetSatNum( Ivy_Obj_t * pObj, int Num ) { pObj->pNextFan0 = (Ivy_Obj_t *)(PORT_PTRUINT_T)Num; } static inline void Ivy_ObjSetFaninVec( Ivy_Obj_t * pObj, Vec_Ptr_t * vFanins ) { pObj->pNextFan1 = (Ivy_Obj_t *)vFanins; } static inline unsigned Ivy_ObjRandomSim() { return (rand() << 24) ^ (rand() << 12) ^ rand(); } @@ -252,8 +252,8 @@ int Ivy_FraigProve( Ivy_Man_t ** ppManAig, void * pPars ) Prove_Params_t * pParams = pPars; Ivy_FraigParams_t Params, * pIvyParams = &Params; Ivy_Man_t * pManAig, * pManTemp; - int RetValue, nIter, clk, timeStart = clock();//, Counter; - sint64 nSatConfs, nSatInspects; + int RetValue, nIter, clk;//, Counter; + sint64 nSatConfs = 0, nSatInspects = 0; // start the network and parameters pManAig = *ppManAig; @@ -2076,7 +2076,7 @@ void Ivy_FraigPrintActivity( Ivy_FraigMan_t * p ) ***********************************************************************/ int Ivy_FraigNodesAreEquiv( Ivy_FraigMan_t * p, Ivy_Obj_t * pOld, Ivy_Obj_t * pNew ) { - int pLits[4], RetValue, RetValue1, nBTLimit, clk, clk2 = clock(); + int pLits[4], RetValue, RetValue1, nBTLimit, clk; //, clk2 = clock(); // make sure the nodes are not complemented assert( !Ivy_IsComplement(pNew) ); @@ -2225,7 +2225,8 @@ p->timeSatFail += clock() - clk; ***********************************************************************/ int Ivy_FraigNodeIsConst( Ivy_FraigMan_t * p, Ivy_Obj_t * pNew ) { - int pLits[2], RetValue1, RetValue, clk; + int pLits[2], RetValue1, clk; +// int RetValue; // make sure the nodes are not complemented assert( !Ivy_IsComplement(pNew) ); diff --git a/src/aig/ivy/ivyMem.c b/src/aig/ivy/ivyMem.c index 2a96857c7..fd29e9ae1 100644 --- a/src/aig/ivy/ivyMem.c +++ b/src/aig/ivy/ivyMem.c @@ -96,7 +96,7 @@ void Ivy_ManAddMemory( Ivy_Man_t * p ) pMemory = ALLOC( char, nBytes ); Vec_PtrPush( p->vChunks, pMemory ); // align memory at the 32-byte boundary - pMemory = pMemory + EntrySizeMax - (((int)pMemory) & (EntrySizeMax-1)); + pMemory = pMemory + EntrySizeMax - (((int)(PORT_PTRUINT_T)pMemory) & (EntrySizeMax-1)); // remember the manager in the first entry Vec_PtrPush( p->vPages, pMemory ); // break the memory down into nodes diff --git a/src/aig/ivy/ivyMulti.c b/src/aig/ivy/ivyMulti.c index a79701564..882c2c870 100644 --- a/src/aig/ivy/ivyMulti.c +++ b/src/aig/ivy/ivyMulti.c @@ -56,7 +56,8 @@ int Ivy_MultiPlus( Ivy_Man_t * p, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vCone, Ivy_Ty { static Ivy_Eva_t pEvals[IVY_EVAL_LIMIT]; Ivy_Eva_t * pEval, * pFan0, * pFan1; - Ivy_Obj_t * pObj, * pTemp; + Ivy_Obj_t * pObj = NULL; // Suppress "might be used uninitialized" + Ivy_Obj_t * pTemp; int nEvals, nEvalsOld, i, k, x, nLeaves; unsigned uMaskAll; @@ -218,9 +219,14 @@ static inline int Ivy_MultiWeight( unsigned uMask, int nMaskOnes, unsigned uFoun int Ivy_MultiCover( Ivy_Man_t * p, Ivy_Eva_t * pEvals, int nLeaves, int nEvals, int nLimit, Vec_Ptr_t * vSols ) { int fVerbose = 0; - Ivy_Eva_t * pEval, * pEvalBest; + Ivy_Eva_t * pEval; + Ivy_Eva_t * pEvalBest = NULL; // Suppress "might be used uninitialized" unsigned uMaskAll, uFound, uTemp; - int i, k, BestK, WeightBest, WeightCur, LevelBest, LevelCur; + int i, k, BestK; + int WeightBest = -1; // Suppress "might be used uninitialized" + int WeightCur; + int LevelBest = -1; // Suppress "might be used uninitialized" + int LevelCur; uMaskAll = (nLeaves == 32)? (~(unsigned)0) : ((1 << nLeaves) - 1); uFound = 0; // solve the covering problem diff --git a/src/aig/ivy/ivyRwr.c b/src/aig/ivy/ivyRwr.c index 3f8720ba3..8bfeb03c0 100644 --- a/src/aig/ivy/ivyRwr.c +++ b/src/aig/ivy/ivyRwr.c @@ -81,7 +81,7 @@ int Ivy_ManRewritePre( Ivy_Man_t * p, int fUpdateLevel, int fUseZeroCost, int fV break; // for each cut, try to resynthesize it nGain = Ivy_NodeRewrite( p, pManRwt, pNode, fUpdateLevel, fUseZeroCost ); - if ( nGain > 0 || nGain == 0 && fUseZeroCost ) + if ( nGain > 0 || (nGain == 0 && fUseZeroCost) ) { Dec_Graph_t * pGraph = Rwt_ManReadDecs(pManRwt); int fCompl = Rwt_ManReadCompl(pManRwt); @@ -122,7 +122,7 @@ Rwt_ManAddTimeTotal( pManRwt, clock() - clkStart ); else Ivy_ManResetLevels( p ); // check - if ( i = Ivy_ManCleanup(p) ) + if ( (i = Ivy_ManCleanup(p)) ) printf( "Cleanup after rewriting removed %d dangling nodes.\n", i ); if ( !Ivy_ManCheck(p) ) printf( "Ivy_ManRewritePre(): The check has failed.\n" ); @@ -154,9 +154,12 @@ int Ivy_NodeRewrite( Ivy_Man_t * pMan, Rwt_Man_t * p, Ivy_Obj_t * pNode, int fUp Ivy_Store_t * pStore; Ivy_Cut_t * pCut; Ivy_Obj_t * pFanin; - unsigned uPhase, uTruthBest, uTruth; + unsigned uPhase; + unsigned uTruthBest = 0; // Suppress "might be used uninitialized" + unsigned uTruth; char * pPerm; - int Required, nNodesSaved, nNodesSaveCur; + int Required, nNodesSaved; + int nNodesSaveCur = -1; // Suppress "might be used uninitialized" int i, c, GainCur, GainBest = -1; int clk, clk2; @@ -190,14 +193,14 @@ clk = clock(); clk2 = clock(); uTruth = 0xFFFF & Ivy_NodeGetTruth( pNode, pCut->pArray, pCut->nSize ); // truth table p->timeTruth += clock() - clk2; - pPerm = p->pPerms4[ p->pPerms[uTruth] ]; + pPerm = p->pPerms4[ (int) p->pPerms[uTruth] ]; uPhase = p->pPhases[uTruth]; // collect fanins with the corresponding permutation/phase Vec_PtrClear( p->vFaninsCur ); Vec_PtrFill( p->vFaninsCur, (int)pCut->nSize, 0 ); for ( i = 0; i < (int)pCut->nSize; i++ ) { - pFanin = Ivy_ManObj( pMan, pCut->pArray[pPerm[i]] ); + pFanin = Ivy_ManObj( pMan, pCut->pArray[(int)pPerm[i]] ); assert( Ivy_ObjIsNode(pFanin) || Ivy_ObjIsCi(pFanin) ); pFanin = Ivy_NotCond(pFanin, ((uPhase & (1< 0) ); Vec_PtrWriteEntry( p->vFaninsCur, i, pFanin ); @@ -355,7 +358,8 @@ unsigned Ivy_NodeGetTruth( Ivy_Obj_t * pObj, int * pNums, int nNums ) Dec_Graph_t * Rwt_CutEvaluate( Ivy_Man_t * pMan, Rwt_Man_t * p, Ivy_Obj_t * pRoot, Vec_Ptr_t * vFaninsCur, int nNodesSaved, int LevelMax, int * pGainBest, unsigned uTruth ) { Vec_Ptr_t * vSubgraphs; - Dec_Graph_t * pGraphBest, * pGraphCur; + Dec_Graph_t * pGraphBest = NULL; // Suppress "might be used uninitialized" + Dec_Graph_t * pGraphCur; Rwt_Node_t * pNode, * pFanin; int nNodesAdded, GainBest, i, k; // find the matching class of subgraphs @@ -478,7 +482,7 @@ int Ivy_GraphToNetworkCount( Ivy_Man_t * p, Ivy_Obj_t * pRoot, Dec_Graph_t * pGr Ivy_Obj_t * Ivy_GraphToNetwork( Ivy_Man_t * p, Dec_Graph_t * pGraph ) { Ivy_Obj_t * pAnd0, * pAnd1; - Dec_Node_t * pNode; + Dec_Node_t * pNode = NULL; // Suppress "might be used uninitialized" int i; // check for constant function if ( Dec_GraphIsConst(pGraph) ) diff --git a/src/aig/ivy/ivySeq.c b/src/aig/ivy/ivySeq.c index 0ee29feee..f4585fa29 100644 --- a/src/aig/ivy/ivySeq.c +++ b/src/aig/ivy/ivySeq.c @@ -91,7 +91,7 @@ int Ivy_ManRewriteSeq( Ivy_Man_t * p, int fUseZeroCost, int fVerbose ) break; // for each cut, try to resynthesize it nGain = Ivy_NodeRewriteSeq( p, pManRwt, pNode, fUseZeroCost ); - if ( nGain > 0 || nGain == 0 && fUseZeroCost ) + if ( nGain > 0 || (nGain == 0 && fUseZeroCost) ) { Dec_Graph_t * pGraph = Rwt_ManReadDecs(pManRwt); int fCompl = Rwt_ManReadCompl(pManRwt); @@ -147,9 +147,12 @@ int Ivy_NodeRewriteSeq( Ivy_Man_t * pMan, Rwt_Man_t * p, Ivy_Obj_t * pNode, int Ivy_Cut_t * pCut; Ivy_Obj_t * pFanin;//, * pFanout; Vec_Ptr_t * vFanout; - unsigned uPhase, uTruthBest, uTruth;//, nNewClauses; + unsigned uPhase; + unsigned uTruthBest = 0; // Suppress "might be used uninitialized" + unsigned uTruth;//, nNewClauses; char * pPerm; - int nNodesSaved, nNodesSaveCur; + int nNodesSaved; + int nNodesSaveCur = -1; // Suppress "might be used uninitialized" int i, c, GainCur, GainBest = -1; int clk, clk2;//, clk3; @@ -182,14 +185,14 @@ clk = clock(); clk2 = clock(); uTruth = 0xFFFF & Ivy_CutGetTruth( pMan, pNode, pCut->pArray, pCut->nSize ); // truth table p->timeTruth += clock() - clk2; - pPerm = p->pPerms4[ p->pPerms[uTruth] ]; + pPerm = p->pPerms4[ (int)p->pPerms[uTruth] ]; uPhase = p->pPhases[uTruth]; // collect fanins with the corresponding permutation/phase Vec_PtrClear( p->vFaninsCur ); Vec_PtrFill( p->vFaninsCur, (int)pCut->nSize, 0 ); for ( i = 0; i < (int)pCut->nSize; i++ ) { - pFanin = Ivy_ManObj( pMan, Ivy_LeafId( pCut->pArray[pPerm[i]] ) ); + pFanin = Ivy_ManObj( pMan, Ivy_LeafId( pCut->pArray[(int)pPerm[i]] ) ); assert( Ivy_ObjIsNode(pFanin) || Ivy_ObjIsCi(pFanin) || Ivy_ObjIsConst1(pFanin) ); pFanin = Ivy_NotCond(pFanin, ((uPhase & (1< 0) ); Vec_PtrWriteEntry( p->vFaninsCur, i, pFanin ); @@ -305,7 +308,8 @@ p->timeRes += clock() - clk; Dec_Graph_t * Rwt_CutEvaluateSeq( Ivy_Man_t * pMan, Rwt_Man_t * p, Ivy_Obj_t * pRoot, Ivy_Cut_t * pCut, char * pPerm, Vec_Ptr_t * vFaninsCur, int nNodesSaved, int * pGainBest, unsigned uTruth ) { Vec_Ptr_t * vSubgraphs; - Dec_Graph_t * pGraphBest, * pGraphCur; + Dec_Graph_t * pGraphBest = NULL; // Suppress "might be used uninitialized" + Dec_Graph_t * pGraphCur; Rwt_Node_t * pNode; int nNodesAdded, GainBest, i; // find the matching class of subgraphs @@ -364,7 +368,7 @@ void Ivy_GraphPrepare( Dec_Graph_t * pGraph, Ivy_Cut_t * pCut, Vec_Ptr_t * vFani Dec_GraphForEachLeaf( pGraph, pNode, i ) { pNode->pFunc = Vec_PtrEntry( vFanins, i ); - pNode->nLat2 = Ivy_LeafLat( pCut->pArray[pPerm[i]] ); + pNode->nLat2 = Ivy_LeafLat( pCut->pArray[(int)pPerm[i]] ); } // propagate latches through the nodes Dec_GraphForEachNode( pGraph, pNode, i ) @@ -470,7 +474,7 @@ int Ivy_GraphToNetworkSeqCountSeq( Ivy_Man_t * p, Ivy_Obj_t * pRoot, Dec_Graph_t Ivy_Obj_t * Ivy_GraphToNetworkSeq( Ivy_Man_t * p, Dec_Graph_t * pGraph ) { Ivy_Obj_t * pAnd0, * pAnd1; - Dec_Node_t * pNode; + Dec_Node_t * pNode = NULL; // Suppress "might be used uninitialized" int i, k; // check for constant function if ( Dec_GraphIsConst(pGraph) ) @@ -1021,7 +1025,6 @@ Ivy_Store_t * Ivy_CutComputeForNode( Ivy_Man_t * p, Ivy_Obj_t * pObj, int nLeave { static Ivy_Store_t CutStore, * pCutStore = &CutStore; Ivy_Cut_t CutNew, * pCutNew = &CutNew, * pCut; - Ivy_Man_t * pMan = p; Ivy_Obj_t * pLeaf; int i, k, Temp, nLats, iLeaf0, iLeaf1; diff --git a/src/aig/ivy/ivyShow.c b/src/aig/ivy/ivyShow.c index cd726e431..4fac27094 100644 --- a/src/aig/ivy/ivyShow.c +++ b/src/aig/ivy/ivyShow.c @@ -44,7 +44,7 @@ static void Ivy_WriteDotAig( Ivy_Man_t * pMan, char * pFileName, int fHaig, Vec_ void Ivy_ManShow( Ivy_Man_t * pMan, int fHaig, Vec_Ptr_t * vBold ) { extern void Abc_ShowFile( char * FileNameDot ); - static Counter = 0; + static int Counter = 0; char FileNameDot[200]; FILE * pFile; // create the file name diff --git a/src/aig/kit/cloud.h b/src/aig/kit/cloud.h index fa7f2fce4..ec8e90591 100644 --- a/src/aig/kit/cloud.h +++ b/src/aig/kit/cloud.h @@ -176,8 +176,8 @@ struct cloudCacheEntry3 // the three-argument cache #define DD_P2 4256249 #define DD_P3 741457 #define DD_P4 1618033999 -#define cloudHashCudd2(f,g,s) ((((unsigned)(f) * DD_P1 + (unsigned)(g)) * DD_P2) >> (s)) -#define cloudHashCudd3(f,g,h,s) (((((unsigned)(f) * DD_P1 + (unsigned)(g)) * DD_P2 + (unsigned)(h)) * DD_P3) >> (s)) +#define cloudHashCudd2(f,g,s) ((((unsigned)(PORT_PTRUINT_T)(f) * DD_P1 + (unsigned)(PORT_PTRUINT_T)(g)) * DD_P2) >> (s)) +#define cloudHashCudd3(f,g,h,s) (((((unsigned)(PORT_PTRUINT_T)(f) * DD_P1 + (unsigned)(PORT_PTRUINT_T)(g)) * DD_P2 + (unsigned)(PORT_PTRUINT_T)(h)) * DD_P3) >> (s)) // node complementation (using node) #define Cloud_Regular(p) ((CloudNode*)(((PORT_PTRUINT_T)(p)) & ~01)) // get the regular node (w/o bubble) diff --git a/src/aig/kit/kitBdd.c b/src/aig/kit/kitBdd.c index 9c8d4f7a8..75caf9490 100644 --- a/src/aig/kit/kitBdd.c +++ b/src/aig/kit/kitBdd.c @@ -88,7 +88,7 @@ DdNode * Kit_SopToBdd( DdManager * dd, Kit_Sop_t * cSop, int nVars ) DdNode * Kit_GraphToBdd( DdManager * dd, Kit_Graph_t * pGraph ) { DdNode * bFunc, * bFunc0, * bFunc1; - Kit_Node_t * pNode; + Kit_Node_t * pNode = NULL; // Suppress "might be used uninitialized" int i; // sanity checks diff --git a/src/aig/kit/kitCloud.c b/src/aig/kit/kitCloud.c index 7b160fea3..525f89f57 100644 --- a/src/aig/kit/kitCloud.c +++ b/src/aig/kit/kitCloud.c @@ -304,14 +304,16 @@ unsigned * Kit_TruthCompose( CloudManager * dd, unsigned * pTruth, int nVars, void Kit_TruthCofSupports( Vec_Int_t * vBddDir, Vec_Int_t * vBddInv, int nVars, Vec_Int_t * vMemory, unsigned * puSupps ) { Kit_Mux_t Mux; - unsigned * puSuppAll, * pThis, * pFan0, * pFan1; + unsigned * puSuppAll; + unsigned * pThis = NULL; // Suppress "might be used uninitialized" + unsigned * pFan0, * pFan1; int i, v, Var, Entry, nSupps; nSupps = 2 * nVars; // extend storage if ( Vec_IntSize( vMemory ) < nSupps * Vec_IntSize(vBddDir) ) Vec_IntGrow( vMemory, nSupps * Vec_IntSize(vBddDir) ); - puSuppAll = Vec_IntArray( vMemory ); + puSuppAll = (unsigned *)Vec_IntArray( vMemory ); // clear storage for the const node memset( puSuppAll, 0, sizeof(unsigned) * nSupps ); // compute supports from nodes @@ -336,7 +338,7 @@ void Kit_TruthCofSupports( Vec_Int_t * vBddDir, Vec_Int_t * vBddInv, int nVars, // extend storage if ( Vec_IntSize( vMemory ) < nSupps * Vec_IntSize(vBddInv) ) Vec_IntGrow( vMemory, nSupps * Vec_IntSize(vBddInv) ); - puSuppAll = Vec_IntArray( vMemory ); + puSuppAll = (unsigned *)Vec_IntArray( vMemory ); // clear storage for the const node memset( puSuppAll, 0, sizeof(unsigned) * nSupps ); // compute supports from nodes diff --git a/src/aig/kit/kitDsd.c b/src/aig/kit/kitDsd.c index a397d452a..8d670419e 100644 --- a/src/aig/kit/kitDsd.c +++ b/src/aig/kit/kitDsd.c @@ -1018,7 +1018,7 @@ unsigned Kit_DsdNonDsdSupports( Kit_DsdNtk_t * pNtk ) SeeAlso [] ***********************************************************************/ -void Kit_DsdExpandCollectAnd_rec( Kit_DsdNtk_t * p, int iLit, int * piLitsNew, int * nLitsNew ) +void Kit_DsdExpandCollectAnd_rec( Kit_DsdNtk_t * p, unsigned iLit, unsigned * piLitsNew, int * nLitsNew ) { Kit_DsdObj_t * pObj; unsigned i, iLitFanin; @@ -1045,7 +1045,7 @@ void Kit_DsdExpandCollectAnd_rec( Kit_DsdNtk_t * p, int iLit, int * piLitsNew, i SeeAlso [] ***********************************************************************/ -void Kit_DsdExpandCollectXor_rec( Kit_DsdNtk_t * p, int iLit, int * piLitsNew, int * nLitsNew ) +void Kit_DsdExpandCollectXor_rec( Kit_DsdNtk_t * p, unsigned iLit, unsigned * piLitsNew, int * nLitsNew ) { Kit_DsdObj_t * pObj; unsigned i, iLitFanin; @@ -1179,7 +1179,7 @@ Kit_DsdNtk_t * Kit_DsdExpand( Kit_DsdNtk_t * p ) SeeAlso [] ***********************************************************************/ -void Kit_DsdCompSort( int pPrios[], unsigned uSupps[], unsigned char * piLits, int nVars, int piLitsRes[] ) +void Kit_DsdCompSort( int pPrios[], unsigned uSupps[], unsigned char * piLits, int nVars, unsigned piLitsRes[] ) { int nSuppSizes[16], Priority[16], pOrder[16]; int i, k, iVarBest, SuppMax, PrioMax; @@ -1236,7 +1236,8 @@ void Kit_DsdCompSort( int pPrios[], unsigned uSupps[], unsigned char * piLits, i ***********************************************************************/ int Kit_DsdShrink_rec( Kit_DsdNtk_t * pNew, Kit_DsdNtk_t * p, int iLit, int pPrios[] ) { - Kit_DsdObj_t * pObj, * pObjNew; + Kit_DsdObj_t * pObj; + Kit_DsdObj_t * pObjNew = NULL; // Suppress "might be used uninitialized" unsigned * pTruth, * pTruthNew; unsigned i, piLitsNew[16], uSupps[16]; int iLitFanin, iLitNew; @@ -2265,7 +2266,14 @@ int Kit_DsdCofactoringGetVars( Kit_DsdNtk_t ** ppNtk, int nSize, int * pVars ) ***********************************************************************/ int Kit_DsdCofactoring( unsigned * pTruth, int nVars, int * pCofVars, int nLimit, int fVerbose ) { - Kit_DsdNtk_t * ppNtks[5][16] = {0}, * pTemp; + Kit_DsdNtk_t * ppNtks[5][16] = { + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} + }; + Kit_DsdNtk_t * pTemp; unsigned * ppCofs[5][16]; int pTryVars[16], nTryVars; int nPrimeSizeMin, nPrimeSizeMax, nPrimeSizeCur; diff --git a/src/aig/kit/kitSop.c b/src/aig/kit/kitSop.c index 20ad06517..8e175dac7 100644 --- a/src/aig/kit/kitSop.c +++ b/src/aig/kit/kitSop.c @@ -174,7 +174,9 @@ void Kit_SopDivideByCube( Kit_Sop_t * cSop, Kit_Sop_t * cDiv, Kit_Sop_t * vQuo, ***********************************************************************/ void Kit_SopDivideInternal( Kit_Sop_t * cSop, Kit_Sop_t * cDiv, Kit_Sop_t * vQuo, Kit_Sop_t * vRem, Vec_Int_t * vMemory ) { - unsigned uCube, uDiv, uCube2, uDiv2, uQuo; + unsigned uCube, uDiv; + unsigned uCube2 = 0; // Suppress "might be used uninitialized" + unsigned uDiv2, uQuo; int i, i2, k, k2, nCubesRem; assert( Kit_SopCubeNum(cSop) >= Kit_SopCubeNum(cDiv) ); // consider special case diff --git a/src/aig/mfx/mfxCore.c b/src/aig/mfx/mfxCore.c index 48107e7e1..a7cd3e3c0 100644 --- a/src/aig/mfx/mfxCore.c +++ b/src/aig/mfx/mfxCore.c @@ -198,7 +198,6 @@ int Mfx_Perform( Nwk_Man_t * pNtk, Mfx_Par_t * pPars, If_Lib_t * pLutLib ) Bdc_Par_t Pars = {0}, * pDecPars = &Pars; Bar_Progress_t * pProgress; Mfx_Man_t * p; - Tim_Man_t * pManTimeOld = NULL; Nwk_Obj_t * pObj; Vec_Vec_t * vLevels; Vec_Ptr_t * vNodes; diff --git a/src/aig/ntl/ntlCheck.c b/src/aig/ntl/ntlCheck.c index b4125804c..03e9e898c 100644 --- a/src/aig/ntl/ntlCheck.c +++ b/src/aig/ntl/ntlCheck.c @@ -106,7 +106,7 @@ int Ntl_ModelCheck( Ntl_Mod_t * pModel, int fMain ) { if ( Ntl_ModelLatchNum(pModel) > 0 ) { - printf( "Root level model has %d registers.\n", pModel->pName, Ntl_ModelLatchNum(pModel) ); + printf( "Root level model %s has %d registers.\n", pModel->pName, Ntl_ModelLatchNum(pModel) ); fStatus = 0; } goto checkobjs; diff --git a/src/aig/ntl/ntlExtract.c b/src/aig/ntl/ntlExtract.c index 8049ffb83..f6f1ebb2c 100644 --- a/src/aig/ntl/ntlExtract.c +++ b/src/aig/ntl/ntlExtract.c @@ -85,7 +85,7 @@ Aig_Obj_t * Ntl_ConvertSopToAigInternal( Aig_Man_t * pMan, Ntl_Obj_t * pNode, ch ***********************************************************************/ Aig_Obj_t * Ntl_GraphToNetworkAig( Aig_Man_t * pMan, Dec_Graph_t * pGraph ) { - Dec_Node_t * pNode; + Dec_Node_t * pNode = NULL; // Suppress "might be used uninitialized" Aig_Obj_t * pAnd0, * pAnd1; int i; // check for constant function @@ -526,15 +526,16 @@ Aig_Man_t * Ntl_ManCollapse( Ntl_Man_t * p, int fSeq ) } nTruePis = Aig_ManPiNum(p->pAig); // create inputs of seq boxes - if ( fSeq ) - Ntl_ModelForEachBox( pRoot, pBox, i ) - { - if ( !(Ntl_BoxIsSeq(pBox) && Ntl_BoxIsWhite(pBox)) ) - continue; - Vec_IntPush( p->vBox1Cios, Aig_ManPiNum(p->pAig) ); - Ntl_ManCollapseBoxSeq1_rec( p, pBox, fSeq ); - Ntl_ObjForEachFanout( pBox, pNet, k ) - pNet->nVisits = 2; + if ( fSeq ) { + Ntl_ModelForEachBox( pRoot, pBox, i ) + { + if ( !(Ntl_BoxIsSeq(pBox) && Ntl_BoxIsWhite(pBox)) ) + continue; + Vec_IntPush( p->vBox1Cios, Aig_ManPiNum(p->pAig) ); + Ntl_ManCollapseBoxSeq1_rec( p, pBox, fSeq ); + Ntl_ObjForEachFanout( pBox, pNet, k ) + pNet->nVisits = 2; + } } // derive the outputs Ntl_ManForEachCoNet( p, pNet, i ) @@ -548,18 +549,19 @@ Aig_Man_t * Ntl_ManCollapse( Ntl_Man_t * p, int fSeq ) } nTruePos = Aig_ManPoNum(p->pAig); // create outputs of seq boxes - if ( fSeq ) - Ntl_ModelForEachBox( pRoot, pBox, i ) - { - if ( !(Ntl_BoxIsSeq(pBox) && Ntl_BoxIsWhite(pBox)) ) - continue; - Ntl_ObjForEachFanin( pBox, pNet, k ) - if ( !Ntl_ManCollapse_rec( p, pNet, fSeq ) ) - { - printf( "Ntl_ManCollapse(): Error: Combinational loop is detected.\n" ); - return 0; - } - Ntl_ManCollapseBoxSeq2_rec( p, pBox, fSeq, Vec_IntEntry(p->vBox1Cios, iBox++) ); + if ( fSeq ) { + Ntl_ModelForEachBox( pRoot, pBox, i ) + { + if ( !(Ntl_BoxIsSeq(pBox) && Ntl_BoxIsWhite(pBox)) ) + continue; + Ntl_ObjForEachFanin( pBox, pNet, k ) + if ( !Ntl_ManCollapse_rec( p, pNet, fSeq ) ) + { + printf( "Ntl_ManCollapse(): Error: Combinational loop is detected.\n" ); + return 0; + } + Ntl_ManCollapseBoxSeq2_rec( p, pBox, fSeq, Vec_IntEntry(p->vBox1Cios, iBox++) ); + } } // make sure registers are added correctly if ( Aig_ManPiNum(p->pAig) - nTruePis != Aig_ManPoNum(p->pAig) - nTruePos ) diff --git a/src/aig/ntl/ntlObj.c b/src/aig/ntl/ntlObj.c index 10bfbbb7e..55924db99 100644 --- a/src/aig/ntl/ntlObj.c +++ b/src/aig/ntl/ntlObj.c @@ -177,7 +177,7 @@ Ntl_Obj_t * Ntl_ModelCreateBox( Ntl_Mod_t * pModel, int nFanins, int nFanouts ) ***********************************************************************/ Ntl_Obj_t * Ntl_ModelDupObj( Ntl_Mod_t * pModel, Ntl_Obj_t * pOld ) { - Ntl_Obj_t * pNew; + Ntl_Obj_t * pNew = NULL; // Supprses "might be used uninitialized" if ( Ntl_ObjIsPi( pOld ) ) pNew = Ntl_ModelCreatePi( pModel ); else if ( Ntl_ObjIsPo( pOld ) ) diff --git a/src/aig/ntl/ntlReadBlif.c b/src/aig/ntl/ntlReadBlif.c index cc019732f..e1b351b30 100644 --- a/src/aig/ntl/ntlReadBlif.c +++ b/src/aig/ntl/ntlReadBlif.c @@ -18,8 +18,10 @@ ***********************************************************************/ +// The code in this file is developed in collaboration with Mark Jarvin of Toronto. + #include "ntl.h" -#include +#include "bzlib.h" //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// @@ -803,7 +805,7 @@ static int Ioa_ReadParseLineModel( Ioa_ReadMod_t * p, char * pLine ) p->pNtk = Ntl_ModelAlloc( p->pMan->pDesign, Vec_PtrEntry(vTokens, 1) ); if ( p->pNtk == NULL ) { - sprintf( p->pMan->sError, "Line %d: Model %s already exists.", Ioa_ReadGetLine(p->pMan, pToken), Vec_PtrEntry(vTokens, 1) ); + sprintf( p->pMan->sError, "Line %d: Model %s already exists.", Ioa_ReadGetLine(p->pMan, pToken), (char*)Vec_PtrEntry(vTokens, 1) ); return 0; } return 1; @@ -961,7 +963,7 @@ static int Ioa_ReadParseLineLatch( Ioa_ReadMod_t * p, char * pLine ) pObj->LatchId.regInit = 2; if ( pObj->LatchId.regInit < 0 || pObj->LatchId.regInit > 2 ) { - sprintf( p->pMan->sError, "Line %d: Initial state of the latch is incorrect \"%s\".", Ioa_ReadGetLine(p->pMan, pToken), Vec_PtrEntry(vTokens,3) ); + sprintf( p->pMan->sError, "Line %d: Initial state of the latch is incorrect \"%s\".", Ioa_ReadGetLine(p->pMan, pToken), (char*)Vec_PtrEntry(vTokens,3) ); return 0; } // get the register class @@ -988,7 +990,7 @@ static int Ioa_ReadParseLineLatch( Ioa_ReadMod_t * p, char * pLine ) } if ( pObj->LatchId.regClass < 0 || pObj->LatchId.regClass > (1<<24) ) { - sprintf( p->pMan->sError, "Line %d: Class of the latch is incorrect \"%s\".", Ioa_ReadGetLine(p->pMan, pToken), Vec_PtrEntry(vTokens,3) ); + sprintf( p->pMan->sError, "Line %d: Class of the latch is incorrect \"%s\".", Ioa_ReadGetLine(p->pMan, pToken), (char*)Vec_PtrEntry(vTokens,3) ); return 0; } // get the clock @@ -1134,7 +1136,7 @@ static int Ioa_ReadParseLineDelay( Ioa_ReadMod_t * p, char * pLine ) Delay = atof( pTokenNum ); if ( Delay == 0.0 && pTokenNum[0] != '0' ) { - sprintf( p->pMan->sError, "Line %d: Delay value (%s) appears to be invalid.", Ioa_ReadGetLine(p->pMan, pToken), Vec_PtrEntryLast(vTokens) ); + sprintf( p->pMan->sError, "Line %d: Delay value (%s) appears to be invalid.", Ioa_ReadGetLine(p->pMan, pToken), (char*)Vec_PtrEntryLast(vTokens) ); return 0; } // find the PI/PO numbers @@ -1144,7 +1146,7 @@ static int Ioa_ReadParseLineDelay( Ioa_ReadMod_t * p, char * pLine ) RetValue1 = Ntl_ModelFindPioNumber( p->pNtk, 0, 0, Vec_PtrEntry(vTokens, 1), &Number1 ); if ( RetValue1 == 0 ) { - sprintf( p->pMan->sError, "Line %d: Cannot find signal \"%s\" among PIs/POs.", Ioa_ReadGetLine(p->pMan, pToken), Vec_PtrEntry(vTokens, 1) ); + sprintf( p->pMan->sError, "Line %d: Cannot find signal \"%s\" among PIs/POs.", Ioa_ReadGetLine(p->pMan, pToken), (char*)Vec_PtrEntry(vTokens, 1) ); return 0; } } @@ -1154,14 +1156,14 @@ static int Ioa_ReadParseLineDelay( Ioa_ReadMod_t * p, char * pLine ) RetValue2 = Ntl_ModelFindPioNumber( p->pNtk, 0, 0, Vec_PtrEntry(vTokens, 2), &Number2 ); if ( RetValue2 == 0 ) { - sprintf( p->pMan->sError, "Line %d: Cannot find signal \"%s\" among PIs/POs.", Ioa_ReadGetLine(p->pMan, pToken), Vec_PtrEntry(vTokens, 2) ); + sprintf( p->pMan->sError, "Line %d: Cannot find signal \"%s\" among PIs/POs.", Ioa_ReadGetLine(p->pMan, pToken), (char*)Vec_PtrEntry(vTokens, 2) ); return 0; } } if ( RetValue1 == RetValue2 && RetValue1 ) { sprintf( p->pMan->sError, "Line %d: Both signals \"%s\" and \"%s\" listed appear to be PIs or POs.", - Ioa_ReadGetLine(p->pMan, pToken), Vec_PtrEntry(vTokens, 1), Vec_PtrEntry(vTokens, 2) ); + Ioa_ReadGetLine(p->pMan, pToken), (char*)Vec_PtrEntry(vTokens, 1), (char*)Vec_PtrEntry(vTokens, 2) ); return 0; } if ( RetValue2 < RetValue1 ) @@ -1219,7 +1221,7 @@ static int Ioa_ReadParseLineTimes( Ioa_ReadMod_t * p, char * pLine, int fOutput Delay = atof( pTokenNum ); if ( Delay == 0.0 && pTokenNum[0] != '0' ) { - sprintf( p->pMan->sError, "Line %d: Delay value (%s) appears to be invalid.", Ioa_ReadGetLine(p->pMan, pToken), Vec_PtrEntryLast(vTokens) ); + sprintf( p->pMan->sError, "Line %d: Delay value (%s) appears to be invalid.", Ioa_ReadGetLine(p->pMan, pToken), (char*)Vec_PtrEntryLast(vTokens) ); return 0; } // find the PI/PO numbers @@ -1230,7 +1232,7 @@ static int Ioa_ReadParseLineTimes( Ioa_ReadMod_t * p, char * pLine, int fOutput RetValue = Ntl_ModelFindPioNumber( p->pNtk, 0, 1, Vec_PtrEntry(vTokens, 1), &Number ); if ( RetValue == 0 ) { - sprintf( p->pMan->sError, "Line %d: Cannot find signal \"%s\" among POs.", Ioa_ReadGetLine(p->pMan, pToken), Vec_PtrEntry(vTokens, 1) ); + sprintf( p->pMan->sError, "Line %d: Cannot find signal \"%s\" among POs.", Ioa_ReadGetLine(p->pMan, pToken), (char*)Vec_PtrEntry(vTokens, 1) ); return 0; } } @@ -1247,7 +1249,7 @@ static int Ioa_ReadParseLineTimes( Ioa_ReadMod_t * p, char * pLine, int fOutput RetValue = Ntl_ModelFindPioNumber( p->pNtk, 1, 0, Vec_PtrEntry(vTokens, 1), &Number ); if ( RetValue == 0 ) { - sprintf( p->pMan->sError, "Line %d: Cannot find signal \"%s\" among PIs.", Ioa_ReadGetLine(p->pMan, pToken), Vec_PtrEntry(vTokens, 1) ); + sprintf( p->pMan->sError, "Line %d: Cannot find signal \"%s\" among PIs.", Ioa_ReadGetLine(p->pMan, pToken), (char*)Vec_PtrEntry(vTokens, 1) ); return 0; } } diff --git a/src/aig/ntl/ntlTime.c b/src/aig/ntl/ntlTime.c index ee3e489b9..121fb8ea3 100644 --- a/src/aig/ntl/ntlTime.c +++ b/src/aig/ntl/ntlTime.c @@ -91,20 +91,21 @@ void Ntl_ManUnpackLeafTiming( Ntl_Man_t * p, Tim_Man_t * pMan ) pNet->dTemp = 0; // store the PI timing vTimes = pRoot->vTimeInputs; - if ( vTimes ) - Vec_IntForEachEntry( vTimes, Entry, i ) - { - dTime = Aig_Int2Float( Vec_IntEntry(vTimes,++i) ); - if ( Entry == -1 ) - { - Ntl_ModelForEachPi( pRoot, pObj, v ) - Ntl_ObjFanout0(pObj)->dTemp = dTime; - } - else - { - pObj = Ntl_ModelPi( pRoot, Entry ); - Ntl_ObjFanout0(pObj)->dTemp = dTime; - } + if ( vTimes ) { + Vec_IntForEachEntry( vTimes, Entry, i ) + { + dTime = Aig_Int2Float( Vec_IntEntry(vTimes,++i) ); + if ( Entry == -1 ) + { + Ntl_ModelForEachPi( pRoot, pObj, v ) + Ntl_ObjFanout0(pObj)->dTemp = dTime; + } + else + { + pObj = Ntl_ModelPi( pRoot, Entry ); + Ntl_ObjFanout0(pObj)->dTemp = dTime; + } + } } // store box timing Ntl_ModelForEachMapLeaf( pRoot, pObj, k ) diff --git a/src/aig/ntl/ntlWriteBlif.c b/src/aig/ntl/ntlWriteBlif.c index 8c97d3d01..0ba330fb1 100644 --- a/src/aig/ntl/ntlWriteBlif.c +++ b/src/aig/ntl/ntlWriteBlif.c @@ -18,10 +18,12 @@ ***********************************************************************/ +// The code in this file is developed in collaboration with Mark Jarvin of Toronto. + #include "ntl.h" #include "ioa.h" -#include +#include "bzlib.h" #include #ifdef _WIN32 diff --git a/src/aig/nwk/nwkFanio.c b/src/aig/nwk/nwkFanio.c index 89bf60ee5..4068a1a51 100644 --- a/src/aig/nwk/nwkFanio.c +++ b/src/aig/nwk/nwkFanio.c @@ -232,7 +232,7 @@ void Nwk_ObjPatchFanin( Nwk_Obj_t * pObj, Nwk_Obj_t * pFaninOld, Nwk_Obj_t * pFa if ( iFanin == -1 ) { printf( "Nwk_ObjPatchFanin(); Error! Node %d is not among", pFaninOld->Id ); - printf( " the fanins of node %s...\n", pObj->Id ); + printf( " the fanins of node %d...\n", pObj->Id ); return; } pObj->pFanio[iFanin] = pFaninNew; diff --git a/src/aig/nwk/nwkFlow.c b/src/aig/nwk/nwkFlow.c index 48496158c..b61550560 100644 --- a/src/aig/nwk/nwkFlow.c +++ b/src/aig/nwk/nwkFlow.c @@ -78,7 +78,7 @@ static inline void Nwk_ObjSetVisitedTop( Nwk_Obj_t * pObj ) else assert( 0 ); } -static inline Nwk_ManIncrementTravIdFlow( Nwk_Man_t * pMan ) +static inline void Nwk_ManIncrementTravIdFlow( Nwk_Man_t * pMan ) { Nwk_ManIncrementTravId( pMan ); Nwk_ManIncrementTravId( pMan ); diff --git a/src/aig/nwk/nwkMan.c b/src/aig/nwk/nwkMan.c index da402f21f..d9a418491 100644 --- a/src/aig/nwk/nwkMan.c +++ b/src/aig/nwk/nwkMan.c @@ -140,11 +140,11 @@ int Nwk_ManCompareAndSaveBest( Nwk_Man_t * pNtk, void * pNtl ) ParsNew.nPis = Nwk_ManPiNum( pNtk ); ParsNew.nPos = Nwk_ManPoNum( pNtk ); // reset the parameters if the network has the same name - if ( ParsBest.pName == NULL || - strcmp(ParsBest.pName, pNtk->pName) || - ParsBest.Depth > ParsNew.Depth || - ParsBest.Depth == ParsNew.Depth && ParsBest.Flops > ParsNew.Flops || - ParsBest.Depth == ParsNew.Depth && ParsBest.Flops == ParsNew.Flops && ParsBest.Nodes > ParsNew.Nodes ) + if ( ParsBest.pName == NULL || + strcmp(ParsBest.pName, pNtk->pName) || + ParsBest.Depth > ParsNew.Depth || + (ParsBest.Depth == ParsNew.Depth && ParsBest.Flops > ParsNew.Flops) || + (ParsBest.Depth == ParsNew.Depth && ParsBest.Flops == ParsNew.Flops && ParsBest.Nodes > ParsNew.Nodes) ) { FREE( ParsBest.pName ); ParsBest.pName = Aig_UtilStrsav( pNtk->pName ); diff --git a/src/aig/nwk/nwkSpeedup.c b/src/aig/nwk/nwkSpeedup.c index b7802f72a..469e9b71c 100644 --- a/src/aig/nwk/nwkSpeedup.c +++ b/src/aig/nwk/nwkSpeedup.c @@ -221,8 +221,8 @@ Aig_Man_t * Nwk_ManSpeedup( Nwk_Man_t * pNtk, int fUseLutLib, int Percentage, in printf( "\n" ); } // mark the timing critical nodes and edges - puTCEdges = ALLOC( int, Nwk_ManObjNumMax(pNtk) ); - memset( puTCEdges, 0, sizeof(int) * Nwk_ManObjNumMax(pNtk) ); + puTCEdges = ALLOC( unsigned, Nwk_ManObjNumMax(pNtk) ); + memset( puTCEdges, 0, sizeof(unsigned) * Nwk_ManObjNumMax(pNtk) ); Nwk_ManForEachNode( pNtk, pNode, i ) { if ( Nwk_ObjSlack(pNode) >= tDelta ) diff --git a/src/aig/nwk/nwkTiming.c b/src/aig/nwk/nwkTiming.c index e8123daec..645084742 100644 --- a/src/aig/nwk/nwkTiming.c +++ b/src/aig/nwk/nwkTiming.c @@ -264,7 +264,8 @@ float Nwk_NodePropagateRequired( Nwk_Obj_t * pObj, int fUseSorting ) int pPinPerm[32]; float pPinDelays[32]; Nwk_Obj_t * pFanin; - float tRequired, * pDelays; + float tRequired = 0.0; // Suppress "might be used uninitialized" + float * pDelays; int k; assert( Nwk_ObjIsNode(pObj) ); if ( pLutLib == NULL ) @@ -557,10 +558,10 @@ void Nwk_NodeUpdateAddToQueue( Vec_Ptr_t * vQueue, Nwk_Obj_t * pObj, int iCurren ***********************************************************************/ void Nwk_NodeUpdateArrival( Nwk_Obj_t * pObj ) { - If_Lib_t * pLutLib = pObj->pMan->pLutLib; Tim_Man_t * pManTime = pObj->pMan->pManTime; Vec_Ptr_t * vQueue = pObj->pMan->vTemp; - Nwk_Obj_t * pTemp, * pNext; + Nwk_Obj_t * pTemp; + Nwk_Obj_t * pNext = NULL; // Suppress "might be used uninitialized" float tArrival; int iCur, k, iBox, iTerm1, nTerms; assert( Nwk_ObjIsNode(pObj) ); @@ -636,10 +637,10 @@ void Nwk_NodeUpdateArrival( Nwk_Obj_t * pObj ) ***********************************************************************/ void Nwk_NodeUpdateRequired( Nwk_Obj_t * pObj ) { - If_Lib_t * pLutLib = pObj->pMan->pLutLib; Tim_Man_t * pManTime = pObj->pMan->pManTime; Vec_Ptr_t * vQueue = pObj->pMan->vTemp; - Nwk_Obj_t * pTemp, * pNext; + Nwk_Obj_t * pTemp; + Nwk_Obj_t * pNext = NULL; // Suppress "might be used uninitialized" float tRequired; int iCur, k, iBox, iTerm1, nTerms; assert( Nwk_ObjIsNode(pObj) ); @@ -763,7 +764,8 @@ void Nwk_ManUpdateLevel( Nwk_Obj_t * pObj ) { Tim_Man_t * pManTime = pObj->pMan->pManTime; Vec_Ptr_t * vQueue = pObj->pMan->vTemp; - Nwk_Obj_t * pTemp, * pNext; + Nwk_Obj_t * pTemp; + Nwk_Obj_t * pNext = NULL; // Suppress "might be used uninitialized" int LevelNew, iCur, k, iBox, iTerm1, nTerms; assert( Nwk_ObjIsNode(pObj) ); // initialize the queue with the node diff --git a/src/aig/nwk/nwkUtil.c b/src/aig/nwk/nwkUtil.c index 14f7632f6..d6daca4e9 100644 --- a/src/aig/nwk/nwkUtil.c +++ b/src/aig/nwk/nwkUtil.c @@ -261,7 +261,7 @@ void Nwk_ManDumpBlif( Nwk_Man_t * pNtk, char * pFileName, Vec_Ptr_t * vPiNames, Aig_MmFlex_t * pMem; char * pSop = NULL; unsigned * pTruth; - int i, k, nDigits, Counter = 0; + int i, k, nDigits; if ( Nwk_ManPoNum(pNtk) == 0 ) { printf( "Nwk_ManDumpBlif(): Network does not have POs.\n" ); @@ -278,7 +278,7 @@ void Nwk_ManDumpBlif( Nwk_Man_t * pNtk, char * pFileName, Vec_Ptr_t * vPiNames, fprintf( pFile, ".inputs" ); Nwk_ManForEachCi( pNtk, pObj, i ) if ( vPiNames ) - fprintf( pFile, " %s", Vec_PtrEntry(vPiNames, i) ); + fprintf( pFile, " %s", (char*)Vec_PtrEntry(vPiNames, i) ); else fprintf( pFile, " n%0*d", nDigits, pObj->Id ); fprintf( pFile, "\n" ); @@ -286,7 +286,7 @@ void Nwk_ManDumpBlif( Nwk_Man_t * pNtk, char * pFileName, Vec_Ptr_t * vPiNames, fprintf( pFile, ".outputs" ); Nwk_ManForEachCo( pNtk, pObj, i ) if ( vPoNames ) - fprintf( pFile, " %s", Vec_PtrEntry(vPoNames, i) ); + fprintf( pFile, " %s", (char*)Vec_PtrEntry(vPoNames, i) ); else fprintf( pFile, " n%0*d", nDigits, pObj->Id ); fprintf( pFile, "\n" ); @@ -310,7 +310,7 @@ void Nwk_ManDumpBlif( Nwk_Man_t * pNtk, char * pFileName, Vec_Ptr_t * vPiNames, { Nwk_ObjForEachFanin( pObj, pFanin, k ) if ( vPiNames && Nwk_ObjIsPi(pFanin) ) - fprintf( pFile, " %s", Vec_PtrEntry(vPiNames, Nwk_ObjPioNum(pFanin)) ); + fprintf( pFile, " %s", (char*)Vec_PtrEntry(vPiNames, Nwk_ObjPioNum(pFanin)) ); else fprintf( pFile, " n%0*d", nDigits, pFanin->Id ); } @@ -327,11 +327,11 @@ void Nwk_ManDumpBlif( Nwk_Man_t * pNtk, char * pFileName, Vec_Ptr_t * vPiNames, { fprintf( pFile, ".names" ); if ( vPiNames && Nwk_ObjIsPi(Nwk_ObjFanin0(pObj)) ) - fprintf( pFile, " %s", Vec_PtrEntry(vPiNames, Nwk_ObjPioNum(Nwk_ObjFanin0(pObj))) ); + fprintf( pFile, " %s", (char*)Vec_PtrEntry(vPiNames, Nwk_ObjPioNum(Nwk_ObjFanin0(pObj))) ); else fprintf( pFile, " n%0*d", nDigits, Nwk_ObjFanin0(pObj)->Id ); if ( vPoNames ) - fprintf( pFile, " %s\n", Vec_PtrEntry(vPoNames, Nwk_ObjPioNum(pObj)) ); + fprintf( pFile, " %s\n", (char*)Vec_PtrEntry(vPoNames, Nwk_ObjPioNum(pObj)) ); else fprintf( pFile, " n%0*d\n", nDigits, pObj->Id ); fprintf( pFile, "%d 1\n", !pObj->fInvert ); diff --git a/src/aig/rwt/rwtDec.c b/src/aig/rwt/rwtDec.c index 98019629c..df6209cd8 100644 --- a/src/aig/rwt/rwtDec.c +++ b/src/aig/rwt/rwtDec.c @@ -60,7 +60,7 @@ void Rwt_ManPreprocess( Rwt_Man_t * p ) for ( pNode = p->pTable[i]; pNode; pNode = pNode->pNext ) { assert( pNode->uTruth == p->pTable[i]->uTruth ); - assert( p->pMap[pNode->uTruth] >= 0 && p->pMap[pNode->uTruth] < 222 ); + assert( p->pMap[pNode->uTruth] < 222 ); // Always >= 0 b/c unsigned. Vec_VecPush( p->vClasses, p->pMap[pNode->uTruth], pNode ); p->pMapInv[ p->pMap[pNode->uTruth] ] = p->puCanons[pNode->uTruth]; } diff --git a/src/aig/saig/saigInter.c b/src/aig/saig/saigInter.c index 889e62985..afc4a34af 100644 --- a/src/aig/saig/saigInter.c +++ b/src/aig/saig/saigInter.c @@ -151,7 +151,8 @@ Aig_Man_t * Saig_ManDuplicated( Aig_Man_t * p ) Aig_Man_t * Saig_ManTransformed( Aig_Man_t * p ) { Aig_Man_t * pNew; - Aig_Obj_t * pObj, * pObjLi, * pObjLo, * pCtrl; + Aig_Obj_t * pObj, * pObjLi, * pObjLo; + Aig_Obj_t * pCtrl = NULL; // Suppress "might be used uninitialized" int i; assert( Aig_ManRegNum(p) > 0 ); // create the new manager @@ -583,12 +584,6 @@ p->timeCnf += clock() - clk; printf( " I = %2d. Bmc =%3d. IntAnd =%6d. IntLev =%5d. Conf =%6d. ", i+1, i + 1 + p->nFrames, Aig_ManNodeNum(p->pInter), Aig_ManLevelNum(p->pInter), p->nConfCur ); PRT( "Time", clock() - clk ); - if ( Aig_ManNodeNum(p->pInter) == 0 ) - { - Aig_Obj_t * pObj = Aig_ManPo(p->pInter, 0); - Aig_Obj_t * pObjR = Aig_Regular(pObj); - int x = 0; - } } if ( RetValue == 0 ) // found a (spurious?) counter-example { diff --git a/src/aig/saig/saigRetMin.c b/src/aig/saig/saigRetMin.c index 0ad6c3148..1820ae9a7 100644 --- a/src/aig/saig/saigRetMin.c +++ b/src/aig/saig/saigRetMin.c @@ -150,13 +150,14 @@ int Saig_ManRetimeUnsatCore( Aig_Man_t * p, int fVerbose ) printf( "\n" ); } // collect the nodes - if ( fVeryVerbose ) - Aig_ManForEachObj( p, pObj, i ) - if ( pCnf->pVarNums[pObj->Id] >= 0 && pVars[ pCnf->pVarNums[pObj->Id] ] == 1 ) - { - Aig_ObjPrint( p, pObj ); - printf( "\n" ); - } + if ( fVeryVerbose ) { + Aig_ManForEachObj( p, pObj, i ) + if ( pCnf->pVarNums[pObj->Id] >= 0 && pVars[ pCnf->pVarNums[pObj->Id] ] == 1 ) + { + Aig_ObjPrint( p, pObj ); + printf( "\n" ); + } + } // pick the first PO in the list nPos = 0; iBadPo = -1; diff --git a/src/aig/saig/saigScl.c b/src/aig/saig/saigScl.c index 67e3e95ba..6d55943a7 100644 --- a/src/aig/saig/saigScl.c +++ b/src/aig/saig/saigScl.c @@ -82,7 +82,7 @@ void Saig_ManReportUselessRegisters( Aig_Man_t * pAig ) int Saig_ManReportComplements( Aig_Man_t * p ) { Aig_Obj_t * pObj, * pFanin; - int i, Counter = 0, Diffs = 0; + int i, Counter = 0; assert( Aig_ManRegNum(p) > 0 ); Aig_ManForEachObj( p, pObj, i ) assert( !pObj->fMarkA ); diff --git a/src/aig/saig/saigTrans.c b/src/aig/saig/saigTrans.c index b00392763..c1c2d8e99 100644 --- a/src/aig/saig/saigTrans.c +++ b/src/aig/saig/saigTrans.c @@ -375,7 +375,7 @@ Aig_Man_t * Saig_ManTimeframeSimplify( Aig_Man_t * pAig, int nFrames, int nFrame { extern Aig_Man_t * Fra_FraigEquivence( Aig_Man_t * pManAig, int nConfMax, int fProve ); Aig_Man_t * pFrames, * pFraig, * pRes1, * pRes2; - int clk, clkTotal = clock(); + int clk; // create uninitialized timeframes with map1 pFrames = Saig_ManFramesNonInitial( pAig, nFrames ); // perform fraiging for the unrolled timeframes diff --git a/src/base/abc/abc.h b/src/base/abc/abc.h index 8f0c72109..9cb7a8553 100644 --- a/src/base/abc/abc.h +++ b/src/base/abc/abc.h @@ -439,10 +439,10 @@ static inline bool Abc_LatchIsInitNone( Abc_Obj_t * pLatch ) { assert(Ab static inline bool Abc_LatchIsInit0( Abc_Obj_t * pLatch ) { assert(Abc_ObjIsLatch(pLatch)); return pLatch->pData == (void *)ABC_INIT_ZERO; } static inline bool Abc_LatchIsInit1( Abc_Obj_t * pLatch ) { assert(Abc_ObjIsLatch(pLatch)); return pLatch->pData == (void *)ABC_INIT_ONE; } static inline bool Abc_LatchIsInitDc( Abc_Obj_t * pLatch ) { assert(Abc_ObjIsLatch(pLatch)); return pLatch->pData == (void *)ABC_INIT_DC; } -static inline int Abc_LatchInit( Abc_Obj_t * pLatch ) { assert(Abc_ObjIsLatch(pLatch)); return (int)pLatch->pData; } +static inline int Abc_LatchInit( Abc_Obj_t * pLatch ) { assert(Abc_ObjIsLatch(pLatch)); return (int)(PORT_PTRINT_T)pLatch->pData; } // global BDDs of the nodes -static inline void * Abc_NtkGlobalBdd( Abc_Ntk_t * pNtk ) { return (void *)Vec_PtrEntry(pNtk->vAttrs, VEC_ATTR_GLOBAL_BDD); } +static inline void * Abc_NtkGlobalBdd( Abc_Ntk_t * pNtk ) { return (void *)Vec_PtrEntry(pNtk->vAttrs, VEC_ATTR_GLOBAL_BDD); } static inline DdManager * Abc_NtkGlobalBddMan( Abc_Ntk_t * pNtk ) { return (DdManager *)Vec_AttMan( (Vec_Att_t *)Abc_NtkGlobalBdd(pNtk) ); } static inline DdNode ** Abc_NtkGlobalBddArray( Abc_Ntk_t * pNtk ) { return (DdNode **)Vec_AttArray( (Vec_Att_t *)Abc_NtkGlobalBdd(pNtk) ); } static inline DdNode * Abc_ObjGlobalBdd( Abc_Obj_t * pObj ) { return (DdNode *)Vec_AttEntry( (Vec_Att_t *)Abc_NtkGlobalBdd(pObj->pNtk), pObj->Id ); } diff --git a/src/base/abc/abcBlifMv.c b/src/base/abc/abcBlifMv.c index f945696e5..3d6730e7a 100644 --- a/src/base/abc/abcBlifMv.c +++ b/src/base/abc/abcBlifMv.c @@ -43,7 +43,7 @@ void Abc_NtkStartMvVars( Abc_Ntk_t * pNtk ) { Vec_Att_t * pAttMan; assert( Abc_NtkMvVar(pNtk) == NULL ); - pAttMan = Vec_AttAlloc( 0, Abc_NtkObjNumMax(pNtk) + 1, Extra_MmFlexStart(), Extra_MmFlexStop, NULL, NULL ); + pAttMan = Vec_AttAlloc( Abc_NtkObjNumMax(pNtk) + 1, Extra_MmFlexStart(), (void(*)(void*))Extra_MmFlexStop, NULL, NULL ); Vec_PtrWriteEntry( pNtk->vAttrs, VEC_ATTR_MVVAR, pAttMan ); //printf( "allocing attr\n" ); } diff --git a/src/base/abc/abcCheck.c b/src/base/abc/abcCheck.c index a78632d21..e538bd645 100644 --- a/src/base/abc/abcCheck.c +++ b/src/base/abc/abcCheck.c @@ -234,7 +234,7 @@ bool Abc_NtkDoCheck( Abc_Ntk_t * pNtk ) ***********************************************************************/ bool Abc_NtkCheckNames( Abc_Ntk_t * pNtk ) { - Abc_Obj_t * pObj; + Abc_Obj_t * pObj = NULL; // Ensure pObj isn't used uninitialized. Vec_Int_t * vNameIds; char * pName; int i, NameId; @@ -262,6 +262,8 @@ bool Abc_NtkCheckNames( Abc_Ntk_t * pNtk ) } } + assert(pObj); // pObj should point to something here. + // return the array of all IDs, which have names vNameIds = Nm_ManReturnNameIds( pNtk->pManName ); // make sure that these IDs correspond to live objects @@ -571,10 +573,10 @@ bool Abc_NtkCheckLatch( Abc_Ntk_t * pNtk, Abc_Obj_t * pLatch ) Value = 0; } // make sure the latch has a reasonable return value - if ( (int)pLatch->pData < ABC_INIT_ZERO || (int)pLatch->pData > ABC_INIT_DC ) + if ( (int)(PORT_PTRINT_T)pLatch->pData < ABC_INIT_ZERO || (int)(PORT_PTRINT_T)pLatch->pData > ABC_INIT_DC ) { fprintf( stdout, "NodeCheck: Latch \"%s\" has incorrect reset value (%d).\n", - Abc_ObjName(pLatch), (int)pLatch->pData ); + Abc_ObjName(pLatch), (int)(PORT_PTRINT_T)pLatch->pData ); Value = 0; } // make sure the latch has only one fanin @@ -857,7 +859,7 @@ int Abc_NtkCheckUniqueCiNames( Abc_Ntk_t * pNtk ) for ( i = 1; i < Abc_NtkCiNum(pNtk); i++ ) if ( !strcmp( Vec_PtrEntry(vNames,i-1), Vec_PtrEntry(vNames,i) ) ) { - printf( "Abc_NtkCheck: Repeated CI names: %s and %s.\n", Vec_PtrEntry(vNames,i-1), Vec_PtrEntry(vNames,i) ); + printf( "Abc_NtkCheck: Repeated CI names: %s and %s.\n", (char*)Vec_PtrEntry(vNames,i-1), (char*)Vec_PtrEntry(vNames,i) ); fRetValue = 0; } Vec_PtrFree( vNames ); @@ -890,7 +892,7 @@ int Abc_NtkCheckUniqueCoNames( Abc_Ntk_t * pNtk ) // printf( "%s\n", Vec_PtrEntry(vNames,i) ); if ( !strcmp( Vec_PtrEntry(vNames,i-1), Vec_PtrEntry(vNames,i) ) ) { - printf( "Abc_NtkCheck: Repeated CO names: %s and %s.\n", Vec_PtrEntry(vNames,i-1), Vec_PtrEntry(vNames,i) ); + printf( "Abc_NtkCheck: Repeated CO names: %s and %s.\n", (char*)Vec_PtrEntry(vNames,i-1), (char*)Vec_PtrEntry(vNames,i) ); fRetValue = 0; } } diff --git a/src/base/abc/abcDfs.c b/src/base/abc/abcDfs.c index b5fb81dba..8759500be 100644 --- a/src/base/abc/abcDfs.c +++ b/src/base/abc/abcDfs.c @@ -197,10 +197,11 @@ Vec_Ptr_t * Abc_NtkDfsReverse( Abc_Ntk_t * pNtk ) Abc_NtkDfsReverse_rec( pFanout, vNodes ); } // add constant nodes in the end - if ( !Abc_NtkIsStrash(pNtk) ) + if ( !Abc_NtkIsStrash(pNtk) ) { Abc_NtkForEachNode( pNtk, pObj, i ) if ( Abc_NodeIsConst(pObj) ) Vec_PtrPush( vNodes, pObj ); + } return vNodes; } @@ -492,7 +493,7 @@ void Abc_NtkDfs_iter( Vec_Ptr_t * vStack, Abc_Obj_t * pRoot, Vec_Ptr_t * vNodes while ( Vec_PtrSize(vStack) > 0 ) { // get the node and its fanin - iFanin = (int)Vec_PtrPop(vStack); + iFanin = (int)(PORT_PTRINT_T)Vec_PtrPop(vStack); pNode = Vec_PtrPop(vStack); assert( !Abc_ObjIsNet(pNode) ); // add it to the array of nodes if we finished @@ -503,7 +504,7 @@ void Abc_NtkDfs_iter( Vec_Ptr_t * vStack, Abc_Obj_t * pRoot, Vec_Ptr_t * vNodes } // explore the next fanin Vec_PtrPush( vStack, pNode ); - Vec_PtrPush( vStack, (void *)(iFanin+1) ); + Vec_PtrPush( vStack, (void *)(PORT_PTRINT_T)(iFanin+1) ); // get the fanin pFanin = Abc_ObjFanin0Ntk( Abc_ObjFanin(pNode,iFanin) ); // if this node is already visited, skip @@ -1112,7 +1113,7 @@ bool Abc_NtkIsAcyclic_rec( Abc_Obj_t * pNode ) Abc_NodeSetTravIdCurrent( pNode ); // visit the transitive fanin Abc_ObjForEachFanin( pNode, pFanin, i ) - { + { pFanin = Abc_ObjFanin0Ntk(pFanin); // make sure there is no mixing of networks assert( pFanin->pNtk == pNode->pNtk ); @@ -1120,7 +1121,7 @@ bool Abc_NtkIsAcyclic_rec( Abc_Obj_t * pNode ) if ( Abc_NodeIsTravIdPrevious(pFanin) ) continue; // traverse the fanin's cone searching for the loop - if ( fAcyclic = Abc_NtkIsAcyclic_rec(pFanin) ) + if ( (fAcyclic = Abc_NtkIsAcyclic_rec(pFanin)) ) continue; // return as soon as the loop is detected fprintf( stdout, " %s ->", Abc_ObjName(pFanin) ); @@ -1135,7 +1136,7 @@ bool Abc_NtkIsAcyclic_rec( Abc_Obj_t * pNode ) if ( Abc_NodeIsTravIdPrevious(pFanin) ) continue; // traverse the fanin's cone searching for the loop - if ( fAcyclic = Abc_NtkIsAcyclic_rec(pFanin) ) + if ( (fAcyclic = Abc_NtkIsAcyclic_rec(pFanin)) ) continue; // return as soon as the loop is detected fprintf( stdout, " %s", Abc_ObjName(pFanin) ); @@ -1184,7 +1185,7 @@ bool Abc_NtkIsAcyclic( Abc_Ntk_t * pNtk ) if ( Abc_NodeIsTravIdPrevious(pNode) ) continue; // traverse the output logic cone - if ( fAcyclic = Abc_NtkIsAcyclic_rec(pNode) ) + if ( (fAcyclic = Abc_NtkIsAcyclic_rec(pNode)) ) continue; // stop as soon as the first loop is detected fprintf( stdout, " CO \"%s\"\n", Abc_ObjName(Abc_ObjFanout0(pNode)) ); @@ -1211,7 +1212,7 @@ int Abc_NodeSetChoiceLevel_rec( Abc_Obj_t * pNode, int fMaximum ) int Level1, Level2, Level, LevelE; // skip the visited node if ( Abc_NodeIsTravIdCurrent( pNode ) ) - return (int)pNode->pCopy; + return (int)(PORT_PTRINT_T)pNode->pCopy; Abc_NodeSetTravIdCurrent( pNode ); // compute levels of the children nodes Level1 = Abc_NodeSetChoiceLevel_rec( Abc_ObjFanin0(pNode), fMaximum ); @@ -1226,9 +1227,9 @@ int Abc_NodeSetChoiceLevel_rec( Abc_Obj_t * pNode, int fMaximum ) Level = ABC_MIN( Level, LevelE ); // set the level of all equivalent nodes to be the same minimum for ( pTemp = pNode->pData; pTemp; pTemp = pTemp->pData ) - pTemp->pCopy = (void *)Level; + pTemp->pCopy = (void *)(PORT_PTRINT_T)Level; } - pNode->pCopy = (void *)Level; + pNode->pCopy = (void *)(PORT_PTRINT_T)Level; return Level; } @@ -1297,7 +1298,7 @@ Vec_Ptr_t * Abc_AigGetLevelizedOrder( Abc_Ntk_t * pNtk, int fCollectCis ) vLevels = Vec_PtrStart( LevelMax + 1 ); Abc_NtkForEachNode( pNtk, pNode, i ) { - ppHead = ((Abc_Obj_t **)vLevels->pArray) + (int)pNode->pCopy; + ppHead = ((Abc_Obj_t **)vLevels->pArray) + (int)(PORT_PTRINT_T)pNode->pCopy; pNode->pCopy = *ppHead; *ppHead = pNode; } diff --git a/src/base/abc/abcFanio.c b/src/base/abc/abcFanio.c index 9f60b0bc8..14b2b0c13 100644 --- a/src/base/abc/abcFanio.c +++ b/src/base/abc/abcFanio.c @@ -90,14 +90,8 @@ void Abc_ObjAddFanin( Abc_Obj_t * pObj, Abc_Obj_t * pFanin ) Abc_ObjSetFaninC( pObj, Abc_ObjFaninNum(pObj)-1 ); if ( Abc_ObjIsNet(pObj) && Abc_ObjFaninNum(pObj) > 1 ) { - int x = 0; + printf( "Abc_ObjAddFanin(): Error! Creating net with two fanins.\n" ); } - if ( pObj->Id == 1960 ) - { - int x = 0; - } -// printf( "Adding fanin of %s ", Abc_ObjName(pObj) ); -// printf( "to be %s\n", Abc_ObjName(pFanin) ); } diff --git a/src/base/abc/abcLatch.c b/src/base/abc/abcLatch.c index 4529d9f39..79b60cf90 100644 --- a/src/base/abc/abcLatch.c +++ b/src/base/abc/abcLatch.c @@ -208,7 +208,7 @@ void Abc_NtkInsertLatchValues( Abc_Ntk_t * pNtk, Vec_Int_t * vValues ) Abc_Obj_t * pLatch; int i; Abc_NtkForEachLatch( pNtk, pLatch, i ) - pLatch->pData = (void *)(vValues? (Vec_IntEntry(vValues,i)? ABC_INIT_ONE : ABC_INIT_ZERO) : ABC_INIT_DC); + pLatch->pData = (void *)(PORT_PTRINT_T)(vValues? (Vec_IntEntry(vValues,i)? ABC_INIT_ONE : ABC_INIT_ZERO) : ABC_INIT_DC); } /**Function************************************************************* @@ -340,7 +340,7 @@ Vec_Ptr_t * Abc_NtkConverLatchNamesIntoNumbers( Abc_Ntk_t * pNtk ) return NULL; // set register numbers Abc_NtkForEachLatch( pNtk, pObj, i ) - pObj->pNext = (Abc_Obj_t *)i; + pObj->pNext = (Abc_Obj_t *)(PORT_PTRINT_T)i; // add the numbers vResult = Vec_PtrAlloc( Vec_PtrSize(pNtk->vOnehots) ); Vec_PtrForEachEntry( pNtk->vOnehots, vNames, i ) @@ -354,7 +354,7 @@ Vec_Ptr_t * Abc_NtkConverLatchNamesIntoNumbers( Abc_Ntk_t * pNtk ) pObj = Abc_NtkObj( pNtk, Num ); if ( Abc_ObjFaninNum(pObj) != 1 || !Abc_ObjIsLatch(Abc_ObjFanin0(pObj)) ) continue; - Vec_IntPush( vNumbers, (int)pObj->pNext ); + Vec_IntPush( vNumbers, (int)(PORT_PTRINT_T)pObj->pNext ); } if ( Vec_IntSize( vNumbers ) > 1 ) { diff --git a/src/base/abc/abcNtk.c b/src/base/abc/abcNtk.c index 4d5435473..88bcda69f 100644 --- a/src/base/abc/abcNtk.c +++ b/src/base/abc/abcNtk.c @@ -932,7 +932,7 @@ void Abc_NtkDelete( Abc_Ntk_t * pNtk ) Abc_Obj_t * pObj; void * pAttrMan; int TotalMemory, i; - int LargePiece = (4 << ABC_NUM_STEPS); +// int LargePiece = (4 << ABC_NUM_STEPS); if ( pNtk == NULL ) return; // free the HAIG diff --git a/src/base/abc/abcObj.c b/src/base/abc/abcObj.c index 79bf41a1a..a79eb5a73 100644 --- a/src/base/abc/abcObj.c +++ b/src/base/abc/abcObj.c @@ -70,7 +70,7 @@ Abc_Obj_t * Abc_ObjAlloc( Abc_Ntk_t * pNtk, Abc_ObjType_t Type ) void Abc_ObjRecycle( Abc_Obj_t * pObj ) { Abc_Ntk_t * pNtk = pObj->pNtk; - int LargePiece = (4 << ABC_NUM_STEPS); +// int LargePiece = (4 << ABC_NUM_STEPS); // free large fanout arrays // if ( pNtk->pMmStep && pObj->vFanouts.nCap * 4 > LargePiece ) // FREE( pObj->vFanouts.pArray ); diff --git a/src/base/abc/abcShow.c b/src/base/abc/abcShow.c index 3bac73167..2b406e817 100644 --- a/src/base/abc/abcShow.c +++ b/src/base/abc/abcShow.c @@ -20,8 +20,11 @@ #ifdef WIN32 #include +#else +#include #endif + #include "abc.h" #include "main.h" #include "ioAbc.h" diff --git a/src/base/abc/abcSop.c b/src/base/abc/abcSop.c index b2d6b6491..d1d1a468e 100644 --- a/src/base/abc/abcSop.c +++ b/src/base/abc/abcSop.c @@ -804,7 +804,7 @@ bool Abc_SopCheck( char * pSop, int nFanins ) if ( pCubes - pCubesOld != nFanins ) { fprintf( stdout, "Abc_SopCheck: SOP has a mismatch between its cover size (%d) and its fanin number (%d).\n", - pCubes - pCubesOld, nFanins ); + (int)(PORT_PTRDIFF_T)(pCubes - pCubesOld), nFanins ); return 0; } // check the output values for this cube diff --git a/src/base/abc/abcUtil.c b/src/base/abc/abcUtil.c index d3d32b981..39f44c112 100644 --- a/src/base/abc/abcUtil.c +++ b/src/base/abc/abcUtil.c @@ -1536,9 +1536,9 @@ void Abc_NtkTransferCopy( Abc_Ntk_t * pNtk ) static inline int Abc_ObjCrossCutInc( Abc_Obj_t * pObj ) { // pObj->pCopy = (void *)(((int)pObj->pCopy)++); - int Value = (int)pObj->pCopy; - pObj->pCopy = (void *)(Value + 1); - return (int)pObj->pCopy == Abc_ObjFanoutNum(pObj); + int Value = (int)(PORT_PTRINT_T)pObj->pCopy; + pObj->pCopy = (void *)(PORT_PTRINT_T)(Value + 1); + return (int)(PORT_PTRINT_T)pObj->pCopy == Abc_ObjFanoutNum(pObj); } /**Function************************************************************* diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c index d3372c9a5..ae1c110ff 100644 --- a/src/base/abci/abc.c +++ b/src/base/abci/abc.c @@ -506,7 +506,7 @@ void Abc_Init( Abc_Frame_t * pAbc ) Dar_LibStart(); } { - extern Bdc_ManDecomposeTest( unsigned uTruth, int nVars ); + extern void Bdc_ManDecomposeTest( unsigned uTruth, int nVars ); // Bdc_ManDecomposeTest( 0x0f0f0f0f, 3 ); } @@ -3710,7 +3710,6 @@ int Abc_CommandTrace( Abc_Frame_t * pAbc, int argc, char ** argv ) { FILE * pOut, * pErr; Abc_Ntk_t * pNtk; - Mfs_Par_t Pars, * pPars = &Pars; int c; int fUseLutLib; int fVerbose; @@ -3780,7 +3779,6 @@ int Abc_CommandSpeedup( Abc_Frame_t * pAbc, int argc, char ** argv ) { FILE * pOut, * pErr; Abc_Ntk_t * pNtk, * pNtkRes; - Mfs_Par_t Pars, * pPars = &Pars; int c; int fUseLutLib; int Percentage; @@ -6568,7 +6566,7 @@ int Abc_CommandExdcSet( Abc_Frame_t * pAbc, int argc, char ** argv ) if ( (pFile = fopen( FileName, "r" )) == NULL ) { fprintf( pAbc->Err, "Cannot open input file \"%s\". ", FileName ); - if ( FileName = Extra_FileGetSimilarName( FileName, ".mv", ".blif", ".pla", ".eqn", ".bench" ) ) + if ( (FileName = Extra_FileGetSimilarName( FileName, ".mv", ".blif", ".pla", ".eqn", ".bench" )) ) fprintf( pAbc->Err, "Did you mean \"%s\"?", FileName ); fprintf( pAbc->Err, "\n" ); return 1; @@ -6655,7 +6653,7 @@ int Abc_CommandCareSet( Abc_Frame_t * pAbc, int argc, char ** argv ) if ( (pFile = fopen( FileName, "r" )) == NULL ) { fprintf( pAbc->Err, "Cannot open input file \"%s\". ", FileName ); - if ( FileName = Extra_FileGetSimilarName( FileName, ".mv", ".blif", ".pla", ".eqn", ".bench" ) ) + if ( (FileName = Extra_FileGetSimilarName( FileName, ".mv", ".blif", ".pla", ".eqn", ".bench" )) ) fprintf( pAbc->Err, "Did you mean \"%s\"?", FileName ); fprintf( pAbc->Err, "\n" ); return 1; @@ -6706,7 +6704,7 @@ int Abc_CommandCut( Abc_Frame_t * pAbc, int argc, char ** argv ) { Cut_Params_t Params, * pParams = &Params; Cut_Man_t * pCutMan; - Cut_Oracle_t * pCutOracle; + Cut_Oracle_t * pCutOracle = NULL; FILE * pOut, * pErr; Abc_Ntk_t * pNtk; int c; @@ -6829,6 +6827,7 @@ int Abc_CommandCut( Abc_Frame_t * pAbc, int argc, char ** argv ) Cut_ManStop( pCutMan ); if ( fOracle ) { + assert(pCutOracle); Abc_NtkCutsOracle( pNtk, pCutOracle ); Cut_OracleStop( pCutOracle ); } @@ -15673,7 +15672,7 @@ int Abc_CommandAbc8Read( Abc_Frame_t * pAbc, int argc, char ** argv ) if ( (pFile = fopen( pFileName, "r" )) == NULL ) { fprintf( stdout, "Cannot open input file \"%s\". ", pFileName ); - if ( pFileName = Extra_FileGetSimilarName( pFileName, ".blif", NULL, NULL, NULL, NULL ) ) + if ( (pFileName = Extra_FileGetSimilarName( pFileName, ".blif", NULL, NULL, NULL, NULL )) ) fprintf( stdout, "Did you mean \"%s\"?", pFileName ); fprintf( stdout, "\n" ); return 1; @@ -15763,7 +15762,7 @@ int Abc_CommandAbc8ReadLogic( Abc_Frame_t * pAbc, int argc, char ** argv ) if ( (pFile = fopen( pFileName, "r" )) == NULL ) { fprintf( stdout, "Cannot open input file \"%s\". ", pFileName ); - if ( pFileName = Extra_FileGetSimilarName( pFileName, ".blif", NULL, NULL, NULL, NULL ) ) + if ( (pFileName = Extra_FileGetSimilarName( pFileName, ".blif", NULL, NULL, NULL, NULL )) ) fprintf( stdout, "Did you mean \"%s\"?", pFileName ); fprintf( stdout, "\n" ); return 1; @@ -16032,7 +16031,7 @@ int Abc_CommandAbc8ReadLut( Abc_Frame_t * pAbc, int argc, char **argv ) if ( (pFile = fopen( FileName, "r" )) == NULL ) { fprintf( stdout, "Cannot open input file \"%s\". ", FileName ); - if ( FileName = Extra_FileGetSimilarName( FileName, ".lut", NULL, NULL, NULL, NULL ) ) + if ( (FileName = Extra_FileGetSimilarName( FileName, ".lut", NULL, NULL, NULL, NULL )) ) fprintf( stdout, "Did you mean \"%s\"?", FileName ); fprintf( stdout, "\n" ); return 1; @@ -17041,11 +17040,11 @@ int Abc_CommandAbc8Speedup( Abc_Frame_t * pAbc, int argc, char ** argv ) { Aig_Man_t * pAigNew; int c; - int fUseLutLib; - int Percentage; - int Degree; - int fVerbose; - int fVeryVerbose; + int fUseLutLib = 0; + int Percentage = 100; + int Degree = 5; + int fVerbose = 0; + int fVeryVerbose = 0; extern Aig_Man_t * Nwk_ManSpeedup( void * pNtk, int fUseLutLib, int Percentage, int Degree, int fVerbose, int fVeryVerbose ); // set defaults diff --git a/src/base/abci/abcAbc8.c b/src/base/abci/abcAbc8.c index d58f6b7e0..be25d9c2a 100644 --- a/src/base/abci/abcAbc8.c +++ b/src/base/abci/abcAbc8.c @@ -253,7 +253,6 @@ Abc_Ntk_t * Abc_NtkNtkTest( Abc_Ntk_t * pNtk, If_Lib_t * pLutLib ) extern Vec_Ptr_t * Nwk_ManRetimeCutForward( Nwk_Man_t * pMan, int nLatches, int fVerbose ); extern Vec_Ptr_t * Nwk_ManRetimeCutBackward( Nwk_Man_t * pMan, int nLatches, int fVerbose ); - Mfx_Par_t Pars, * pPars = &Pars; Abc_Ntk_t * pNtkNew; Nwk_Man_t * pMan; pMan = Abc_NtkToNtkNew( pNtk ); diff --git a/src/base/abci/abcBalance.c b/src/base/abci/abcBalance.c index f04837c5a..26b6db997 100644 --- a/src/base/abci/abcBalance.c +++ b/src/base/abci/abcBalance.c @@ -96,7 +96,6 @@ Abc_Ntk_t * Abc_NtkBalance( Abc_Ntk_t * pNtk, bool fDuplicate, bool fSelective, ***********************************************************************/ void Abc_NtkBalancePerform( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkAig, bool fDuplicate, bool fSelective, bool fUpdateLevel ) { - int fCheck = 1; ProgressBar * pProgress; Vec_Vec_t * vStorage; Abc_Obj_t * pNode, * pDriver; diff --git a/src/base/abci/abcBmc.c b/src/base/abci/abcBmc.c index af6d237be..1512c76f1 100644 --- a/src/base/abci/abcBmc.c +++ b/src/base/abci/abcBmc.c @@ -84,7 +84,7 @@ printf( "Fraig has %6d nodes.\n", Ivy_ManNodeNum(pFraig) ); ***********************************************************************/ void Abc_NtkBmcReport( Ivy_Man_t * pMan, Ivy_Man_t * pFrames, Ivy_Man_t * pFraig, Vec_Ptr_t * vMapping, int nFrames ) { - Ivy_Obj_t * pFirst1, * pFirst2, * pFirst3; + Ivy_Obj_t * pFirst1, * pFirst2 = NULL, * pFirst3 = NULL; int i, f, nIdMax, Prev2, Prev3; nIdMax = Ivy_ManObjIdMax(pMan); // check what is the number of nodes in each frame @@ -101,6 +101,8 @@ void Abc_NtkBmcReport( Ivy_Man_t * pMan, Ivy_Man_t * pFrames, Ivy_Man_t * pFraig continue; break; } + assert(pFirst2); + assert(pFirst3); if ( f ) printf( "Frame %3d : Strash = %5d Fraig = %5d\n", f, pFirst2->Id - Prev2, pFirst3->Id - Prev3 ); Prev2 = pFirst2->Id; diff --git a/src/base/abci/abcCut.c b/src/base/abci/abcCut.c index d399ce5fd..d38f62d02 100644 --- a/src/base/abci/abcCut.c +++ b/src/base/abci/abcCut.c @@ -144,7 +144,7 @@ void Abc_NtkCutsOracle( Abc_Ntk_t * pNtk, Cut_Oracle_t * p ) { Abc_Obj_t * pObj; Vec_Ptr_t * vNodes; - int i, clk = clock(); + int i; //, clk = clock(); int fDrop = Cut_OracleReadDrop(p); assert( Abc_NtkIsStrash(pNtk) ); @@ -327,7 +327,7 @@ int Abc_NtkComputeArea( Abc_Ntk_t * pNtk, Cut_Man_t * p ) void * Abc_NodeGetCutsRecursive( void * p, Abc_Obj_t * pObj, int fDag, int fTree ) { void * pList; - if ( pList = Abc_NodeReadCuts( p, pObj ) ) + if ( (pList = Abc_NodeReadCuts( p, pObj )) ) return pList; Abc_NodeGetCutsRecursive( p, Abc_ObjFanin0(pObj), fDag, fTree ); Abc_NodeGetCutsRecursive( p, Abc_ObjFanin1(pObj), fDag, fTree ); @@ -459,7 +459,6 @@ void Abc_NodeFreeCuts( void * p, Abc_Obj_t * pObj ) ***********************************************************************/ void Abc_NtkPrintCuts( void * p, Abc_Ntk_t * pNtk, int fSeq ) { - Cut_Man_t * pMan = p; Cut_Cut_t * pList; Abc_Obj_t * pObj; int i; @@ -485,7 +484,6 @@ void Abc_NtkPrintCuts( void * p, Abc_Ntk_t * pNtk, int fSeq ) ***********************************************************************/ void Abc_NtkPrintCuts_( void * p, Abc_Ntk_t * pNtk, int fSeq ) { - Cut_Man_t * pMan = p; Cut_Cut_t * pList; Abc_Obj_t * pObj; pObj = Abc_NtkObj( pNtk, 2 * Abc_NtkObjNum(pNtk) / 3 ); diff --git a/src/base/abci/abcDar.c b/src/base/abci/abcDar.c index d746e3156..d89ee618c 100644 --- a/src/base/abci/abcDar.c +++ b/src/base/abci/abcDar.c @@ -99,10 +99,11 @@ Aig_Man_t * Abc_NtkToDar( Abc_Ntk_t * pNtk, int fExors, int fRegisters ) Abc_NtkForEachCi( pNtk, pObj, i ) pObj->pCopy = (Abc_Obj_t *)Aig_ObjCreatePi(pMan); // complement the 1-values registers - if ( fRegisters ) + if ( fRegisters ) { Abc_NtkForEachLatch( pNtk, pObj, i ) if ( Abc_LatchIsInit1(pObj) ) Abc_ObjFanout0(pObj)->pCopy = Abc_ObjNot(Abc_ObjFanout0(pObj)->pCopy); + } // perform the conversion of the internal nodes (assumes DFS ordering) // pMan->fAddStrash = 1; Abc_NtkForEachNode( pNtk, pObj, i ) @@ -1894,7 +1895,7 @@ Abc_Ntk_t * Abc_NtkInter( Abc_Ntk_t * pNtkOn, Abc_Ntk_t * pNtkOff, int fRelation { Abc_Ntk_t * pNtkOn1, * pNtkOff1, * pNtkInter1, * pNtkInter; Abc_Obj_t * pObj; - int i, clk = clock(); + int i; //, clk = clock(); if ( Abc_NtkCoNum(pNtkOn) != Abc_NtkCoNum(pNtkOff) ) { printf( "Currently works only for networks with equal number of POs.\n" ); diff --git a/src/base/abci/abcDelay.c b/src/base/abci/abcDelay.c index 3c28e6a6a..91f175fad 100644 --- a/src/base/abci/abcDelay.c +++ b/src/base/abci/abcDelay.c @@ -526,8 +526,8 @@ Abc_Ntk_t * Abc_NtkSpeedup( Abc_Ntk_t * pNtk, int fUseLutLib, int Percentage, in printf( "\n" ); } // mark the timing critical nodes and edges - puTCEdges = ALLOC( int, Abc_NtkObjNumMax(pNtk) ); - memset( puTCEdges, 0, sizeof(int) * Abc_NtkObjNumMax(pNtk) ); + puTCEdges = ALLOC( unsigned, Abc_NtkObjNumMax(pNtk) ); + memset( puTCEdges, 0, sizeof(unsigned) * Abc_NtkObjNumMax(pNtk) ); Abc_NtkForEachNode( pNtk, pNode, i ) { if ( Abc_ObjSlack(pNode) >= tDelta ) diff --git a/src/base/abci/abcDsd.c b/src/base/abci/abcDsd.c index c00a7d7ca..ab6279b6e 100644 --- a/src/base/abci/abcDsd.c +++ b/src/base/abci/abcDsd.c @@ -161,11 +161,11 @@ void Abc_NtkDsdConstruct( Dsd_Manager_t * pManDsd, Abc_Ntk_t * pNtk, Abc_Ntk_t * int i, nNodesDsd; // save the CI nodes in the DSD nodes - Dsd_NodeSetMark( Dsd_ManagerReadConst1(pManDsd), (int)Abc_NtkCreateNodeConst1(pNtkNew) ); + Dsd_NodeSetMark( Dsd_ManagerReadConst1(pManDsd), (int)(PORT_PTRINT_T)Abc_NtkCreateNodeConst1(pNtkNew) ); Abc_NtkForEachCi( pNtk, pNode, i ) { pNodeDsd = Dsd_ManagerReadInput( pManDsd, i ); - Dsd_NodeSetMark( pNodeDsd, (int)pNode->pCopy ); + Dsd_NodeSetMark( pNodeDsd, (int)(PORT_PTRINT_T)pNode->pCopy ); } // collect DSD nodes in DFS order (leaves and const1 are not collected) @@ -183,7 +183,7 @@ void Abc_NtkDsdConstruct( Dsd_Manager_t * pManDsd, Abc_Ntk_t * pNtk, Abc_Ntk_t * if ( !Abc_AigNodeIsAnd(pDriver) ) continue; pNodeDsd = Dsd_ManagerReadRoot( pManDsd, i ); - pNodeNew = (Abc_Obj_t *)Dsd_NodeReadMark( Dsd_Regular(pNodeDsd) ); + pNodeNew = (Abc_Obj_t *)(PORT_PTRINT_T)Dsd_NodeReadMark( Dsd_Regular(pNodeDsd) ); assert( !Abc_ObjIsComplement(pNodeNew) ); pDriver->pCopy = Abc_ObjNotCond( pNodeNew, Dsd_IsComplement(pNodeDsd) ); } @@ -219,7 +219,7 @@ Abc_Obj_t * Abc_NtkDsdConstructNode( Dsd_Manager_t * pManDsd, Dsd_Node_t * pNode for ( i = 0; i < nDecs; i++ ) { pFaninDsd = Dsd_NodeReadDec( pNodeDsd, i ); - pFanin = (Abc_Obj_t *)Dsd_NodeReadMark(Dsd_Regular(pFaninDsd)); + pFanin = (Abc_Obj_t *)(PORT_PTRINT_T)Dsd_NodeReadMark(Dsd_Regular(pFaninDsd)); Abc_ObjAddFanin( pNodeNew, pFanin ); assert( Type == DSD_NODE_OR || !Dsd_IsComplement(pFaninDsd) ); } @@ -284,7 +284,7 @@ printf( "\n" ); } } pNodeNew->pData = bLocal; - Dsd_NodeSetMark( pNodeDsd, (int)pNodeNew ); + Dsd_NodeSetMark( pNodeDsd, (int)(PORT_PTRINT_T)pNodeNew ); return pNodeNew; } @@ -383,7 +383,7 @@ Vec_Ptr_t * Abc_NtkCollectNodesForDsd( Abc_Ntk_t * pNtk ) void Abc_NodeDecompDsdAndMux( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes, Dsd_Manager_t * pManDsd, bool fRecursive, int * pCounters ) { DdManager * dd = pNode->pNtk->pManFunc; - Abc_Obj_t * pRoot, * pFanin, * pNode1, * pNode2, * pNodeC; + Abc_Obj_t * pRoot = NULL, * pFanin, * pNode1, * pNode2, * pNodeC; Dsd_Node_t ** ppNodesDsd, * pNodeDsd, * pFaninDsd; int i, nNodesDsd, iVar, fCompl; @@ -400,7 +400,7 @@ void Abc_NodeDecompDsdAndMux( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes, Dsd_Manager Abc_ObjForEachFanin( pNode, pFanin, i ) { pFaninDsd = Dsd_ManagerReadInput( pManDsd, i ); - Dsd_NodeSetMark( pFaninDsd, (int)pFanin ); + Dsd_NodeSetMark( pFaninDsd, (int)(PORT_PTRINT_T)pFanin ); } // construct the intermediate nodes @@ -412,6 +412,7 @@ void Abc_NodeDecompDsdAndMux( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes, Dsd_Manager Vec_PtrPush( vNodes, pRoot ); } free( ppNodesDsd ); + assert(pRoot); // remove the current fanins Abc_ObjRemoveFanins( pNode ); @@ -466,7 +467,7 @@ void Abc_NodeDecompDsdAndMux( Abc_Obj_t * pNode, Vec_Ptr_t * vNodes, Dsd_Manager ***********************************************************************/ bool Abc_NodeIsForDsd( Abc_Obj_t * pNode ) { - DdManager * dd = pNode->pNtk->pManFunc; +// DdManager * dd = pNode->pNtk->pManFunc; // DdNode * bFunc, * bFunc0, * bFunc1; assert( Abc_ObjIsNode(pNode) ); // if ( Cudd_DagSize(pNode->pData)-1 > Abc_ObjFaninNum(pNode) ) diff --git a/src/base/abci/abcFpga.c b/src/base/abci/abcFpga.c index 78e7cf6b6..b87edb6b3 100644 --- a/src/base/abci/abcFpga.c +++ b/src/base/abci/abcFpga.c @@ -49,7 +49,7 @@ Abc_Ntk_t * Abc_NtkFpga( Abc_Ntk_t * pNtk, float DelayTarget, int fRecovery, int int fShowSwitching = 1; Abc_Ntk_t * pNtkNew; Fpga_Man_t * pMan; - Vec_Int_t * vSwitching; + Vec_Int_t * vSwitching = NULL; float * pSwitching = NULL; int Num; @@ -70,7 +70,7 @@ Abc_Ntk_t * Abc_NtkFpga( Abc_Ntk_t * pNtk, float DelayTarget, int fRecovery, int // perform FPGA mapping pMan = Abc_NtkToFpga( pNtk, fRecovery, pSwitching, fLatchPaths, fVerbose ); - if ( pSwitching ) Vec_IntFree( vSwitching ); + if ( pSwitching ) { assert(vSwitching); Vec_IntFree( vSwitching ); } if ( pMan == NULL ) return NULL; Fpga_ManSetSwitching( pMan, fSwitching ); diff --git a/src/base/abci/abcFraig.c b/src/base/abci/abcFraig.c index be8a25f1b..d3cbaccb7 100644 --- a/src/base/abci/abcFraig.c +++ b/src/base/abci/abcFraig.c @@ -101,7 +101,7 @@ void * Abc_NtkToFraig( Abc_Ntk_t * pNtk, void * pParams, int fAllNodes, int fExd { int fInternal = ((Fraig_Params_t *)pParams)->fInternal; Fraig_Man_t * pMan; - ProgressBar * pProgress; + ProgressBar * pProgress = NULL; Vec_Ptr_t * vNodes; Abc_Obj_t * pNode; int i; @@ -126,14 +126,18 @@ void * Abc_NtkToFraig( Abc_Ntk_t * pNtk, void * pParams, int fAllNodes, int fExd { if ( Abc_ObjFaninNum(pNode) == 0 ) continue; - if ( !fInternal ) + if ( !fInternal ) { + assert(pProgress); Extra_ProgressBarUpdate( pProgress, i, NULL ); + } pNode->pCopy = (Abc_Obj_t *)Fraig_NodeAnd( pMan, Fraig_NotCond( Abc_ObjFanin0(pNode)->pCopy, Abc_ObjFaninC0(pNode) ), Fraig_NotCond( Abc_ObjFanin1(pNode)->pCopy, Abc_ObjFaninC1(pNode) ) ); } - if ( !fInternal ) + if ( !fInternal ) { + assert(pProgress); Extra_ProgressBarStop( pProgress ); + } Vec_PtrFree( vNodes ); // use EXDC to change the mapping of nodes into FRAIG nodes @@ -316,7 +320,7 @@ Abc_Obj_t * Abc_NodeFromFraig_rec( Abc_Ntk_t * pNtkNew, Fraig_Node_t * pNodeFrai Fraig_Node_t * pNodeTemp, * pNodeFraigR = Fraig_Regular(pNodeFraig); void ** ppTail; // check if the node was already considered - if ( pRes = (Abc_Obj_t *)Fraig_NodeReadData1(pNodeFraigR) ) + if ( (pRes = (Abc_Obj_t *)Fraig_NodeReadData1(pNodeFraigR)) ) return Abc_ObjNotCond( pRes, Fraig_IsComplement(pNodeFraig) ); // solve the children pRes0 = Abc_NodeFromFraig_rec( pNtkNew, Fraig_NodeReadOne(pNodeFraigR) ); @@ -455,7 +459,7 @@ void Abc_NtkFromFraig2_rec( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pNode, Vec_Ptr_t * Abc_NodeSetTravIdCurrent( pNode ); assert( Abc_ObjIsNode( pNode ) ); // get the node's representative - if ( pRepr = Vec_PtrEntry(vNodeReprs, pNode->Id) ) + if ( (pRepr = Vec_PtrEntry(vNodeReprs, pNode->Id)) ) { Abc_NtkFromFraig2_rec( pNtkNew, pRepr, vNodeReprs ); pNode->pCopy = Abc_ObjNotCond( pRepr->pCopy, pRepr->fPhase ^ pNode->fPhase ); @@ -695,7 +699,7 @@ Abc_Ntk_t * Abc_NtkFraigRestore() Vec_Ptr_t * vStore; Abc_Ntk_t * pNtk, * pFraig; int nWords1, nWords2, nWordsMin; - int clk = clock(); +// int clk = clock(); // get the stored network vStore = Abc_FrameReadStore(); @@ -732,6 +736,7 @@ Abc_Ntk_t * Abc_NtkFraigRestore() Params.fDoSparse = 1; // performs equiv tests for sparse functions Params.fChoicing = 1; // enables recording structural choices Params.fTryProve = 0; // tries to solve the final miter + Params.fInternal = 1; // does not show progress bar Params.fVerbose = 0; // the verbosiness flag // perform partitioned computation of structural choices diff --git a/src/base/abci/abcIf.c b/src/base/abci/abcIf.c index 94c7dda84..751e2b2fb 100644 --- a/src/base/abci/abcIf.c +++ b/src/base/abci/abcIf.c @@ -453,8 +453,8 @@ Hop_Obj_t * Abc_NodeIfToHop( Hop_Man_t * pHopMan, If_Man_t * pIfMan, If_Obj_t * ***********************************************************************/ int Abc_ObjCompareFlow( Abc_Obj_t ** ppNode0, Abc_Obj_t ** ppNode1 ) { - float Flow0 = Abc_Int2Float((int)(*ppNode0)->pCopy); - float Flow1 = Abc_Int2Float((int)(*ppNode1)->pCopy); + float Flow0 = Abc_Int2Float((int)(PORT_PTRINT_T)(*ppNode0)->pCopy); + float Flow1 = Abc_Int2Float((int)(PORT_PTRINT_T)(*ppNode1)->pCopy); if ( Flow0 > Flow1 ) return -1; if ( Flow0 < Flow1 ) @@ -517,9 +517,9 @@ Vec_Ptr_t * Abc_NtkFindGoodOrder( Abc_Ntk_t * pNtk ) { pFanin0 = Abc_ObjFanin0(pNode); pFanin1 = Abc_ObjFanin1(pNode); - Flow0 = Abc_Int2Float((int)pFanin0->pCopy)/Abc_ObjFanoutNum(pFanin0); - Flow1 = Abc_Int2Float((int)pFanin1->pCopy)/Abc_ObjFanoutNum(pFanin1); - pNode->pCopy = (Abc_Obj_t *)Abc_Float2Int(Flow0 + Flow1+(float)1.0); + Flow0 = Abc_Int2Float((int)(PORT_PTRINT_T)pFanin0->pCopy)/Abc_ObjFanoutNum(pFanin0); + Flow1 = Abc_Int2Float((int)(PORT_PTRINT_T)pFanin1->pCopy)/Abc_ObjFanoutNum(pFanin1); + pNode->pCopy = (Abc_Obj_t *)(PORT_PTRINT_T)Abc_Float2Int(Flow0 + Flow1+(float)1.0); } // find the flow of the COs vCos = Vec_PtrAlloc( Abc_NtkCoNum(pNtk) ); @@ -536,7 +536,7 @@ Vec_Ptr_t * Abc_NtkFindGoodOrder( Abc_Ntk_t * pNtk ) // verify sorting pFanin0 = Vec_PtrEntry(vCos, 0); pFanin1 = Vec_PtrEntryLast(vCos); - assert( Abc_Int2Float((int)pFanin0->pCopy) >= Abc_Int2Float((int)pFanin1->pCopy) ); + assert( Abc_Int2Float((int)(PORT_PTRINT_T)pFanin0->pCopy) >= Abc_Int2Float((int)(PORT_PTRINT_T)pFanin1->pCopy) ); // collect the nodes in the topological order from the new array Abc_NtkIncrementTravId( pNtk ); diff --git a/src/base/abci/abcIvy.c b/src/base/abci/abcIvy.c index a470448e4..96d8196e6 100644 --- a/src/base/abci/abcIvy.c +++ b/src/base/abci/abcIvy.c @@ -73,7 +73,6 @@ extern int timeRetime; Ivy_Man_t * Abc_NtkIvyBefore( Abc_Ntk_t * pNtk, int fSeq, int fUseDc ) { Ivy_Man_t * pMan; - int fCleanup = 1; //timeRetime = clock(); assert( !Abc_NtkIsNetlist(pNtk) ); if ( Abc_NtkIsBddLogic(pNtk) ) @@ -588,9 +587,9 @@ Abc_Ntk_t * Abc_NtkIvy( Abc_Ntk_t * pNtk ) { // Abc_Ntk_t * pNtkAig; Ivy_Man_t * pMan;//, * pTemp; - int fCleanup = 1; +// int fCleanup = 1; // int nNodes; - int nLatches = Abc_NtkLatchNum(pNtk); +// int nLatches = Abc_NtkLatchNum(pNtk); Vec_Int_t * vInit = Abc_NtkCollectLatchValuesIvy( pNtk, 0 ); assert( !Abc_NtkIsNetlist(pNtk) ); diff --git a/src/base/abci/abcLut.c b/src/base/abci/abcLut.c index afa76cc85..4203a4255 100644 --- a/src/base/abci/abcLut.c +++ b/src/base/abci/abcLut.c @@ -21,6 +21,8 @@ #include "abc.h" #include "cut.h" +#define LARGE_LEVEL 1000000 + //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// @@ -212,7 +214,7 @@ void Abc_NodeLutMap( Cut_Man_t * pManCuts, Abc_Obj_t * pObj ) assert( pCut != NULL ); assert( pObj->Level == 0 ); // go through the cuts - pObj->Level = ABC_INFINITY; + pObj->Level = LARGE_LEVEL; for ( pCut = pCut->pNext; pCut; pCut = pCut->pNext ) { DelayMax = 0; @@ -226,7 +228,7 @@ void Abc_NodeLutMap( Cut_Man_t * pManCuts, Abc_Obj_t * pObj ) if ( (int)pObj->Level > DelayMax ) pObj->Level = DelayMax; } - assert( pObj->Level < ABC_INFINITY ); + assert( pObj->Level < LARGE_LEVEL ); pObj->Level++; // printf( "%d(%d) ", pObj->Id, pObj->Level ); } @@ -340,7 +342,7 @@ void Abc_ManSclStop( Abc_ManScl_t * p ) unsigned * Abc_NodeSuperChoiceTruth( Abc_ManScl_t * pManScl ) { Abc_Obj_t * pObj; - unsigned * puData0, * puData1, * puData; + unsigned * puData0, * puData1, * puData = NULL; char * pSop; int i, k; // set elementary truth tables @@ -635,7 +637,7 @@ void Abc_NodeDecomposeSort( Abc_Obj_t ** pLeaves, int nVars, int * pBSet, int nL for ( i = 0; i < nLutSize; i++ ) { kBest = -1; - LevelMin = ABC_INFINITY; + LevelMin = LARGE_LEVEL; for ( k = 0; k < nVars; k++ ) if ( pTemp[k] && LevelMin > (int)pTemp[k]->Level ) { @@ -704,7 +706,7 @@ int Abc_NodeDecomposeStep( Abc_ManScl_t * p ) pTruthClass = p->uCofs[ nCofs + pCofClasses[k][0] ]; if ( Extra_TruthIsEqual( pTruthCof, pTruthClass, nVars ) ) { - pCofClasses[k][ nCofClasses[k]++ ] = i; + pCofClasses[k][(int)nCofClasses[k]++ ] = i; break; } } diff --git a/src/base/abci/abcMap.c b/src/base/abci/abcMap.c index d4d509236..f6a1bb4ef 100644 --- a/src/base/abci/abcMap.c +++ b/src/base/abci/abcMap.c @@ -59,7 +59,7 @@ Abc_Ntk_t * Abc_NtkMap( Abc_Ntk_t * pNtk, double DelayTarget, int fRecovery, int int fShowSwitching = 1; Abc_Ntk_t * pNtkNew; Map_Man_t * pMan; - Vec_Int_t * vSwitching; + Vec_Int_t * vSwitching = NULL; float * pSwitching = NULL; int clk; diff --git a/src/base/abci/abcNtbdd.c b/src/base/abci/abcNtbdd.c index 3de3eefab..ed02f589f 100644 --- a/src/base/abci/abcNtbdd.c +++ b/src/base/abci/abcNtbdd.c @@ -258,7 +258,7 @@ DdManager * Abc_NtkBuildGlobalBdds( Abc_Ntk_t * pNtk, int nBddSizeMax, int fDrop // start the manager assert( Abc_NtkGlobalBdd(pNtk) == NULL ); dd = Cudd_Init( Abc_NtkCiNum(pNtk), 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 ); - pAttMan = Vec_AttAlloc( 0, Abc_NtkObjNumMax(pNtk) + 1, dd, Extra_StopManager, NULL, Cudd_RecursiveDeref ); + pAttMan = Vec_AttAlloc( Abc_NtkObjNumMax(pNtk) + 1, dd, (void (*)(void*))Extra_StopManager, NULL, (void (*)(void*,void*))Cudd_RecursiveDeref ); Vec_PtrWriteEntry( pNtk->vAttrs, VEC_ATTR_GLOBAL_BDD, pAttMan ); // set reordering diff --git a/src/base/abci/abcOdc.c b/src/base/abci/abcOdc.c index d6e59328e..989d551f6 100644 --- a/src/base/abci/abcOdc.c +++ b/src/base/abci/abcOdc.c @@ -662,10 +662,10 @@ void * Abc_NtkDontCareTransfer_rec( Odc_Man_t * p, Abc_Obj_t * pNode, Abc_Obj_t assert( Abc_ObjIsNode(pNode) ); // consider the case when the node is the pivot if ( pNode == pPivot ) - return pNode->pCopy = (void *)((Odc_Const1() << 16) | Odc_Const0()); + return pNode->pCopy = (void *)(PORT_PTRUINT_T)((Odc_Const1() << 16) | Odc_Const0()); // compute the cofactors - uData0 = (unsigned)Abc_NtkDontCareTransfer_rec( p, Abc_ObjFanin0(pNode), pPivot ); - uData1 = (unsigned)Abc_NtkDontCareTransfer_rec( p, Abc_ObjFanin1(pNode), pPivot ); + uData0 = (unsigned)(PORT_PTRUINT_T)Abc_NtkDontCareTransfer_rec( p, Abc_ObjFanin0(pNode), pPivot ); + uData1 = (unsigned)(PORT_PTRUINT_T)Abc_NtkDontCareTransfer_rec( p, Abc_ObjFanin1(pNode), pPivot ); // find the 0-cofactor uLit0 = Odc_NotCond( (Odc_Lit_t)(uData0 & 0xffff), Abc_ObjFaninC0(pNode) ); uLit1 = Odc_NotCond( (Odc_Lit_t)(uData1 & 0xffff), Abc_ObjFaninC1(pNode) ); @@ -675,7 +675,7 @@ void * Abc_NtkDontCareTransfer_rec( Odc_Man_t * p, Abc_Obj_t * pNode, Abc_Obj_t uLit1 = Odc_NotCond( (Odc_Lit_t)(uData1 >> 16), Abc_ObjFaninC1(pNode) ); uRes1 = Odc_And( p, uLit0, uLit1 ); // find the result - return pNode->pCopy = (void *)((uRes1 << 16) | uRes0); + return pNode->pCopy = (void *)(PORT_PTRUINT_T)((uRes1 << 16) | uRes0); } /**Function************************************************************* @@ -701,21 +701,21 @@ int Abc_NtkDontCareTransfer( Odc_Man_t * p ) Vec_PtrForEachEntry( p->vLeaves, pObj, i ) { uLit = Odc_Var( p, i ); - pObj->pCopy = (void *)((uLit << 16) | uLit); + pObj->pCopy = (void *)(PORT_PTRUINT_T)((uLit << 16) | uLit); Abc_NodeSetTravIdCurrent(pObj); } // set elementary variables at the branched Vec_PtrForEachEntry( p->vBranches, pObj, i ) { uLit = Odc_Var( p, i+p->nVarsMax ); - pObj->pCopy = (void *)((uLit << 16) | uLit); + pObj->pCopy = (void *)(PORT_PTRUINT_T)((uLit << 16) | uLit); Abc_NodeSetTravIdCurrent(pObj); } // compute the AIG for the window p->iRoot = Odc_Const0(); Vec_PtrForEachEntry( p->vRoots, pObj, i ) { - uData = (unsigned)Abc_NtkDontCareTransfer_rec( p, pObj, p->pNode ); + uData = (unsigned)(PORT_PTRUINT_T)Abc_NtkDontCareTransfer_rec( p, pObj, p->pNode ); // get the cofactors uRes0 = uData & 0xffff; uRes1 = uData >> 16; diff --git a/src/base/abci/abcPart.c b/src/base/abci/abcPart.c index 85c4e9189..a482e5c9f 100644 --- a/src/base/abci/abcPart.c +++ b/src/base/abci/abcPart.c @@ -115,7 +115,7 @@ char * Supp_ManFetch( Supp_Man_t * p, int nSize ) assert( nSize > 0 ); Type = Supp_SizeType( nSize, p->nStepSize ); Vec_PtrFillExtra( p->vFree, Type + 1, NULL ); - if ( pMemory = Vec_PtrEntry( p->vFree, Type ) ) + if ( (pMemory = Vec_PtrEntry( p->vFree, Type )) ) { Vec_PtrWriteEntry( p->vFree, Type, Supp_OneNext(pMemory) ); return pMemory; @@ -321,9 +321,9 @@ Vec_Ptr_t * Abc_NtkComputeSupportsSmart( Abc_Ntk_t * pNtk ) int i; // set the number of PIs/POs Abc_NtkForEachCi( pNtk, pObj, i ) - pObj->pNext = (Abc_Obj_t *)i; + pObj->pNext = (Abc_Obj_t *)(PORT_PTRINT_T)i; Abc_NtkForEachCo( pNtk, pObj, i ) - pObj->pNext = (Abc_Obj_t *)i; + pObj->pNext = (Abc_Obj_t *)(PORT_PTRINT_T)i; // start the support computation manager p = Supp_ManStart( 1 << 20, 1 << 6 ); // consider objects in the topological order @@ -353,7 +353,7 @@ Vec_Ptr_t * Abc_NtkComputeSupportsSmart( Abc_Ntk_t * pNtk ) if ( Abc_ObjIsNode(Abc_ObjFanin0(pObj)) ) { vSupp = Supp_ManTransferEntry(pPart0); - Vec_IntPush( vSupp, (int)pObj->pNext ); + Vec_IntPush( vSupp, (int)(PORT_PTRINT_T)pObj->pNext ); Vec_PtrPush( vSupports, vSupp ); } assert( pPart0->nRefs > 0 ); @@ -366,7 +366,7 @@ Vec_Ptr_t * Abc_NtkComputeSupportsSmart( Abc_Ntk_t * pNtk ) if ( Abc_ObjFanoutNum(pObj) ) { pPart0 = (Supp_One_t *)Supp_ManFetchEntry( p, 1, Abc_ObjFanoutNum(pObj) ); - pPart0->pOuts[ pPart0->nOuts++ ] = (int)pObj->pNext; + pPart0->pOuts[ pPart0->nOuts++ ] = (int)(PORT_PTRINT_T)pObj->pNext; pObj->pCopy = (Abc_Obj_t *)pPart0; } continue; @@ -417,7 +417,7 @@ Vec_Ptr_t * Abc_NtkComputeSupportsNaive( Abc_Ntk_t * pNtk ) int i, k; // set the PI numbers Abc_NtkForEachCi( pNtk, pObj, i ) - pObj->pNext = (void *)i; + pObj->pNext = (void *)(PORT_PTRINT_T)i; // save the CI numbers vSupports = Vec_PtrAlloc( Abc_NtkCoNum(pNtk) ); Abc_NtkForEachCo( pNtk, pObj, i ) @@ -427,7 +427,7 @@ Vec_Ptr_t * Abc_NtkComputeSupportsNaive( Abc_Ntk_t * pNtk ) vSupp = Abc_NtkNodeSupport( pNtk, &pObj, 1 ); vSuppI = (Vec_Int_t *)vSupp; Vec_PtrForEachEntry( vSupp, pTemp, k ) - Vec_IntWriteEntry( vSuppI, k, (int)pTemp->pNext ); + Vec_IntWriteEntry( vSuppI, k, (int)(PORT_PTRINT_T)pTemp->pNext ); Vec_IntSort( vSuppI, 0 ); // append the number of this output Vec_IntPush( vSuppI, i ); diff --git a/src/base/abci/abcPrint.c b/src/base/abci/abcPrint.c index 271f94dff..b753700ee 100644 --- a/src/base/abci/abcPrint.c +++ b/src/base/abci/abcPrint.c @@ -80,11 +80,11 @@ int Abc_NtkCompareAndSaveBest( Abc_Ntk_t * pNtk ) ParsNew.nPis = Abc_NtkPiNum( pNtk ); ParsNew.nPos = Abc_NtkPoNum( pNtk ); // reset the parameters if the network has the same name - if ( ParsBest.pName == NULL || - strcmp(ParsBest.pName, pNtk->pName) || - ParsBest.Depth > ParsNew.Depth || - ParsBest.Depth == ParsNew.Depth && ParsBest.Flops > ParsNew.Flops || - ParsBest.Depth == ParsNew.Depth && ParsBest.Flops == ParsNew.Flops && ParsBest.Nodes > ParsNew.Nodes ) + if ( ParsBest.pName == NULL || + strcmp(ParsBest.pName, pNtk->pName) || + ParsBest.Depth > ParsNew.Depth || + (ParsBest.Depth == ParsNew.Depth && ParsBest.Flops > ParsNew.Flops) || + (ParsBest.Depth == ParsNew.Depth && ParsBest.Flops == ParsNew.Flops && ParsBest.Nodes > ParsNew.Nodes) ) { FREE( ParsBest.pName ); ParsBest.pName = Extra_UtilStrsav( pNtk->pName ); @@ -145,9 +145,9 @@ void Abc_NtkPrintStats( FILE * pFile, Abc_Ntk_t * pNtk, int fFactored, int fSave else if ( Abc_NtkIsStrash(pNtk) ) { fprintf( pFile, " and = %5d", Abc_NtkNodeNum(pNtk) ); - if ( Num = Abc_NtkGetChoiceNum(pNtk) ) + if ( (Num = Abc_NtkGetChoiceNum(pNtk)) ) fprintf( pFile, " (choice = %d)", Num ); - if ( Num = Abc_NtkGetExorNum(pNtk) ) + if ( (Num = Abc_NtkGetExorNum(pNtk)) ) fprintf( pFile, " (exor = %d)", Num ); // if ( Num2 = Abc_NtkGetMuxNum(pNtk) ) // fprintf( pFile, " (mux = %d)", Num2-Num ); @@ -930,7 +930,7 @@ void Abc_NtkPrintGates( Abc_Ntk_t * pNtk, int fUseLibrary ) return; // transform logic functions from BDD to SOP - if ( fHasBdds = Abc_NtkIsBddLogic(pNtk) ) + if ( (fHasBdds = Abc_NtkIsBddLogic(pNtk)) ) { if ( !Abc_NtkBddToSop(pNtk, 0) ) { @@ -955,9 +955,11 @@ void Abc_NtkPrintGates( Abc_Ntk_t * pNtk, int fUseLibrary ) CountBuf++; else if ( Abc_SopIsInv(pSop) ) CountInv++; - else if ( !Abc_SopIsComplement(pSop) && Abc_SopIsAndType(pSop) || Abc_SopIsComplement(pSop) && Abc_SopIsOrType(pSop) ) + else if ( (!Abc_SopIsComplement(pSop) && Abc_SopIsAndType(pSop)) || + ( Abc_SopIsComplement(pSop) && Abc_SopIsOrType(pSop)) ) CountAnd++; - else if ( Abc_SopIsComplement(pSop) && Abc_SopIsAndType(pSop) || !Abc_SopIsComplement(pSop) && Abc_SopIsOrType(pSop) ) + else if ( ( Abc_SopIsComplement(pSop) && Abc_SopIsAndType(pSop)) || + (!Abc_SopIsComplement(pSop) && Abc_SopIsOrType(pSop)) ) CountOr++; else CountOther++; @@ -1127,7 +1129,7 @@ void Abc_ObjPrint( FILE * pFile, Abc_Obj_t * pObj ) */ // print the logic function if ( Abc_ObjIsNode(pObj) && Abc_NtkIsSopLogic(pObj->pNtk) ) - fprintf( pFile, " %s", pObj->pData ); + fprintf( pFile, " %s", (char*)pObj->pData ); else fprintf( pFile, "\n" ); } diff --git a/src/base/abci/abcProve.c b/src/base/abci/abcProve.c index 618b6a0f7..6a695fc42 100644 --- a/src/base/abci/abcProve.c +++ b/src/base/abci/abcProve.c @@ -55,7 +55,7 @@ int Abc_NtkMiterProve( Abc_Ntk_t ** ppNtk, void * pPars ) { Prove_Params_t * pParams = pPars; Abc_Ntk_t * pNtk, * pNtkTemp; - int RetValue, nIter, nSatFails, Counter, clk, timeStart = clock(); + int RetValue = -1, nIter, nSatFails, Counter, clk; //, timeStart = clock(); sint64 nSatConfs, nSatInspects, nInspectLimit; // get the starting network diff --git a/src/base/abci/abcReach.c b/src/base/abci/abcReach.c index 42494b5c4..815e452a2 100644 --- a/src/base/abci/abcReach.c +++ b/src/base/abci/abcReach.c @@ -132,10 +132,10 @@ DdNode ** Abc_NtkCreatePartitions( DdManager * dd, Abc_Ntk_t * pNtk, int fReorde DdNode * Abc_NtkComputeReachable( DdManager * dd, Abc_Ntk_t * pNtk, DdNode ** pbParts, DdNode * bInitial, DdNode * bOutput, int nBddMax, int nIterMax, int fPartition, int fReorder, int fVerbose ) { int fInternalReorder = 0; - Extra_ImageTree_t * pTree; - Extra_ImageTree2_t * pTree2; + Extra_ImageTree_t * pTree = NULL; + Extra_ImageTree2_t * pTree2 = NULL; DdNode * bReached, * bCubeCs; - DdNode * bCurrent, * bNext, * bTemp; + DdNode * bCurrent, * bNext = NULL, * bTemp; DdNode ** pbVarsY; Abc_Obj_t * pLatch; int i, nIters, nBddSize; @@ -159,6 +159,7 @@ DdNode * Abc_NtkComputeReachable( DdManager * dd, Abc_Ntk_t * pNtk, DdNode ** pb // perform reachability analisys bCurrent = bInitial; Cudd_Ref( bCurrent ); bReached = bInitial; Cudd_Ref( bReached ); + assert( nIterMax > 1 ); // required to not deref uninitialized bNext for ( nIters = 1; nIters <= nIterMax; nIters++ ) { // compute the next states diff --git a/src/base/abci/abcRec.c b/src/base/abci/abcRec.c index f74cbee8f..2983efc24 100644 --- a/src/base/abci/abcRec.c +++ b/src/base/abci/abcRec.c @@ -232,11 +232,6 @@ p->timeTruth += clock() - clk; pObj = Abc_ObjFanin0(pObj); pTruth = Vec_PtrEntry( p->vTtNodes, pObj->Id ); - if ( pTruth[0] == 1128481603 ) - { - int x = 0; - } - // add the resulting truth table to the hash table ppSpot = Abc_NtkRecTableLookup( p, pTruth, p->nVars ); assert( pObj->pEquiv == NULL ); @@ -777,7 +772,7 @@ int Abc_NtkRecAddCut( If_Man_t * pIfMan, If_Obj_t * pRoot, If_Cut_t * pCut ) static int s_MaxSize[16] = { 0 }; char Buffer[40], Name[20], Truth[20]; char pCanonPerm[16]; - Abc_Obj_t * pObj, * pFanin0, * pFanin1, ** ppSpot, * pObjPo; + Abc_Obj_t * pObj = NULL, * pFanin0, * pFanin1, ** ppSpot, * pObjPo; Abc_Ntk_t * pAig = s_pMan->pNtk; If_Obj_t * pIfObj; Vec_Ptr_t * vNodes = s_pMan->vNodes; @@ -788,11 +783,6 @@ int Abc_NtkRecAddCut( If_Man_t * pIfMan, If_Obj_t * pRoot, If_Cut_t * pCut ) unsigned uCanonPhase; int clk; - if ( pRoot->Id == 2639 ) - { - int y = 0; - } - assert( nInputs <= 16 ); assert( nInputs == (int)pCut->nLimit ); s_pMan->nTried++; @@ -848,7 +838,7 @@ s_pMan->timeCanon += clock() - clk; for ( i = 0; i < nLeaves; i++ ) { // get hold of the corresponding leaf - pIfObj = If_ManObj( pIfMan, pCut->pLeaves[pCanonPerm[i]] ); + pIfObj = If_ManObj( pIfMan, pCut->pLeaves[(int)pCanonPerm[i]] ); // get hold of the corresponding new node pObj = Abc_NtkPi( pAig, i ); pObj = Abc_ObjNotCond( pObj, (uCanonPhase & (1 << i)) ); @@ -897,6 +887,7 @@ s_pMan->timeCanon += clock() - clk; } } + assert(pObj); pTruth = Vec_PtrEntry( s_pMan->vTtNodes, pObj->Id ); if ( Kit_TruthSupport(pTruth, nInputs) != Kit_BitMask(nLeaves) ) { diff --git a/src/base/abci/abcReconv.c b/src/base/abci/abcReconv.c index e77f055a0..078aee9dd 100644 --- a/src/base/abci/abcReconv.c +++ b/src/base/abci/abcReconv.c @@ -384,8 +384,8 @@ int Abc_NodeBuildCutLevelOne_int( Vec_Ptr_t * vVisited, Vec_Ptr_t * vLeaves, int ***********************************************************************/ int Abc_NodeBuildCutLevelTwo_int( Vec_Ptr_t * vVisited, Vec_Ptr_t * vLeaves, int nFaninLimit ) { - Abc_Obj_t * pNode, * pLeafToAdd, * pNodeToMark1, * pNodeToMark2; - int CostCur, i; + Abc_Obj_t * pNode = NULL, * pLeafToAdd, * pNodeToMark1, * pNodeToMark2; + int CostCur = 0, i; // find the best fanin Vec_PtrForEachEntry( vLeaves, pNode, i ) { @@ -494,7 +494,7 @@ void Abc_NodeConeMarkCollect_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vVisited ) DdNode * Abc_NodeConeBdd( DdManager * dd, DdNode ** pbVars, Abc_Obj_t * pRoot, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vVisited ) { Abc_Obj_t * pNode; - DdNode * bFunc0, * bFunc1, * bFunc; + DdNode * bFunc0, * bFunc1, * bFunc = NULL; int i; // get the nodes in the cut without fanins in the DFS order Abc_NodeConeCollect( &pRoot, 1, vLeaves, vVisited, 0 ); @@ -510,6 +510,7 @@ DdNode * Abc_NodeConeBdd( DdManager * dd, DdNode ** pbVars, Abc_Obj_t * pRoot, V bFunc = Cudd_bddAnd( dd, bFunc0, bFunc1 ); Cudd_Ref( bFunc ); pNode->pCopy = (Abc_Obj_t *)bFunc; } + assert(bFunc); Cudd_Ref( bFunc ); // dereference the intermediate ones Vec_PtrForEachEntry( vVisited, pNode, i ) diff --git a/src/base/abci/abcRefactor.c b/src/base/abci/abcRefactor.c index b925f1b95..821bd66b3 100644 --- a/src/base/abci/abcRefactor.c +++ b/src/base/abci/abcRefactor.c @@ -267,7 +267,7 @@ clk = clock(); nNodesAdded = Dec_GraphToNetworkCount( pNode, pFForm, nNodesSaved, Required ); p->timeEval += clock() - clk; // quit if there is no improvement - if ( nNodesAdded == -1 || nNodesAdded == nNodesSaved && !fUseZeros ) + if ( nNodesAdded == -1 || (nNodesAdded == nNodesSaved && !fUseZeros) ) { Cudd_RecursiveDeref( p->dd, bNodeFunc ); Dec_GraphFree( pFForm ); diff --git a/src/base/abci/abcRestruct.c b/src/base/abci/abcRestruct.c index aa9a2998f..2550e02c9 100644 --- a/src/base/abci/abcRestruct.c +++ b/src/base/abci/abcRestruct.c @@ -295,7 +295,7 @@ Dec_Graph_t * Abc_NodeRestructure( Abc_ManRst_t * p, Abc_Obj_t * pNode, Cut_Cut_ { if ( pCut->nLeaves < 4 ) continue; - if ( pGraph = Abc_NodeRestructureCut( p, pNode, pCut ) ) + if ( (pGraph = Abc_NodeRestructureCut( p, pNode, pCut )) ) return pGraph; } return NULL; @@ -337,11 +337,6 @@ Dec_Graph_t * Abc_NodeRestructureCut( Abc_ManRst_t * p, Abc_Obj_t * pRoot, Cut_C Vec_PtrPush( p->vLeaves, pLeaf ); } - if ( pRoot->Id == 29 ) - { - int x = 0; - } - clk = clock(); // collect the internal nodes of the cut // Abc_NodeConeCollect( &pRoot, 1, p->vLeaves, p->vVisited, 0 ); @@ -430,7 +425,7 @@ clk = clock(); p->timeEval += clock() - clk; // quit if there is no improvement - if ( pGraph == NULL || nNodesAdded == -1 || nNodesAdded == nNodesSaved && !p->fUseZeros ) + if ( pGraph == NULL || nNodesAdded == -1 || (nNodesAdded == nNodesSaved && !p->fUseZeros) ) { Cudd_RecursiveDeref( p->dd, bFunc ); if ( pGraph ) Dec_GraphFree( pGraph ); @@ -1206,16 +1201,16 @@ void Abc_NodeMffcSimulate( Vec_Ptr_t * vDecs, int nLeaves, Vec_Int_t * vRands, V Vec_PtrForEachEntryStop( vDecs, pObj, i, nLeaves ) { uData = (unsigned)Vec_IntEntry( vRands, i ); - pObj->pData = (void *)uData; + pObj->pData = (void *)(PORT_PTRUINT_T)uData; Vec_IntPush( vSims, uData ); } // simulate Vec_PtrForEachEntryStart( vDecs, pObj, i, nLeaves ) { - uData0 = (unsigned)Abc_ObjFanin0(pObj)->pData; - uData1 = (unsigned)Abc_ObjFanin1(pObj)->pData; + uData0 = (unsigned)(PORT_PTRUINT_T)Abc_ObjFanin0(pObj)->pData; + uData1 = (unsigned)(PORT_PTRUINT_T)Abc_ObjFanin1(pObj)->pData; uData = (Abc_ObjFaninC0(pObj)? ~uData0 : uData0) & (Abc_ObjFaninC1(pObj)? ~uData1 : uData1); - pObj->pData = (void *)uData; + pObj->pData = (void *)(PORT_PTRUINT_T)uData; Vec_IntPush( vSims, uData ); } } @@ -1248,7 +1243,7 @@ int Abc_NodeCheckFull( Abc_ManRst_t * p, Dec_Graph_t * pGraph ) ***********************************************************************/ Dec_Graph_t * Abc_NodeMffcConstants( Abc_ManRst_t * p, Vec_Int_t * vSims ) { - Dec_Graph_t * pGraph; + Dec_Graph_t * pGraph = NULL; unsigned uRoot; // get the root node uRoot = (unsigned)Vec_IntEntryLast( vSims ); @@ -1258,6 +1253,7 @@ Dec_Graph_t * Abc_NodeMffcConstants( Abc_ManRst_t * p, Vec_Int_t * vSims ) else if ( uRoot == ~(unsigned)0 ) pGraph = Dec_GraphCreateConst1(); // check the graph + assert(pGraph); if ( Abc_NodeCheckFull( p, pGraph ) ) return pGraph; Dec_GraphFree( pGraph ); diff --git a/src/base/abci/abcResub.c b/src/base/abci/abcResub.c index a2b23c0c8..80532b141 100644 --- a/src/base/abci/abcResub.c +++ b/src/base/abci/abcResub.c @@ -164,9 +164,10 @@ int Abc_NtkResubstitute( Abc_Ntk_t * pNtk, int nCutMax, int nStepsMax, int nLeve if ( fUpdateLevel ) Abc_NtkStartReverseLevels( pNtk, 0 ); - if ( Abc_NtkLatchNum(pNtk) ) + if ( Abc_NtkLatchNum(pNtk) ) { Abc_NtkForEachLatch(pNtk, pNode, i) pNode->pNext = pNode->pData; + } // resynthesize each node once pManRes->nNodesBeg = Abc_NtkNodeNum(pNtk); @@ -249,9 +250,10 @@ pManRes->timeTotal = clock() - clkStart; Abc_NtkForEachObj( pNtk, pNode, i ) pNode->pData = NULL; - if ( Abc_NtkLatchNum(pNtk) ) + if ( Abc_NtkLatchNum(pNtk) ) { Abc_NtkForEachLatch(pNtk, pNode, i) pNode->pData = pNode->pNext, pNode->pNext = NULL; + } // put the nodes into the DFS order and reassign their IDs Abc_NtkReassignIds( pNtk ); @@ -1131,7 +1133,7 @@ Dec_Graph_t * Abc_ManResubDivs1( Abc_ManRes_t * p, int Required ) ***********************************************************************/ Dec_Graph_t * Abc_ManResubDivs12( Abc_ManRes_t * p, int Required ) { - Abc_Obj_t * pObj0, * pObj1, * pObj2, * pObjMax, * pObjMin0, * pObjMin1; + Abc_Obj_t * pObj0, * pObj1, * pObj2, * pObjMax, * pObjMin0 = NULL, * pObjMin1 = NULL; unsigned * puData0, * puData1, * puData2, * puDataR; int i, k, j, w, LevelMax; puDataR = p->pRoot->pData; @@ -1169,6 +1171,8 @@ Dec_Graph_t * Abc_ManResubDivs12( Abc_ManRes_t * p, int Required ) } p->nUsedNode2Or++; + assert(pObjMin0); + assert(pObjMin1); return Abc_ManResubQuit21( p->pRoot, pObjMin0, pObjMin1, pObjMax, 1 ); } } @@ -1208,6 +1212,8 @@ Dec_Graph_t * Abc_ManResubDivs12( Abc_ManRes_t * p, int Required ) } p->nUsedNode2And++; + assert(pObjMin0); + assert(pObjMin1); return Abc_ManResubQuit21( p->pRoot, pObjMin0, pObjMin1, pObjMax, 0 ); } } @@ -1341,7 +1347,7 @@ Dec_Graph_t * Abc_ManResubDivs3( Abc_ManRes_t * p, int Required ) { Abc_Obj_t * pObj0, * pObj1, * pObj2, * pObj3; unsigned * puData0, * puData1, * puData2, * puData3, * puDataR; - int i, k, w, Flag; + int i, k, w = 0, Flag; puDataR = p->pRoot->pData; // check positive unate divisors Vec_PtrForEachEntry( p->vDivs2UP0, pObj0, i ) @@ -1653,7 +1659,7 @@ p->timeSim += clock() - clk; clk = clock(); // consider constants - if ( pGraph = Abc_ManResubQuit( p ) ) + if ( (pGraph = Abc_ManResubQuit( p )) ) { p->nUsedNodeC++; p->nLastGain = p->nMffc; @@ -1661,7 +1667,7 @@ clk = clock(); } // consider equal nodes - if ( pGraph = Abc_ManResubDivs0( p ) ) + if ( (pGraph = Abc_ManResubDivs0( p )) ) { p->timeRes1 += clock() - clk; p->nUsedNode0++; @@ -1678,7 +1684,7 @@ p->timeRes1 += clock() - clk; Abc_ManResubDivsS( p, Required ); // consider one node - if ( pGraph = Abc_ManResubDivs1( p, Required ) ) + if ( (pGraph = Abc_ManResubDivs1( p, Required )) ) { p->timeRes1 += clock() - clk; p->nLastGain = p->nMffc - 1; @@ -1690,7 +1696,7 @@ p->timeRes1 += clock() - clk; clk = clock(); // consider triples - if ( pGraph = Abc_ManResubDivs12( p, Required ) ) + if ( (pGraph = Abc_ManResubDivs12( p, Required )) ) { p->timeRes2 += clock() - clk; p->nLastGain = p->nMffc - 2; @@ -1705,7 +1711,7 @@ p->timeResD += clock() - clk; // consider two nodes clk = clock(); - if ( pGraph = Abc_ManResubDivs2( p, Required ) ) + if ( (pGraph = Abc_ManResubDivs2( p, Required )) ) { p->timeRes2 += clock() - clk; p->nLastGain = p->nMffc - 2; @@ -1717,7 +1723,7 @@ p->timeRes2 += clock() - clk; // consider two nodes clk = clock(); - if ( pGraph = Abc_ManResubDivs3( p, Required ) ) + if ( (pGraph = Abc_ManResubDivs3( p, Required )) ) { p->timeRes3 += clock() - clk; p->nLastGain = p->nMffc - 3; @@ -1880,7 +1886,7 @@ Vec_Ptr_t * Abc_CutFactorLarge( Abc_Obj_t * pNode, int nLeavesMax ) vFeasible = Vec_IntAlloc( nLeavesMax ); while ( 1 ) { - BestCut = -1; + BestCut = -1, BestShare = -1; // find the next feasible cut to add Vec_IntClear( vFeasible ); Vec_PtrForEachEntry( vFactors, vFact, i ) diff --git a/src/base/abci/abcRewrite.c b/src/base/abci/abcRewrite.c index 3b50107b0..ff1e1f8b3 100644 --- a/src/base/abci/abcRewrite.c +++ b/src/base/abci/abcRewrite.c @@ -62,7 +62,7 @@ int Abc_NtkRewrite( Abc_Ntk_t * pNtk, int fUpdateLevel, int fUseZeros, int fVerb Cut_Man_t * pManCut; Rwr_Man_t * pManRwr; Abc_Obj_t * pNode; - Vec_Ptr_t * vAddedCells = NULL, * vUpdatedNets = NULL; +// Vec_Ptr_t * vAddedCells = NULL, * vUpdatedNets = NULL; Dec_Graph_t * pGraph; int i, nNodes, nGain, fCompl; int clk, clkStart = clock(); @@ -120,7 +120,7 @@ Rwr_ManAddTimeCuts( pManRwr, clock() - clk ); // for each cut, try to resynthesize it nGain = Rwr_NodeRewrite( pManRwr, pManCut, pNode, fUpdateLevel, fUseZeros, fPlaceEnable ); - if ( !(nGain > 0 || nGain == 0 && fUseZeros) ) + if ( !(nGain > 0 || (nGain == 0 && fUseZeros)) ) continue; // if we end up here, a rewriting step is accepted diff --git a/src/base/abci/abcRr.c b/src/base/abci/abcRr.c index c33444df1..888850e1f 100644 --- a/src/base/abci/abcRr.c +++ b/src/base/abci/abcRr.c @@ -729,16 +729,16 @@ void Abc_NtkRRSimulateStart( Abc_Ntk_t * pNtk ) int i; Abc_AigConst1(pNtk)->pData = (void *)~((unsigned)0); Abc_NtkForEachCi( pNtk, pObj, i ) - pObj->pData = (void *)SIM_RANDOM_UNSIGNED; + pObj->pData = (void *)(PORT_PTRUINT_T)SIM_RANDOM_UNSIGNED; Abc_NtkForEachNode( pNtk, pObj, i ) { if ( i == 0 ) continue; - uData0 = (unsigned)Abc_ObjFanin0(pObj)->pData; - uData1 = (unsigned)Abc_ObjFanin1(pObj)->pData; + uData0 = (unsigned)(PORT_PTRUINT_T)Abc_ObjFanin0(pObj)->pData; + uData1 = (unsigned)(PORT_PTRUINT_T)Abc_ObjFanin1(pObj)->pData; uData = Abc_ObjFaninC0(pObj)? ~uData0 : uData0; uData &= Abc_ObjFaninC1(pObj)? ~uData1 : uData1; assert( pObj->pData == NULL ); - pObj->pData = (void *)uData; + pObj->pData = (void *)(PORT_PTRUINT_T)uData; } } @@ -802,24 +802,24 @@ Vec_Str_t * Abc_NtkRRSimulate( Abc_Ntk_t * pNtk ) // simulate patters and store them in copy Abc_AigConst1(pNtk)->pCopy = (Abc_Obj_t *)~((unsigned)0); Abc_NtkForEachCi( pNtk, pObj, i ) - pObj->pCopy = (Abc_Obj_t *)SIM_RANDOM_UNSIGNED; + pObj->pCopy = (Abc_Obj_t *)(PORT_PTRUINT_T)SIM_RANDOM_UNSIGNED; Abc_NtkForEachNode( pNtk, pObj, i ) { if ( i == 0 ) continue; - uData0 = (unsigned)Abc_ObjFanin0(pObj)->pData; - uData1 = (unsigned)Abc_ObjFanin1(pObj)->pData; + uData0 = (unsigned)(PORT_PTRUINT_T)Abc_ObjFanin0(pObj)->pData; + uData1 = (unsigned)(PORT_PTRUINT_T)Abc_ObjFanin1(pObj)->pData; uData = Abc_ObjFaninC0(pObj)? ~uData0 : uData0; uData &= Abc_ObjFaninC1(pObj)? ~uData1 : uData1; - pObj->pCopy = (Abc_Obj_t *)uData; + pObj->pCopy = (Abc_Obj_t *)(PORT_PTRUINT_T)uData; } // store the result in data Abc_NtkForEachCo( pNtk, pObj, i ) { - uData0 = (unsigned)Abc_ObjFanin0(pObj)->pData; + uData0 = (unsigned)(PORT_PTRUINT_T)Abc_ObjFanin0(pObj)->pData; if ( Abc_ObjFaninC0(pObj) ) - pObj->pData = (void *)~uData0; + pObj->pData = (void *)(PORT_PTRUINT_T)~uData0; else - pObj->pData = (void *)uData0; + pObj->pData = (void *)(PORT_PTRUINT_T)uData0; } // refine the candidates @@ -904,7 +904,7 @@ void Sim_CollectNodes_rec( Abc_Obj_t * pRoot, Vec_Ptr_t * vField ) Abc_ObjForEachFanin( pRoot, pFanin, i ) Sim_CollectNodes_rec( pFanin, vField ); if ( !Abc_ObjIsCo(pRoot) ) - pRoot->pData = (void *)Vec_PtrSize(vField); + pRoot->pData = (void *)(PORT_PTRUINT_T)Vec_PtrSize(vField); Vec_PtrPush( vField, pRoot ); } @@ -934,13 +934,13 @@ void Sim_SimulateCollected( Vec_Str_t * vTargets, Vec_Ptr_t * vNodes, Vec_Ptr_t { pUnsigned = Vec_PtrEntry( vSims, i ); for ( k = 0; k < Vec_PtrSize(vNodes); k++ ) - pUnsigned[k] = (unsigned)pObj->pCopy; + pUnsigned[k] = (unsigned)(PORT_PTRUINT_T)pObj->pCopy; continue; } if ( Abc_ObjIsCo(pObj) ) { pUnsigned = Vec_PtrEntry( vSims, i ); - pUnsignedF = Vec_PtrEntry( vSims, (int)Abc_ObjFanin0(pObj)->pData ); + pUnsignedF = Vec_PtrEntry( vSims, (int)(PORT_PTRUINT_T)Abc_ObjFanin0(pObj)->pData ); if ( Abc_ObjFaninC0(pObj) ) for ( k = 0; k < Vec_PtrSize(vNodes); k++ ) pUnsigned[k] = ~pUnsignedF[k]; @@ -950,7 +950,7 @@ void Sim_SimulateCollected( Vec_Str_t * vTargets, Vec_Ptr_t * vNodes, Vec_Ptr_t // update targets for ( k = 0; k < Vec_PtrSize(vNodes); k++ ) { - if ( pUnsigned[k] == (unsigned)pObj->pData ) + if ( pUnsigned[k] == (unsigned)(PORT_PTRUINT_T)pObj->pData ) continue; pDisproved = Vec_PtrEntry( vNodes, k ); fCompl = Abc_ObjIsComplement(pDisproved); diff --git a/src/base/abci/abcSat.c b/src/base/abci/abcSat.c index afdfbdeb4..025652fef 100644 --- a/src/base/abci/abcSat.c +++ b/src/base/abci/abcSat.c @@ -27,7 +27,7 @@ static sat_solver * Abc_NtkMiterSatCreateLogic( Abc_Ntk_t * pNtk, int fAllPrimes ); extern Vec_Int_t * Abc_NtkGetCiSatVarNums( Abc_Ntk_t * pNtk ); -static nMuxes; +static int nMuxes; //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// @@ -151,7 +151,7 @@ Vec_Int_t * Abc_NtkGetCiSatVarNums( Abc_Ntk_t * pNtk ) int i; vCiIds = Vec_IntAlloc( Abc_NtkCiNum(pNtk) ); Abc_NtkForEachCi( pNtk, pObj, i ) - Vec_IntPush( vCiIds, (int)pObj->pCopy ); + Vec_IntPush( vCiIds, (int)(PORT_PTRINT_T)pObj->pCopy ); return vCiIds; } @@ -172,7 +172,7 @@ int Abc_NtkClauseTriv( sat_solver * pSat, Abc_Obj_t * pNode, Vec_Int_t * vVars ) { //printf( "Adding triv %d. %d\n", Abc_ObjRegular(pNode)->Id, (int)pSat->sat_solver_stats.clauses ); vVars->nSize = 0; - Vec_IntPush( vVars, toLitCond( (int)Abc_ObjRegular(pNode)->pCopy, Abc_ObjIsComplement(pNode) ) ); + Vec_IntPush( vVars, toLitCond( (int)(PORT_PTRINT_T)Abc_ObjRegular(pNode)->pCopy, Abc_ObjIsComplement(pNode) ) ); // Vec_IntPush( vVars, toLitCond( (int)Abc_ObjRegular(pNode)->Id, Abc_ObjIsComplement(pNode) ) ); return sat_solver_addclause( pSat, vVars->pArray, vVars->pArray + vVars->nSize ); } @@ -195,7 +195,7 @@ int Abc_NtkClauseTop( sat_solver * pSat, Vec_Ptr_t * vNodes, Vec_Int_t * vVars ) //printf( "Adding triv %d. %d\n", Abc_ObjRegular(pNode)->Id, (int)pSat->sat_solver_stats.clauses ); vVars->nSize = 0; Vec_PtrForEachEntry( vNodes, pNode, i ) - Vec_IntPush( vVars, toLitCond( (int)Abc_ObjRegular(pNode)->pCopy, Abc_ObjIsComplement(pNode) ) ); + Vec_IntPush( vVars, toLitCond( (int)(PORT_PTRINT_T)Abc_ObjRegular(pNode)->pCopy, Abc_ObjIsComplement(pNode) ) ); // Vec_IntPush( vVars, toLitCond( (int)Abc_ObjRegular(pNode)->Id, Abc_ObjIsComplement(pNode) ) ); return sat_solver_addclause( pSat, vVars->pArray, vVars->pArray + vVars->nSize ); } @@ -220,7 +220,7 @@ int Abc_NtkClauseAnd( sat_solver * pSat, Abc_Obj_t * pNode, Vec_Ptr_t * vSuper, assert( Abc_ObjIsNode( pNode ) ); // nVars = sat_solver_nvars(pSat); - Var = (int)pNode->pCopy; + Var = (int)(PORT_PTRINT_T)pNode->pCopy; // Var = pNode->Id; // assert( Var < nVars ); @@ -230,7 +230,7 @@ int Abc_NtkClauseAnd( sat_solver * pSat, Abc_Obj_t * pNode, Vec_Ptr_t * vSuper, // get the complemented attributes of the nodes fComp1 = Abc_ObjIsComplement(vSuper->pArray[i]); // determine the variable numbers - Var1 = (int)Abc_ObjRegular(vSuper->pArray[i])->pCopy; + Var1 = (int)(PORT_PTRINT_T)Abc_ObjRegular(vSuper->pArray[i])->pCopy; // Var1 = (int)Abc_ObjRegular(vSuper->pArray[i])->Id; // check that the variables are in the SAT manager @@ -255,7 +255,7 @@ int Abc_NtkClauseAnd( sat_solver * pSat, Abc_Obj_t * pNode, Vec_Ptr_t * vSuper, // get the complemented attributes of the nodes fComp1 = Abc_ObjIsComplement(vSuper->pArray[i]); // determine the variable numbers - Var1 = (int)Abc_ObjRegular(vSuper->pArray[i])->pCopy; + Var1 = (int)(PORT_PTRINT_T)Abc_ObjRegular(vSuper->pArray[i])->pCopy; // Var1 = (int)Abc_ObjRegular(vSuper->pArray[i])->Id; // add this variable to the array Vec_IntPush( vVars, toLitCond(Var1, !fComp1) ); @@ -283,10 +283,10 @@ int Abc_NtkClauseMux( sat_solver * pSat, Abc_Obj_t * pNode, Abc_Obj_t * pNodeC, assert( !Abc_ObjIsComplement( pNode ) ); assert( Abc_NodeIsMuxType( pNode ) ); // get the variable numbers - VarF = (int)pNode->pCopy; - VarI = (int)pNodeC->pCopy; - VarT = (int)Abc_ObjRegular(pNodeT)->pCopy; - VarE = (int)Abc_ObjRegular(pNodeE)->pCopy; + VarF = (int)(PORT_PTRINT_T)pNode->pCopy; + VarI = (int)(PORT_PTRINT_T)pNodeC->pCopy; + VarT = (int)(PORT_PTRINT_T)Abc_ObjRegular(pNodeT)->pCopy; + VarE = (int)(PORT_PTRINT_T)Abc_ObjRegular(pNodeE)->pCopy; // VarF = (int)pNode->Id; // VarI = (int)pNodeC->Id; // VarT = (int)Abc_ObjRegular(pNodeT)->Id; @@ -379,12 +379,12 @@ int Abc_NtkCollectSupergate_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vSuper, int fFir } // if the new node is complemented or a PI, another gate begins if ( !fFirst ) - if ( Abc_ObjIsComplement(pNode) || !Abc_ObjIsNode(pNode) || Abc_ObjFanoutNum(pNode) > 1 || fStopAtMux && Abc_NodeIsMuxType(pNode) ) - { - Vec_PtrPush( vSuper, pNode ); - Abc_ObjRegular(pNode)->fMarkB = 1; - return 0; - } + if ( Abc_ObjIsComplement(pNode) || !Abc_ObjIsNode(pNode) || Abc_ObjFanoutNum(pNode) > 1 || (fStopAtMux && Abc_NodeIsMuxType(pNode)) ) + { + Vec_PtrPush( vSuper, pNode ); + Abc_ObjRegular(pNode)->fMarkB = 1; + return 0; + } assert( !Abc_ObjIsComplement(pNode) ); assert( Abc_ObjIsNode(pNode) ); // go through the branches @@ -462,9 +462,7 @@ int Abc_NtkMiterSatCreateInt( sat_solver * pSat, Abc_Ntk_t * pNtk ) Vec_Ptr_t * vNodes, * vSuper; Vec_Int_t * vVars; int i, k, fUseMuxes = 1; - int clk1 = clock(); // int fOrderCiVarsFirst = 0; - int nLevelsMax = Abc_AigLevel(pNtk); int RetValue = 0; assert( Abc_NtkIsStrash(pNtk) ); @@ -481,7 +479,7 @@ int Abc_NtkMiterSatCreateInt( sat_solver * pSat, Abc_Ntk_t * pNtk ) // add the clause for the constant node pNode = Abc_AigConst1(pNtk); pNode->fMarkA = 1; - pNode->pCopy = (Abc_Obj_t *)vNodes->nSize; + pNode->pCopy = (Abc_Obj_t *)(PORT_PTRINT_T)vNodes->nSize; Vec_PtrPush( vNodes, pNode ); Abc_NtkClauseTriv( pSat, pNode, vVars ); /* @@ -503,7 +501,7 @@ int Abc_NtkMiterSatCreateInt( sat_solver * pSat, Abc_Ntk_t * pNtk ) if ( pFanin->fMarkA == 0 ) { pFanin->fMarkA = 1; - pFanin->pCopy = (Abc_Obj_t *)vNodes->nSize; + pFanin->pCopy = (Abc_Obj_t *)(PORT_PTRINT_T)vNodes->nSize; Vec_PtrPush( vNodes, pFanin ); } // add the trivial clause @@ -538,7 +536,7 @@ int Abc_NtkMiterSatCreateInt( sat_solver * pSat, Abc_Ntk_t * pNtk ) if ( pFanin->fMarkA == 0 ) { pFanin->fMarkA = 1; - pFanin->pCopy = (Abc_Obj_t *)vNodes->nSize; + pFanin->pCopy = (Abc_Obj_t *)(PORT_PTRINT_T)vNodes->nSize; Vec_PtrPush( vNodes, pFanin ); } } @@ -557,7 +555,7 @@ int Abc_NtkMiterSatCreateInt( sat_solver * pSat, Abc_Ntk_t * pNtk ) if ( pFanin->fMarkA == 0 ) { pFanin->fMarkA = 1; - pFanin->pCopy = (Abc_Obj_t *)vNodes->nSize; + pFanin->pCopy = (Abc_Obj_t *)(PORT_PTRINT_T)vNodes->nSize; Vec_PtrPush( vNodes, pFanin ); } } @@ -625,7 +623,7 @@ void * Abc_NtkMiterSatCreate( Abc_Ntk_t * pNtk, int fAllPrimes ) { sat_solver * pSat; Abc_Obj_t * pNode; - int RetValue, i, clk = clock(); + int RetValue, i; //, clk = clock(); assert( Abc_NtkIsStrash(pNtk) || Abc_NtkIsBddLogic(pNtk) ); if ( Abc_NtkIsBddLogic(pNtk) ) @@ -842,7 +840,7 @@ sat_solver * Abc_NtkMiterSatCreateLogic( Abc_Ntk_t * pNtk, int fAllPrimes ) // transfer the IDs to the copy field Abc_NtkForEachPi( pNtk, pNode, i ) - pNode->pCopy = (void *)pNode->Id; + pNode->pCopy = (void *)(PORT_PTRINT_T)pNode->Id; // start the data structures pSat = sat_solver_new(); @@ -913,7 +911,7 @@ void Abc_NtkWriteSorterCnf( char * pFileName, int nVars, int nQueens ) if ( nQueens <= 0 && nQueens >= nVars ) { - printf( "The number of queens (Q = %d) should belong to the interval: 0 < Q < %d.\n", nQueens, nQueens, nVars ); + printf( "The number of queens (Q = %d) should belong to the interval: 0 < Q < %d.\n", nQueens, nQueens); return; } assert( nQueens > 0 && nQueens < nVars ); @@ -947,9 +945,9 @@ void Abc_NtkWriteSorterCnf( char * pFileName, int nVars, int nQueens ) Abc_NtkForEachObj( pNtk, pObj, i ) pObj->pCopy = (void *)~0; Abc_NtkForEachPi( pNtk, pObj, i ) - pObj->pCopy = (void *)Counter++; + pObj->pCopy = (void *)(PORT_PTRINT_T)Counter++; Vec_PtrForEachEntry( vNodes, pObj, i ) - pObj->pCopy = (void *)Counter++; + pObj->pCopy = (void *)(PORT_PTRINT_T)Counter++; /* OutVar = pCnf->pVarNums[ pObj->Id ]; @@ -977,14 +975,14 @@ void Abc_NtkWriteSorterCnf( char * pFileName, int nVars, int nQueens ) Vec_PtrForEachEntry( vNodes, pObj, i ) { // positive phase - fprintf( pFile, "%d %s%d %s%d 0\n", 1+(int)pObj->pCopy, - Abc_ObjFaninC0(pObj)? "" : "-", 1+(int)Abc_ObjFanin0(pObj)->pCopy, - Abc_ObjFaninC1(pObj)? "" : "-", 1+(int)Abc_ObjFanin1(pObj)->pCopy ); + fprintf( pFile, "%d %s%d %s%d 0\n", 1+(int)(PORT_PTRINT_T)pObj->pCopy, + Abc_ObjFaninC0(pObj)? "" : "-", 1+(int)(PORT_PTRINT_T)Abc_ObjFanin0(pObj)->pCopy, + Abc_ObjFaninC1(pObj)? "" : "-", 1+(int)(PORT_PTRINT_T)Abc_ObjFanin1(pObj)->pCopy ); // negative phase - fprintf( pFile, "-%d %s%d 0\n", 1+(int)pObj->pCopy, - Abc_ObjFaninC0(pObj)? "-" : "", 1+(int)Abc_ObjFanin0(pObj)->pCopy ); - fprintf( pFile, "-%d %s%d 0\n", 1+(int)pObj->pCopy, - Abc_ObjFaninC1(pObj)? "-" : "", 1+(int)Abc_ObjFanin1(pObj)->pCopy ); + fprintf( pFile, "-%d %s%d 0\n", 1+(int)(PORT_PTRINT_T)pObj->pCopy, + Abc_ObjFaninC0(pObj)? "-" : "", 1+(int)(PORT_PTRINT_T)Abc_ObjFanin0(pObj)->pCopy ); + fprintf( pFile, "-%d %s%d 0\n", 1+(int)(PORT_PTRINT_T)pObj->pCopy, + Abc_ObjFaninC1(pObj)? "-" : "", 1+(int)(PORT_PTRINT_T)Abc_ObjFanin1(pObj)->pCopy ); } Vec_PtrFree( vNodes ); @@ -994,10 +992,10 @@ void Abc_NtkWriteSorterCnf( char * pFileName, int nVars, int nQueens ) */ // assert the first literal to zero fprintf( pFile, "%s%d 0\n", - Abc_ObjFaninC0(ppNodes[0])? "" : "-", 1+(int)Abc_ObjFanin0(ppNodes[0])->pCopy ); + Abc_ObjFaninC0(ppNodes[0])? "" : "-", 1+(int)(PORT_PTRINT_T)Abc_ObjFanin0(ppNodes[0])->pCopy ); // assert the second literal to one fprintf( pFile, "%s%d 0\n", - Abc_ObjFaninC0(ppNodes[1])? "-" : "", 1+(int)Abc_ObjFanin0(ppNodes[1])->pCopy ); + Abc_ObjFaninC0(ppNodes[1])? "-" : "", 1+(int)(PORT_PTRINT_T)Abc_ObjFanin0(ppNodes[1])->pCopy ); fclose( pFile ); } diff --git a/src/base/abci/abcStrash.c b/src/base/abci/abcStrash.c index c1e0faf0e..084f6a6cd 100644 --- a/src/base/abci/abcStrash.c +++ b/src/base/abci/abcStrash.c @@ -46,7 +46,7 @@ static void Abc_NtkStrashPerform( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew, int fAl ***********************************************************************/ Abc_Ntk_t * Abc_NtkRestrash( Abc_Ntk_t * pNtk, bool fCleanup ) { - extern int timeRetime; +// extern int timeRetime; Abc_Ntk_t * pNtkAig; Abc_Obj_t * pObj; int i, nNodes;//, RetValue; @@ -99,7 +99,7 @@ Abc_Ntk_t * Abc_NtkRestrash( Abc_Ntk_t * pNtk, bool fCleanup ) ***********************************************************************/ Abc_Ntk_t * Abc_NtkRestrashZero( Abc_Ntk_t * pNtk, bool fCleanup ) { - extern int timeRetime; +// extern int timeRetime; Abc_Ntk_t * pNtkAig; Abc_Obj_t * pObj; int i, nNodes;//, RetValue; @@ -311,7 +311,7 @@ void Abc_NtkStrashPerform( Abc_Ntk_t * pNtkOld, Abc_Ntk_t * pNtkNew, int fAllNod ProgressBar * pProgress; Vec_Ptr_t * vNodes; Abc_Obj_t * pNodeOld; - int i, clk = clock(); + int i; //, clk = clock(); assert( Abc_NtkIsLogic(pNtkOld) ); assert( Abc_NtkIsStrash(pNtkNew) ); // vNodes = Abc_NtkDfs( pNtkOld, fAllNodes ); diff --git a/src/base/abci/abcSweep.c b/src/base/abci/abcSweep.c index 1ae8745b7..c5f4bb1e9 100644 --- a/src/base/abci/abcSweep.c +++ b/src/base/abci/abcSweep.c @@ -338,9 +338,9 @@ void Abc_NtkFraigMergeClassMapped( Abc_Ntk_t * pNtk, Abc_Obj_t * pChain, int fUs // assert( Abc_ObjIsCi(pNodeMin) || Arrival1 > 0 ); // assert( Abc_ObjIsCi(pNode) || Arrival2 > 0 ); if ( Arrival1 > Arrival2 || - Arrival1 == Arrival2 && pNodeMin->Level > pNode->Level || - Arrival1 == Arrival2 && pNodeMin->Level == pNode->Level && - Abc_NodeDroppingCost(pNodeMin) < Abc_NodeDroppingCost(pNode) ) + (Arrival1 == Arrival2 && pNodeMin->Level > pNode->Level) || + (Arrival1 == Arrival2 && pNodeMin->Level == pNode->Level && + Abc_NodeDroppingCost(pNodeMin) < Abc_NodeDroppingCost(pNode)) ) pNodeMin = pNode; } @@ -358,9 +358,9 @@ void Abc_NtkFraigMergeClassMapped( Abc_Ntk_t * pNtk, Abc_Obj_t * pChain, int fUs // assert( Abc_ObjIsCi(pNodeMin) || Arrival1 > 0 ); // assert( Abc_ObjIsCi(pNode) || Arrival2 > 0 ); if ( Arrival1 > Arrival2 || - Arrival1 == Arrival2 && pNodeMin->Level > pNode->Level || - Arrival1 == Arrival2 && pNodeMin->Level == pNode->Level && - Abc_NodeDroppingCost(pNodeMin) < Abc_NodeDroppingCost(pNode) ) + (Arrival1 == Arrival2 && pNodeMin->Level > pNode->Level) || + (Arrival1 == Arrival2 && pNodeMin->Level == pNode->Level && + Abc_NodeDroppingCost(pNodeMin) < Abc_NodeDroppingCost(pNode)) ) pNodeMin = pNode; } diff --git a/src/base/abci/abcVerify.c b/src/base/abci/abcVerify.c index 96a4566d3..1131f119a 100644 --- a/src/base/abci/abcVerify.c +++ b/src/base/abci/abcVerify.c @@ -669,18 +669,18 @@ int * Abc_NtkVerifySimulatePattern( Abc_Ntk_t * pNtk, int * pModel ) // set the CI values Abc_AigConst1(pNtk)->pCopy = (void *)1; Abc_NtkForEachCi( pNtk, pNode, i ) - pNode->pCopy = (void *)pModel[i]; + pNode->pCopy = (void *)(PORT_PTRINT_T)pModel[i]; // simulate in the topological order Abc_NtkForEachNode( pNtk, pNode, i ) { - Value0 = ((int)Abc_ObjFanin0(pNode)->pCopy) ^ Abc_ObjFaninC0(pNode); - Value1 = ((int)Abc_ObjFanin1(pNode)->pCopy) ^ Abc_ObjFaninC1(pNode); - pNode->pCopy = (void *)(Value0 & Value1); + Value0 = ((int)(PORT_PTRINT_T)Abc_ObjFanin0(pNode)->pCopy) ^ Abc_ObjFaninC0(pNode); + Value1 = ((int)(PORT_PTRINT_T)Abc_ObjFanin1(pNode)->pCopy) ^ Abc_ObjFaninC1(pNode); + pNode->pCopy = (void *)(PORT_PTRINT_T)(Value0 & Value1); } // fill the output values pValues = ALLOC( int, Abc_NtkCoNum(pNtk) ); Abc_NtkForEachCo( pNtk, pNode, i ) - pValues[i] = ((int)Abc_ObjFanin0(pNode)->pCopy) ^ Abc_ObjFaninC0(pNode); + pValues[i] = ((int)(PORT_PTRINT_T)Abc_ObjFanin0(pNode)->pCopy) ^ Abc_ObjFaninC0(pNode); if ( fStrashed ) Abc_NtkDelete( pNtk ); return pValues; @@ -740,7 +740,7 @@ void Abc_NtkVerifyReportError( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int * pMode vNodes = Abc_NtkNodeSupport( pNtk1, &pNode, 1 ); // set the PI numbers Abc_NtkForEachCi( pNtk1, pNode, i ) - pNode->pCopy = (void*)i; + pNode->pCopy = (void*)(PORT_PTRINT_T)i; // print the model pNode = Vec_PtrEntry( vNodes, 0 ); if ( Abc_ObjIsCi(pNode) ) @@ -748,7 +748,7 @@ void Abc_NtkVerifyReportError( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int * pMode Vec_PtrForEachEntry( vNodes, pNode, i ) { assert( Abc_ObjIsCi(pNode) ); - printf( " %s=%d", Abc_ObjName(pNode), pModel[(int)pNode->pCopy] ); + printf( " %s=%d", Abc_ObjName(pNode), pModel[(int)(PORT_PTRINT_T)pNode->pCopy] ); } } printf( "\n" ); @@ -819,9 +819,9 @@ void Abc_NtkVerifyReportErrorSeq( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int * pM { Vec_Ptr_t * vInfo1, * vInfo2; Abc_Obj_t * pObj, * pObjError, * pObj1, * pObj2; - int ValueError1, ValueError2; + int ValueError1 = -1, ValueError2 = -1; unsigned * pPats1, * pPats2; - int i, o, k, nErrors, iFrameError, iNodePo, nPrinted; + int i, o, k, nErrors, iFrameError = -1, iNodePo = -1, nPrinted; int fRemove1 = 0, fRemove2 = 0; if ( !Abc_NtkIsStrash(pNtk1) ) @@ -991,7 +991,7 @@ void Abc_NtkSimulteBuggyMiter( Abc_Ntk_t * pNtk ) Abc_NtkForEachPi( pNtk, pObj, i ) pModel1[i] = vPiValues1[i] - '0'; Abc_NtkForEachLatch( pNtk, pObj, i ) - pModel1[Abc_NtkPiNum(pNtk)+i] = ((int)pObj->pData) - 1; + pModel1[Abc_NtkPiNum(pNtk)+i] = ((int)(PORT_PTRINT_T)pObj->pData) - 1; pResult1 = Abc_NtkVerifySimulatePattern( pNtk, pModel1 ); printf( "Value = %d\n", pResult1[0] ); diff --git a/src/base/abci/abcXsim.c b/src/base/abci/abcXsim.c index e56561704..877395722 100644 --- a/src/base/abci/abcXsim.c +++ b/src/base/abci/abcXsim.c @@ -28,8 +28,8 @@ #define XVS1 ABC_INIT_ONE #define XVSX ABC_INIT_DC -static inline void Abc_ObjSetXsim( Abc_Obj_t * pObj, int Value ) { pObj->pCopy = (void *)Value; } -static inline int Abc_ObjGetXsim( Abc_Obj_t * pObj ) { return (int)pObj->pCopy; } +static inline void Abc_ObjSetXsim( Abc_Obj_t * pObj, int Value ) { pObj->pCopy = (void *)(PORT_PTRINT_T)Value; } +static inline int Abc_ObjGetXsim( Abc_Obj_t * pObj ) { return (int)(PORT_PTRINT_T)pObj->pCopy; } static inline int Abc_XsimInv( int Value ) { if ( Value == XVS0 ) @@ -214,7 +214,7 @@ void Abc_NtkCycleInitState( Abc_Ntk_t * pNtk, int nFrames, int fVerbose ) } // set the final values Abc_NtkForEachLatch( pNtk, pObj, i ) - pObj->pData = (void *)Abc_ObjGetXsim(Abc_ObjFanout0(pObj)); + pObj->pData = (void *)(PORT_PTRINT_T)Abc_ObjGetXsim(Abc_ObjFanout0(pObj)); } /////////////////////////////////////////////////////////////////////// diff --git a/src/base/cmd/cmd.c b/src/base/cmd/cmd.c index 313ae0ed4..75aa00646 100644 --- a/src/base/cmd/cmd.c +++ b/src/base/cmd/cmd.c @@ -20,6 +20,8 @@ #ifdef WIN32 #include +#else +#include #endif #include "mainInt.h" @@ -346,7 +348,7 @@ int CmdCommandHistory( Abc_Frame_t * pAbc, int argc, char **argv ) size = pAbc->aHistory->nSize; num = ( num < size ) ? num : size; for ( i = size - num; i < size; i++ ) - fprintf( pAbc->Out, "%s", pAbc->aHistory->pArray[i] ); + fprintf( pAbc->Out, "%s", (char*)pAbc->aHistory->pArray[i] ); return 0; usage: diff --git a/src/base/io/io.c b/src/base/io/io.c index 7538e31c5..1695942ea 100644 --- a/src/base/io/io.c +++ b/src/base/io/io.c @@ -970,7 +970,7 @@ int IoCommandReadVer( Abc_Frame_t * pAbc, int argc, char ** argv ) if ( (pFile = fopen( pFileName, "r" )) == NULL ) { fprintf( pAbc->Err, "Cannot open input file \"%s\". ", pFileName ); - if ( pFileName = Extra_FileGetSimilarName( pFileName, ".blif", ".bench", ".pla", ".baf", ".aig" ) ) + if ( (pFileName = Extra_FileGetSimilarName( pFileName, ".blif", ".bench", ".pla", ".baf", ".aig" )) ) fprintf( pAbc->Err, "Did you mean \"%s\"?", pFileName ); fprintf( pAbc->Err, "\n" ); return 1; @@ -1061,7 +1061,7 @@ int IoCommandReadVerLib( Abc_Frame_t * pAbc, int argc, char ** argv ) if ( (pFile = fopen( pFileName, "r" )) == NULL ) { fprintf( pAbc->Err, "Cannot open input file \"%s\". ", pFileName ); - if ( pFileName = Extra_FileGetSimilarName( pFileName, ".blif", ".bench", ".pla", ".baf", ".aig" ) ) + if ( (pFileName = Extra_FileGetSimilarName( pFileName, ".blif", ".bench", ".pla", ".baf", ".aig" )) ) fprintf( pAbc->Err, "Did you mean \"%s\"?", pFileName ); fprintf( pAbc->Err, "\n" ); return 1; @@ -1120,6 +1120,11 @@ int IoCommandWrite( Abc_Frame_t * pAbc, int argc, char **argv ) goto usage; } } + if ( pAbc->pNtkCur == NULL ) + { + fprintf( pAbc->Out, "Empty network.\n" ); + return 0; + } if ( argc != globalUtilOptind + 1 ) goto usage; // get the output file name @@ -1168,6 +1173,11 @@ int IoCommandWriteHie( Abc_Frame_t * pAbc, int argc, char **argv ) goto usage; } } + if ( pAbc->pNtkCur == NULL ) + { + fprintf( pAbc->Out, "Empty network.\n" ); + return 0; + } if ( argc != globalUtilOptind + 2 ) goto usage; // get the output file name @@ -1226,6 +1236,11 @@ int IoCommandWriteAiger( Abc_Frame_t * pAbc, int argc, char **argv ) goto usage; } } + if ( pAbc->pNtkCur == NULL ) + { + fprintf( pAbc->Out, "Empty network.\n" ); + return 0; + } if ( argc != globalUtilOptind + 1 ) goto usage; // get the output file name @@ -1276,6 +1291,11 @@ int IoCommandWriteBaf( Abc_Frame_t * pAbc, int argc, char **argv ) goto usage; } } + if ( pAbc->pNtkCur == NULL ) + { + fprintf( pAbc->Out, "Empty network.\n" ); + return 0; + } if ( argc != globalUtilOptind + 1 ) goto usage; // get the output file name @@ -1319,6 +1339,11 @@ int IoCommandWriteBlif( Abc_Frame_t * pAbc, int argc, char **argv ) goto usage; } } + if ( pAbc->pNtkCur == NULL ) + { + fprintf( pAbc->Out, "Empty network.\n" ); + return 0; + } if ( argc != globalUtilOptind + 1 ) goto usage; // get the output file name @@ -1362,6 +1387,11 @@ int IoCommandWriteBlifMv( Abc_Frame_t * pAbc, int argc, char **argv ) goto usage; } } + if ( pAbc->pNtkCur == NULL ) + { + fprintf( pAbc->Out, "Empty network.\n" ); + return 0; + } if ( argc != globalUtilOptind + 1 ) goto usage; // get the output file name @@ -1410,6 +1440,11 @@ int IoCommandWriteBench( Abc_Frame_t * pAbc, int argc, char **argv ) goto usage; } } + if ( pAbc->pNtkCur == NULL ) + { + fprintf( pAbc->Out, "Empty network.\n" ); + return 0; + } if ( argc != globalUtilOptind + 1 ) goto usage; // get the output file name @@ -1467,14 +1502,14 @@ int IoCommandWriteCellNet( Abc_Frame_t * pAbc, int argc, char **argv ) goto usage; } } - if ( argc != globalUtilOptind + 1 ) - goto usage; - pNtk = pAbc->pNtkCur; - if ( pNtk == NULL ) + if ( pAbc->pNtkCur == NULL ) { fprintf( pAbc->Out, "Empty network.\n" ); return 0; } + if ( argc != globalUtilOptind + 1 ) + goto usage; + pNtk = pAbc->pNtkCur; // get the output file name pFileName = argv[globalUtilOptind]; // call the corresponding file writer @@ -1532,6 +1567,11 @@ int IoCommandWriteCnf( Abc_Frame_t * pAbc, int argc, char **argv ) goto usage; } } + if ( pAbc->pNtkCur == NULL ) + { + fprintf( pAbc->Out, "Empty network.\n" ); + return 0; + } if ( argc != globalUtilOptind + 1 ) goto usage; // get the output file name @@ -1588,6 +1628,11 @@ int IoCommandWriteDot( Abc_Frame_t * pAbc, int argc, char **argv ) goto usage; } } + if ( pAbc->pNtkCur == NULL ) + { + fprintf( pAbc->Out, "Empty network.\n" ); + return 0; + } if ( argc != globalUtilOptind + 1 ) goto usage; // get the output file name @@ -1763,6 +1808,11 @@ int IoCommandWriteEqn( Abc_Frame_t * pAbc, int argc, char **argv ) goto usage; } } + if ( pAbc->pNtkCur == NULL ) + { + fprintf( pAbc->Out, "Empty network.\n" ); + return 0; + } if ( argc != globalUtilOptind + 1 ) goto usage; // get the output file name @@ -1806,6 +1856,11 @@ int IoCommandWriteGml( Abc_Frame_t * pAbc, int argc, char **argv ) goto usage; } } + if ( pAbc->pNtkCur == NULL ) + { + fprintf( pAbc->Out, "Empty network.\n" ); + return 0; + } if ( argc != globalUtilOptind + 1 ) goto usage; // get the output file name @@ -1857,13 +1912,13 @@ int IoCommandWriteList( Abc_Frame_t * pAbc, int argc, char **argv ) goto usage; } } - if ( argc != globalUtilOptind + 1 ) - goto usage; if ( pAbc->pNtkCur == NULL ) { fprintf( pAbc->Out, "Empty network.\n" ); return 0; } + if ( argc != globalUtilOptind + 1 ) + goto usage; /* if ( !Abc_NtkIsSeq(pAbc->pNtkCur) ) { @@ -1913,6 +1968,11 @@ int IoCommandWritePla( Abc_Frame_t * pAbc, int argc, char **argv ) goto usage; } } + if ( pAbc->pNtkCur == NULL ) + { + fprintf( pAbc->Out, "Empty network.\n" ); + return 0; + } if ( argc != globalUtilOptind + 1 ) goto usage; // get the output file name @@ -1956,6 +2016,11 @@ int IoCommandWriteVerilog( Abc_Frame_t * pAbc, int argc, char **argv ) goto usage; } } + if ( pAbc->pNtkCur == NULL ) + { + fprintf( pAbc->Out, "Empty network.\n" ); + return 0; + } if ( argc != globalUtilOptind + 1 ) goto usage; // get the output file name diff --git a/src/base/io/ioReadAiger.c b/src/base/io/ioReadAiger.c index 9ecc00fd8..b85555611 100644 --- a/src/base/io/ioReadAiger.c +++ b/src/base/io/ioReadAiger.c @@ -19,8 +19,11 @@ ***********************************************************************/ +// The code in this file is developed in collaboration with Mark Jarvin of Toronto. + #include "ioAbc.h" -#include +#include "bzlib.h" +#include "zlib.h" //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// @@ -104,7 +107,7 @@ typedef struct buflist { struct buflist * next; } buflist; -static char * Ioa_ReadLoadFileBz2Aig( char * pFileName ) +static char * Ioa_ReadLoadFileBz2Aig( char * pFileName, int * pFileSize ) { FILE * pFile; int nFileSize = 0; @@ -168,10 +171,46 @@ static char * Ioa_ReadLoadFileBz2Aig( char * pFileName ) fclose( pFile ); // finish off the file with the spare .end line // some benchmarks suddenly break off without this line - strcpy( pContents + nFileSize, "\n.end\n" ); +// strcpy( pContents + nFileSize, "\n.end\n" ); + *pFileSize = nFileSize; return pContents; } +/**Function************************************************************* + + Synopsis [Reads the file into a character buffer.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +static char * Ioa_ReadLoadFileGzAig( char * pFileName, int * pFileSize ) +{ + const int READ_BLOCK_SIZE = 100000; + FILE * pFile; + char * pContents; + int amtRead, readBlock, nFileSize = READ_BLOCK_SIZE; + pFile = gzopen( pFileName, "rb" ); // if pFileName doesn't end in ".gz" then this acts as a passthrough to fopen + pContents = ALLOC( char, nFileSize ); + readBlock = 0; + while ((amtRead = gzread(pFile, pContents + readBlock * READ_BLOCK_SIZE, READ_BLOCK_SIZE)) == READ_BLOCK_SIZE) { + //printf("%d: read %d bytes\n", readBlock, amtRead); + nFileSize += READ_BLOCK_SIZE; + pContents = REALLOC(char, pContents, nFileSize); + ++readBlock; + } + //printf("%d: read %d bytes\n", readBlock, amtRead); + assert( amtRead != -1 ); // indicates a zlib error + nFileSize -= (READ_BLOCK_SIZE - amtRead); + gzclose(pFile); + *pFileSize = nFileSize; + return pContents; +} + + /**Function************************************************************* Synopsis [Reads the AIG in the binary AIGER format.] @@ -191,13 +230,15 @@ Abc_Ntk_t * Io_ReadAiger( char * pFileName, int fCheck ) Vec_Int_t * vLits = NULL; Abc_Obj_t * pObj, * pNode0, * pNode1; Abc_Ntk_t * pNtkNew; - int nTotal, nInputs, nOutputs, nLatches, nAnds, nFileSize, iTerm, nDigits, i; - char * pContents, * pDrivers, * pSymbols, * pCur, * pName, * pType; + int nTotal, nInputs, nOutputs, nLatches, nAnds, nFileSize = -1, iTerm, nDigits, i; + char * pContents, * pDrivers = NULL, * pSymbols, * pCur, * pName, * pType; unsigned uLit0, uLit1, uLit; // read the file into the buffer if ( !strncmp(pFileName+strlen(pFileName)-4,".bz2",4) ) - pContents = Ioa_ReadLoadFileBz2Aig( pFileName ); + pContents = Ioa_ReadLoadFileBz2Aig( pFileName, &nFileSize ); + else if ( !strncmp(pFileName+strlen(pFileName)-3,".gz",3) ) + pContents = Ioa_ReadLoadFileGzAig( pFileName, &nFileSize ); else { // pContents = Ioa_ReadLoadFile( pFileName ); diff --git a/src/base/io/ioReadBaf.c b/src/base/io/ioReadBaf.c index 13f644cc4..eb3376031 100644 --- a/src/base/io/ioReadBaf.c +++ b/src/base/io/ioReadBaf.c @@ -112,9 +112,9 @@ Abc_Ntk_t * Io_ReadBaf( char * pFileName, int fCheck ) } // get the pointer to the beginning of the node array - pBufferNode = (int *)(pContents + (nFileSize - (2 * nAnds + nOutputs + nLatches) * sizeof(int)) ); + pBufferNode = (unsigned *)(pContents + (nFileSize - (2 * nAnds + nOutputs + nLatches) * sizeof(int)) ); // make sure we are at the place where the nodes begin - if ( pBufferNode != (int *)pCur ) + if ( pBufferNode != (unsigned *)pCur ) { free( pContents ); Vec_PtrFree( vNodes ); @@ -140,7 +140,7 @@ Abc_Ntk_t * Io_ReadBaf( char * pFileName, int fCheck ) Num = pBufferNode[2*nAnds+i]; if ( Abc_ObjFanoutNum(pObj) > 0 && Abc_ObjIsLatch(Abc_ObjFanout0(pObj)) ) { - Abc_ObjSetData( Abc_ObjFanout0(pObj), (void *)(Num & 3) ); + Abc_ObjSetData( Abc_ObjFanout0(pObj), (void *)(PORT_PTRINT_T)(Num & 3) ); Num >>= 2; } pNode0 = Abc_ObjNotCond( Vec_PtrEntry(vNodes, Num >> 1), Num & 1 ); diff --git a/src/base/io/ioReadBench.c b/src/base/io/ioReadBench.c index 0742ec1f0..b6e0e15f0 100644 --- a/src/base/io/ioReadBench.c +++ b/src/base/io/ioReadBench.c @@ -95,7 +95,7 @@ Abc_Ntk_t * Io_ReadBenchNetwork( Extra_FileReader_t * p ) // go through the lines of the file vString = Vec_StrAlloc( 100 ); pProgress = Extra_ProgressBarStart( stdout, Extra_FileReaderGetFileSize(p) ); - for ( iLine = 0; vTokens = Extra_FileReaderGetTokens(p); iLine++ ) + for ( iLine = 0; (vTokens = Extra_FileReaderGetTokens(p)); iLine++ ) { Extra_ProgressBarUpdate( pProgress, Extra_FileReaderGetCurPosition(p), NULL ); diff --git a/src/base/io/ioReadBlif.c b/src/base/io/ioReadBlif.c index 68a0bc357..c818cd55a 100644 --- a/src/base/io/ioReadBlif.c +++ b/src/base/io/ioReadBlif.c @@ -206,7 +206,7 @@ Abc_Ntk_t * Io_ReadBlifNetwork( Io_ReadBlif_t * p ) ***********************************************************************/ Abc_Ntk_t * Io_ReadBlifNetworkOne( Io_ReadBlif_t * p ) { - ProgressBar * pProgress; + ProgressBar * pProgress = NULL; Abc_Ntk_t * pNtk; char * pDirective; int iLine, fTokensReady, fStatus; @@ -235,7 +235,7 @@ Abc_Ntk_t * Io_ReadBlifNetworkOne( Io_ReadBlif_t * p ) else if ( strcmp( p->vTokens->pArray[0], ".exdc" ) != 0 ) { printf( "%s: File parsing skipped after line %d (\"%s\").\n", p->pFileName, - Extra_FileReaderGetLineNumber(p->pReader, 0), p->vTokens->pArray[0] ); + Extra_FileReaderGetLineNumber(p->pReader, 0), (char*)p->vTokens->pArray[0] ); Abc_NtkDelete(pNtk); p->pNtkCur = NULL; return NULL; @@ -243,12 +243,12 @@ Abc_Ntk_t * Io_ReadBlifNetworkOne( Io_ReadBlif_t * p ) // read the inputs/outputs if ( p->pNtkMaster == NULL ) - pProgress = Extra_ProgressBarStart( stdout, Extra_FileReaderGetFileSize(p->pReader) ); + pProgress = Extra_ProgressBarStart( stdout, Extra_FileReaderGetFileSize(p->pReader) ); fTokensReady = fStatus = 0; for ( iLine = 0; fTokensReady || (p->vTokens = Io_ReadBlifGetTokens(p)); iLine++ ) { if ( p->pNtkMaster == NULL && iLine % 1000 == 0 ) - Extra_ProgressBarUpdate( pProgress, Extra_FileReaderGetCurPosition(p->pReader), NULL ); + Extra_ProgressBarUpdate( pProgress, Extra_FileReaderGetCurPosition(p->pReader), NULL ); // consider different line types fTokensReady = 0; @@ -298,7 +298,7 @@ Abc_Ntk_t * Io_ReadBlifNetworkOne( Io_ReadBlif_t * p ) } } if ( p->pNtkMaster == NULL ) - Extra_ProgressBarStop( pProgress ); + Extra_ProgressBarStop( pProgress ); return pNtk; } @@ -393,7 +393,7 @@ int Io_ReadBlifNetworkLatch( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens ) if ( ResetValue != 0 && ResetValue != 1 && ResetValue != 2 ) { p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0); - sprintf( p->sError, "The .latch line has an unknown reset value (%s).", vTokens->pArray[3] ); + sprintf( p->sError, "The .latch line has an unknown reset value (%s).", (char*)vTokens->pArray[3] ); Io_ReadBlifPrintErrorMessage( p ); return 1; } @@ -445,7 +445,7 @@ int Io_ReadBlifNetworkNames( Io_ReadBlif_t * p, Vec_Ptr_t ** pvTokens ) nFanins = vTokens->nSize - 2; if ( nFanins == 0 ) { - while ( vTokens = Io_ReadBlifGetTokens(p) ) + while ( (vTokens = Io_ReadBlifGetTokens(p)) ) { pToken = vTokens->pArray[0]; if ( pToken[0] == '.' ) @@ -467,7 +467,7 @@ int Io_ReadBlifNetworkNames( Io_ReadBlif_t * p, Vec_Ptr_t ** pvTokens ) } else { - while ( vTokens = Io_ReadBlifGetTokens(p) ) + while ( (vTokens = Io_ReadBlifGetTokens(p)) ) { pToken = vTokens->pArray[0]; if ( pToken[0] == '.' ) @@ -567,7 +567,7 @@ int Io_ReadBlifNetworkGate( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens ) if ( pGate == NULL ) { p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0); - sprintf( p->sError, "Cannot find gate \"%s\" in the library.", vTokens->pArray[1] ); + sprintf( p->sError, "Cannot find gate \"%s\" in the library.", (char*)vTokens->pArray[1] ); Io_ReadBlifPrintErrorMessage( p ); return 1; } @@ -642,7 +642,7 @@ int Io_ReadBlifNetworkSubcircuit( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens ) // set the pointer to the node names Abc_ObjSetData( pBox, vNames ); // remember the line of the file - pBox->pCopy = (void *)Extra_FileReaderGetLineNumber(p->pReader, 0); + pBox->pCopy = (void *)(PORT_PTRINT_T)Extra_FileReaderGetLineNumber(p->pReader, 0); return 0; } @@ -697,7 +697,7 @@ int Io_ReadBlifNetworkInputArrival( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens ) if ( pNet == NULL ) { p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0); - sprintf( p->sError, "Cannot find object corresponding to %s on .input_arrival line.", vTokens->pArray[1] ); + sprintf( p->sError, "Cannot find object corresponding to %s on .input_arrival line.", (char*)vTokens->pArray[1] ); Io_ReadBlifPrintErrorMessage( p ); return 1; } @@ -706,7 +706,7 @@ int Io_ReadBlifNetworkInputArrival( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens ) if ( *pFoo1 != '\0' || *pFoo2 != '\0' ) { p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0); - sprintf( p->sError, "Bad value (%s %s) for rise or fall time on .input_arrival line.", vTokens->pArray[2], vTokens->pArray[3] ); + sprintf( p->sError, "Bad value (%s %s) for rise or fall time on .input_arrival line.", (char*)vTokens->pArray[2], (char*)vTokens->pArray[3] ); Io_ReadBlifPrintErrorMessage( p ); return 1; } @@ -745,7 +745,7 @@ int Io_ReadBlifNetworkDefaultInputArrival( Io_ReadBlif_t * p, Vec_Ptr_t * vToken if ( *pFoo1 != '\0' || *pFoo2 != '\0' ) { p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0); - sprintf( p->sError, "Bad value (%s %s) for rise or fall time on .default_input_arrival line.", vTokens->pArray[1], vTokens->pArray[2] ); + sprintf( p->sError, "Bad value (%s %s) for rise or fall time on .default_input_arrival line.", (char*)vTokens->pArray[1], (char*)vTokens->pArray[2] ); Io_ReadBlifPrintErrorMessage( p ); return 1; } @@ -914,15 +914,15 @@ int Io_ReadBlifNetworkConnectBoxesOneBox( Io_ReadBlif_t * p, Abc_Obj_t * pBox, s Vec_Ptr_t * pNames; Abc_Ntk_t * pNtkModel; Abc_Obj_t * pObj, * pNet; - char * pName, * pActual; - int i, Length, Start; + char * pName = NULL, * pActual; + int i, Length, Start = -1; // get the model for this box pNames = pBox->pData; if ( !stmm_lookup( tName2Model, Vec_PtrEntry(pNames, 0), (char **)&pNtkModel ) ) { - p->LineCur = (int)pBox->pCopy; - sprintf( p->sError, "Cannot find the model for subcircuit %s.", Vec_PtrEntry(pNames, 0) ); + p->LineCur = (int)(PORT_PTRINT_T)pBox->pCopy; + sprintf( p->sError, "Cannot find the model for subcircuit %s.", (char*)Vec_PtrEntry(pNames, 0) ); Io_ReadBlifPrintErrorMessage( p ); return 1; } @@ -939,7 +939,7 @@ int Io_ReadBlifNetworkConnectBoxesOneBox( Io_ReadBlif_t * p, Abc_Obj_t * pBox, s pActual = Io_ReadBlifCleanName(pName); if ( pActual == NULL ) { - p->LineCur = (int)pBox->pCopy; + p->LineCur = (int)(PORT_PTRINT_T)pBox->pCopy; sprintf( p->sError, "Cannot parse formal/actual name pair \"%s\".", pName ); Io_ReadBlifPrintErrorMessage( p ); return 1; @@ -950,8 +950,8 @@ int Io_ReadBlifNetworkConnectBoxesOneBox( Io_ReadBlif_t * p, Abc_Obj_t * pBox, s pObj = Abc_NtkFindNet( pNtkModel, pName ); if ( pObj == NULL ) { - p->LineCur = (int)pBox->pCopy; - sprintf( p->sError, "Cannot find formal input \"%s\" as an PI of model \"%s\".", pName, Vec_PtrEntry(pNames, 0) ); + p->LineCur = (int)(PORT_PTRINT_T)pBox->pCopy; + sprintf( p->sError, "Cannot find formal input \"%s\" as an PI of model \"%s\".", pName, (char*)Vec_PtrEntry(pNames, 0) ); Io_ReadBlifPrintErrorMessage( p ); return 1; } @@ -967,7 +967,7 @@ int Io_ReadBlifNetworkConnectBoxesOneBox( Io_ReadBlif_t * p, Abc_Obj_t * pBox, s // remember the actual name in the net if ( pObj->pCopy != NULL ) { - p->LineCur = (int)pBox->pCopy; + p->LineCur = (int)(PORT_PTRINT_T)pBox->pCopy; sprintf( p->sError, "Formal input \"%s\" is used more than once.", pName ); Io_ReadBlifPrintErrorMessage( p ); return 1; @@ -987,8 +987,8 @@ int Io_ReadBlifNetworkConnectBoxesOneBox( Io_ReadBlif_t * p, Abc_Obj_t * pBox, s pActual = (void *)pObj->pCopy; if ( pActual == NULL ) { - p->LineCur = (int)pBox->pCopy; - sprintf( p->sError, "Formal input \"%s\" of model %s is not driven.", pName, Vec_PtrEntry(pNames, 0) ); + p->LineCur = (int)(PORT_PTRINT_T)pBox->pCopy; + sprintf( p->sError, "Formal input \"%s\" of model %s is not driven.", pName, (char*)Vec_PtrEntry(pNames, 0) ); Io_ReadBlifPrintErrorMessage( p ); return 1; } @@ -1006,7 +1006,7 @@ int Io_ReadBlifNetworkConnectBoxesOneBox( Io_ReadBlif_t * p, Abc_Obj_t * pBox, s pActual = Io_ReadBlifCleanName(pName); if ( pActual == NULL ) { - p->LineCur = (int)pBox->pCopy; + p->LineCur = (int)(PORT_PTRINT_T)pBox->pCopy; sprintf( p->sError, "Cannot parse formal/actual name pair \"%s\".", pName ); Io_ReadBlifPrintErrorMessage( p ); return 1; @@ -1017,8 +1017,8 @@ int Io_ReadBlifNetworkConnectBoxesOneBox( Io_ReadBlif_t * p, Abc_Obj_t * pBox, s pObj = Abc_NtkFindNet( pNtkModel, pName ); if ( pObj == NULL ) { - p->LineCur = (int)pBox->pCopy; - sprintf( p->sError, "Cannot find formal output \"%s\" as an PO of model \"%s\".", pName, Vec_PtrEntry(pNames, 0) ); + p->LineCur = (int)(PORT_PTRINT_T)pBox->pCopy; + sprintf( p->sError, "Cannot find formal output \"%s\" as an PO of model \"%s\".", pName, (char*)Vec_PtrEntry(pNames, 0) ); Io_ReadBlifPrintErrorMessage( p ); return 1; } @@ -1026,7 +1026,7 @@ int Io_ReadBlifNetworkConnectBoxesOneBox( Io_ReadBlif_t * p, Abc_Obj_t * pBox, s pObj = Abc_ObjFanout0(pObj); if ( pObj->pCopy != NULL ) { - p->LineCur = (int)pBox->pCopy; + p->LineCur = (int)(PORT_PTRINT_T)pBox->pCopy; sprintf( p->sError, "Formal output \"%s\" is used more than once.", pName ); Io_ReadBlifPrintErrorMessage( p ); return 1; @@ -1039,8 +1039,8 @@ int Io_ReadBlifNetworkConnectBoxesOneBox( Io_ReadBlif_t * p, Abc_Obj_t * pBox, s pActual = (void *)pObj->pCopy; if ( pActual == NULL ) { - p->LineCur = (int)pBox->pCopy; - sprintf( p->sError, "Formal output \"%s\" of model %s is not driven.", pName, Vec_PtrEntry(pNames, 0) ); + p->LineCur = (int)(PORT_PTRINT_T)pBox->pCopy; + sprintf( p->sError, "Formal output \"%s\" of model %s is not driven.", pName, (char*)Vec_PtrEntry(pNames, 0) ); Io_ReadBlifPrintErrorMessage( p ); return 1; } diff --git a/src/base/io/ioReadBlifAig.c b/src/base/io/ioReadBlifAig.c index c448bab60..75552192f 100644 --- a/src/base/io/ioReadBlifAig.c +++ b/src/base/io/ioReadBlifAig.c @@ -713,7 +713,7 @@ static int Io_BlifParseLatch( Io_BlifMan_t * p, char * pLine ) Init = 2; if ( Init < 0 || Init > 2 ) { - sprintf( p->sError, "Line %d: Initial state of the latch is incorrect (%s).", Io_BlifGetLine(p, pToken), Vec_PtrEntry(p->vTokens,3) ); + sprintf( p->sError, "Line %d: Initial state of the latch is incorrect (%s).", Io_BlifGetLine(p, pToken), (char*)Vec_PtrEntry(p->vTokens,3) ); return 0; } if ( Init == 0 ) @@ -731,12 +731,12 @@ static int Io_BlifParseLatch( Io_BlifMan_t * p, char * pLine ) pObj = Io_BlifHashFindOrAdd( p, Vec_PtrEntry(p->vTokens,2) ); if ( pObj->fPi ) { - sprintf( p->sError, "Line %d: Primary input (%s) is also defined latch output.", Io_BlifGetLine(p, pToken), Vec_PtrEntry(p->vTokens,2) ); + sprintf( p->sError, "Line %d: Primary input (%s) is also defined latch output.", Io_BlifGetLine(p, pToken), (char*)Vec_PtrEntry(p->vTokens,2) ); return 0; } if ( pObj->fLo ) { - sprintf( p->sError, "Line %d: Latch output (%s) is defined as the output of another latch.", Io_BlifGetLine(p, pToken), Vec_PtrEntry(p->vTokens,2) ); + sprintf( p->sError, "Line %d: Latch output (%s) is defined as the output of another latch.", Io_BlifGetLine(p, pToken), (char*)Vec_PtrEntry(p->vTokens,2) ); return 0; } pObj->fLo = 1; @@ -970,7 +970,7 @@ static int Io_BlifParseConstruct( Io_BlifMan_t * p ) // add the latch box pLatch = Abc_NtkCreateLatch( pAig ); - pLatch->pData = (void *)pObjIo->Init; + pLatch->pData = (void *)(PORT_PTRUINT_T)pObjIo->Init; Abc_ObjAssignName( pLatch, pObjIo->pName, "L" ); Abc_ObjAddFanin( pLatch, pObj ); diff --git a/src/base/io/ioReadBlifMv.c b/src/base/io/ioReadBlifMv.c index b5fb632f5..52d7eb06e 100644 --- a/src/base/io/ioReadBlifMv.c +++ b/src/base/io/ioReadBlifMv.c @@ -768,7 +768,7 @@ static Abc_Lib_t * Io_MvParse( Io_MvMan_t * p ) Abc_Obj_t * pObj; // set register numbers Abc_NtkForEachLatch( pMod->pNtk, pObj, k ) - pObj->pNext = (Abc_Obj_t *)k; + pObj->pNext = (Abc_Obj_t *)(PORT_PTRINT_T)k; // derive register pMod->pNtk->vOnehots = Vec_PtrAlloc( Vec_PtrSize(pMod->vOnehots) ); Vec_PtrForEachEntry( pMod->vOnehots, pLine, k ) @@ -932,7 +932,7 @@ static int Io_MvParseLineLatch( Io_MvMod_t * p, char * pLine ) Init = 2; if ( Init < 0 || Init > 2 ) { - sprintf( p->pMan->sError, "Line %d: Initial state of the latch is incorrect \"%s\".", Io_MvGetLine(p->pMan, pToken), Vec_PtrEntry(vTokens,3) ); + sprintf( p->pMan->sError, "Line %d: Initial state of the latch is incorrect \"%s\".", Io_MvGetLine(p->pMan, pToken), (char*)Vec_PtrEntry(vTokens,3) ); return 0; } if ( Init == 0 ) @@ -1099,9 +1099,9 @@ static Vec_Int_t * Io_MvParseLineOnehot( Io_MvMod_t * p, char * pLine ) } // save register name // Vec_PtrPush( vResult, Abc_ObjName(pNet) ); - Vec_IntPush( vResult, (int)Abc_ObjFanin0(pTerm)->pNext ); + Vec_IntPush( vResult, (int)(PORT_PTRINT_T)Abc_ObjFanin0(pTerm)->pNext ); // printf( "%d(%d) ", (int)Abc_ObjFanin0(pTerm)->pNext, ((int)Abc_ObjFanin0(pTerm)->pData) -1 ); - printf( "%d", ((int)Abc_ObjFanin0(pTerm)->pData)-1 ); + printf( "%d", ((int)(PORT_PTRINT_T)Abc_ObjFanin0(pTerm)->pData)-1 ); } printf( "\n" ); return vResult; @@ -1123,7 +1123,7 @@ static int Io_MvParseLineMv( Io_MvMod_t * p, char * pLine ) { Vec_Ptr_t * vTokens = p->pMan->vTokens; Abc_Obj_t * pObj; - Io_MvVar_t * pVar; + Io_MvVar_t * pVar = NULL; Extra_MmFlex_t * pFlex; char * pName; int nCommas, nValues, i, k; @@ -1135,7 +1135,7 @@ static int Io_MvParseLineMv( Io_MvMod_t * p, char * pLine ) // get the number of values if ( Vec_PtrSize(vTokens) <= nCommas + 2 ) { - sprintf( p->pMan->sError, "Line %d: The number of values in not specified in .mv line.", Io_MvGetLine(p->pMan, pName), pName ); + sprintf( p->pMan->sError, "Line %d: The number of values in not specified in .mv line.", Io_MvGetLine(p->pMan, pName) ); return 0; } nValues = atoi( Vec_PtrEntry(vTokens,nCommas+2) ); @@ -1178,6 +1178,7 @@ static int Io_MvParseLineMv( Io_MvMod_t * p, char * pLine ) Abc_ObjSetMvVar( pObj, pVar ); } // make sure the names are unique + assert(pVar); if ( pVar->pNames ) { for ( i = 0; i < nValues; i++ ) @@ -1398,7 +1399,7 @@ static Abc_Obj_t * Io_MvParseAddResetCircuit( Io_MvMod_t * p, char * pName ) if ( p->pMan->fBlifMv ) { // Vec_Att_t * p = Abc_NtkMvVar( pNtk ); - int nValues = Abc_ObjMvVarNum(pOutNet); +// int nValues = Abc_ObjMvVarNum(pOutNet); // sprintf( Buffer, "2 %d %d %d\n1 - - =1\n0 - - =2\n", nValues, nValues, nValues ); sprintf( Buffer, "1 - - =1\n0 - - =2\n" ); pNode->pData = Abc_SopRegister( p->pNtk->pManFunc, Buffer ); @@ -1776,7 +1777,7 @@ static int Io_MvParseLineGateBlif( Io_MvMod_t * p, Vec_Ptr_t * vTokens ) pGate = Mio_LibraryReadGateByName( pGenlib, vTokens->pArray[1] ); if ( pGate == NULL ) { - sprintf( p->pMan->sError, "Line %d: Cannot find gate \"%s\" in the library.", Io_MvGetLine(p->pMan, pName), vTokens->pArray[1] ); + sprintf( p->pMan->sError, "Line %d: Cannot find gate \"%s\" in the library.", Io_MvGetLine(p->pMan, pName), (char*)vTokens->pArray[1] ); return 0; } diff --git a/src/base/io/ioReadEdif.c b/src/base/io/ioReadEdif.c index bea9bf696..2f97644a5 100644 --- a/src/base/io/ioReadEdif.c +++ b/src/base/io/ioReadEdif.c @@ -212,7 +212,7 @@ Abc_Ntk_t * Io_ReadEdifNetwork( Extra_FileReader_t * p ) Abc_ObjSetData( pObj, Abc_SopCreateBuf(pNtk->pManFunc) ); else { - printf( "%s: Unknown gate type \"%s\".\n", Extra_FileReaderGetFileName(p), pObj->pData ); + printf( "%s: Unknown gate type \"%s\".\n", Extra_FileReaderGetFileName(p), (char*)pObj->pData ); Abc_NtkDelete( pNtk ); return NULL; } diff --git a/src/base/io/ioReadEqn.c b/src/base/io/ioReadEqn.c index 6a1360d02..ad35c73bd 100644 --- a/src/base/io/ioReadEqn.c +++ b/src/base/io/ioReadEqn.c @@ -100,7 +100,7 @@ Abc_Ntk_t * Io_ReadEqnNetwork( Extra_FileReader_t * p ) // go through the lines of the file vVars = Vec_PtrAlloc( 100 ); pProgress = Extra_ProgressBarStart( stdout, Extra_FileReaderGetFileSize(p) ); - for ( iLine = 0; vTokens = Extra_FileReaderGetTokens(p); iLine++ ) + for ( iLine = 0; (vTokens = Extra_FileReaderGetTokens(p)); iLine++ ) { Extra_ProgressBarUpdate( pProgress, Extra_FileReaderGetCurPosition(p), NULL ); diff --git a/src/base/io/ioReadPla.c b/src/base/io/ioReadPla.c index cbee81efa..4b3267839 100644 --- a/src/base/io/ioReadPla.c +++ b/src/base/io/ioReadPla.c @@ -83,7 +83,7 @@ Abc_Ntk_t * Io_ReadPlaNetwork( Extra_FileReader_t * p, int fZeros ) Vec_Ptr_t * vTokens; Abc_Ntk_t * pNtk; Abc_Obj_t * pTermPi, * pTermPo, * pNode; - Vec_Str_t ** ppSops; + Vec_Str_t ** ppSops = NULL; char Buffer[100]; int nInputs = -1, nOutputs = -1, nProducts = -1; char * pCubeIn, * pCubeOut; @@ -95,7 +95,7 @@ Abc_Ntk_t * Io_ReadPlaNetwork( Extra_FileReader_t * p, int fZeros ) // go through the lines of the file nCubes = 0; pProgress = Extra_ProgressBarStart( stdout, Extra_FileReaderGetFileSize(p) ); - for ( iLine = 0; vTokens = Extra_FileReaderGetTokens(p); iLine++ ) + for ( iLine = 0; (vTokens = Extra_FileReaderGetTokens(p)); iLine++ ) { Extra_ProgressBarUpdate( pProgress, Extra_FileReaderGetCurPosition(p), NULL ); @@ -193,14 +193,14 @@ Abc_Ntk_t * Io_ReadPlaNetwork( Extra_FileReader_t * p, int fZeros ) pCubeOut = vTokens->pArray[1]; if ( strlen(pCubeIn) != (unsigned)nInputs ) { - printf( "%s (line %d): Input cube length (%d) differs from the number of inputs (%d).\n", + printf( "%s (line %d): Input cube length (%zu) differs from the number of inputs (%d).\n", Extra_FileReaderGetFileName(p), iLine+1, strlen(pCubeIn), nInputs ); Abc_NtkDelete( pNtk ); return NULL; } if ( strlen(pCubeOut) != (unsigned)nOutputs ) { - printf( "%s (line %d): Output cube length (%d) differs from the number of outputs (%d).\n", + printf( "%s (line %d): Output cube length (%zu) differs from the number of outputs (%d).\n", Extra_FileReaderGetFileName(p), iLine+1, strlen(pCubeOut), nOutputs ); Abc_NtkDelete( pNtk ); return NULL; diff --git a/src/base/io/ioUtil.c b/src/base/io/ioUtil.c index a5d32e39d..119b4d758 100644 --- a/src/base/io/ioUtil.c +++ b/src/base/io/ioUtil.c @@ -101,7 +101,7 @@ Abc_Ntk_t * Io_ReadNetlist( char * pFileName, Io_FileType_t FileType, int fCheck if ( pFile == NULL ) { fprintf( stdout, "Cannot open input file \"%s\". ", pFileName ); - if ( pFileName = Extra_FileGetSimilarName( pFileName, ".blif", ".bench", ".pla", ".baf", ".aig" ) ) + if ( (pFileName = Extra_FileGetSimilarName( pFileName, ".blif", ".bench", ".pla", ".baf", ".aig" )) ) fprintf( stdout, "Did you mean \"%s\"?", pFileName ); fprintf( stdout, "\n" ); return NULL; @@ -715,7 +715,7 @@ FILE * Io_FileOpen( const char * FileName, const char * PathVar, const char * Mo } else { - if ( c = Abc_FrameReadFlag( (char*)PathVar ) ) + if ( (c = Abc_FrameReadFlag( (char*)PathVar )) ) { char ActualFileName[4096]; FILE * fp = 0; diff --git a/src/base/io/ioWriteAiger.c b/src/base/io/ioWriteAiger.c index 9e5ee8b48..45e1e9657 100644 --- a/src/base/io/ioWriteAiger.c +++ b/src/base/io/ioWriteAiger.c @@ -19,10 +19,13 @@ ***********************************************************************/ +// The code in this file is developed in collaboration with Mark Jarvin of Toronto. + #include "ioAbc.h" -#include #include +#include "bzlib.h" +#include "zlib.h" #ifdef _WIN32 #define vsnprintf _vsnprintf @@ -132,9 +135,9 @@ Binary Format Definition */ -static unsigned Io_ObjMakeLit( int Var, int fCompl ) { return (Var << 1) | fCompl; } -static unsigned Io_ObjAigerNum( Abc_Obj_t * pObj ) { return (unsigned)pObj->pCopy; } -static void Io_ObjSetAigerNum( Abc_Obj_t * pObj, unsigned Num ) { pObj->pCopy = (void *)Num; } +static unsigned Io_ObjMakeLit( int Var, int fCompl ) { return (Var << 1) | fCompl; } +static unsigned Io_ObjAigerNum( Abc_Obj_t * pObj ) { return (unsigned)(PORT_PTRINT_T)pObj->pCopy; } +static void Io_ObjSetAigerNum( Abc_Obj_t * pObj, unsigned Num ) { pObj->pCopy = (void *)(PORT_PTRINT_T)Num; } //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// @@ -152,7 +155,7 @@ static void Io_ObjSetAigerNum( Abc_Obj_t * pObj, unsigned Num ) { pObj->pCo SeeAlso [] ***********************************************************************/ -int Io_WriteAigerEncode( char * pBuffer, int Pos, unsigned x ) +int Io_WriteAigerEncode( unsigned char * pBuffer, int Pos, unsigned x ) { unsigned char ch; while (x & ~0x7f) @@ -215,13 +218,13 @@ Vec_Str_t * Io_WriteEncodeLiterals( Vec_Int_t * vLits ) int Pos = 0, Lit, LitPrev, Diff, i; vBinary = Vec_StrAlloc( 2 * Vec_IntSize(vLits) ); LitPrev = Vec_IntEntry( vLits, 0 ); - Pos = Io_WriteAigerEncode( Vec_StrArray(vBinary), Pos, LitPrev ); + Pos = Io_WriteAigerEncode( (unsigned char *)Vec_StrArray(vBinary), Pos, LitPrev ); Vec_IntForEachEntryStart( vLits, Lit, i, 1 ) { Diff = Lit - LitPrev; Diff = (Lit < LitPrev)? -Diff : Diff; Diff = (Diff << 1) | (int)(Lit < LitPrev); - Pos = Io_WriteAigerEncode( Vec_StrArray(vBinary), Pos, Diff ); + Pos = Io_WriteAigerEncode( (unsigned char *)Vec_StrArray(vBinary), Pos, Diff ); LitPrev = Lit; if ( Pos + 10 > vBinary->nCap ) Vec_StrGrow( vBinary, vBinary->nCap+1 ); @@ -260,7 +263,7 @@ void Io_WriteAiger_old( Abc_Ntk_t * pNtk, char * pFileName, int fWriteSymbols, i ProgressBar * pProgress; FILE * pFile; Abc_Obj_t * pObj, * pDriver; - int i, nNodes, Pos, nBufferSize; + int i, nNodes, nBufferSize, Pos; unsigned char * pBuffer; unsigned uLit0, uLit1, uLit; @@ -376,6 +379,126 @@ void Io_WriteAiger_old( Abc_Ntk_t * pNtk, char * pFileName, int fWriteSymbols, i fclose( pFile ); } +/**Function************************************************************* + + Synopsis [Writes the AIG in the binary AIGER format.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Io_WriteAigerGz( Abc_Ntk_t * pNtk, char * pFileName, int fWriteSymbols ) +{ + ProgressBar * pProgress; + gzFile pFile; + Abc_Obj_t * pObj, * pDriver; + int i, nNodes, Pos, nBufferSize; + unsigned char * pBuffer; + unsigned uLit0, uLit1, uLit; + + assert( Abc_NtkIsStrash(pNtk) ); + // start the output stream + pFile = gzopen( pFileName, "wb" ); // if pFileName doesn't end in ".gz" then this acts as a passthrough to fopen + if ( pFile == NULL ) + { + fprintf( stdout, "Io_WriteAigerGz(): Cannot open the output file \"%s\".\n", pFileName ); + return; + } + Abc_NtkForEachLatch( pNtk, pObj, i ) + if ( !Abc_LatchIsInit0(pObj) ) + { + fprintf( stdout, "Io_WriteAigerGz(): Cannot write AIGER format with non-0 latch init values. Run \"zero\".\n" ); + return; + } + + // set the node numbers to be used in the output file + nNodes = 0; + Io_ObjSetAigerNum( Abc_AigConst1(pNtk), nNodes++ ); + Abc_NtkForEachCi( pNtk, pObj, i ) + Io_ObjSetAigerNum( pObj, nNodes++ ); + Abc_AigForEachAnd( pNtk, pObj, i ) + Io_ObjSetAigerNum( pObj, nNodes++ ); + + // write the header "M I L O A" where M = I + L + A + gzprintf( pFile, "aig %u %u %u %u %u\n", + Abc_NtkPiNum(pNtk) + Abc_NtkLatchNum(pNtk) + Abc_NtkNodeNum(pNtk), + Abc_NtkPiNum(pNtk), + Abc_NtkLatchNum(pNtk), + Abc_NtkPoNum(pNtk), + Abc_NtkNodeNum(pNtk) ); + + // if the driver node is a constant, we need to complement the literal below + // because, in the AIGER format, literal 0/1 is represented as number 0/1 + // while, in ABC, constant 1 node has number 0 and so literal 0/1 will be 1/0 + + // write latch drivers + Abc_NtkForEachLatchInput( pNtk, pObj, i ) + { + pDriver = Abc_ObjFanin0(pObj); + gzprintf( pFile, "%u\n", Io_ObjMakeLit( Io_ObjAigerNum(pDriver), Abc_ObjFaninC0(pObj) ^ (Io_ObjAigerNum(pDriver) == 0) ) ); + } + + // write PO drivers + Abc_NtkForEachPo( pNtk, pObj, i ) + { + pDriver = Abc_ObjFanin0(pObj); + gzprintf( pFile, "%u\n", Io_ObjMakeLit( Io_ObjAigerNum(pDriver), Abc_ObjFaninC0(pObj) ^ (Io_ObjAigerNum(pDriver) == 0) ) ); + } + + // write the nodes into the buffer + Pos = 0; + nBufferSize = 6 * Abc_NtkNodeNum(pNtk) + 100; // skeptically assuming 3 chars per one AIG edge + pBuffer = ALLOC( char, nBufferSize ); + pProgress = Extra_ProgressBarStart( stdout, Abc_NtkObjNumMax(pNtk) ); + Abc_AigForEachAnd( pNtk, pObj, i ) + { + Extra_ProgressBarUpdate( pProgress, i, NULL ); + uLit = Io_ObjMakeLit( Io_ObjAigerNum(pObj), 0 ); + uLit0 = Io_ObjMakeLit( Io_ObjAigerNum(Abc_ObjFanin0(pObj)), Abc_ObjFaninC0(pObj) ); + uLit1 = Io_ObjMakeLit( Io_ObjAigerNum(Abc_ObjFanin1(pObj)), Abc_ObjFaninC1(pObj) ); + assert( uLit0 < uLit1 ); + Pos = Io_WriteAigerEncode( pBuffer, Pos, uLit - uLit1 ); + Pos = Io_WriteAigerEncode( pBuffer, Pos, uLit1 - uLit0 ); + if ( Pos > nBufferSize - 10 ) + { + printf( "Io_WriteAiger(): AIGER generation has failed because the allocated buffer is too small.\n" ); + gzclose( pFile ); + return; + } + } + assert( Pos < nBufferSize ); + Extra_ProgressBarStop( pProgress ); + + // write the buffer + gzwrite(pFile, pBuffer, Pos); + free( pBuffer ); + + // write the symbol table + if ( fWriteSymbols ) + { + // write PIs + Abc_NtkForEachPi( pNtk, pObj, i ) + gzprintf( pFile, "i%d %s\n", i, Abc_ObjName(pObj) ); + // write latches + Abc_NtkForEachLatch( pNtk, pObj, i ) + gzprintf( pFile, "l%d %s\n", i, Abc_ObjName(Abc_ObjFanout0(pObj)) ); + // write POs + Abc_NtkForEachPo( pNtk, pObj, i ) + gzprintf( pFile, "o%d %s\n", i, Abc_ObjName(pObj) ); + } + + // write the comment + gzprintf( pFile, "c\n" ); + if ( pNtk->pName && strlen(pNtk->pName) > 0 ) + gzprintf( pFile, ".model %s\n", pNtk->pName ); + gzprintf( pFile, "This file was produced by ABC on %s\n", Extra_TimeStamp() ); + gzprintf( pFile, "For information about AIGER format, refer to %s\n", "http://fmv.jku.at/aiger" ); + gzclose( pFile ); +} + /**Function************************************************************* @@ -448,7 +571,7 @@ void Io_WriteAiger( Abc_Ntk_t * pNtk, char * pFileName, int fWriteSymbols, int f ProgressBar * pProgress; // FILE * pFile; Abc_Obj_t * pObj, * pDriver; - int i, nNodes, Pos, nBufferSize, bzError; + int i, nNodes, nBufferSize, bzError, Pos; unsigned char * pBuffer; unsigned uLit0, uLit1, uLit; bz2file b; @@ -462,6 +585,13 @@ void Io_WriteAiger( Abc_Ntk_t * pNtk, char * pFileName, int fWriteSymbols, int f return; } + // write the GZ file + if (!strncmp(pFileName+strlen(pFileName)-3,".gz",3)) + { + Io_WriteAigerGz( pNtk, pFileName, fWriteSymbols ); + return; + } + memset(&b,0,sizeof(b)); b.nBytesMax = (1<<12); b.buf = ALLOC( char,b.nBytesMax ); diff --git a/src/base/io/ioWriteBaf.c b/src/base/io/ioWriteBaf.c index 334870414..6a9af2f21 100644 --- a/src/base/io/ioWriteBaf.c +++ b/src/base/io/ioWriteBaf.c @@ -126,29 +126,29 @@ void Io_WriteBaf( Abc_Ntk_t * pNtk, char * pFileName ) Abc_NtkCleanCopy( pNtk ); nNodes = 1; Abc_NtkForEachCi( pNtk, pObj, i ) - pObj->pCopy = (void *)nNodes++; + pObj->pCopy = (void *)(PORT_PTRINT_T)nNodes++; Abc_AigForEachAnd( pNtk, pObj, i ) - pObj->pCopy = (void *)nNodes++; + pObj->pCopy = (void *)(PORT_PTRINT_T)nNodes++; // write the nodes into the buffer nAnds = 0; nBufferSize = Abc_NtkNodeNum(pNtk) * 2 + Abc_NtkCoNum(pNtk); - pBufferNode = ALLOC( int, nBufferSize ); + pBufferNode = ALLOC( unsigned, nBufferSize ); pProgress = Extra_ProgressBarStart( stdout, nBufferSize ); Abc_AigForEachAnd( pNtk, pObj, i ) { Extra_ProgressBarUpdate( pProgress, nAnds, NULL ); - pBufferNode[nAnds++] = (((int)Abc_ObjFanin0(pObj)->pCopy) << 1) | Abc_ObjFaninC0(pObj); - pBufferNode[nAnds++] = (((int)Abc_ObjFanin1(pObj)->pCopy) << 1) | Abc_ObjFaninC1(pObj); + pBufferNode[nAnds++] = (((int)(PORT_PTRINT_T)Abc_ObjFanin0(pObj)->pCopy) << 1) | Abc_ObjFaninC0(pObj); + pBufferNode[nAnds++] = (((int)(PORT_PTRINT_T)Abc_ObjFanin1(pObj)->pCopy) << 1) | Abc_ObjFaninC1(pObj); } // write the COs into the buffer Abc_NtkForEachCo( pNtk, pObj, i ) { Extra_ProgressBarUpdate( pProgress, nAnds, NULL ); - pBufferNode[nAnds] = (((int)Abc_ObjFanin0(pObj)->pCopy) << 1) | Abc_ObjFaninC0(pObj); + pBufferNode[nAnds] = (((int)(PORT_PTRINT_T)Abc_ObjFanin0(pObj)->pCopy) << 1) | Abc_ObjFaninC0(pObj); if ( Abc_ObjFanoutNum(pObj) > 0 && Abc_ObjIsLatch(Abc_ObjFanout0(pObj)) ) - pBufferNode[nAnds] = (pBufferNode[nAnds] << 2) | ((unsigned)Abc_ObjData(Abc_ObjFanout0(pObj)) & 3); + pBufferNode[nAnds] = (pBufferNode[nAnds] << 2) | ((int)(PORT_PTRINT_T)Abc_ObjData(Abc_ObjFanout0(pObj)) & 3); nAnds++; } Extra_ProgressBarStop( pProgress ); diff --git a/src/base/io/ioWriteBlif.c b/src/base/io/ioWriteBlif.c index a0105a6bd..342dc0aad 100644 --- a/src/base/io/ioWriteBlif.c +++ b/src/base/io/ioWriteBlif.c @@ -434,7 +434,7 @@ void Io_NtkWriteLatch( FILE * pFile, Abc_Obj_t * pLatch ) int Reset; pNetLi = Abc_ObjFanin0( Abc_ObjFanin0(pLatch) ); pNetLo = Abc_ObjFanout0( Abc_ObjFanout0(pLatch) ); - Reset = (int)Abc_ObjData( pLatch ); + Reset = (int)(PORT_PTRUINT_T)Abc_ObjData( pLatch ); // write the latch line fprintf( pFile, ".latch" ); fprintf( pFile, " %10s", Abc_ObjName(pNetLi) ); @@ -470,7 +470,7 @@ void Io_NtkWriteNode( FILE * pFile, Abc_Obj_t * pNode, int Length ) Io_NtkWriteNodeFanins( pFile, pNode ); fprintf( pFile, "\n" ); // write the cubes - fprintf( pFile, "%s", Abc_ObjData(pNode) ); + fprintf( pFile, "%s", (char*)Abc_ObjData(pNode) ); } } diff --git a/src/base/io/ioWriteBlifMv.c b/src/base/io/ioWriteBlifMv.c index 86891fee1..266ee95f1 100644 --- a/src/base/io/ioWriteBlifMv.c +++ b/src/base/io/ioWriteBlifMv.c @@ -341,7 +341,7 @@ void Io_NtkWriteBlifMvLatch( FILE * pFile, Abc_Obj_t * pLatch ) int Reset; pNetLi = Abc_ObjFanin0( Abc_ObjFanin0(pLatch) ); pNetLo = Abc_ObjFanout0( Abc_ObjFanout0(pLatch) ); - Reset = (int)Abc_ObjData( pLatch ); + Reset = (int)(PORT_PTRUINT_T)Abc_ObjData( pLatch ); // write the latch line fprintf( pFile, ".latch" ); fprintf( pFile, " %10s", Abc_ObjName(pNetLi) ); diff --git a/src/base/io/ioWriteDot.c b/src/base/io/ioWriteDot.c index b8ca6f675..880281057 100644 --- a/src/base/io/ioWriteDot.c +++ b/src/base/io/ioWriteDot.c @@ -95,7 +95,7 @@ void Io_WriteDotNtk( Abc_Ntk_t * pNtk, Vec_Ptr_t * vNodes, Vec_Ptr_t * vNodesSho } // transform logic functions from BDD to SOP - if ( fHasBdds = Abc_NtkIsBddLogic(pNtk) ) + if ( (fHasBdds = Abc_NtkIsBddLogic(pNtk)) ) { if ( !Abc_NtkBddToSop(pNtk, 0) ) { @@ -430,7 +430,7 @@ void Io_WriteDotSeq( Abc_Ntk_t * pNtk, Vec_Ptr_t * vNodes, Vec_Ptr_t * vNodesSho } // transform logic functions from BDD to SOP - if ( fHasBdds = Abc_NtkIsBddLogic(pNtk) ) + if ( (fHasBdds = Abc_NtkIsBddLogic(pNtk)) ) { if ( !Abc_NtkBddToSop(pNtk, 0) ) { diff --git a/src/base/io/ioWriteEqn.c b/src/base/io/ioWriteEqn.c index 94c6e0326..228e4ae90 100644 --- a/src/base/io/ioWriteEqn.c +++ b/src/base/io/ioWriteEqn.c @@ -212,7 +212,7 @@ void Io_NtkWriteEqnCos( FILE * pFile, Abc_Ntk_t * pNtk ) int Io_NtkWriteEqnCheck( Abc_Ntk_t * pNtk ) { Abc_Obj_t * pObj; - char * pName; + char * pName = NULL; int i, k, Length; int RetValue = 1; diff --git a/src/base/io/ioWritePla.c b/src/base/io/ioWritePla.c index 4b316416b..653e2f747 100644 --- a/src/base/io/ioWritePla.c +++ b/src/base/io/ioWritePla.c @@ -126,7 +126,7 @@ int Io_WritePlaOne( FILE * pFile, Abc_Ntk_t * pNtk ) // mark the CI nodes Abc_NtkForEachCi( pNtk, pNode, i ) - pNode->pCopy = (Abc_Obj_t *)i; + pNode->pCopy = (Abc_Obj_t *)(PORT_PTRUINT_T)i; // write the cubes pProgress = Extra_ProgressBarStart( stdout, nOutputs ); @@ -142,9 +142,9 @@ int Io_WritePlaOne( FILE * pFile, Abc_Ntk_t * pNtk ) if ( !Abc_ObjIsNode(pDriver) ) { assert( Abc_ObjIsCi(pDriver) ); - pCubeIn[(int)pDriver->pCopy] = '1' - Abc_ObjFaninC0(pNode); + pCubeIn[(int)(PORT_PTRUINT_T)pDriver->pCopy] = '1' - Abc_ObjFaninC0(pNode); fprintf( pFile, "%s %s\n", pCubeIn, pCubeOut ); - pCubeIn[(int)pDriver->pCopy] = '-'; + pCubeIn[(int)(PORT_PTRUINT_T)pDriver->pCopy] = '-'; continue; } if ( Abc_NodeIsConst(pDriver) ) @@ -164,8 +164,8 @@ int Io_WritePlaOne( FILE * pFile, Abc_Ntk_t * pNtk ) Abc_ObjForEachFanin( pDriver, pFanin, k ) { pFanin = Abc_ObjFanin0Ntk(pFanin); - assert( (int)pFanin->pCopy < nInputs ); - pCubeIn[(int)pFanin->pCopy] = pCube[k]; + assert( (int)(PORT_PTRUINT_T)pFanin->pCopy < nInputs ); + pCubeIn[(int)(PORT_PTRUINT_T)pFanin->pCopy] = pCube[k]; } fprintf( pFile, "%s %s\n", pCubeIn, pCubeOut ); } @@ -174,7 +174,7 @@ int Io_WritePlaOne( FILE * pFile, Abc_Ntk_t * pNtk ) { pFanin = Abc_ObjFanin0Ntk(pFanin); assert( Abc_ObjIsCi(pFanin) ); - pCubeIn[(int)pFanin->pCopy] = '-'; + pCubeIn[(int)(PORT_PTRUINT_T)pFanin->pCopy] = '-'; } Extra_ProgressBarUpdate( pProgress, i, NULL ); } diff --git a/src/base/io/ioWriteVerilog.c b/src/base/io/ioWriteVerilog.c index c704c6a15..41932dca3 100644 --- a/src/base/io/ioWriteVerilog.c +++ b/src/base/io/ioWriteVerilog.c @@ -458,7 +458,7 @@ void Io_WriteVerilogLatches( FILE * pFile, Abc_Ntk_t * pNtk ) if ( i == Abc_NtkLatchNum(pNtk) ) return; // write the initial values - fprintf( pFile, " initial begin\n", Io_WriteVerilogGetName(Abc_ObjName(Abc_ObjFanout0(Abc_NtkPi(pNtk,0)))) ); + fprintf( pFile, " initial begin\n" ); Abc_NtkForEachLatch( pNtk, pLatch, i ) { if ( Abc_LatchInit(pLatch) == ABC_INIT_ZERO ) diff --git a/src/base/main/mainUtils.c b/src/base/main/mainUtils.c index 1f090cf4d..d69055a48 100644 --- a/src/base/main/mainUtils.c +++ b/src/base/main/mainUtils.c @@ -22,6 +22,7 @@ #ifndef _WIN32 #include +#include #endif //////////////////////////////////////////////////////////////////////// @@ -64,14 +65,17 @@ char * Abc_UtilsGetVersion( Abc_Frame_t * pAbc ) ***********************************************************************/ char * Abc_UtilsGetUsersInput( Abc_Frame_t * pAbc ) { - static char Buffer[1000], Prompt[1000]; + static char Prompt[1000]; +#ifndef _WIN32 + static char * line = NULL; +#endif + sprintf( Prompt, "abc %02d> ", pAbc->nSteps ); #ifdef _WIN32 fprintf( pAbc->Out, "%s", Prompt ); - fgets( Buffer, 999, stdin ); - return Buffer; + fgets( Prompt, 999, stdin ); + return Prompt; #else - static char* line = NULL; if (line != NULL) free(line); line = readline(Prompt); if (line == NULL){ printf("***EOF***\n"); exit(0); } diff --git a/src/base/ver/verCore.c b/src/base/ver/verCore.c index 322ce7201..93fc7b5db 100644 --- a/src/base/ver/verCore.c +++ b/src/base/ver/verCore.c @@ -293,7 +293,7 @@ Abc_Ntk_t * Ver_ParseFindOrCreateNetwork( Ver_Man_t * pMan, char * pName ) { Abc_Ntk_t * pNtkNew; // check if the network exists - if ( pNtkNew = Abc_LibFindModelByName( pMan->pDesign, pName ) ) + if ( (pNtkNew = Abc_LibFindModelByName( pMan->pDesign, pName )) ) return pNtkNew; //printf( "Creating network %s.\n", pName ); // create new network @@ -319,7 +319,7 @@ Abc_Ntk_t * Ver_ParseFindOrCreateNetwork( Ver_Man_t * pMan, char * pName ) Abc_Obj_t * Ver_ParseFindNet( Abc_Ntk_t * pNtk, char * pName ) { Abc_Obj_t * pObj; - if ( pObj = Abc_NtkFindNet(pNtk, pName) ) + if ( (pObj = Abc_NtkFindNet(pNtk, pName)) ) return pObj; if ( !strcmp( pName, "1\'b0" ) || !strcmp( pName, "1\'bx" ) ) return Abc_NtkFindOrCreateNet( pNtk, "1\'b0" ); @@ -583,7 +583,7 @@ int Ver_ParseInsertsSuffix( Ver_Man_t * pMan, char * pWord, int nMsb, int nLsb ) assert( nMsb >= 0 && nMsb < 128 ); assert( nLsb >= 0 && nLsb < 128 ); Value = (nMsb << 8) | nLsb; - st_insert( pMan->tName2Suffix, Extra_UtilStrsav(pWord), (char *)Value ); + st_insert( pMan->tName2Suffix, Extra_UtilStrsav(pWord), (char *)(PORT_PTRUINT_T)Value ); return 1; } @@ -764,7 +764,7 @@ int Ver_ParseConstant( Ver_Man_t * pMan, char * pWord ) if ( pWord[i] == 'x' ) Vec_PtrPush( pMan->vNames, (void *)0 ); else - Vec_PtrPush( pMan->vNames, (void *)(pWord[i]-'0') ); + Vec_PtrPush( pMan->vNames, (void *)(PORT_PTRUINT_T)(pWord[i]-'0') ); } return 1; } @@ -1211,7 +1211,7 @@ int Ver_ParseAssign( Ver_Man_t * pMan, Abc_Ntk_t * pNtk ) Ver_ParsePrintErrorMessage( pMan ); return 0; } - Vec_PtrPush( pMan->vNames, (void *)strlen(pEquation) ); + Vec_PtrPush( pMan->vNames, (void *)(PORT_PTRUINT_T)strlen(pEquation) ); Vec_PtrPush( pMan->vNames, pEquation ); // get the buffer pFunc = (Hop_Obj_t *)Mio_LibraryReadBuf(Abc_FrameReadLibGen()); @@ -1248,7 +1248,7 @@ int Ver_ParseAssign( Ver_Man_t * pMan, Abc_Ntk_t * pNtk ) for ( i = 0; i < Vec_PtrSize(pMan->vNames)/2; i++ ) { // get the name of this signal - Length = (int)Vec_PtrEntry( pMan->vNames, 2*i ); + Length = (int)(PORT_PTRUINT_T)Vec_PtrEntry( pMan->vNames, 2*i ); pName = Vec_PtrEntry( pMan->vNames, 2*i + 1 ); pName[Length] = 0; // find the corresponding net @@ -2371,7 +2371,6 @@ int Ver_ParseCheckNondrivenNets( Vec_Ptr_t * vUndefs ) if ( pBundle ) Vec_PtrForEachEntry( pBundle->vNetsActual, pNet, m ) { - char * pName = Abc_ObjName(pNet); if ( Abc_ObjFaninNum(pNet) == 0 ) // non-driven if ( strcmp(Abc_ObjName(pNet), "1\'b0") && strcmp(Abc_ObjName(pNet), "1\'b1") ) // diff from a const return 1; @@ -2392,7 +2391,7 @@ int Ver_ParseCheckNondrivenNets( Vec_Ptr_t * vUndefs ) ***********************************************************************/ int Ver_ParseFormalNetsAreDriven( Abc_Ntk_t * pNtk, char * pNameFormal ) { - Ver_Bundle_t * pBundle; + Ver_Bundle_t * pBundle = NULL; Abc_Obj_t * pBox, * pNet; int k, j, m; // go through instances of this type @@ -2406,6 +2405,7 @@ int Ver_ParseFormalNetsAreDriven( Abc_Ntk_t * pNtk, char * pNameFormal ) if ( j == Vec_PtrSize((Vec_Ptr_t *)pBox->pCopy) ) continue; // check if all nets are driven in this bundle + assert(pBundle); // Verify that pBundle was assigned to. Vec_PtrForEachEntry( pBundle->vNetsActual, pNet, m ) if ( Abc_ObjFaninNum(pNet) > 0 ) return 1; @@ -2461,7 +2461,7 @@ int Ver_ParseDriveFormal( Ver_Man_t * pMan, Abc_Ntk_t * pNtk, Ver_Bundle_t * pBu { char Buffer[200]; char * pName; - Ver_Bundle_t * pBundle; + Ver_Bundle_t * pBundle = NULL; Abc_Obj_t * pBox, * pTerm, * pTermNew, * pNetAct, * pNetFormal; int k, j, m; @@ -2496,6 +2496,7 @@ int Ver_ParseDriveFormal( Ver_Man_t * pMan, Abc_Ntk_t * pNtk, Ver_Bundle_t * pBu if ( j == Vec_PtrSize((Vec_Ptr_t *)pBox->pCopy) ) continue; // check if any nets are driven in this bundle + assert(pBundle); // Verify pBundle was assigned to. Vec_PtrForEachEntry( pBundle->vNetsActual, pNetAct, m ) if ( Abc_ObjFaninNum(pNetAct) > 0 ) { @@ -2705,7 +2706,7 @@ void Ver_ParsePrintLog( Ver_Man_t * pMan ) { Vec_Ptr_t * vBundles; Ver_Bundle_t * pBundle; - int j, nActNets, Counter = 0, CounterBoxes = 0; + int j, nActNets, Counter = 0; // count the number of instances with dangling outputs Vec_PtrForEachEntry( pMan->pDesign->vModules, pNtk, i ) { @@ -2784,7 +2785,7 @@ void Ver_ParsePrintLog( Ver_Man_t * pMan ) ***********************************************************************/ int Ver_ParseAttachBoxes( Ver_Man_t * pMan ) { - Abc_Ntk_t * pNtk; + Abc_Ntk_t * pNtk = NULL; Ver_Bundle_t * pBundle; Vec_Ptr_t * vUndefs; int i, RetValue, Counter, nMaxBoxSize; @@ -2813,7 +2814,7 @@ int Ver_ParseAttachBoxes( Ver_Man_t * pMan ) // go through undef box types pBundle = NULL; Vec_PtrForEachEntry( vUndefs, pNtk, i ) - if ( pBundle = Ver_ParseGetNondrivenBundle( pNtk, Counter ) ) + if ( (pBundle = Ver_ParseGetNondrivenBundle( pNtk, Counter )) ) break; if ( pBundle == NULL ) { diff --git a/src/base/ver/verFormula.c b/src/base/ver/verFormula.c index 19a2c523d..e9588ba91 100644 --- a/src/base/ver/verFormula.c +++ b/src/base/ver/verFormula.c @@ -237,7 +237,7 @@ void * Ver_FormulaParser( char * pFormula, void * pMan, Vec_Ptr_t * vNames, Vec_ v = Ver_FormulaParserFindVar( pTemp, vNames ); if ( *pTemp == '\\' ) pTemp++; - pTemp += (int)Vec_PtrEntry( vNames, 2*v ) - 1; + pTemp += (int)(PORT_PTRUINT_T)Vec_PtrEntry( vNames, 2*v ) - 1; // assume operation AND, if vars follow one another if ( Flag == VER_PARSE_FLAG_VAR ) @@ -404,7 +404,7 @@ int Ver_FormulaParserFindVar( char * pString, Vec_Ptr_t * vNames ) nLength = pTemp - pString; for ( i = 0; i < Vec_PtrSize(vNames)/2; i++ ) { - nLength2 = (int)Vec_PtrEntry( vNames, 2*i + 0 ); + nLength2 = (int)(PORT_PTRUINT_T)Vec_PtrEntry( vNames, 2*i + 0 ); if ( nLength2 != nLength ) continue; pTemp2 = Vec_PtrEntry( vNames, 2*i + 1 ); @@ -413,7 +413,7 @@ int Ver_FormulaParserFindVar( char * pString, Vec_Ptr_t * vNames ) return i; } // could not find - add and return the number - Vec_PtrPush( vNames, (void *)nLength ); + Vec_PtrPush( vNames, (void *)(PORT_PTRUINT_T)nLength ); Vec_PtrPush( vNames, pString ); return i; } @@ -431,7 +431,7 @@ int Ver_FormulaParserFindVar( char * pString, Vec_Ptr_t * vNames ) ***********************************************************************/ void * Ver_FormulaReduction( char * pFormula, void * pMan, Vec_Ptr_t * vNames, char * pErrorMessage ) { - Hop_Obj_t * pRes; + Hop_Obj_t * pRes = NULL; int v, fCompl; char Symbol; @@ -453,7 +453,7 @@ void * Ver_FormulaReduction( char * pFormula, void * pMan, Vec_Ptr_t * vNames, c while ( *pFormula != '}' ) { v = Ver_FormulaParserFindVar( pFormula, vNames ); - pFormula += (int)Vec_PtrEntry( vNames, 2*v ); + pFormula += (int)(PORT_PTRUINT_T)Vec_PtrEntry( vNames, 2*v ); while ( *pFormula == ' ' || *pFormula == ',' ) pFormula++; } diff --git a/src/bdd/cas/casCore.c b/src/bdd/cas/casCore.c index 84d1e97b6..a27e994fe 100644 --- a/src/bdd/cas/casCore.c +++ b/src/bdd/cas/casCore.c @@ -459,16 +459,16 @@ void Experiment2( BFunc * pFunc ) //////////////////////////////////////////////////////////////////////// // the bit count for the first 256 integer numbers -static unsigned char BitCount8[256] = { - 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5, - 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, - 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8 -}; +//static unsigned char BitCount8[256] = { +// 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5, +// 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, +// 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, +// 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, +// 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, +// 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, +// 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, +// 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8 +//}; ///////////////////////////////////////////////////////////// static int s_SuppSize[MAXOUTPUTS]; @@ -605,7 +605,6 @@ DdNode * GetSingleOutputFunctionRemapped( DdManager * dd, DdNode ** pOutputs, in DdNode * bSupp, * bTemp; int i, Counter; - int nSuppPrev = -1; DdNode * bFunc; DdNode * aFunc; @@ -669,7 +668,6 @@ DdNode * GetSingleOutputFunctionRemappedNewDD( DdManager * dd, DdNode ** pOutput DdNode * bSupp, * bTemp; int i, v, Counter; - int nSuppPrev = -1; DdNode * bFunc; // these are in the new manager diff --git a/src/bdd/cudd/cuddAddIte.c b/src/bdd/cudd/cuddAddIte.c index 71f8070f3..bcfae83aa 100644 --- a/src/bdd/cudd/cuddAddIte.c +++ b/src/bdd/cudd/cuddAddIte.c @@ -421,7 +421,7 @@ cuddAddIteRecur( DdNode *one,*zero; DdNode *r,*Fv,*Fnv,*Gv,*Gnv,*Hv,*Hnv,*t,*e; unsigned int topf,topg,toph,v; - int index; + int index = 0; // Suppress "might be used uninitialized" statLine(dd); /* Trivial cases. */ diff --git a/src/bdd/cudd/cuddAddWalsh.c b/src/bdd/cudd/cuddAddWalsh.c index c6a67e340..90a57b3c1 100644 --- a/src/bdd/cudd/cuddAddWalsh.c +++ b/src/bdd/cudd/cuddAddWalsh.c @@ -271,7 +271,8 @@ addWalshInt( int n) { DdNode *one, *minusone; - DdNode *t, *u, *t1, *u1, *v, *w; + DdNode *t = NULL; // Suppress "might be used uninitialized" + DdNode *u, *t1, *u1, *v, *w; int i; one = DD_ONE(dd); diff --git a/src/bdd/cudd/cuddBddIte.c b/src/bdd/cudd/cuddBddIte.c index b44e40de6..672d63442 100644 --- a/src/bdd/cudd/cuddBddIte.c +++ b/src/bdd/cudd/cuddBddIte.c @@ -572,7 +572,7 @@ cuddBddIteRecur( DdNode *one, *zero, *res; DdNode *r, *Fv, *Fnv, *Gv, *Gnv, *H, *Hv, *Hnv, *t, *e; unsigned int topf, topg, toph, v; - int index; + int index = 0; // Suppress "might be used uninitialized" int comple; statLine(dd); diff --git a/src/bdd/cudd/cuddDecomp.c b/src/bdd/cudd/cuddDecomp.c index 4fde7392f..35a77b8c2 100644 --- a/src/bdd/cudd/cuddDecomp.c +++ b/src/bdd/cudd/cuddDecomp.c @@ -1662,7 +1662,8 @@ BuildConjuncts( st_table * mintermTable) { int topid, distance; - Conjuncts *factorsNv, *factorsNnv, *factors; + Conjuncts *factorsNv = NULL, *factorsNnv = NULL; // Suppress "might be used uninitialized" + Conjuncts *factors; Conjuncts *dummy; DdNode *N, *Nv, *Nnv, *temp, *g1, *g2, *h1, *h2, *topv; double minNv = 0.0, minNnv = 0.0; diff --git a/src/bdd/cudd/cuddGroup.c b/src/bdd/cudd/cuddGroup.c index 81c05d2c5..fbf8b6dda 100644 --- a/src/bdd/cudd/cuddGroup.c +++ b/src/bdd/cudd/cuddGroup.c @@ -1455,7 +1455,7 @@ ddGroupMove( Move *move; int size; int i,j,xtop,xbot,xsize,ytop,ybot,ysize,newxtop; - int swapx,swapy; + int swapx=-1,swapy=-1; // Suppress "might be used uninitialized" #if defined(DD_DEBUG) && defined(DD_VERBOSE) int initialSize,bestSize; #endif @@ -1635,7 +1635,7 @@ ddGroupSiftingBackward( { Move *move; int res; - Move *end_move; + Move *end_move = NULL; int diff, tmp_diff; int index, pairlev; diff --git a/src/bdd/cudd/cuddHarwell.c b/src/bdd/cudd/cuddHarwell.c index 063f19225..59394ce48 100644 --- a/src/bdd/cudd/cuddHarwell.c +++ b/src/bdd/cudd/cuddHarwell.c @@ -113,7 +113,7 @@ Cudd_addHarwell( DdNode *cubex, *cubey, *minterm1; int u, v, err, i, j, nv; double val; - DdNode **lx, **ly, **lxn, **lyn; /* local copies of x, y, xn, yn_ */ + DdNode **lx = NULL, **ly = NULL, **lxn = NULL, **lyn = NULL; /* local copies of x, y, xn, yn_ */ /* Suppress "might be used uninitialized */ int lnx, lny; /* local copies of nx and ny */ char title[73], key[9], mxtype[4], rhstyp[4]; int totcrd, ptrcrd, indcrd, valcrd, rhscrd, diff --git a/src/bdd/cudd/cuddLinear.c b/src/bdd/cudd/cuddLinear.c index 7f6b36784..95624a9e3 100644 --- a/src/bdd/cudd/cuddLinear.c +++ b/src/bdd/cudd/cuddLinear.c @@ -836,7 +836,7 @@ cuddLinearInPlace( int posn; int isolated; DdNode *f,*f0,*f1,*f01,*f00,*f11,*f10,*newf1,*newf0; - DdNode *g,*next,*last; + DdNode *g,*next,*last = NULL; // Suppress "might be used uninitialized" DdNodePtr *previousP; DdNode *tmp; DdNode *sentinel = &(table->sentinel); diff --git a/src/bdd/cudd/cuddPriority.c b/src/bdd/cudd/cuddPriority.c index 788fc7128..2895fa0bd 100644 --- a/src/bdd/cudd/cuddPriority.c +++ b/src/bdd/cudd/cuddPriority.c @@ -937,7 +937,8 @@ cuddCProjectionRecur( { DdNode *res, *res1, *res2, *resA; DdNode *r, *y, *RT, *RE, *YT, *YE, *Yrest, *Ra, *Ran, *Gamma, *Alpha; - unsigned int topR, topY, top, index; + unsigned int topR, topY, top; + unsigned int index = 0; // Suppress "might be used uninitialized" DdNode *one = DD_ONE(dd); statLine(dd); diff --git a/src/bdd/cudd/cuddReorder.c b/src/bdd/cudd/cuddReorder.c index 1387196f4..4e62ce34d 100644 --- a/src/bdd/cudd/cuddReorder.c +++ b/src/bdd/cudd/cuddReorder.c @@ -577,7 +577,7 @@ cuddSwapping( int iterate; int previousSize; Move *moves, *move; - int pivot; + int pivot = 0; // Suppress "might be used uninitialized" int modulo; int result; @@ -2005,7 +2005,7 @@ ddUpdateMtrTree( int * invperm) { int i, size, index, level; - int minLevel, maxLevel, minIndex; + int minLevel = table->size, maxLevel = 0, minIndex = 0; // Suppress "might be used uninitialized" if (treenode == NULL) return(1); diff --git a/src/bdd/cudd/cuddSubsetSP.c b/src/bdd/cudd/cuddSubsetSP.c index 55ee34703..e3d39a0e3 100644 --- a/src/bdd/cudd/cuddSubsetSP.c +++ b/src/bdd/cudd/cuddSubsetSP.c @@ -1224,12 +1224,14 @@ BuildSubsetBdd( { DdNode *N, *Nv, *Nnv; DdNode *ThenBranch, *ElseBranch, *childBranch; - DdNode *child, *regChild, *regNnv, *regNv; + DdNode *child, *regChild; + DdNode *regNnv = NULL, *regNv = NULL; // Suppress "might be used uninitialized" NodeDist_t *nodeStatNv, *nodeStat, *nodeStatNnv; DdNode *neW, *topv, *regNew; char *entry; unsigned int topid; - unsigned int childPathLength, oddLen, evenLen, NnvPathLength, NvPathLength; + unsigned int childPathLength, oddLen, evenLen; + unsigned int NnvPathLength = -1, NvPathLength = -1; // Suppress "might be used uninitialized" unsigned int NvBotDist, NnvBotDist; int tiebreakChild; int processingDone, thenDone, elseDone; diff --git a/src/bdd/cudd/cuddSymmetry.c b/src/bdd/cudd/cuddSymmetry.c index e5488b174..aef6abc6c 100644 --- a/src/bdd/cudd/cuddSymmetry.c +++ b/src/bdd/cudd/cuddSymmetry.c @@ -1445,10 +1445,10 @@ ddSymmGroupMove( Move ** moves) { Move *move; - int size; + int size = 0; // Suppress "might be used uninitialized" int i,j; int xtop,xbot,xsize,ytop,ybot,ysize,newxtop; - int swapx,swapy; + int swapx = 0,swapy = 0; // Suppress "might be used uninitialized" #if DD_DEBUG assert(x < y); /* we assume that x < y */ @@ -1524,7 +1524,7 @@ ddSymmGroupMoveBackward( int x, int y) { - int size; + int size = 0; // Suppress "might be used uninitialized" int i,j; int xtop,xbot,xsize,ytop,ybot,ysize,newxtop; diff --git a/src/bdd/cudd/cuddTable.c b/src/bdd/cudd/cuddTable.c index 7f14aed18..458f19e62 100644 --- a/src/bdd/cudd/cuddTable.c +++ b/src/bdd/cudd/cuddTable.c @@ -1768,7 +1768,8 @@ cuddInsertSubtables( int oldsize,newsize; int i,j,index,reorderSave; unsigned int numSlots = unique->initSlots; - int *newperm, *newinvperm, *newmap; + int *newperm, *newinvperm; + int *newmap = NULL; // Suppress "might be used uninitialized" DdNode *one, *zero; #ifdef DD_DEBUG @@ -2499,7 +2500,8 @@ ddResizeTable( int oldsize,newsize; int i,j,reorderSave; int numSlots = unique->initSlots; - int *newperm, *newinvperm, *newmap; + int *newperm, *newinvperm; + int *newmap = NULL; // Suppress "might be used uninitialized" DdNode *one, *zero; oldsize = unique->size; diff --git a/src/bdd/cudd/cuddUtil.c b/src/bdd/cudd/cuddUtil.c index d5fa18e22..bc1a17eb9 100644 --- a/src/bdd/cudd/cuddUtil.c +++ b/src/bdd/cudd/cuddUtil.c @@ -1357,7 +1357,8 @@ Cudd_bddPickArbitraryMinterms( DdNode **old, *neW; double minterms; char *saveString; - int saveFlag, savePoint, isSame; + int saveFlag, isSame; + int savePoint = 0; // Suppress "might be used uninitialized" minterms = Cudd_CountMinterm(dd,f,n); if ((double)k > minterms) { diff --git a/src/bdd/cudd/cuddZddGroup.c b/src/bdd/cudd/cuddZddGroup.c index 621fa43f4..c26ea5335 100644 --- a/src/bdd/cudd/cuddZddGroup.c +++ b/src/bdd/cudd/cuddZddGroup.c @@ -1060,7 +1060,7 @@ zddGroupMove( Move *move; int size; int i,j,xtop,xbot,xsize,ytop,ybot,ysize,newxtop; - int swapx,swapy; + int swapx = 0,swapy = 0; // Suppress "might be used uninitialized" #if defined(DD_DEBUG) && defined(DD_VERBOSE) int initialSize,bestSize; #endif diff --git a/src/bdd/cudd/cuddZddReord.c b/src/bdd/cudd/cuddZddReord.c index e2da37f2b..6e7d3438a 100644 --- a/src/bdd/cudd/cuddZddReord.c +++ b/src/bdd/cudd/cuddZddReord.c @@ -464,7 +464,8 @@ cuddZddSwapInPlace( int i; int posn; DdNode *f, *f1, *f0, *f11, *f10, *f01, *f00; - DdNode *newf1, *newf0, *next; + DdNode *newf1 = NULL; // Suppress "might be used uninitialized" + DdNode *newf0, *next; DdNodePtr g, *lastP, *previousP; #ifdef DD_DEBUG @@ -725,7 +726,7 @@ cuddZddSwapping( int iterate; int previousSize; Move *moves, *move; - int pivot; + int pivot = -1; // Suppress "might be used uninitialized" int modulo; int result; diff --git a/src/bdd/cudd/cuddZddSymm.c b/src/bdd/cudd/cuddZddSymm.c index 54019892e..0930e0771 100644 --- a/src/bdd/cudd/cuddZddSymm.c +++ b/src/bdd/cudd/cuddZddSymm.c @@ -1459,7 +1459,7 @@ zdd_group_move( Move *move; int size; int i, temp, gxtop, gxbot, gytop, gybot, yprev; - int swapx, swapy; + int swapx = 0, swapy = 0; // Suppress "might be used uninitialized" #ifdef DD_DEBUG assert(x < y); /* we assume that x < y */ @@ -1563,7 +1563,7 @@ zdd_group_move_backward( int x, int y) { - int size; + int size = -1; // Suppress "might be used uninitialized" int i, temp, gxtop, gxbot, gytop, gybot, yprev; #ifdef DD_DEBUG diff --git a/src/bdd/dsd/dsdCheck.c b/src/bdd/dsd/dsdCheck.c index 58b824d2d..ce466a713 100644 --- a/src/bdd/dsd/dsdCheck.c +++ b/src/bdd/dsd/dsdCheck.c @@ -183,7 +183,7 @@ int Dsd_CheckRootFunctionIdentity_rec( DdManager * dd, DdNode * bF1, DdNode * bF pCache->pTable[HKey].bX[3] == bC2 ) { pCache->nSuccess++; - return (int)pCache->pTable[HKey].bX[4]; // the last bit records the result (yes/no) + return (int)(PORT_PTRUINT_T)pCache->pTable[HKey].bX[4]; // the last bit records the result (yes/no) } else { @@ -302,7 +302,7 @@ int Dsd_CheckRootFunctionIdentity_rec( DdManager * dd, DdNode * bF1, DdNode * bF // set cache for ( i = 0; i < 4; i++ ) pCache->pTable[HKey].bX[i] = bA[i]; - pCache->pTable[HKey].bX[4] = (DdNode*)RetValue; + pCache->pTable[HKey].bX[4] = (DdNode*)(PORT_PTRUINT_T)RetValue; return RetValue; } diff --git a/src/bdd/dsd/dsdProc.c b/src/bdd/dsd/dsdProc.c index 543ad3872..45c0986f7 100644 --- a/src/bdd/dsd/dsdProc.c +++ b/src/bdd/dsd/dsdProc.c @@ -48,27 +48,21 @@ static int dsdKernelVerifyDecomposition( Dsd_Manager_t * pDsdMan, Dsd_Node_t * p static int s_Mark; // debugging flag -static int s_Show = 0; +//static int s_Show = 0; // temporary var used for debugging static int Depth = 0; static int s_Loops1; static int s_Loops2; static int s_Loops3; -static int s_Pivot; -static int s_PivotNo; static int s_Common; static int s_CommonNo; static int s_Case4Calls; static int s_Case4CallsSpecial; -static int s_Case5; -static int s_Loops2Useless; - - -static int s_DecNodesTotal; -static int s_DecNodesUsed; +//static int s_Case5; +//static int s_Loops2Useless; // statistical variables static int s_nDecBlocks; @@ -76,10 +70,6 @@ static int s_nLiterals; static int s_nExorGates; static int s_nReusedBlocks; static int s_nCascades; -static float s_nArea; -static float s_MaxDelay; -static long s_Time; -static int s_nInvertors; static int s_nPrimeBlocks; static int HashSuccess = 0; @@ -451,14 +441,14 @@ if ( s_Show ) if ( fContained ) { Dsd_Node_t * pSmall, * pLarge; - int c, iCompLarge; // the number of the component is Large is equal to the whole of Small + int c, iCompLarge = -1; // the number of the component is Large is equal to the whole of Small; suppress "might be used uninitialized" int fLowIsLarge; DdNode * bFTemp; // the changed input function Dsd_Node_t * pDETemp, * pDENew; Dsd_Node_t * pComp = NULL; - int nComp; + int nComp = -1; // Suppress "might be used uninitialized" if ( pSmallR == pLR ) { // Low is Small => High is Large @@ -495,7 +485,7 @@ if ( s_Show ) // as discribed in the previous example. // find the component, which when substituted for 0 or 1, produces the desired result - int g, fFoundComp; // {0,1} depending on whether setting cofactor to 0 or 1 worked out + int g, fFoundComp = -1; // {0,1} depending on whether setting cofactor to 0 or 1 worked out; suppress "might be used uninitialized" DdNode * bLarge, * bSmall; if ( fLowIsLarge ) @@ -575,7 +565,7 @@ if ( s_Show ) // try to find a group of common components if ( pLargeR->Type == pSmallR->Type && - (pLargeR->Type == DSD_NODE_EXOR || pSmallR->Type == DSD_NODE_OR&& ((pLarge==pLargeR) == (pSmall==pSmallR))) ) + (pLargeR->Type == DSD_NODE_EXOR || (pSmallR->Type == DSD_NODE_OR && ((pLarge==pLargeR) == (pSmall==pSmallR)))) ) { Dsd_Node_t ** pCommon, * pLastDiffL = NULL, * pLastDiffH = NULL; int nCommon = dsdKernelFindCommonComponents( pDsdMan, pLargeR, pSmallR, &pCommon, &pLastDiffL, &pLastDiffH ); @@ -618,12 +608,12 @@ if ( s_Show ) // <> <> .......<=>... /..|..<> | // / \ / | \| // [OR] [C] S1 S2 C - // / \ - // <> \ - // / \ - // [OR] [x] - // / \ - // S1 S2 + // / \ . + // <> \ . + // / \ . + // [OR] [x] . + // / \ . + // S1 S2 . // @@ -673,12 +663,12 @@ if ( s_Show ) // / \ / | \ | // / \ / | \| // [OR] [C] S1 S2 C - // / \ - // <> \ - // / \ - // [XOR] [x] - // / \ - // S1 S2 + // / \ . + // <> \ . + // / \ . + // [XOR] [x] . + // / \ . + // S1 S2 . // assert( fComp2 == 0 ); @@ -740,7 +730,7 @@ if ( s_Show ) // and if they are PRIME, their dec numbers should be the same if ( pLR->Type == pHR->Type && pLR->Type != DSD_NODE_BUF && - (pLR->Type != DSD_NODE_OR || ( pL == pLR && pH == pHR || pL != pLR && pH != pHR ) ) && + (pLR->Type != DSD_NODE_OR || ( (pL == pLR && pH == pHR) || (pL != pLR && pH != pHR) ) ) && (pLR->Type != DSD_NODE_PRIME || pLR->nDecs == pHR->nDecs) ) { // array to store common comps in pL and pH @@ -947,7 +937,8 @@ if ( s_Show ) int nEntries = 0; DdNode * SuppL, * SuppH, * SuppL_init, * SuppH_init; - Dsd_Node_t *pHigher, *pLower, * pTemp, * pDENew; + Dsd_Node_t *pHigher = NULL; // Suppress "might be used uninitialized" + Dsd_Node_t *pLower, * pTemp, * pDENew; int levTopSuppL; @@ -1146,7 +1137,7 @@ if ( s_Show ) pMarkedLeft[ nMarkedLeft ] = pTempL; pMarkedPols[ nMarkedLeft ] = fPolarity; nMarkedLeft++; - } while ( pTempL = dsdKernelFindContainingComponent( pDsdMan, pTempL, bVarTop, &fPolarity ) ); + } while ( (pTempL = dsdKernelFindContainingComponent( pDsdMan, pTempL, bVarTop, &fPolarity )) ); // go over the dec list of pH, and find the component that is marked and the previos one // (such component always exists, because they have common variables) @@ -1431,7 +1422,8 @@ int dsdKernelFindCommonComponents( Dsd_Manager_t * pDsdMan, Dsd_Node_t * pL, Dsd void dsdKernelComputeSumOfComponents( Dsd_Manager_t * pDsdMan, Dsd_Node_t ** pCommon, int nCommon, DdNode ** pCompF, DdNode ** pCompS, int fExor ) { DdManager * dd = pDsdMan->dd; - DdNode * bF, * bS, * bFadd, * bTemp; + DdNode * bF, * bFadd, * bTemp; + DdNode * bS = NULL; // Suppress "might be used uninitialized" Dsd_Node_t * pDE, * pDER; int i; @@ -1565,7 +1557,6 @@ int dsdKernelVerifyDecomposition( Dsd_Manager_t * pDsdMan, Dsd_Node_t * pDE ) { DdManager * dd = pDsdMan->dd; Dsd_Node_t * pR = Dsd_Regular(pDE); - int fCompP = (int)( pDE != pR ); int RetValue; DdNode * bRes; diff --git a/src/bdd/dsd/dsdTree.c b/src/bdd/dsd/dsdTree.c index 2855d68d0..5d69f2f47 100644 --- a/src/bdd/dsd/dsdTree.c +++ b/src/bdd/dsd/dsdTree.c @@ -38,11 +38,6 @@ static void Dsd_NodePrint_rec( FILE * pFile, Dsd_Node_t * pNode, int fComp, char static int s_DepthMax; static int s_GateSizeMax; -static int s_CounterBlocks; -static int s_CounterPos; -static int s_CounterNeg; -static int s_CounterNo; - //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// @@ -1009,7 +1004,6 @@ DdNode * Dsd_TreeGetPrimeFunctionOld( DdManager * dd, Dsd_Node_t * pNode, int fR { DdNode * bCof0, * bCof1, * bCube0, * bCube1, * bNewFunc, * bTemp; int i; - int fAllBuffs = 1; static int Permute[MAXINPUTS]; assert( pNode ); diff --git a/src/bdd/parse/parseCore.c b/src/bdd/parse/parseCore.c index eb89b3e30..0071fb5ae 100644 --- a/src/bdd/parse/parseCore.c +++ b/src/bdd/parse/parseCore.c @@ -120,7 +120,8 @@ DdNode * Parse_FormulaParser( FILE * pOutput, char * pFormulaInit, int nVars, in char * pTemp; int nParans, fFound, Flag; int Oper, Oper1, Oper2; - int i, v, fLower; + int i, fLower; + int v = -1; // Suppress "might be used uninitialized" // make sure that the number of vars and ranks is correct if ( nVars * (nRanks + 1) > dd->size ) diff --git a/src/bdd/reo/reoSwap.c b/src/bdd/reo/reoSwap.c index 4afa650c9..d3a9c7a55 100644 --- a/src/bdd/reo/reoSwap.c +++ b/src/bdd/reo/reoSwap.c @@ -47,7 +47,8 @@ double reoReorderSwapAdjacentVars( reo_man * p, int lev0, int fMovingUp ) // the new nodes on lev0 reo_unit * pLoop, * pUnit; // the new nodes on lev1 - reo_unit * pNewPlane20, * pNewPlane21, * pNewPlane20R; + reo_unit * pNewPlane20 = NULL, * pNewPlane21 = NULL; // Suppress "might be used uninitialized" + reo_unit * pNewPlane20R; reo_unit * pUnitE, * pUnitER, * pUnitT; // the nodes below lev1 reo_unit * pNew1E, * pNew1T, * pNew2E, * pNew2T; @@ -60,18 +61,19 @@ double reoReorderSwapAdjacentVars( reo_man * p, int lev0, int fMovingUp ) reo_unit * pListNew1 = NULL, ** ppListNew1 = &pListNew1; reo_unit * pListTemp = NULL, ** ppListTemp = &pListTemp; // various integer variables - int fComp, fCompT, fFound, nWidthCofs, HKey, fInteract, temp, c; + int fComp, fCompT, fFound, HKey, fInteract, temp, c; + int nWidthCofs = -1; // Suppress "might be used uninitialized" // statistical variables int nNodesUpMovedDown = 0; int nNodesDownMovedUp = 0; int nNodesUnrefRemoved = 0; int nNodesUnrefAdded = 0; int nWidthReduction = 0; - double AplWeightTotalLev0; - double AplWeightTotalLev1; - double AplWeightHalf; - double AplWeightPrev; - double AplWeightAfter; + double AplWeightTotalLev0 = 0.0; // Suppress "might be used uninitialized" + double AplWeightTotalLev1 = 0.0; // Suppress "might be used uninitialized" + double AplWeightHalf = 0.0; // Suppress "might be used uninitialized" + double AplWeightPrev = 0.0; // Suppress "might be used uninitialized" + double AplWeightAfter = 0.0; // Suppress "might be used uninitialized" double nCostGain; // set the old lists @@ -248,14 +250,14 @@ double reoReorderSwapAdjacentVars( reo_man * p, int lev0, int fMovingUp ) { // before after // - // - // 0 / \ 1 - // / \ - // / \ - // / \ - // / \ 0 / \ 1 - // / \ / \ - // / \ / \ + // . + // 0 / \ 1 . + // / \ . + // / \ . + // / \ . + // / \ 0 / \ 1 . + // / \ / \ . + // / \ / \ . // F0 F1 F0 F1 // move to plane-2-new @@ -333,15 +335,15 @@ double reoReorderSwapAdjacentVars( reo_man * p, int lev0, int fMovingUp ) { // before after // - // - // 0 / \ 1 0 / \ 1 - // / \ / \ - // / \ / \ - // - // 0 / \ 1 0 / \ 1 0 / \ 1 0 / \ 1 - // / \ / \ / \ / \ - // / \ / \ / \ / \ - // F0 F1 F2 F3 F0 F2 F1 F3 + // . + // 0 / \ 1 0 / \ 1 . + // / \ / \ . + // / \ / \ . + // . + // 0 / \ 1 0 / \ 1 0 / \ 1 0 / \ 1 . + // / \ / \ / \ / \ . + // / \ / \ / \ / \ . + // F0 F1 F2 F3 F0 F2 F1 F3 . // pNew1E pNew1T pNew2E pNew2T // pNew1E = pUnitE->pE; // F0 @@ -354,15 +356,15 @@ double reoReorderSwapAdjacentVars( reo_man * p, int lev0, int fMovingUp ) { // before after // - // - // 0 . \ 1 0 / \ 1 - // . \ / \ - // . \ / \ - // - // 0 / \ 1 0 / \ 1 0 . \ 1 0 . \ 1 - // / \ / \ . \ . \ - // / \ / \ . \ . \ - // F0 F1 F2 F3 F0 F2 F1 F3 + // . + // 0 . \ 1 0 / \ 1 . + // . \ / \ . + // . \ / \ . + // . + // 0 / \ 1 0 / \ 1 0 . \ 1 0 . \ 1 . + // / \ / \ . \ . \ . + // / \ / \ . \ . \ . + // F0 F1 F2 F3 F0 F2 F1 F3 . // pNew1E pNew1T pNew2E pNew2T // pNew1E = Unit_Not(pUnitER->pE); // F0 @@ -389,15 +391,15 @@ double reoReorderSwapAdjacentVars( reo_man * p, int lev0, int fMovingUp ) { // before after // - // - // 0 / \ 1 0 / \ 1 - // / \ / \ - // / \ / \ - // \ - // 0 / \ 1 \ 0 / \ 1 0 / \ 1 - // / \ \ / \ / \ - // / \ \ / \ / \ - // F0 F1 F3 F0 F3 F1 F3 + // . + // 0 / \ 1 0 / \ 1 . + // / \ / \ . + // / \ / \ . + // \ . + // 0 / \ 1 \ 0 / \ 1 0 / \ 1 . + // / \ \ / \ / \ . + // / \ \ / \ / \ . + // F0 F1 F3 F0 F3 F1 F3 . // pNew1E pNew1T pNew2E pNew2T // pNew1E = pUnitER->pE; // F0 @@ -410,15 +412,15 @@ double reoReorderSwapAdjacentVars( reo_man * p, int lev0, int fMovingUp ) { // before after // - // - // 0 . \ 1 0 / \ 1 - // . \ / \ - // . \ / \ - // \ - // 0 / \ 1 \ 0 . \ 1 0 . \ 1 - // / \ \ . \ . \ - // / \ \ . \ . \ - // F0 F1 F3 F0 F3 F1 F3 + // . + // 0 . \ 1 0 / \ 1 . + // . \ / \ . + // . \ / \ . + // \ . + // 0 / \ 1 \ 0 . \ 1 0 . \ 1 . + // / \ \ . \ . \ . + // / \ \ . \ . \ . + // F0 F1 F3 F0 F3 F1 F3 . // pNew1E pNew1T pNew2E pNew2T // pNew1E = Unit_Not(pUnitER->pE); // F0 @@ -443,15 +445,15 @@ double reoReorderSwapAdjacentVars( reo_man * p, int lev0, int fMovingUp ) { // before after // - // - // 0 / \ 1 0 / \ 1 - // / \ / \ - // / \ / \ - // / - // / 0 / \ 1 0 / \ 1 0 / \ 1 - // / / \ / \ / \ - // / / \ / \ / \ - // F0 F2 F3 F0 F2 F0 F3 + // . + // 0 / \ 1 0 / \ 1 . + // / \ / \ . + // / \ / \ . + // / . + // / 0 / \ 1 0 / \ 1 0 / \ 1 . + // / / \ / \ / \ . + // / / \ / \ / \ . + // F0 F2 F3 F0 F2 F0 F3 . // pNew1E pNew1T pNew2E pNew2T // pNew1E = pUnitE; // F0 diff --git a/src/bdd/reo/reoTransfer.c b/src/bdd/reo/reoTransfer.c index 65d31d014..26a6689ec 100644 --- a/src/bdd/reo/reoTransfer.c +++ b/src/bdd/reo/reoTransfer.c @@ -41,7 +41,8 @@ reo_unit * reoTransferNodesToUnits_rec( reo_man * p, DdNode * F ) { DdManager * dd = p->dd; reo_unit * pUnit; - int HKey, fComp; + int HKey = -1; // Suppress "might be used uninitialized" + int fComp; fComp = Cudd_IsComplement(F); F = Cudd_Regular(F); @@ -68,7 +69,7 @@ reo_unit * reoTransferNodesToUnits_rec( reo_man * p, DdNode * F ) if ( cuddIsConstant(F) ) { pUnit->lev = REO_CONST_LEVEL; - pUnit->pE = (reo_unit*)((int)(cuddV(F))); + pUnit->pE = (reo_unit*)((int)(PORT_PTRUINT_T)(cuddV(F))); pUnit->pT = NULL; // check if the diagram that is being reordering has complement edges if ( F != dd->one ) @@ -117,7 +118,8 @@ DdNode * reoTransferUnitsToNodes_rec( reo_man * p, reo_unit * pUnit ) { DdManager * dd = p->dd; DdNode * bRes, * E, * T; - int HKey, fComp; + int HKey = -1; // Suppress "might be used uninitialized" + int fComp; fComp = Cudd_IsComplement(pUnit); pUnit = Unit_Regular(pUnit); @@ -137,7 +139,7 @@ DdNode * reoTransferUnitsToNodes_rec( reo_man * p, reo_unit * pUnit ) // treat the case of constants if ( Unit_IsConstant(pUnit) ) { - bRes = cuddUniqueConst( dd, ((double)((int)(pUnit->pE))) ); + bRes = cuddUniqueConst( dd, ((double)((int)(PORT_PTRUINT_T)(pUnit->pE))) ); cuddRef( bRes ); } else diff --git a/src/bdd/reo/reoUnits.c b/src/bdd/reo/reoUnits.c index aa86516e1..521370270 100644 --- a/src/bdd/reo/reoUnits.c +++ b/src/bdd/reo/reoUnits.c @@ -84,7 +84,7 @@ void reoUnitsRecycleUnit( reo_man * p, reo_unit * pUnit ) void reoUnitsRecycleUnitList( reo_man * p, reo_plane * pPlane ) { reo_unit * pUnit; - reo_unit * pTail; + reo_unit * pTail = NULL; // Suppress "might be used uninitialized" if ( pPlane->pHead == NULL ) return; diff --git a/src/map/fpga/fpga.c b/src/map/fpga/fpga.c index 31edf6898..fa2a138cd 100644 --- a/src/map/fpga/fpga.c +++ b/src/map/fpga/fpga.c @@ -138,7 +138,7 @@ int Fpga_CommandReadLibrary( Abc_Frame_t * pAbc, int argc, char **argv ) if ( (pFile = fopen( FileName, "r" )) == NULL ) { fprintf( pErr, "Cannot open input file \"%s\". ", FileName ); - if ( FileName = Extra_FileGetSimilarName( FileName, ".genlib", ".lib", ".gen", ".g", NULL ) ) + if ( (FileName = Extra_FileGetSimilarName( FileName, ".genlib", ".lib", ".gen", ".g", NULL )) ) fprintf( pErr, "Did you mean \"%s\"?", FileName ); fprintf( pErr, "\n" ); return 1; diff --git a/src/map/fpga/fpgaCreate.c b/src/map/fpga/fpgaCreate.c index be71d74e2..c0bae1c73 100644 --- a/src/map/fpga/fpgaCreate.c +++ b/src/map/fpga/fpgaCreate.c @@ -28,7 +28,7 @@ static void Fpga_TableResize( Fpga_Man_t * p ); static Fpga_Node_t * Fpga_TableLookup( Fpga_Man_t * p, Fpga_Node_t * p1, Fpga_Node_t * p2 ); // hash key for the structural hash table -static inline unsigned Fpga_HashKey2( Fpga_Node_t * p0, Fpga_Node_t * p1, int TableSize ) { return ((unsigned)(p0) + (unsigned)(p1) * 12582917) % TableSize; } +static inline unsigned Fpga_HashKey2( Fpga_Node_t * p0, Fpga_Node_t * p1, int TableSize ) { return (unsigned)(((PORT_PTRUINT_T)(p0) + (PORT_PTRUINT_T)(p1) * 12582917) % TableSize); } //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// @@ -252,8 +252,8 @@ void Fpga_ManFree( Fpga_Man_t * p ) ***********************************************************************/ void Fpga_ManPrintTimeStats( Fpga_Man_t * p ) { - extern char * pNetName; - extern int TotalLuts; +// extern char * pNetName; +// extern int TotalLuts; // FILE * pTable; diff --git a/src/map/fpga/fpgaCut.c b/src/map/fpga/fpgaCut.c index ce6881798..de5584562 100644 --- a/src/map/fpga/fpgaCut.c +++ b/src/map/fpga/fpgaCut.c @@ -418,8 +418,8 @@ Fpga_Cut_t * Fpga_CutMergeLists( Fpga_Man_t * p, Fpga_CutTable_t * pTable, // create the signature pCut->uSign = pTemp1->uSign | pTemp2->uSign; // add it to the corresponding list - pCut->pNext = pLists[pCut->nLeaves]; - pLists[pCut->nLeaves] = pCut; + pCut->pNext = pLists[(int)pCut->nLeaves]; + pLists[(int)pCut->nLeaves] = pCut; // count this cut and quit if limit is reached Counter++; if ( Counter == FPGA_CUTS_MAX_COMPUTE ) @@ -453,8 +453,8 @@ Fpga_Cut_t * Fpga_CutMergeLists( Fpga_Man_t * p, Fpga_CutTable_t * pTable, // create the signature pCut->uSign = pTemp1->uSign | pTemp2->uSign; // add it to the corresponding list - pCut->pNext = pLists[pCut->nLeaves]; - pLists[pCut->nLeaves] = pCut; + pCut->pNext = pLists[(int)pCut->nLeaves]; + pLists[(int)pCut->nLeaves] = pCut; // count this cut and quit if limit is reached Counter++; if ( Counter == FPGA_CUTS_MAX_COMPUTE ) @@ -493,8 +493,8 @@ Fpga_Cut_t * Fpga_CutMergeLists( Fpga_Man_t * p, Fpga_CutTable_t * pTable, // create the signature pCut->uSign = pTemp1->uSign | pTemp2->uSign; // add it to the corresponding list - pCut->pNext = pLists[pCut->nLeaves]; - pLists[pCut->nLeaves] = pCut; + pCut->pNext = pLists[(int)pCut->nLeaves]; + pLists[(int)pCut->nLeaves] = pCut; // count this cut and quit if limit is reached Counter++; if ( Counter == FPGA_CUTS_MAX_COMPUTE ) @@ -560,8 +560,8 @@ Fpga_Cut_t * Fpga_CutMergeLists2( Fpga_Man_t * p, Fpga_CutTable_t * pTable, pCut->pOne = Fpga_CutNotCond( pTemp1, fComp1 ); pCut->pTwo = Fpga_CutNotCond( pTemp2, fComp2 ); // add it to the corresponding list - pCut->pNext = pLists[pCut->nLeaves]; - pLists[pCut->nLeaves] = pCut; + pCut->pNext = pLists[(int)pCut->nLeaves]; + pLists[(int)pCut->nLeaves] = pCut; // count this cut and quit if limit is reached Counter++; if ( Counter == FPGA_CUTS_MAX_COMPUTE ) diff --git a/src/map/fpga/fpgaCutUtils.c b/src/map/fpga/fpgaCutUtils.c index e60a1dee6..0f003ee7c 100644 --- a/src/map/fpga/fpgaCutUtils.c +++ b/src/map/fpga/fpgaCutUtils.c @@ -142,7 +142,7 @@ Fpga_Cut_t * Fpga_CutCreateSimple( Fpga_Man_t * p, Fpga_Node_t * pNode ) ***********************************************************************/ float Fpga_CutGetRootArea( Fpga_Man_t * p, Fpga_Cut_t * pCut ) { - return p->pLutLib->pLutAreas[pCut->nLeaves]; + return p->pLutLib->pLutAreas[(int)pCut->nLeaves]; } /**Function************************************************************* @@ -158,7 +158,8 @@ float Fpga_CutGetRootArea( Fpga_Man_t * p, Fpga_Cut_t * pCut ) ***********************************************************************/ Fpga_Cut_t * Fpga_CutListAppend( Fpga_Cut_t * pSetAll, Fpga_Cut_t * pSets ) { - Fpga_Cut_t * pPrev, * pTemp; + Fpga_Cut_t * pPrev = NULL; // Suppress "might be used uninitialized" + Fpga_Cut_t * pTemp; if ( pSetAll == NULL ) return pSets; if ( pSets == NULL ) @@ -277,7 +278,7 @@ void Fpga_CutGetParameters( Fpga_Man_t * pMan, Fpga_Cut_t * pCut ) Fpga_Cut_t * pFaninCut; int i; pCut->tArrival = -FPGA_FLOAT_LARGE; - pCut->aFlow = pMan->pLutLib->pLutAreas[pCut->nLeaves]; + pCut->aFlow = pMan->pLutLib->pLutAreas[(int)pCut->nLeaves]; for ( i = 0; i < pCut->nLeaves; i++ ) { pFaninCut = pCut->ppLeaves[i]->pCutBest; @@ -292,7 +293,7 @@ void Fpga_CutGetParameters( Fpga_Man_t * pMan, Fpga_Cut_t * pCut ) } // use the first pin to compute the delay of the LUT // (this mapper does not support the variable pin delay model) - pCut->tArrival += pMan->pLutLib->pLutDelays[pCut->nLeaves][0]; + pCut->tArrival += pMan->pLutLib->pLutDelays[(int)pCut->nLeaves][0]; } @@ -311,7 +312,7 @@ float Fpga_CutGetAreaFlow( Fpga_Man_t * pMan, Fpga_Cut_t * pCut ) { Fpga_Cut_t * pCutFanin; int i; - pCut->aFlow = pMan->pLutLib->pLutAreas[pCut->nLeaves]; + pCut->aFlow = pMan->pLutLib->pLutAreas[(int)pCut->nLeaves]; for ( i = 0; i < pCut->nLeaves; i++ ) { // get the cut implementing this phase of the fanin @@ -388,7 +389,7 @@ float Fpga_CutRef( Fpga_Man_t * pMan, Fpga_Node_t * pNode, Fpga_Cut_t * pCut, in // Fpga_CutInsertFanouts( pMan, pNode, pCut ); // start the area of this cut - aArea = pMan->pLutLib->pLutAreas[pCut->nLeaves]; + aArea = pMan->pLutLib->pLutAreas[(int)pCut->nLeaves]; // go through the children for ( i = 0; i < pCut->nLeaves; i++ ) { @@ -425,7 +426,7 @@ float Fpga_CutDeref( Fpga_Man_t * pMan, Fpga_Node_t * pNode, Fpga_Cut_t * pCut, // Fpga_CutRemoveFanouts( pMan, pNode, pCut ); // start the area of this cut - aArea = pMan->pLutLib->pLutAreas[pCut->nLeaves]; + aArea = pMan->pLutLib->pLutAreas[(int)pCut->nLeaves]; // go through the children for ( i = 0; i < pCut->nLeaves; i++ ) { diff --git a/src/map/fpga/fpgaInt.h b/src/map/fpga/fpgaInt.h index 1e4ac1d49..a308cbb31 100644 --- a/src/map/fpga/fpgaInt.h +++ b/src/map/fpga/fpgaInt.h @@ -64,19 +64,19 @@ #define FPGA_INT_LARGE (10000000) // the macro to compute the signature -#define FPGA_SEQ_SIGN(p) (1 << (((unsigned)p)%31)); +#define FPGA_SEQ_SIGN(p) (1 << (((PORT_PTRUINT_T)p)%31)); // internal macros to work with cuts -#define Fpga_CutIsComplement(p) (((int)((unsigned long) (p) & 01))) -#define Fpga_CutRegular(p) ((Fpga_Cut_t *)((unsigned long)(p) & ~01)) -#define Fpga_CutNot(p) ((Fpga_Cut_t *)((unsigned long)(p) ^ 01)) -#define Fpga_CutNotCond(p,c) ((Fpga_Cut_t *)((unsigned long)(p) ^ (c))) +#define Fpga_CutIsComplement(p) (((int)((PORT_PTRUINT_T)(p) & 01))) +#define Fpga_CutRegular(p) ((Fpga_Cut_t *)((PORT_PTRUINT_T)(p) & ~01)) +#define Fpga_CutNot(p) ((Fpga_Cut_t *)((PORT_PTRUINT_T)(p) ^ 01)) +#define Fpga_CutNotCond(p,c) ((Fpga_Cut_t *)((PORT_PTRUINT_T)(p) ^ (c))) // the cut nodes -#define Fpga_SeqIsComplement( p ) (((int)((unsigned long) (p) & 01))) -#define Fpga_SeqRegular( p ) ((Fpga_Node_t *)((unsigned long)(p) & ~015)) -#define Fpga_SeqIndex( p ) ((((unsigned long)(p)) >> 1) & 07) -#define Fpga_SeqIndexCreate( p, Ind ) (((unsigned long)(p)) | (1 << (((unsigned)(Ind)) & 07))) +#define Fpga_SeqIsComplement( p ) (((int)((PORT_PTRUINT_T) (p) & 01))) +#define Fpga_SeqRegular( p ) ((Fpga_Node_t *)((PORT_PTRUINT_T)(p) & ~015)) +#define Fpga_SeqIndex( p ) ((((PORT_PTRUINT_T)(p)) >> 1) & 07) +#define Fpga_SeqIndexCreate( p, Ind ) (((PORT_PTRUINT_T)(p)) | (1 << (((PORT_PTRUINT_T)(Ind)) & 07))) // internal macros for referencing of nodes #define Fpga_NodeReadRef(p) ((Fpga_Regular(p))->nRefs) @@ -275,9 +275,9 @@ struct Fpga_NodeVecStruct_t_ pFanout = pFanout2, \ pFanout2 = Fpga_NodeReadNextFanout(pNode, pFanout) ) -static inline Fpga_FloatMoreThan( Fpga_Man_t * p, float Arg1, float Arg2 ) { return Arg1 > Arg2 + p->fEpsilon; } -static inline Fpga_FloatLessThan( Fpga_Man_t * p, float Arg1, float Arg2 ) { return Arg1 < Arg2 - p->fEpsilon; } -static inline Fpga_FloatEqual( Fpga_Man_t * p, float Arg1, float Arg2 ) { return Arg1 > Arg2 - p->fEpsilon && Arg1 < Arg2 + p->fEpsilon; } +static inline int Fpga_FloatMoreThan( Fpga_Man_t * p, float Arg1, float Arg2 ) { return Arg1 > Arg2 + p->fEpsilon; } +static inline int Fpga_FloatLessThan( Fpga_Man_t * p, float Arg1, float Arg2 ) { return Arg1 < Arg2 - p->fEpsilon; } +static inline int Fpga_FloatEqual( Fpga_Man_t * p, float Arg1, float Arg2 ) { return Arg1 > Arg2 - p->fEpsilon && Arg1 < Arg2 + p->fEpsilon; } //////////////////////////////////////////////////////////////////////// /// GLOBAL VARIABLES /// diff --git a/src/map/fpga/fpgaLib.c b/src/map/fpga/fpgaLib.c index 77fc3a6fb..b9615a8cd 100644 --- a/src/map/fpga/fpgaLib.c +++ b/src/map/fpga/fpgaLib.c @@ -91,7 +91,7 @@ Fpga_LutLib_t * Fpga_LutLibRead( char * FileName, int fVerbose ) // read delays k = 0; - while ( pToken = strtok( NULL, " \t\n" ) ) + while ( (pToken = strtok( NULL, " \t\n" )) ) p->pLutDelays[i][k++] = (float)atof(pToken); // check for out-of-bound @@ -141,7 +141,7 @@ Fpga_LutLib_t * Fpga_LutLibRead( char * FileName, int fVerbose ) { if ( p->pLutDelays[i][0] <= 0.0 ) printf( "Warning: LUT %d has delay %f. Pin delays should be non-negative numbers. Technology mapping may not work correctly.\n", - k, i, p->pLutDelays[i][0] ); + i, p->pLutDelays[i][0] ); } } diff --git a/src/map/fpga/fpgaMatch.c b/src/map/fpga/fpgaMatch.c index 73fa1258c..30448750c 100644 --- a/src/map/fpga/fpgaMatch.c +++ b/src/map/fpga/fpgaMatch.c @@ -153,10 +153,10 @@ clk = clock(); // (2) area recovery (subsequent traversals), area-flow first, delay as a tie-breaker if ( (fDelayOriented && (Fpga_FloatMoreThan(p, pNode->pCutBest->tArrival, pCut->tArrival) || - Fpga_FloatEqual(p, pNode->pCutBest->tArrival, pCut->tArrival) && Fpga_FloatMoreThan(p, pNode->pCutBest->aFlow, pCut->aFlow) )) || + (Fpga_FloatEqual(p, pNode->pCutBest->tArrival, pCut->tArrival) && Fpga_FloatMoreThan(p, pNode->pCutBest->aFlow, pCut->aFlow)) )) || (!fDelayOriented && (Fpga_FloatMoreThan(p, pNode->pCutBest->aFlow, pCut->aFlow) || - Fpga_FloatEqual(p, pNode->pCutBest->aFlow, pCut->aFlow) && Fpga_FloatMoreThan(p, pNode->pCutBest->tArrival, pCut->tArrival))) ) + (Fpga_FloatEqual(p, pNode->pCutBest->aFlow, pCut->aFlow) && Fpga_FloatMoreThan(p, pNode->pCutBest->tArrival, pCut->tArrival)))) ) { pNode->pCutBest = pCut; } @@ -301,7 +301,7 @@ clk = clock(); } // choose the best cut as follows: exact area first, delay as a tie-breaker if ( Fpga_FloatMoreThan(p, pNode->pCutBest->aFlow, pCut->aFlow) || - Fpga_FloatEqual(p, pNode->pCutBest->aFlow, pCut->aFlow) && Fpga_FloatMoreThan(p, pNode->pCutBest->tArrival, pCut->tArrival) ) + (Fpga_FloatEqual(p, pNode->pCutBest->aFlow, pCut->aFlow) && Fpga_FloatMoreThan(p, pNode->pCutBest->tArrival, pCut->tArrival)) ) { pNode->pCutBest = pCut; } @@ -386,7 +386,7 @@ int Fpga_MappingMatchesSwitch( Fpga_Man_t * p ) int Fpga_MatchNodeSwitch( Fpga_Man_t * p, Fpga_Node_t * pNode ) { Fpga_Cut_t * pCut, * pCutBestOld; - float aAreaCutBest; + float aAreaCutBest = FPGA_FLOAT_LARGE; int clk; // make sure that at least one cut other than the trivial is present if ( pNode->pCuts->pNext == NULL ) @@ -422,7 +422,7 @@ clk = clock(); } // choose the best cut as follows: exact area first, delay as a tie-breaker if ( Fpga_FloatMoreThan(p, pNode->pCutBest->aFlow, pCut->aFlow) || - Fpga_FloatEqual(p, pNode->pCutBest->aFlow, pCut->aFlow) && Fpga_FloatMoreThan(p, pNode->pCutBest->tArrival, pCut->tArrival) ) + (Fpga_FloatEqual(p, pNode->pCutBest->aFlow, pCut->aFlow) && Fpga_FloatMoreThan(p, pNode->pCutBest->tArrival, pCut->tArrival)) ) { pNode->pCutBest = pCut; } diff --git a/src/map/fpga/fpgaTime.c b/src/map/fpga/fpgaTime.c index 879cad4d1..d9bf79472 100644 --- a/src/map/fpga/fpgaTime.c +++ b/src/map/fpga/fpgaTime.c @@ -46,7 +46,7 @@ float Fpga_TimeCutComputeArrival( Fpga_Man_t * pMan, Fpga_Cut_t * pCut ) for ( i = 0; i < pCut->nLeaves; i++ ) if ( tArrival < pCut->ppLeaves[i]->pCutBest->tArrival ) tArrival = pCut->ppLeaves[i]->pCutBest->tArrival; - tArrival += pMan->pLutLib->pLutDelays[pCut->nLeaves][0]; + tArrival += pMan->pLutLib->pLutDelays[(int)pCut->nLeaves][0]; return tArrival; } @@ -216,7 +216,7 @@ void Fpga_TimePropagateRequired( Fpga_Man_t * p, Fpga_NodeVec_t * vNodes ) if ( !Fpga_NodeIsAnd(pNode) ) continue; // get the required time for children - fRequired = pNode->tRequired - p->pLutLib->pLutDelays[pNode->pCutBest->nLeaves][0]; + fRequired = pNode->tRequired - p->pLutLib->pLutDelays[(int)pNode->pCutBest->nLeaves][0]; // update the required time of the children for ( i = 0; i < pNode->pCutBest->nLeaves; i++ ) { diff --git a/src/map/fpga/fpgaTruth.c b/src/map/fpga/fpgaTruth.c index e3eb487fd..8ffb78192 100644 --- a/src/map/fpga/fpgaTruth.c +++ b/src/map/fpga/fpgaTruth.c @@ -44,7 +44,7 @@ DdNode * Fpga_TruthsCutBdd_rec( DdManager * dd, Fpga_Cut_t * pCut, Fpga_NodeVec_ assert( !Fpga_IsComplement(pCut) ); // if the cut is visited, return the result if ( pCut->uSign ) - return (DdNode *)pCut->uSign; + return (DdNode *)(PORT_PTRUINT_T)pCut->uSign; // compute the functions of the children bFunc0 = Fpga_TruthsCutBdd_rec( dd, Fpga_CutRegular(pCut->pOne), vVisited ); Cudd_Ref( bFunc0 ); bFunc0 = Cudd_NotCond( bFunc0, Fpga_CutIsComplement(pCut->pOne) ); @@ -56,7 +56,7 @@ DdNode * Fpga_TruthsCutBdd_rec( DdManager * dd, Fpga_Cut_t * pCut, Fpga_NodeVec_ Cudd_RecursiveDeref( dd, bFunc0 ); Cudd_RecursiveDeref( dd, bFunc1 ); assert( pCut->uSign == 0 ); - pCut->uSign = (unsigned)bFunc; + pCut->uSign = (unsigned)(PORT_PTRUINT_T)bFunc; // add this cut to the visited list Fpga_NodeVecPush( vVisited, (Fpga_Node_t *)pCut ); return bFunc; @@ -81,7 +81,7 @@ void * Fpga_TruthsCutBdd( void * dd, Fpga_Cut_t * pCut ) assert( pCut->nLeaves > 1 ); // set the leaf variables for ( i = 0; i < pCut->nLeaves; i++ ) - pCut->ppLeaves[i]->pCuts->uSign = (unsigned)Cudd_bddIthVar( dd, i ); + pCut->ppLeaves[i]->pCuts->uSign = (unsigned)(PORT_PTRUINT_T)Cudd_bddIthVar( dd, i ); // recursively compute the function vVisited = Fpga_NodeVecAlloc( 10 ); bFunc = Fpga_TruthsCutBdd_rec( dd, pCut, vVisited ); Cudd_Ref( bFunc ); @@ -91,7 +91,7 @@ void * Fpga_TruthsCutBdd( void * dd, Fpga_Cut_t * pCut ) for ( i = 0; i < vVisited->nSize; i++ ) { pCut = (Fpga_Cut_t *)vVisited->pArray[i]; - Cudd_RecursiveDeref( dd, (DdNode*)pCut->uSign ); + Cudd_RecursiveDeref( dd, (DdNode*)(PORT_PTRUINT_T)pCut->uSign ); pCut->uSign = 0; } // printf( "%d ", vVisited->nSize ); diff --git a/src/map/fpga/fpgaUtils.c b/src/map/fpga/fpgaUtils.c index b951fd8f7..77c2e2b0d 100644 --- a/src/map/fpga/fpgaUtils.c +++ b/src/map/fpga/fpgaUtils.c @@ -31,7 +31,6 @@ static void Fpga_MappingFindLatest( Fpga_Man_t * p, int * pNodes, int nNodesMax static void Fpga_DfsLim_rec( Fpga_Node_t * pNode, int Level, Fpga_NodeVec_t * vNodes ); static int Fpga_CollectNodeTfo_rec( Fpga_Node_t * pNode, Fpga_Node_t * pPivot, Fpga_NodeVec_t * vVisited, Fpga_NodeVec_t * vTfo ); static Fpga_NodeVec_t * Fpga_MappingOrderCosByLevel( Fpga_Man_t * pMan ); -static Fpga_Man_t * s_pMan = NULL; //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// @@ -182,7 +181,7 @@ float Fpga_MappingArea( Fpga_Man_t * pMan ) for ( i = 0; i < pMan->vMapping->nSize; i++ ) { pNode = pMan->vMapping->pArray[i]; - aTotal += pMan->pLutLib->pLutAreas[pNode->pCutBest->nLeaves]; + aTotal += pMan->pLutLib->pLutAreas[(int)pNode->pCutBest->nLeaves]; } return aTotal; } @@ -217,7 +216,7 @@ float Fpga_MappingArea_rec( Fpga_Man_t * pMan, Fpga_Node_t * pNode, Fpga_NodeVec // mark the node as visited pNode->fMark0 = 1; // add the node to the list - aArea += pMan->pLutLib->pLutAreas[pNode->pCutBest->nLeaves]; + aArea += pMan->pLutLib->pLutAreas[(int)pNode->pCutBest->nLeaves]; // add the node to the list Fpga_NodeVecPush( vNodes, pNode ); return aArea; @@ -276,7 +275,7 @@ float Fpga_MappingSetRefsAndArea_rec( Fpga_Man_t * pMan, Fpga_Node_t * pNode, Fp pNode->pData0 = (char *)ppStore[pNode->Level]; ppStore[pNode->Level] = pNode; // visit the transitive fanin of the selected cut - aArea = pMan->pLutLib->pLutAreas[pNode->pCutBest->nLeaves]; + aArea = pMan->pLutLib->pLutAreas[(int)pNode->pCutBest->nLeaves]; for ( i = 0; i < pNode->pCutBest->nLeaves; i++ ) aArea += Fpga_MappingSetRefsAndArea_rec( pMan, pNode->pCutBest->ppLeaves[i], ppStore ); return aArea; diff --git a/src/map/fpga/fpgaVec.c b/src/map/fpga/fpgaVec.c index 70a4a7ac6..79b6b43d1 100644 --- a/src/map/fpga/fpgaVec.c +++ b/src/map/fpga/fpgaVec.c @@ -370,8 +370,8 @@ void Fpga_NodeVecPushOrder( Fpga_NodeVec_t * vNodes, Fpga_Node_t * pNode, int fI { pNode1 = vNodes->pArray[i ]; pNode2 = vNodes->pArray[i-1]; - if ( fIncreasing && pNode1->pCutBest->tArrival >= pNode2->pCutBest->tArrival || - !fIncreasing && pNode1->pCutBest->tArrival <= pNode2->pCutBest->tArrival ) + if (( fIncreasing && pNode1->pCutBest->tArrival >= pNode2->pCutBest->tArrival) || + (!fIncreasing && pNode1->pCutBest->tArrival <= pNode2->pCutBest->tArrival) ) break; vNodes->pArray[i ] = pNode2; vNodes->pArray[i-1] = pNode1; diff --git a/src/map/if/if.h b/src/map/if/if.h index 8cf5c0e86..24046f066 100644 --- a/src/map/if/if.h +++ b/src/map/if/if.h @@ -326,7 +326,7 @@ static inline float If_CutLutArea( If_Man_t * p, If_Cut_t * pCut ) { r for ( i = 0; (i < (int)(pCut)->nLeaves) && ((pLeaf) = If_ManObj(p, (pCut)->pLeaves[i])); i++ ) #define If_CutForEachLeafReverse( p, pCut, pLeaf, i ) \ for ( i = (int)(pCut)->nLeaves - 1; (i >= 0) && ((pLeaf) = If_ManObj(p, (pCut)->pLeaves[i])); i-- ) -//#define If_CutForEachLeaf( p, pCut, pLeaf, i ) \ +//#define If_CutForEachLeaf( p, pCut, pLeaf, i ) \ \\prevent multiline comment // for ( i = 0; (i < (int)(pCut)->nLeaves) && ((pLeaf) = If_ManObj(p, p->pPars->fLiftLeaves? (pCut)->pLeaves[i] >> 8 : (pCut)->pLeaves[i])); i++ ) // iterator over the leaves of the sequential cut #define If_CutForEachLeafSeq( p, pCut, pLeaf, Shift, i ) \ diff --git a/src/map/if/ifLib.c b/src/map/if/ifLib.c index b3e6ad4c0..51630164e 100644 --- a/src/map/if/ifLib.c +++ b/src/map/if/ifLib.c @@ -80,7 +80,7 @@ If_Lib_t * If_LutLibRead( char * FileName ) // read delays k = 0; - while ( pToken = strtok( NULL, " \t\n" ) ) + while ( (pToken = strtok( NULL, " \t\n" )) ) p->pLutDelays[i][k++] = (float)atof(pToken); // check for out-of-bound @@ -124,7 +124,7 @@ If_Lib_t * If_LutLibRead( char * FileName ) { if ( p->pLutDelays[i][0] <= 0.0 ) printf( "Warning: LUT %d has delay %f. Pin delays should be non-negative numbers. Technology mapping may not work correctly.\n", - k, i, p->pLutDelays[i][0] ); + i, p->pLutDelays[i][0] ); } } diff --git a/src/map/if/ifMan.c b/src/map/if/ifMan.c index d1a17b6a1..015e3d310 100644 --- a/src/map/if/ifMan.c +++ b/src/map/if/ifMan.c @@ -320,7 +320,7 @@ void If_ManSetupCut( If_Man_t * p, If_Cut_t * pCut ) if ( p->pPars->fUsePerm ) pCut->pPerm = (char *)(pCut->pLeaves + p->pPars->nLutSize); if ( p->pPars->fTruth ) - pCut->pTruth = pCut->pLeaves + p->pPars->nLutSize + p->nPermWords; + pCut->pTruth = (unsigned *)pCut->pLeaves + p->pPars->nLutSize + p->nPermWords; } /**Function************************************************************* diff --git a/src/map/mapper/mapper.c b/src/map/mapper/mapper.c index b18b68c0e..370521009 100644 --- a/src/map/mapper/mapper.c +++ b/src/map/mapper/mapper.c @@ -132,7 +132,7 @@ int Map_CommandReadLibrary( Abc_Frame_t * pAbc, int argc, char **argv ) // if ( (pFile = fopen( FileName, "r" )) == NULL ) { fprintf( pErr, "Cannot open input file \"%s\". ", FileName ); - if ( FileName = Extra_FileGetSimilarName( FileName, ".genlib", ".lib", ".gen", ".g", NULL ) ) + if (( FileName = Extra_FileGetSimilarName( FileName, ".genlib", ".lib", ".gen", ".g", NULL )) ) fprintf( pErr, "Did you mean \"%s\"?", FileName ); fprintf( pErr, "\n" ); return 1; diff --git a/src/map/mapper/mapperCanon.c b/src/map/mapper/mapperCanon.c index 203c91429..4f93ad3b6 100644 --- a/src/map/mapper/mapperCanon.c +++ b/src/map/mapper/mapperCanon.c @@ -76,7 +76,7 @@ int Map_CanonComputeSlow( unsigned uTruths[][2], int nVarsMax, int nVarsReal, un for ( m = 0; m < nMints; m++ ) { Map_CanonComputePhase6( uTruths, nVarsMax, uTruth, m, uTruthPerm ); - if ( uTruthRes[1] > uTruthPerm[1] || uTruthRes[1] == uTruthPerm[1] && uTruthRes[0] > uTruthPerm[0] ) + if ( uTruthRes[1] > uTruthPerm[1] || (uTruthRes[1] == uTruthPerm[1] && uTruthRes[0] > uTruthPerm[0]) ) { uTruthRes[0] = uTruthPerm[0]; uTruthRes[1] = uTruthPerm[1]; @@ -170,7 +170,8 @@ void Map_CanonComputePhase6( unsigned uTruths[][2], int nVars, unsigned uTruth[] int Map_CanonComputeFast( Map_Man_t * p, int nVarsMax, int nVarsReal, unsigned uTruth[], unsigned char * puPhases, unsigned uTruthRes[] ) { unsigned uTruth0, uTruth1; - unsigned uCanon0, uCanon1, uCanonBest, uPhaseBest; + unsigned uCanon0, uCanon1, uCanonBest; + unsigned uPhaseBest = 16; // Suppress "might be used uninitialized" (asserts require < 16) int i, Limit; if ( nVarsMax == 6 ) diff --git a/src/map/mapper/mapperCreate.c b/src/map/mapper/mapperCreate.c index 157d467b7..0a971542b 100644 --- a/src/map/mapper/mapperCreate.c +++ b/src/map/mapper/mapperCreate.c @@ -27,7 +27,7 @@ static void Map_TableResize( Map_Man_t * p ); static Map_Node_t * Map_TableLookup( Map_Man_t * p, Map_Node_t * p1, Map_Node_t * p2 ); // hash key for the structural hash table -static inline unsigned Map_HashKey2( Map_Node_t * p0, Map_Node_t * p1, int TableSize ) { return ((unsigned)(p0) + (unsigned)(p1) * 12582917) % TableSize; } +static inline unsigned Map_HashKey2( Map_Node_t * p0, Map_Node_t * p1, int TableSize ) { return (unsigned)(((PORT_PTRUINT_T)(p0) + (PORT_PTRUINT_T)(p1) * 12582917) % TableSize); } //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// diff --git a/src/map/mapper/mapperCut.c b/src/map/mapper/mapperCut.c index b05e9d0c9..46405547f 100644 --- a/src/map/mapper/mapperCut.c +++ b/src/map/mapper/mapperCut.c @@ -355,8 +355,8 @@ Map_Cut_t * Map_CutMergeLists( Map_Man_t * p, Map_CutTable_t * pTable, // if ( p->nVarsMax == 5 ) // pCut->uTruth = Map_CutComputeTruth( p, pCut, pTemp1, pTemp2, fComp1, fComp2 ); // add it to the corresponding list - pCut->pNext = pLists[pCut->nLeaves]; - pLists[pCut->nLeaves] = pCut; + pCut->pNext = pLists[(int)pCut->nLeaves]; + pLists[(int)pCut->nLeaves] = pCut; // count this cut and quit if limit is reached Counter++; if ( Counter == MAP_CUTS_MAX_COMPUTE ) @@ -389,8 +389,8 @@ Map_Cut_t * Map_CutMergeLists( Map_Man_t * p, Map_CutTable_t * pTable, // if ( p->nVarsMax == 5 ) // pCut->uTruth = Map_CutComputeTruth( p, pCut, pTemp1, pTemp2, fComp1, fComp2 ); // add it to the corresponding list - pCut->pNext = pLists[pCut->nLeaves]; - pLists[pCut->nLeaves] = pCut; + pCut->pNext = pLists[(int)pCut->nLeaves]; + pLists[(int)pCut->nLeaves] = pCut; // count this cut and quit if limit is reached Counter++; if ( Counter == MAP_CUTS_MAX_COMPUTE ) @@ -426,8 +426,8 @@ Map_Cut_t * Map_CutMergeLists( Map_Man_t * p, Map_CutTable_t * pTable, // if ( p->nVarsMax == 5 ) // pCut->uTruth = Map_CutComputeTruth( p, pCut, pTemp1, pTemp2, fComp1, fComp2 ); // add it to the corresponding list - pCut->pNext = pLists[pCut->nLeaves]; - pLists[pCut->nLeaves] = pCut; + pCut->pNext = pLists[(int)pCut->nLeaves]; + pLists[(int)pCut->nLeaves] = pCut; // count this cut and quit if limit is reached Counter++; if ( Counter == MAP_CUTS_MAX_COMPUTE ) @@ -493,8 +493,8 @@ Map_Cut_t * Map_CutMergeLists2( Map_Man_t * p, Map_CutTable_t * pTable, pCut->pOne = Map_CutNotCond( pTemp1, fComp1 ); pCut->pTwo = Map_CutNotCond( pTemp2, fComp2 ); // add it to the corresponding list - pCut->pNext = pLists[pCut->nLeaves]; - pLists[pCut->nLeaves] = pCut; + pCut->pNext = pLists[(int)pCut->nLeaves]; + pLists[(int)pCut->nLeaves] = pCut; // count this cut and quit if limit is reached Counter++; if ( Counter == MAP_CUTS_MAX_COMPUTE ) diff --git a/src/map/mapper/mapperCutUtils.c b/src/map/mapper/mapperCutUtils.c index 4450cb04c..42bdd103e 100644 --- a/src/map/mapper/mapperCutUtils.c +++ b/src/map/mapper/mapperCutUtils.c @@ -161,7 +161,8 @@ int Map_NodeGetLeafPhase( Map_Node_t * pNode, int fPhase, int iLeaf ) ***********************************************************************/ Map_Cut_t * Map_CutListAppend( Map_Cut_t * pSetAll, Map_Cut_t * pSets ) { - Map_Cut_t * pPrev, * pTemp; + Map_Cut_t * pPrev = NULL; // Suppress "might be used uninitialized" + Map_Cut_t * pTemp; if ( pSetAll == NULL ) return pSets; if ( pSets == NULL ) diff --git a/src/map/mapper/mapperLib.c b/src/map/mapper/mapperLib.c index d916487e6..9c47ed03b 100644 --- a/src/map/mapper/mapperLib.c +++ b/src/map/mapper/mapperLib.c @@ -15,6 +15,11 @@ Revision [$Id: mapperLib.c,v 1.6 2005/01/23 06:59:44 alanmi Exp $] ***********************************************************************/ +#define _BSD_SOURCE + +#ifndef WIN32 +#include +#endif #include "mapperInt.h" diff --git a/src/map/mapper/mapperMatch.c b/src/map/mapper/mapperMatch.c index bfa726010..74b83f750 100644 --- a/src/map/mapper/mapperMatch.c +++ b/src/map/mapper/mapperMatch.c @@ -137,7 +137,8 @@ int Map_MatchNodePhase( Map_Man_t * p, Map_Node_t * pNode, int fPhase ) { Map_Match_t MatchBest, * pMatch; Map_Cut_t * pCut, * pCutBest; - float Area1, Area2, fWorstLimit; + float Area1 = 0.0; // Suppress "might be used uninitialized + float Area2, fWorstLimit; // skip the cuts that have been unassigned during area recovery pCutBest = pNode->pCutBest[fPhase]; diff --git a/src/map/mapper/mapperSuper.c b/src/map/mapper/mapperSuper.c index ce6a780f3..92f73ecb1 100644 --- a/src/map/mapper/mapperSuper.c +++ b/src/map/mapper/mapperSuper.c @@ -80,7 +80,8 @@ int Map_LibraryReadFile( Map_SuperLib_t * pLib, FILE * pFile ) char pBuffer[2000]; FILE * pFileGen; Map_Super_t * pGate; - char * pTemp, * pLibName; + char * pTemp = NULL; // Suppress "might be used uninitialized" + char * pLibName; int nCounter, nGatesTotal; unsigned uCanon[2]; @@ -400,7 +401,7 @@ void Map_LibraryPrintSupergate( Map_Super_t * pGate ) printf( "%5d : ", pGate->nUsed ); printf( "%5d ", pGate->Num ); printf( "A = %5.2f ", pGate->Area ); - printf( "D = %5.2f ", pGate->tDelayMax ); + printf( "D = %5.2f/%5.2f/%5.2f ", pGate->tDelayMax.Rise, pGate->tDelayMax.Fall, pGate->tDelayMax.Worst ); printf( "%s", pGate->pFormula ); printf( "\n" ); } diff --git a/src/map/mapper/mapperTable.c b/src/map/mapper/mapperTable.c index d0cb7a01c..3feba3526 100644 --- a/src/map/mapper/mapperTable.c +++ b/src/map/mapper/mapperTable.c @@ -231,7 +231,7 @@ void Map_SuperTableResize( Map_HashTable_t * p ) { Map_HashEntry_t ** pBinsNew; Map_HashEntry_t * pEnt, * pEnt2; - int nBinsNew, Counter, i, clk = clock(); + int nBinsNew, Counter, i; unsigned Key; // get the new table size nBinsNew = Cudd_Prime(2 * p->nBins); diff --git a/src/map/mapper/mapperTree.c b/src/map/mapper/mapperTree.c index ef66082d5..76c1e5208 100644 --- a/src/map/mapper/mapperTree.c +++ b/src/map/mapper/mapperTree.c @@ -34,7 +34,7 @@ static int Map_LibraryGetMaxSuperPi_rec( Map_Super_t * pGate ); static unsigned Map_LibraryGetGateSupp_rec( Map_Super_t * pGate ); // fanout limits -extern const int s_MapFanoutLimits[10] = { 1/*0*/, 10/*1*/, 5/*2*/, 2/*3*/, 1/*4*/, 1/*5*/, 1/*6*/ }; +static const int s_MapFanoutLimits[10] = { 1/*0*/, 10/*1*/, 5/*2*/, 2/*3*/, 1/*4*/, 1/*5*/, 1/*6*/ }; //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// diff --git a/src/map/mapper/mapperTruth.c b/src/map/mapper/mapperTruth.c index 388b6dd38..dcc8c1d37 100644 --- a/src/map/mapper/mapperTruth.c +++ b/src/map/mapper/mapperTruth.c @@ -194,7 +194,7 @@ void Map_TruthsCut( Map_Man_t * p, Map_Cut_t * pCut ) void Map_TruthsCutOne( Map_Man_t * p, Map_Cut_t * pCut, unsigned uTruth[] ) { unsigned uTruth1[2], uTruth2[2]; - Map_Cut_t * pTemp; + Map_Cut_t * pTemp = NULL; // Suppress "might be used uninitialized" int i; // mark the cut leaves for ( i = 0; i < pCut->nLeaves; i++ ) diff --git a/src/map/mapper/mapperUtils.c b/src/map/mapper/mapperUtils.c index 11a3a6831..b1f425a37 100644 --- a/src/map/mapper/mapperUtils.c +++ b/src/map/mapper/mapperUtils.c @@ -37,7 +37,6 @@ static unsigned Map_MappingExpandTruth_rec( unsigned uTruth, int nVars ); static void Map_MappingGetChoiceLevels( Map_Man_t * pMan, Map_Node_t * p1, Map_Node_t * p2, int * pMin, int * pMax ); static float Map_MappingGetChoiceVolumes( Map_Man_t * pMan, Map_Node_t * p1, Map_Node_t * p2 ); static int Map_MappingCountUsedNodes( Map_Man_t * pMan, int fChoices ); -static Map_Man_t * s_pMan = NULL; //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// diff --git a/src/map/mio/mio.c b/src/map/mio/mio.c index 10a5af9d9..e0000c388 100644 --- a/src/map/mio/mio.c +++ b/src/map/mio/mio.c @@ -16,6 +16,12 @@ ***********************************************************************/ +#define _BSD_SOURCE + +#ifndef WIN32 +#include +#endif + #include "abc.h" #include "mvc.h" #include "mainInt.h" diff --git a/src/map/mio/mioRead.c b/src/map/mio/mioRead.c index dc6650502..5b92d3e19 100644 --- a/src/map/mio/mioRead.c +++ b/src/map/mio/mioRead.c @@ -16,6 +16,7 @@ ***********************************************************************/ +#include #include "mioInt.h" //////////////////////////////////////////////////////////////////////// @@ -34,10 +35,6 @@ static char * chomp( char *s ); static void Mio_LibraryDetectSpecialGates( Mio_Library_t * pLib ); static void Io_ReadFileRemoveComments( char * pBuffer, int * pnDots, int * pnLines ); -#ifdef WIN32 -extern int isspace( int c ); // to silence the warning in VS -#endif - /**Function************************************************************* Synopsis [Read the genlib type of library.] diff --git a/src/map/super/superAnd.c b/src/map/super/superAnd.c index 26235a0ec..8e8319520 100644 --- a/src/map/super/superAnd.c +++ b/src/map/super/superAnd.c @@ -306,7 +306,7 @@ Super2_Lib_t * Super2_LibFirst( Super2_Man_t * pMan, int nInputs ) { pLib->pGates[v+1] = (Super2_Gate_t *)Extra_MmFixedEntryFetch( pMan->pMem ); memset( pLib->pGates[v+1], 0, sizeof(Super2_Gate_t) ); - pLib->pGates[v+1]->pTwo = (Super2_Gate_t *)v; + pLib->pGates[v+1]->pTwo = (Super2_Gate_t *)(PORT_PTRUINT_T)v; } // set up their truth tables @@ -347,7 +347,7 @@ Super2_Lib_t * Super2_LibCompute( Super2_Man_t * pMan, Super2_Lib_t * pLib ) { uTruthR = ((pGate1->uTruth & pLibNew->uMaskBit)? Mask & ~pGate1->uTruth : pGate1->uTruth); - if ( stmm_lookup( pMan->tTable, (char *)uTruthR, (char **)&pGate2 ) ) + if ( stmm_lookup( pMan->tTable, (char *)(PORT_PTRUINT_T)uTruthR, (char **)&pGate2 ) ) { printf( "New gate:\n" ); Super2_LibWriteGate( stdout, pLibNew, pGate1 ); @@ -355,7 +355,7 @@ Super2_Lib_t * Super2_LibCompute( Super2_Man_t * pMan, Super2_Lib_t * pLib ) Super2_LibWriteGate( stdout, pLibNew, pGate2 ); assert( 0 ); } - stmm_insert( pMan->tTable, (char *)uTruthR, (char *)pGate1 ); + stmm_insert( pMan->tTable, (char *)(PORT_PTRUINT_T)uTruthR, (char *)(PORT_PTRUINT_T)pGate1 ); } @@ -382,7 +382,7 @@ Super2_Lib_t * Super2_LibCompute( Super2_Man_t * pMan, Super2_Lib_t * pLib ) uTruth = uTruth1 & uTruth2; uTruthR = ((uTruth & pLibNew->uMaskBit)? Mask & ~uTruth : uTruth); - if ( !stmm_find_or_add( pMan->tTable, (char *)uTruthR, (char ***)&ppGate ) ) + if ( !stmm_find_or_add( pMan->tTable, (char *)(PORT_PTRUINT_T)uTruthR, (char ***)&ppGate ) ) { pGateNew = (Super2_Gate_t *)Extra_MmFixedEntryFetch( pMan->pMem ); pGateNew->pOne = pGate1; @@ -396,7 +396,7 @@ Super2_Lib_t * Super2_LibCompute( Super2_Man_t * pMan, Super2_Lib_t * pLib ) uTruth = uTruth1c & uTruth2; uTruthR = ((uTruth & pLibNew->uMaskBit)? Mask & ~uTruth : uTruth); - if ( !stmm_find_or_add( pMan->tTable, (char *)uTruthR, (char ***)&ppGate ) ) + if ( !stmm_find_or_add( pMan->tTable, (char *)(PORT_PTRUINT_T)uTruthR, (char ***)&ppGate ) ) { pGateNew = (Super2_Gate_t *)Extra_MmFixedEntryFetch( pMan->pMem ); pGateNew->pOne = Super2_Not(pGate1); @@ -410,7 +410,7 @@ Super2_Lib_t * Super2_LibCompute( Super2_Man_t * pMan, Super2_Lib_t * pLib ) uTruth = uTruth1 & uTruth2c; uTruthR = ((uTruth & pLibNew->uMaskBit)? Mask & ~uTruth : uTruth); - if ( !stmm_find_or_add( pMan->tTable, (char *)uTruthR, (char ***)&ppGate ) ) + if ( !stmm_find_or_add( pMan->tTable, (char *)(PORT_PTRUINT_T)uTruthR, (char ***)&ppGate ) ) { pGateNew = (Super2_Gate_t *)Extra_MmFixedEntryFetch( pMan->pMem ); pGateNew->pOne = pGate1; @@ -424,7 +424,7 @@ Super2_Lib_t * Super2_LibCompute( Super2_Man_t * pMan, Super2_Lib_t * pLib ) uTruth = uTruth1c & uTruth2c; uTruthR = ((uTruth & pLibNew->uMaskBit)? Mask & ~uTruth : uTruth); - if ( !stmm_find_or_add( pMan->tTable, (char *)uTruthR, (char ***)&ppGate ) ) + if ( !stmm_find_or_add( pMan->tTable, (char *)(PORT_PTRUINT_T)uTruthR, (char ***)&ppGate ) ) { pGateNew = (Super2_Gate_t *)Extra_MmFixedEntryFetch( pMan->pMem ); pGateNew->pOne = Super2_Not(pGate1); @@ -600,7 +600,7 @@ char * Super2_LibWriteGate_rec( Super2_Gate_t * pGate, int fInv, int Level ) } else { - pBuffer1[0] = (fInv? 'A' + ((int)pGate->pTwo): 'a' + ((int)pGate->pTwo)); + pBuffer1[0] = (fInv? 'A' + ((int)(PORT_PTRUINT_T)pGate->pTwo): 'a' + ((int)(PORT_PTRUINT_T)pGate->pTwo)); pBuffer1[1] = 0; } return pBuffer1; diff --git a/src/map/super/superGate.c b/src/map/super/superGate.c index 91a1e5136..915ff86d8 100644 --- a/src/map/super/superGate.c +++ b/src/map/super/superGate.c @@ -295,7 +295,8 @@ Super_Man_t * Super_Compute( Super_Man_t * pMan, Mio_Gate_t ** ppGates, int nGat { Super_Gate_t * pSupers[6], * pGate0, * pGate1, * pGate2, * pGate3, * pGate4, * pGate5, * pGateNew; float tPinDelaysRes[6], * ptPinDelays[6], tPinDelayMax, tDelayMio; - float Area, Area0, Area1, Area2, Area3, Area4, AreaMio; + float Area = 0.0; // Suppress "might be used uninitialized" + float Area0, Area1, Area2, Area3, Area4, AreaMio; unsigned uTruth[2], uTruths[6][2]; int i0, i1, i2, i3, i4, i5; Super_Gate_t ** ppGatesLimit; @@ -731,7 +732,7 @@ void Super_AddGateToTable( Super_Man_t * pMan, Super_Gate_t * pGate ) unsigned Key; // Key = pGate->uTruth[0] + 2003 * pGate->uTruth[1]; Key = pGate->uTruth[0] ^ pGate->uTruth[1]; - if ( !stmm_find_or_add( pMan->tTable, (char *)Key, (char ***)&ppList ) ) + if ( !stmm_find_or_add( pMan->tTable, (char *)(PORT_PTRUINT_T)Key, (char ***)&ppList ) ) *ppList = NULL; pGate->pNext = *ppList; *ppList = pGate; @@ -772,7 +773,7 @@ bool Super_CompareGates( Super_Man_t * pMan, unsigned uTruth[], float Area, floa // get hold of the place where the entry is stored // Key = uTruth[0] + 2003 * uTruth[1]; Key = uTruth[0] ^ uTruth[1]; - if ( !stmm_find( pMan->tTable, (char *)Key, (char ***)&ppList ) ) + if ( !stmm_find( pMan->tTable, (char *)(PORT_PTRUINT_T)Key, (char ***)&ppList ) ) return 1; // the entry with this truth table is found pPrev = NULL; diff --git a/src/misc/bzlib/bzlib.h b/src/misc/bzlib/bzlib.h index 798f248c8..b1f892b08 100644 --- a/src/misc/bzlib/bzlib.h +++ b/src/misc/bzlib/bzlib.h @@ -18,10 +18,11 @@ in the file LICENSE. ------------------------------------------------------------------ */ -//#define O_BINARY 0 +#ifdef _WIN32 #ifdef __STDC__ #undef __STDC__ #endif +#endif #ifndef _BZLIB_H #define _BZLIB_H diff --git a/src/misc/bzlib/manual.pdf b/src/misc/bzlib/manual.pdf deleted file mode 100644 index f043e164ae04d974e992a25100fd46c348478478..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 288134 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 aV9~j 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≈Z{nnzLNJMfs7?X3y}T5@O7dJa>L`t( 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 0; i--) - if (val = full[i] & ~ (p[i] | cof[i])) { + if ((val = full[i] & ~ (p[i] | cof[i]))) { cnt = count + ((i-1) << LOGBPI); #if BPI == 32 if (val & 0xFF000000) { @@ -230,6 +230,7 @@ IN pcube *T; best = var, mostactive = active, mostzero = cdata.var_zeros[best], mostbalanced = maxactive; else if (active == mostactive) + { /* secondary condition is to maximize the number zeros */ /* for binary variables, this is the same as minimum # of 2's */ if (cdata.var_zeros[var] > mostzero) @@ -240,6 +241,7 @@ IN pcube *T; /* for binary vars, this means roughly equal # 0's and 1's */ if (maxactive < mostbalanced) best = var, mostbalanced = maxactive; + } cdata.parts_active[var] = active; cdata.is_unate[var] = (active == 1); @@ -358,7 +360,7 @@ pcube *A1; return A; } -simplify_cubelist(T) +void simplify_cubelist(T) pcube *T; { register pcube *Tdest; diff --git a/src/misc/espresso/contain.c b/src/misc/espresso/contain.c index 180dceb6b..710c4894f 100644 --- a/src/misc/espresso/contain.c +++ b/src/misc/espresso/contain.c @@ -211,7 +211,9 @@ IN int (*compare)(); int rm_contain(A1) INOUT pset *A1; /* updated in place */ { - register pset *pa, *pb, *pcheck, a, b; + register pset *pa, *pb; + register pset *pcheck = NULL; // Suppress "might be used uninitialized" + register pset a, b; pset *pdest = A1; int last_size = -1; @@ -239,7 +241,9 @@ INOUT pset *A1; /* updated in place */ int rm_rev_contain(A1) INOUT pset *A1; /* updated in place */ { - register pset *pa, *pb, *pcheck, a, b; + register pset *pa, *pb; + register pset *pcheck = NULL; // Suppress "might be used uninitialized" + register pset a, b; pset *pdest = A1; int last_size = -1; diff --git a/src/misc/espresso/cvrin.c b/src/misc/espresso/cvrin.c index 7790b38b3..d33db46a3 100644 --- a/src/misc/espresso/cvrin.c +++ b/src/misc/espresso/cvrin.c @@ -12,6 +12,7 @@ purpose: cube and cover input routines */ +#include #include "espresso.h" static bool line_length_error; @@ -658,7 +659,7 @@ pPLA new_PLA() } -PLA_labels(PLA) +void PLA_labels(PLA) pPLA PLA; { int i; diff --git a/src/misc/espresso/cvrm.c b/src/misc/espresso/cvrm.c index 7d42d6e36..f55178e8d 100644 --- a/src/misc/espresso/cvrm.c +++ b/src/misc/espresso/cvrm.c @@ -357,7 +357,7 @@ int i; * * Each function returns TRUE if process is to continue */ -foreach_output_function(PLA, func, func1) +void foreach_output_function(PLA, func, func1) pPLA PLA; int (*func)(); int (*func1)(); diff --git a/src/misc/espresso/cvrout.c b/src/misc/espresso/cvrout.c index 4bd1c53b7..60b9d9e81 100644 --- a/src/misc/espresso/cvrout.c +++ b/src/misc/espresso/cvrout.c @@ -428,7 +428,7 @@ pcover T; } -int makeup_labels(PLA) +void makeup_labels(PLA) pPLA PLA; { int var, i, ind; @@ -453,7 +453,7 @@ pPLA PLA; } -kiss_output(fp, PLA) +void kiss_output(fp, PLA) FILE *fp; pPLA PLA; { @@ -468,7 +468,7 @@ pPLA PLA; } -kiss_print_cube(fp, PLA, p, out_string) +void kiss_print_cube(fp, PLA, p, out_string) FILE *fp; pPLA PLA; pcube p; @@ -515,7 +515,7 @@ char *out_string; putc('\n', fp); } -output_symbolic_constraints(fp, PLA, output_symbolic) +void output_symbolic_constraints(fp, PLA, output_symbolic) FILE *fp; pPLA PLA; int output_symbolic; diff --git a/src/misc/espresso/equiv.c b/src/misc/espresso/equiv.c index ba898a70d..f6495f1f6 100644 --- a/src/misc/espresso/equiv.c +++ b/src/misc/espresso/equiv.c @@ -10,7 +10,7 @@ #include "espresso.h" -find_equiv_outputs(PLA) +void find_equiv_outputs(PLA) pPLA PLA; { int i, j, ipart, jpart, some_equiv; diff --git a/src/misc/espresso/espresso.h b/src/misc/espresso/espresso.h index 1c7a86469..3ca331acb 100644 --- a/src/misc/espresso/espresso.h +++ b/src/misc/espresso/espresso.h @@ -546,7 +546,7 @@ extern struct cdata_struct cdata, temp_cdata_save; /* cubestr.c */ extern void restore_cube_struct(); /* cubestr.c */ extern void save_cube_struct(); /* cubestr.c */ extern void setdown_cube(); -/* cvrin.c */ extern PLA_labels(); +/* cvrin.c */ extern void PLA_labels(); /* cvrin.c */ extern char *get_word(); /* cvrin.c */ extern int label_index(); /* cvrin.c */ extern int read_pla(); @@ -557,7 +557,7 @@ extern struct cdata_struct cdata, temp_cdata_save; /* cvrin.c */ extern void parse_pla(); /* cvrin.c */ extern void read_cube(); /* cvrin.c */ extern void skip_line(); -/* cvrm.c */ extern foreach_output_function(); +/* cvrm.c */ extern void foreach_output_function(); /* cvrm.c */ extern int cubelist_partition(); /* cvrm.c */ extern int so_both_do_espresso(); /* cvrm.c */ extern int so_both_do_exact(); @@ -590,10 +590,10 @@ extern struct cdata_struct cdata, temp_cdata_save; /* cvrout.c */ extern char *pc1(); /* cvrout.c */ extern char *pc2(); /* cvrout.c */ extern char *pc3(); -/* cvrout.c */ extern int makeup_labels(); -/* cvrout.c */ extern kiss_output(); -/* cvrout.c */ extern kiss_print_cube(); -/* cvrout.c */ extern output_symbolic_constraints(); +/* cvrout.c */ extern void makeup_labels(); +/* cvrout.c */ extern void kiss_output(); +/* cvrout.c */ extern void kiss_print_cube(); +/* cvrout.c */ extern void output_symbolic_constraints(); /* cvrout.c */ extern void cprint(); /* cvrout.c */ extern void debug1_print(); /* cvrout.c */ extern void debug_print(); @@ -606,7 +606,7 @@ extern struct cdata_struct cdata, temp_cdata_save; /* cvrout.c */ extern void print_cube(); /* cvrout.c */ extern void print_expanded_cube(); /* cvrout.c */ extern void sf_debug_print(); -/* equiv.c */ extern find_equiv_outputs(); +/* equiv.c */ extern void find_equiv_outputs(); /* equiv.c */ extern int check_equiv(); /* espresso.c */ extern pcover espresso(); /* essen.c */ extern bool essen_cube(); @@ -633,14 +633,14 @@ extern struct cdata_struct cdata, temp_cdata_save; /* gasp.c */ extern pcover super_gasp(); /* gasp.c */ extern void expand1_gasp(); /* getopt.c */ extern int util_getopt(); -/* hack.c */ extern find_dc_inputs(); -/* hack.c */ extern find_inputs(); -/* hack.c */ extern form_bitvector(); -/* hack.c */ extern map_dcset(); -/* hack.c */ extern map_output_symbolic(); -/* hack.c */ extern map_symbolic(); +/* hack.c */ extern void find_dc_inputs(); +/* hack.c */ extern void find_inputs(); +/* hack.c */ extern void form_bitvector(); +/* hack.c */ extern void map_dcset(); +/* hack.c */ extern void map_output_symbolic(); +/* hack.c */ extern void map_symbolic(); /* hack.c */ extern pcover map_symbolic_cover(); -/* hack.c */ extern symbolic_hack_labels(); +/* hack.c */ extern void symbolic_hack_labels(); /* irred.c */ extern bool cube_is_covered(); /* irred.c */ extern bool taut_special_cases(); /* irred.c */ extern bool tautology(); @@ -651,7 +651,7 @@ extern struct cdata_struct cdata, temp_cdata_save; /* map.c */ extern pset minterms(); /* map.c */ extern void explode(); /* map.c */ extern void map(); -/* opo.c */ extern output_phase_setup(); +/* opo.c */ extern void output_phase_setup(); /* opo.c */ extern pPLA set_phase(); /* opo.c */ extern pcover opo(); /* opo.c */ extern pcube find_phase(); @@ -662,19 +662,19 @@ extern struct cdata_struct cdata, temp_cdata_save; /* opo.c */ extern void opoall(); /* opo.c */ extern void phase_assignment(); /* opo.c */ extern void repeated_phase_assignment(); -/* pair.c */ extern generate_all_pairs(); +/* pair.c */ extern void generate_all_pairs(); /* pair.c */ extern int **find_pairing_cost(); -/* pair.c */ extern int find_best_cost(); +/* pair.c */ extern void find_best_cost(); /* pair.c */ extern int greedy_best_cost(); -/* pair.c */ extern int minimize_pair(); -/* pair.c */ extern int pair_free(); -/* pair.c */ extern pair_all(); +/* pair.c */ extern void minimize_pair(); +/* pair.c */ extern void pair_free(); +/* pair.c */ extern void pair_all(); /* pair.c */ extern pcover delvar(); /* pair.c */ extern pcover pairvar(); /* pair.c */ extern ppair pair_best_cost(); /* pair.c */ extern ppair pair_new(); /* pair.c */ extern ppair pair_save(); -/* pair.c */ extern print_pair(); +/* pair.c */ extern void print_pair(); /* pair.c */ extern void find_optimal_pairing(); /* pair.c */ extern void set_pair(); /* pair.c */ extern void set_pair1(); @@ -764,10 +764,6 @@ extern struct cdata_struct cdata, temp_cdata_save; /* sminterf.c */pset do_sm_minimum_cover(); /* sparse.c */ extern pcover make_sparse(); /* sparse.c */ extern pcover mv_reduce(); -#if !defined(__osf__) && !defined(__STDC__) && !defined(__hpux) -/* ucbqsort.c */ extern qsort(); -#endif -/* ucbqsort.c */ extern qst(); /* unate.c */ extern pcover find_all_minimal_covers_petrick(); /* unate.c */ extern pcover map_cover_to_unate(); /* unate.c */ extern pcover map_unate_to_cover(); @@ -776,7 +772,7 @@ extern struct cdata_struct cdata, temp_cdata_save; /* unate.c */ extern pset_family unate_compl(); /* unate.c */ extern pset_family unate_complement(); /* unate.c */ extern pset_family unate_intersect(); -/* verify.c */ extern PLA_permute(); +/* verify.c */ extern void PLA_permute(); /* verify.c */ extern bool PLA_verify(); /* verify.c */ extern bool check_consistency(); /* verify.c */ extern bool verify(); diff --git a/src/misc/espresso/expand.c b/src/misc/espresso/expand.c index 2765d71c0..6b41a7863 100644 --- a/src/misc/espresso/expand.c +++ b/src/misc/espresso/expand.c @@ -219,8 +219,8 @@ pcube RAISE, FREESET; if ((dist = cdist01(p, r)) > 1) goto exit_if; #else {register int w,last;register unsigned int x;dist=0;if((last=cube.inword)!=-1) -{x=p[last]&r[last];if(x=~(x|x>>1)&cube.inmask)if((dist=count_ones(x))>1)goto -exit_if;for(w=1;w>1)&DISJOINT)if(dist==1||( +{x=p[last]&r[last];if((x=~(x|x>>1)&cube.inmask))if((dist=count_ones(x))>1)goto +exit_if;for(w=1;w>1)&DISJOINT))if(dist==1||( dist+=count_ones(x))>1)goto exit_if;}}}{register int w,var,last;register pcube mask;for(var=cube.num_binary_vars;var 1) goto exit_if; #else {register int w,last;register unsigned int x;dist=0;if((last=cube.inword)!=-1) -{x=p[last]&r[last];if(x=~(x|x>>1)&cube.inmask)if((dist=count_ones(x))>1)goto -exit_if;for(w=1;w>1)&DISJOINT)if(dist==1||( +{x=p[last]&r[last];if((x=~(x|x>>1)&cube.inmask))if((dist=count_ones(x))>1)goto +exit_if;for(w=1;w>1)&DISJOINT))if(dist==1||( dist+=count_ones(x))>1)goto exit_if;}}}{register int w,var,last;register pcube mask;for(var=cube.num_binary_vars;varD = sf_delc(PLA->D, 2*var, 2*var+1); } -map_output_symbolic(PLA) +void map_output_symbolic(PLA) pPLA PLA; { pset_family newF, newD; @@ -187,7 +187,7 @@ pPLA PLA; } -find_inputs(A, PLA, list, base, value, newF, newD) +void find_inputs(A, PLA, list, base, value, newF, newD) pcover A; pPLA PLA; symbolic_list_t *list; @@ -282,7 +282,7 @@ pcover *newF, *newD; } #endif -map_symbolic(PLA) +void map_symbolic(PLA) pPLA PLA; { symbolic_t *p1; @@ -377,7 +377,7 @@ int base; } -form_bitvector(p, base, value, list) +void form_bitvector(p, base, value, list) pset p; /* old cube, looking at binary variables */ int base; /* where in mv cube the new variable starts */ int value; /* current value for this recursion */ @@ -404,7 +404,7 @@ symbolic_list_t *list; /* current place in the symbolic list */ } -symbolic_hack_labels(PLA, list, compress, new_size, old_size, size_added) +void symbolic_hack_labels(PLA, list, compress, new_size, old_size, size_added) pPLA PLA; symbolic_t *list; pset compress; @@ -476,7 +476,7 @@ pcover F; } -disassemble_fsm(PLA, verbose_mode) +void disassemble_fsm(PLA, verbose_mode) pPLA PLA; int verbose_mode; { diff --git a/src/misc/espresso/irred.c b/src/misc/espresso/irred.c index 384e698f0..2e9f4e268 100644 --- a/src/misc/espresso/irred.c +++ b/src/misc/espresso/irred.c @@ -304,7 +304,7 @@ start: if (debug & TAUT) { printf("UNATE_REDUCTION: %d unate variables, reduced to %d\n", - cdata.vars_unate, CUBELISTSIZE(T)); + (int)cdata.vars_unate, (int)CUBELISTSIZE(T)); } goto start; @@ -430,7 +430,7 @@ start: if (debug & TAUT) { printf("UNATE_REDUCTION: %d unate variables, reduced to %d\n", - cdata.vars_unate, CUBELISTSIZE(T)); + (int)cdata.vars_unate, (int)CUBELISTSIZE(T)); } goto start; } diff --git a/src/misc/espresso/map.c b/src/misc/espresso/map.c index 5ccf264c4..68168745b 100644 --- a/src/misc/espresso/map.c +++ b/src/misc/espresso/map.c @@ -36,34 +36,36 @@ int var, z; int i, last = cube.last_part[var]; for(i=cube.first_part[var], z *= cube.part_size[var]; i<=last; i++, z++) if (is_in_set(Gcube, i)) + { if (var == 0) set_insert(Gminterm, z); else explode(var-1, z); + } } static int mapindex[16][16] = { - 0, 1, 3, 2, 16, 17, 19, 18, 80, 81, 83, 82, 64, 65, 67, 66, - 4, 5, 7, 6, 20, 21, 23, 22, 84, 85, 87, 86, 68, 69, 71, 70, - 12, 13, 15, 14, 28, 29, 31, 30, 92, 93, 95, 94, 76, 77, 79, 78, - 8, 9, 11, 10, 24, 25, 27, 26, 88, 89, 91, 90, 72, 73, 75, 74, + { 0, 1, 3, 2, 16, 17, 19, 18, 80, 81, 83, 82, 64, 65, 67, 66}, + { 4, 5, 7, 6, 20, 21, 23, 22, 84, 85, 87, 86, 68, 69, 71, 70}, + { 12, 13, 15, 14, 28, 29, 31, 30, 92, 93, 95, 94, 76, 77, 79, 78}, + { 8, 9, 11, 10, 24, 25, 27, 26, 88, 89, 91, 90, 72, 73, 75, 74}, - 32, 33, 35, 34, 48, 49, 51, 50, 112,113,115,114, 96, 97, 99, 98, - 36, 37, 39, 38, 52, 53, 55, 54, 116,117,119,118, 100,101,103,102, - 44, 45, 47, 46, 60, 61, 63, 62, 124,125,127,126, 108,109,111,110, - 40, 41, 43, 42, 56, 57, 59, 58, 120,121,123,122, 104,105,107,106, + { 32, 33, 35, 34, 48, 49, 51, 50, 112,113,115,114, 96, 97, 99, 98}, + { 36, 37, 39, 38, 52, 53, 55, 54, 116,117,119,118, 100,101,103,102}, + { 44, 45, 47, 46, 60, 61, 63, 62, 124,125,127,126, 108,109,111,110}, + { 40, 41, 43, 42, 56, 57, 59, 58, 120,121,123,122, 104,105,107,106}, - 160,161,163,162, 176,177,179,178, 240,241,243,242, 224,225,227,226, - 164,165,167,166, 180,181,183,182, 244,245,247,246, 228,229,231,230, - 172,173,175,174, 188,189,191,190, 252,253,255,254, 236,237,239,238, - 168,169,171,170, 184,185,187,186, 248,249,251,250, 232,233,235,234, + {160,161,163,162, 176,177,179,178, 240,241,243,242, 224,225,227,226}, + {164,165,167,166, 180,181,183,182, 244,245,247,246, 228,229,231,230}, + {172,173,175,174, 188,189,191,190, 252,253,255,254, 236,237,239,238}, + {168,169,171,170, 184,185,187,186, 248,249,251,250, 232,233,235,234}, - 128,129,131,130, 144,145,147,146, 208,209,211,210, 192,193,195,194, - 132,133,135,134, 148,149,151,150, 212,213,215,214, 196,197,199,198, - 140,141,143,142, 156,157,159,158, 220,221,223,222, 204,205,207,206, - 136,137,139,138, 152,153,155,154, 216,217,219,218, 200,201,203,202 + {128,129,131,130, 144,145,147,146, 208,209,211,210, 192,193,195,194}, + {132,133,135,134, 148,149,151,150, 212,213,215,214, 196,197,199,198}, + {140,141,143,142, 156,157,159,158, 220,221,223,222, 204,205,207,206}, + {136,137,139,138, 152,153,155,154, 216,217,219,218, 200,201,203,202} }; #define POWER2(n) (1 << n) diff --git a/src/misc/espresso/opo.c b/src/misc/espresso/opo.c index 8daa07715..19522f893 100644 --- a/src/misc/espresso/opo.c +++ b/src/misc/espresso/opo.c @@ -411,7 +411,7 @@ int n; * duplicated in the output part */ -output_phase_setup(PLA, first_output) +void output_phase_setup(PLA, first_output) INOUT pPLA PLA; int first_output; { diff --git a/src/misc/espresso/pair.c b/src/misc/espresso/pair.c index a8077176a..a53451786 100644 --- a/src/misc/espresso/pair.c +++ b/src/misc/espresso/pair.c @@ -163,7 +163,8 @@ pcover A; bool paired[]; { bool run; - int first_run, run_length, var, offset = 0; + int first_run = 0; // Suppress "might be used uninitialized" + int run_length, var, offset = 0; run = FALSE; run_length = 0; for(var = 0; var < cube.num_binary_vars; var++) @@ -261,8 +262,10 @@ pPLA PLA; int strategy; { int var1, var2, **cost_array; - int i, j, xnum_binary_vars, xnum_vars, *xpart_size, cost; - pcover T, Fsave, Dsave, Rsave; + int i, j; + int xnum_binary_vars = 0, xnum_vars = 0, *xpart_size = NULL, cost = 0; // Suppress "might be used uninitialized" + pcover T; + pcover Fsave = NULL, Dsave = NULL, Rsave = NULL; // Suppress "might be used uninitialized" pset mask; /* char *s;*/ @@ -366,7 +369,7 @@ static pcover best_F, best_D, best_R; static int pair_minim_strategy; -print_pair(pair) +void print_pair(pair) ppair pair; { int i; @@ -382,7 +385,9 @@ int greedy_best_cost(cost_array_local, pair_p) int **cost_array_local; ppair *pair_p; { - int i, j, besti, bestj, maxcost, total_cost; + int i, j; + int besti = 0, bestj = 0; + int maxcost, total_cost; pset cand; ppair pair; @@ -437,7 +442,7 @@ int **cost_array_local; } -int find_best_cost(pair) +void find_best_cost(pair) register ppair pair; { register int i, cost; @@ -464,7 +469,7 @@ register ppair pair; 4) for phase assignment */ -pair_all(PLA, pair_strategy) +void pair_all(PLA, pair_strategy) pPLA PLA; int pair_strategy; { @@ -507,7 +512,7 @@ int pair_strategy; /* * minimize_pair -- called as each pair is generated */ -int minimize_pair(pair) +void minimize_pair(pair) ppair pair; { pcover Fsave, Dsave, Rsave; @@ -582,7 +587,7 @@ ppair pair; global_PLA->phase = NULL; } -generate_all_pairs(pair, n, candidate, action) +void generate_all_pairs(pair, n, candidate, action) ppair pair; int n; pset candidate; @@ -666,7 +671,7 @@ register int n; } -int pair_free(pair) +void pair_free(pair) register ppair pair; { FREE(pair->var1); diff --git a/src/misc/espresso/set.c b/src/misc/espresso/set.c index fce88288c..e36293438 100644 --- a/src/misc/espresso/set.c +++ b/src/misc/espresso/set.c @@ -16,7 +16,7 @@ #include "espresso.h" static pset_family set_family_garbage = NULL; -static int intcpy(d, s, n) +static void intcpy(d, s, n) register unsigned int *d, *s; register long n; { diff --git a/src/misc/espresso/setc.c b/src/misc/espresso/setc.c index a6112ebc5..64130ec56 100644 --- a/src/misc/espresso/setc.c +++ b/src/misc/espresso/setc.c @@ -114,14 +114,14 @@ register pset a, b; /* Check the partial word of binary variables */ x = a[last] & b[last]; - if (x = ~ (x | x >> 1) & cube.inmask) + if ((x = ~ (x | x >> 1) & cube.inmask)) if ((dist = count_ones(x)) > 1) return 2; /* Check the full words of binary variables */ for(w = 1; w < last; w++) { x = a[w] & b[w]; - if (x = ~ (x | x >> 1) & DISJOINT) + if ((x = ~ (x | x >> 1) & DISJOINT)) if (dist == 1 || (dist += count_ones(x)) > 1) return 2; } @@ -159,13 +159,13 @@ register pset a, b; /* Check the partial word of binary variables */ x = a[last] & b[last]; - if (x = ~ (x | x >> 1) & cube.inmask) + if ((x = ~ (x | x >> 1) & cube.inmask)) dist = count_ones(x); /* Check the full words of binary variables */ for(w = 1; w < last; w++) { x = a[w] & b[w]; - if (x = ~ (x | x >> 1) & DISJOINT) + if ((x = ~ (x | x >> 1) & DISJOINT)) dist += count_ones(x); } } @@ -200,13 +200,13 @@ IN register pset a, b; /* Check the partial word of binary variables */ x = a[last] & b[last]; - if (x = ~(x | x >> 1) & cube.inmask) + if ((x = ~(x | x >> 1) & cube.inmask)) xlower[last] |= (x | (x << 1)) & a[last]; /* Check the full words of binary variables */ for(w = 1; w < last; w++) { x = a[w] & b[w]; - if (x = ~(x | x >> 1) & DISJOINT) + if ((x = ~(x | x >> 1) & DISJOINT)) xlower[w] |= (x | (x << 1)) & a[w]; } } @@ -252,13 +252,13 @@ IN register pcube a, b; /* Check the partial word of binary variables */ r[last] = x = a[last] & b[last]; - if (x = ~(x | x >> 1) & cube.inmask) + if ((x = ~(x | x >> 1) & cube.inmask)) r[last] |= (x | (x << 1)) & (a[last] | b[last]); /* Check the full words of binary variables */ for(w = 1; w < last; w++) { r[w] = x = a[w] & b[w]; - if (x = ~(x | x >> 1) & DISJOINT) + if ((x = ~(x | x >> 1) & DISJOINT)) r[w] |= (x | (x << 1)) & (a[w] | b[w]); } } @@ -273,7 +273,7 @@ IN register pcube a, b; last = cube.last_word[var]; empty = TRUE; for(w = cube.first_word[var]; w <= last; w++) - if (x = a[w] & b[w] & mask[w]) + if ((x = a[w] & b[w] & mask[w])) empty = FALSE, r[w] |= x; if (empty) for(w = cube.first_word[var]; w <= last; w++) @@ -299,7 +299,7 @@ register pcube a; /* Check the partial word of binary variables */ x = a[last]; - if (x = ~ (x & x >> 1) & cube.inmask) { + if ((x = ~ (x & x >> 1) & cube.inmask)) { if ((dist = count_ones(x)) > 1) return -1; /* more than 2 active variables */ active = (last-1)*(BPI/2) + bit_index(x) / 2; @@ -308,7 +308,7 @@ register pcube a; /* Check the full words of binary variables */ for(w = 1; w < last; w++) { x = a[w]; - if (x = ~ (x & x >> 1) & DISJOINT) { + if ((x = ~ (x & x >> 1) & DISJOINT)) { if ((dist += count_ones(x)) > 1) return -1; /* more than 2 active variables */ active = (w-1)*(BPI/2) + bit_index(x) / 2; diff --git a/src/misc/espresso/verify.c b/src/misc/espresso/verify.c index 64342787f..e53407241 100644 --- a/src/misc/espresso/verify.c +++ b/src/misc/espresso/verify.c @@ -83,7 +83,7 @@ pPLA PLA1, PLA2; * Discard any columns of PLA1 which are not in PLA2 * Association is strictly by the names of the columns of the cover. */ -PLA_permute(PLA1, PLA2) +void PLA_permute(PLA1, PLA2) pPLA PLA1, PLA2; { register int i, j, *permute, npermute; diff --git a/src/misc/extra/extra.h b/src/misc/extra/extra.h index 9870c3d07..6b840024b 100644 --- a/src/misc/extra/extra.h +++ b/src/misc/extra/extra.h @@ -93,21 +93,21 @@ typedef unsigned long long uint64; // hash key macros #define hashKey1(a,TSIZE) \ -((unsigned)(a) % TSIZE) +((PORT_PTRUINT_T)(a) % TSIZE) #define hashKey2(a,b,TSIZE) \ -(((unsigned)(a) + (unsigned)(b) * DD_P1) % TSIZE) +(((PORT_PTRUINT_T)(a) + (PORT_PTRUINT_T)(b) * DD_P1) % TSIZE) #define hashKey3(a,b,c,TSIZE) \ -(((((unsigned)(a) + (unsigned)(b)) * DD_P1 + (unsigned)(c)) * DD_P2 ) % TSIZE) +(((((PORT_PTRUINT_T)(a) + (PORT_PTRUINT_T)(b)) * DD_P1 + (PORT_PTRUINT_T)(c)) * DD_P2 ) % TSIZE) #define hashKey4(a,b,c,d,TSIZE) \ -((((((unsigned)(a) + (unsigned)(b)) * DD_P1 + (unsigned)(c)) * DD_P2 + \ - (unsigned)(d)) * DD_P3) % TSIZE) +((((((PORT_PTRUINT_T)(a) + (PORT_PTRUINT_T)(b)) * DD_P1 + (PORT_PTRUINT_T)(c)) * DD_P2 + \ + (PORT_PTRUINT_T)(d)) * DD_P3) % TSIZE) #define hashKey5(a,b,c,d,e,TSIZE) \ -(((((((unsigned)(a) + (unsigned)(b)) * DD_P1 + (unsigned)(c)) * DD_P2 + \ - (unsigned)(d)) * DD_P3 + (unsigned)(e)) * DD_P1) % TSIZE) +(((((((PORT_PTRUINT_T)(a) + (PORT_PTRUINT_T)(b)) * DD_P1 + (PORT_PTRUINT_T)(c)) * DD_P2 + \ + (PORT_PTRUINT_T)(d)) * DD_P3 + (PORT_PTRUINT_T)(e)) * DD_P1) % TSIZE) #ifndef PRT #define PRT(a,t) printf("%s = ", (a)); printf("%6.2f sec\n", (float)(t)/(float)(CLOCKS_PER_SEC)) diff --git a/src/misc/extra/extraBddAuto.c b/src/misc/extra/extraBddAuto.c index 21a969baf..11612ef47 100644 --- a/src/misc/extra/extraBddAuto.c +++ b/src/misc/extra/extraBddAuto.c @@ -575,11 +575,11 @@ DdNode * extraBddSpaceFromFunction( DdManager * dd, DdNode * bF, DdNode * bG ) // both bFunc and bCore are not constants // the operation is commutative - normalize the problem - if ( (unsigned)bF > (unsigned)bG ) + if ( (unsigned)(PORT_PTRUINT_T)bF > (unsigned)(PORT_PTRUINT_T)bG ) return extraBddSpaceFromFunction(dd, bG, bF); - if ( bRes = cuddCacheLookup2(dd, extraBddSpaceFromFunction, bF, bG) ) + if ( (bRes = cuddCacheLookup2(dd, extraBddSpaceFromFunction, bF, bG)) ) return bRes; else { @@ -741,7 +741,7 @@ DdNode * extraBddSpaceFromFunctionPos( DdManager * dd, DdNode * bF ) if ( cuddIsConstant(bFR) ) return b1; - if ( bRes = cuddCacheLookup1(dd, extraBddSpaceFromFunctionPos, bF) ) + if ( (bRes = cuddCacheLookup1(dd, extraBddSpaceFromFunctionPos, bF)) ) return bRes; else { @@ -872,7 +872,7 @@ DdNode * extraBddSpaceFromFunctionNeg( DdManager * dd, DdNode * bF ) if ( cuddIsConstant(bFR) ) return b0; - if ( bRes = cuddCacheLookup1(dd, extraBddSpaceFromFunctionNeg, bF) ) + if ( (bRes = cuddCacheLookup1(dd, extraBddSpaceFromFunctionNeg, bF)) ) return bRes; else { @@ -1003,7 +1003,7 @@ DdNode * extraBddSpaceCanonVars( DdManager * dd, DdNode * bF ) if ( cuddIsConstant(bFR) ) return bF; - if ( bRes = cuddCacheLookup1(dd, extraBddSpaceCanonVars, bF) ) + if ( (bRes = cuddCacheLookup1(dd, extraBddSpaceCanonVars, bF)) ) return bRes; else { @@ -1075,7 +1075,7 @@ DdNode * extraBddSpaceEquationsPos( DdManager * dd, DdNode * bF ) if ( bF == b1 ) return z0; - if ( zRes = cuddCacheLookup1Zdd(dd, extraBddSpaceEquationsPos, bF) ) + if ( (zRes = cuddCacheLookup1Zdd(dd, extraBddSpaceEquationsPos, bF)) ) return zRes; else { @@ -1205,7 +1205,7 @@ DdNode * extraBddSpaceEquationsNeg( DdManager * dd, DdNode * bF ) if ( bF == b1 ) return z0; - if ( zRes = cuddCacheLookup1Zdd(dd, extraBddSpaceEquationsNeg, bF) ) + if ( (zRes = cuddCacheLookup1Zdd(dd, extraBddSpaceEquationsNeg, bF)) ) return zRes; else { @@ -1337,7 +1337,7 @@ DdNode * extraBddSpaceFromMatrixPos( DdManager * dd, DdNode * zA ) if ( zA == z1 ) return b1; - if ( bRes = cuddCacheLookup1(dd, extraBddSpaceFromMatrixPos, zA) ) + if ( (bRes = cuddCacheLookup1(dd, extraBddSpaceFromMatrixPos, zA)) ) return bRes; else { @@ -1455,7 +1455,7 @@ DdNode * extraBddSpaceFromMatrixNeg( DdManager * dd, DdNode * zA ) if ( zA == z1 ) return b0; - if ( bRes = cuddCacheLookup1(dd, extraBddSpaceFromMatrixNeg, zA) ) + if ( (bRes = cuddCacheLookup1(dd, extraBddSpaceFromMatrixNeg, zA)) ) return bRes; else { diff --git a/src/misc/extra/extraBddImage.c b/src/misc/extra/extraBddImage.c index d21cfe235..23c1c6822 100644 --- a/src/misc/extra/extraBddImage.c +++ b/src/misc/extra/extraBddImage.c @@ -838,7 +838,7 @@ int Extra_FindBestVariable( DdManager * dd, int iVarBest, v; double CostBest, CostCur; - CostBest = 100000000000000; + CostBest = 100000000000000.0; iVarBest = -1; for ( v = 0; v < nVars; v++ ) if ( pVars[v] ) diff --git a/src/misc/extra/extraBddKmap.c b/src/misc/extra/extraBddKmap.c index bb43db68c..6b54b4509 100644 --- a/src/misc/extra/extraBddKmap.c +++ b/src/misc/extra/extraBddKmap.c @@ -333,10 +333,12 @@ void Extra_PrintKMap( fprintf( Output, "%c", DOUBLE_HORIZONTAL ); fprintf( Output, "%c", DOUBLE_HORIZONTAL ); if ( s != nCellsHor-1 ) + { if ( s&1 ) fprintf( Output, "%c", D_JOINS_D_HOR_BOT ); else fprintf( Output, "%c", S_JOINS_D_HOR_BOT ); + } } fprintf( Output, "%c", DOUBLE_TOP_RIGHT ); fprintf( Output, "\n" ); @@ -394,10 +396,12 @@ void Extra_PrintKMap( fprintf( Output, " " ); if ( h != nCellsHor-1 ) + { if ( h&1 ) fprintf( Output, "%c", DOUBLE_VERTICAL ); else fprintf( Output, "%c", SINGLE_VERTICAL ); + } } fprintf( Output, "%c", DOUBLE_VERTICAL ); fprintf( Output, "\n" ); @@ -417,10 +421,12 @@ void Extra_PrintKMap( fprintf( Output, "%c", DOUBLE_HORIZONTAL ); fprintf( Output, "%c", DOUBLE_HORIZONTAL ); if ( s != nCellsHor-1 ) + { if ( s&1 ) fprintf( Output, "%c", DOUBLES_CROSS ); else fprintf( Output, "%c", S_VER_CROSS_D_HOR ); + } } fprintf( Output, "%c", D_JOINS_D_VER_LEFT ); } @@ -433,10 +439,12 @@ void Extra_PrintKMap( fprintf( Output, "%c", SINGLE_HORIZONTAL ); fprintf( Output, "%c", SINGLE_HORIZONTAL ); if ( s != nCellsHor-1 ) + { if ( s&1 ) fprintf( Output, "%c", S_HOR_CROSS_D_VER ); else fprintf( Output, "%c", SINGLES_CROSS ); + } } fprintf( Output, "%c", S_JOINS_D_VER_LEFT ); } @@ -454,10 +462,12 @@ void Extra_PrintKMap( fprintf( Output, "%c", DOUBLE_HORIZONTAL ); fprintf( Output, "%c", DOUBLE_HORIZONTAL ); if ( s != nCellsHor-1 ) + { if ( s&1 ) fprintf( Output, "%c", D_JOINS_D_HOR_TOP ); else fprintf( Output, "%c", S_JOINS_D_HOR_TOP ); + } } fprintf( Output, "%c", DOUBLE_BOT_RIGHT ); fprintf( Output, "\n" ); @@ -588,10 +598,12 @@ void Extra_PrintKMapRelation( fprintf( Output, "%c", DOUBLE_HORIZONTAL ); fprintf( Output, "%c", DOUBLE_HORIZONTAL ); if ( s != nCellsHor-1 ) + { if ( s&1 ) fprintf( Output, "%c", D_JOINS_D_HOR_BOT ); else fprintf( Output, "%c", S_JOINS_D_HOR_BOT ); + } } fprintf( Output, "%c", DOUBLE_TOP_RIGHT ); fprintf( Output, "\n" ); @@ -651,10 +663,12 @@ void Extra_PrintKMapRelation( fprintf( Output, " " ); if ( h != nCellsHor-1 ) + { if ( h&1 ) fprintf( Output, "%c", DOUBLE_VERTICAL ); else fprintf( Output, "%c", SINGLE_VERTICAL ); + } } fprintf( Output, "%c", DOUBLE_VERTICAL ); fprintf( Output, "\n" ); @@ -674,10 +688,12 @@ void Extra_PrintKMapRelation( fprintf( Output, "%c", DOUBLE_HORIZONTAL ); fprintf( Output, "%c", DOUBLE_HORIZONTAL ); if ( s != nCellsHor-1 ) + { if ( s&1 ) fprintf( Output, "%c", DOUBLES_CROSS ); else fprintf( Output, "%c", S_VER_CROSS_D_HOR ); + } } fprintf( Output, "%c", D_JOINS_D_VER_LEFT ); } @@ -690,10 +706,12 @@ void Extra_PrintKMapRelation( fprintf( Output, "%c", SINGLE_HORIZONTAL ); fprintf( Output, "%c", SINGLE_HORIZONTAL ); if ( s != nCellsHor-1 ) + { if ( s&1 ) fprintf( Output, "%c", S_HOR_CROSS_D_VER ); else fprintf( Output, "%c", SINGLES_CROSS ); + } } fprintf( Output, "%c", S_JOINS_D_VER_LEFT ); } @@ -711,10 +729,12 @@ void Extra_PrintKMapRelation( fprintf( Output, "%c", DOUBLE_HORIZONTAL ); fprintf( Output, "%c", DOUBLE_HORIZONTAL ); if ( s != nCellsHor-1 ) + { if ( s&1 ) fprintf( Output, "%c", D_JOINS_D_HOR_TOP ); else fprintf( Output, "%c", S_JOINS_D_HOR_TOP ); + } } fprintf( Output, "%c", DOUBLE_BOT_RIGHT ); fprintf( Output, "\n" ); diff --git a/src/misc/extra/extraBddMisc.c b/src/misc/extra/extraBddMisc.c index 5ebedaba5..8b8bdd81e 100644 --- a/src/misc/extra/extraBddMisc.c +++ b/src/misc/extra/extraBddMisc.c @@ -1015,7 +1015,7 @@ DdNode * extraBddMove( if ( Cudd_IsConstant(bF) ) return bF; - if ( bRes = cuddCacheLookup2(dd, extraBddMove, bF, bDist) ) + if ( (bRes = cuddCacheLookup2(dd, extraBddMove, bF, bDist)) ) return bRes; else { diff --git a/src/misc/extra/extraBddSymm.c b/src/misc/extra/extraBddSymm.c index 358402b04..666814f6f 100644 --- a/src/misc/extra/extraBddSymm.c +++ b/src/misc/extra/extraBddSymm.c @@ -515,7 +515,7 @@ DdNode* Extra_zddTuplesFromBdd( return NULL; /* the second argument in the recursive call stannds for ; - /* reate the first argument, which stands for + * reate the first argument, which stands for * as when we are talking about the tuple of out of */ for ( i = 0; i < nVars-K; i++ ) bVarsK = cuddT( bVarsK ); @@ -603,7 +603,7 @@ extraZddSymmPairsCompute( } assert( bVars != b1 ); - if ( zRes = cuddCacheLookup2Zdd(dd, extraZddSymmPairsCompute, bFunc, bVars) ) + if ( (zRes = cuddCacheLookup2Zdd(dd, extraZddSymmPairsCompute, bFunc, bVars)) ) return zRes; else { @@ -817,7 +817,7 @@ DdNode * extraZddGetSymmetricVars( } assert( bVars != b1 ); - if ( zRes = cuddCacheLookupZdd(dd, DD_GET_SYMM_VARS_TAG, bF, bG, bVars) ) + if ( (zRes = cuddCacheLookupZdd(dd, DD_GET_SYMM_VARS_TAG, bF, bG, bVars)) ) return zRes; else { @@ -1005,7 +1005,7 @@ DdNode * extraZddGetSingletons( // if ( bVars == b0 ) // bug fixed by Jin Zhang, Jan 23, 2004 return z1; - if ( zRes = cuddCacheLookup1Zdd(dd, extraZddGetSingletons, bVars) ) + if ( (zRes = cuddCacheLookup1Zdd(dd, extraZddGetSingletons, bVars)) ) return zRes; else { @@ -1067,7 +1067,7 @@ DdNode * extraBddReduceVarSet( if ( cuddIsConstant(bFR) || bVars == b1 ) return bVars; - if ( bRes = cuddCacheLookup2(dd, extraBddReduceVarSet, bVars, bF) ) + if ( (bRes = cuddCacheLookup2(dd, extraBddReduceVarSet, bVars, bF)) ) return bRes; else { @@ -1175,7 +1175,7 @@ DdNode * extraBddCheckVarsSymmetric( assert( bVars != b1 ); - if ( bRes = cuddCacheLookup2(dd, extraBddCheckVarsSymmetric, bF, bVars) ) + if ( (bRes = cuddCacheLookup2(dd, extraBddCheckVarsSymmetric, bF, bVars)) ) return bRes; else { @@ -1425,7 +1425,7 @@ DdNode * extraZddSelectOneSubset( if ( zS == z1 ) return z1; // check cache - if ( zRes = cuddCacheLookup1Zdd( dd, extraZddSelectOneSubset, zS ) ) + if ( (zRes = cuddCacheLookup1Zdd( dd, extraZddSelectOneSubset, zS )) ) return zRes; else { diff --git a/src/misc/extra/extraBddUnate.c b/src/misc/extra/extraBddUnate.c index b0297c77e..92396c38f 100644 --- a/src/misc/extra/extraBddUnate.c +++ b/src/misc/extra/extraBddUnate.c @@ -395,7 +395,7 @@ extraZddUnateInfoCompute( } assert( bVars != b1 ); - if ( zRes = cuddCacheLookup2Zdd(dd, extraZddUnateInfoCompute, bFunc, bVars) ) + if ( (zRes = cuddCacheLookup2Zdd(dd, extraZddUnateInfoCompute, bFunc, bVars)) ) return zRes; else { @@ -573,7 +573,7 @@ DdNode * extraZddGetSingletonsBoth( if ( bVars == b1 ) return z1; - if ( zRes = cuddCacheLookup1Zdd(dd, extraZddGetSingletonsBoth, bVars) ) + if ( (zRes = cuddCacheLookup1Zdd(dd, extraZddGetSingletonsBoth, bVars)) ) return zRes; else { diff --git a/src/misc/extra/extraUtilCanon.c b/src/misc/extra/extraUtilCanon.c index fcc7d84df..c9c199d89 100644 --- a/src/misc/extra/extraUtilCanon.c +++ b/src/misc/extra/extraUtilCanon.c @@ -344,10 +344,6 @@ void Map_Var3Test() { uTruth = i; Count = Extra_TruthCanonFastN( 5, 3, &uTruth, &ptRes, &pfRes ); - if ( *ptRes != uCanons[i] || Count != pCounters[i] ) - { - int k = 0; - } } } @@ -369,7 +365,7 @@ void Map_Var4Test() unsigned short * uCanons; char ** uPhases; char * pCounters; - int i, k; + int i; unsigned * ptRes; char * pfRes; unsigned uTruth; @@ -381,15 +377,6 @@ void Map_Var4Test() { uTruth = i; Count = Extra_TruthCanonFastN( 5, 4, &uTruth, &ptRes, &pfRes ); - if ( (*ptRes & 0xFFFF) != uCanons[i] || Count != pCounters[i] ) - { - int k = 0; - } - for ( k = 0; k < Count; k++ ) - if ( uPhases[i][k] != pfRes[k] ) - { - int v = 0; - } } } diff --git a/src/misc/extra/extraUtilMemory.c b/src/misc/extra/extraUtilMemory.c index 376ed9b09..39c342961 100644 --- a/src/misc/extra/extraUtilMemory.c +++ b/src/misc/extra/extraUtilMemory.c @@ -562,7 +562,7 @@ char * Extra_MmStepEntryFetch( Extra_MmStep_t * p, int nBytes ) if ( p->nLargeChunksAlloc == 0 ) p->nLargeChunksAlloc = 32; p->nLargeChunksAlloc *= 2; - p->pLargeChunks = REALLOC( char *, p->pLargeChunks, p->nLargeChunksAlloc ); + p->pLargeChunks = REALLOC( void *, p->pLargeChunks, p->nLargeChunksAlloc ); } p->pLargeChunks[ p->nLargeChunks++ ] = ALLOC( char, nBytes ); return p->pLargeChunks[ p->nLargeChunks - 1 ]; diff --git a/src/misc/extra/extraUtilMisc.c b/src/misc/extra/extraUtilMisc.c index dff774bc5..48fca0bab 100644 --- a/src/misc/extra/extraUtilMisc.c +++ b/src/misc/extra/extraUtilMisc.c @@ -819,7 +819,7 @@ void Extra_Truth3VarN( unsigned ** puCanons, char *** puPhases, char ** ppCounte { assert( uCanons[uPhase] == uTruth32 ); if ( pCounters[uPhase] < nPhasesMax ) - uPhases[uPhase][ pCounters[uPhase]++ ] = i; + uPhases[uPhase][ (int)pCounters[uPhase]++ ] = i; } } } @@ -885,7 +885,7 @@ void Extra_Truth4VarN( unsigned short ** puCanons, char *** puPhases, char ** pp { assert( uCanons[uPhase] == uTruth ); if ( pCounters[uPhase] < nPhasesMax ) - uPhases[uPhase][ pCounters[uPhase]++ ] = i; + uPhases[uPhase][ (int)pCounters[uPhase]++ ] = i; } } } @@ -917,15 +917,15 @@ void Extra_Truth4VarN( unsigned short ** puCanons, char *** puPhases, char ** pp ***********************************************************************/ void ** Extra_ArrayAlloc( int nCols, int nRows, int Size ) { - char ** pRes; + void ** pRes; char * pBuffer; int i; assert( nCols > 0 && nRows > 0 && Size > 0 ); pBuffer = ALLOC( char, nCols * (sizeof(void *) + nRows * Size) ); - pRes = (char **)pBuffer; + pRes = (void **)pBuffer; pRes[0] = pBuffer + nCols * sizeof(void *); for ( i = 1; i < nCols; i++ ) - pRes[i] = pRes[0] + i * nRows * Size; + pRes[i] = (void *)((char *)pRes[0] + i * nRows * Size); return pRes; } @@ -1860,7 +1860,7 @@ void Extra_TruthExpand( int nVars, int nWords, unsigned * puTruth, unsigned uPha { int i; for ( i = 0; i < nWords; i++ ) - puTruthR[i] = uTruths[Cases[uPhase]][i]; + puTruthR[i] = uTruths[(int)Cases[uPhase]][i]; return; } diff --git a/src/misc/extra/extraUtilReader.c b/src/misc/extra/extraUtilReader.c index c165b9897..b6a53fbca 100644 --- a/src/misc/extra/extraUtilReader.c +++ b/src/misc/extra/extraUtilReader.c @@ -232,7 +232,7 @@ int Extra_FileReaderGetLineNumber( Extra_FileReader_t * p, int iToken ) void * Extra_FileReaderGetTokens( Extra_FileReader_t * p ) { Vec_Ptr_t * vTokens; - while ( vTokens = Extra_FileReaderGetTokens_int( p ) ) + while ( (vTokens = Extra_FileReaderGetTokens_int( p )) ) if ( vTokens->nSize > 0 ) break; return vTokens; @@ -272,7 +272,7 @@ void * Extra_FileReaderGetTokens_int( Extra_FileReader_t * p ) if ( *pChar == '\n' ) p->nLineCounter++; // switch depending on the character - MapValue = p->pCharMap[*pChar]; + MapValue = p->pCharMap[(int)*pChar]; // printf( "Char value = %d. Map value = %d.\n", *pChar, MapValue ); diff --git a/src/misc/mvc/mvcDivide.c b/src/misc/mvc/mvcDivide.c index 03643dcf4..450639435 100644 --- a/src/misc/mvc/mvcDivide.c +++ b/src/misc/mvc/mvcDivide.c @@ -81,7 +81,8 @@ void Mvc_CoverDivideInternal( Mvc_Cover_t * pCover, Mvc_Cover_t * pDiv, Mvc_Cove Mvc_Cube_t * pCubeC, * pCubeD, * pCubeCopy; Mvc_Cube_t * pCube1, * pCube2; int * pGroups, nGroups; // the cube groups - int nCubesC, nCubesD, nMerges, iCubeC, iCubeD, iMerge; + int nCubesC, nCubesD, nMerges, iCubeC, iCubeD; + int iMerge = -1; // Suppress "might be used uninitialized" int fSkipG, GroupSize, g, c, RetValue; int nCubes; diff --git a/src/misc/nm/nmApi.c b/src/misc/nm/nmApi.c index 9165922fc..576882a7c 100644 --- a/src/misc/nm/nmApi.c +++ b/src/misc/nm/nmApi.c @@ -111,7 +111,7 @@ char * Nm_ManStoreIdName( Nm_Man_t * p, int ObjId, int Type, char * pName, char Nm_Entry_t * pEntry; int RetValue, nEntrySize; // check if the object with this ID is already stored - if ( pEntry = Nm_ManTableLookupId(p, ObjId) ) + if ( (pEntry = Nm_ManTableLookupId(p, ObjId)) ) { printf( "Nm_ManStoreIdName(): Entry with the same ID already exists.\n" ); return NULL; @@ -173,7 +173,7 @@ char * Nm_ManCreateUniqueName( Nm_Man_t * p, int ObjId ) static char NameStr[1000]; Nm_Entry_t * pEntry; int i; - if ( pEntry = Nm_ManTableLookupId(p, ObjId) ) + if ( (pEntry = Nm_ManTableLookupId(p, ObjId)) ) return pEntry->Name; sprintf( NameStr, "n%d", ObjId ); for ( i = 1; Nm_ManTableLookupName(p, NameStr, -1); i++ ) @@ -195,7 +195,7 @@ char * Nm_ManCreateUniqueName( Nm_Man_t * p, int ObjId ) char * Nm_ManFindNameById( Nm_Man_t * p, int ObjId ) { Nm_Entry_t * pEntry; - if ( pEntry = Nm_ManTableLookupId(p, ObjId) ) + if ( (pEntry = Nm_ManTableLookupId(p, ObjId)) ) return pEntry->Name; return NULL; } @@ -215,7 +215,7 @@ char * Nm_ManFindNameById( Nm_Man_t * p, int ObjId ) int Nm_ManFindIdByName( Nm_Man_t * p, char * pName, int Type ) { Nm_Entry_t * pEntry; - if ( pEntry = Nm_ManTableLookupName(p, pName, Type) ) + if ( (pEntry = Nm_ManTableLookupName(p, pName, Type)) ) return pEntry->ObjId; return -1; } diff --git a/src/misc/nm/nmTable.c b/src/misc/nm/nmTable.c index f97a2f0bd..e50388ba9 100644 --- a/src/misc/nm/nmTable.c +++ b/src/misc/nm/nmTable.c @@ -77,7 +77,7 @@ int Nm_ManTableAdd( Nm_Man_t * p, Nm_Entry_t * pEntry ) pEntry->pNextI2N = *ppSpot; *ppSpot = pEntry; // check if an entry with the same name already exists - if ( pOther = Nm_ManTableLookupName(p, pEntry->Name, -1) ) + if ( (pOther = Nm_ManTableLookupName(p, pEntry->Name, -1)) ) { // entry with the same name already exists - add it to the ring pEntry->pNameSake = pOther->pNameSake? pOther->pNameSake : pOther; @@ -188,7 +188,6 @@ Nm_Entry_t * Nm_ManTableLookupId( Nm_Man_t * p, int ObjId ) Nm_Entry_t * Nm_ManTableLookupName( Nm_Man_t * p, char * pName, int Type ) { Nm_Entry_t * pEntry, * pTemp; - int Counter = 0; for ( pEntry = p->pBinsN2I[ Nm_HashString(pName, p->nBins) ]; pEntry; pEntry = pEntry->pNextN2I ) { // check the entry itself diff --git a/src/misc/util/port_type.h b/src/misc/util/port_type.h index 316905f34..67b7d454d 100644 --- a/src/misc/util/port_type.h +++ b/src/misc/util/port_type.h @@ -41,6 +41,24 @@ typedef unsigned int PORT_PTRUINT_T; #error unknown platform #endif /* defined(PLATFORM) */ +/** + * Signed integral type that can contain a pointer. + * + * This is a signed integral type that is the same size as a pointer. + * + * NOTE: This type may be different sizes on different platforms. + */ +#if defined(__ccdoc__) +typedef platform_dependent_type PORT_PTRINT_T; +#elif defined(LIN64) +typedef long PORT_PTRINT_T; +#elif defined(NT64) +typedef long long PORT_PTRINT_T; +#elif defined(NT) || defined(LIN) || defined(WIN32) +typedef int PORT_PTRINT_T; +#else + #error unknown platform +#endif /* defined(PLATFORM) */ /** * 64-bit signed integral type. diff --git a/src/misc/vec/vecAtt.h b/src/misc/vec/vecAtt.h index da7a84459..8d0a034b9 100644 --- a/src/misc/vec/vecAtt.h +++ b/src/misc/vec/vecAtt.h @@ -60,7 +60,8 @@ struct Vec_Att_t_ { // storage for attributes int nCap; // the size of array allocated - int * pArrayInt; // the integer attribute array + // Removed pArrayInt as it's not 64-bit safe, it generates compiler + // warnings, and it's unused. void ** pArrayPtr; // the pointer attribute array // attribute specific info void * pMan; // the manager for this attribute @@ -89,7 +90,7 @@ struct Vec_Att_t_ ***********************************************************************/ static inline Vec_Att_t * Vec_AttAlloc( - int fInteger, int nSize, void * pMan, + int nSize, void * pMan, void (*pFuncFreeMan) (void *), void*(*pFuncStartObj)(void *), void (*pFuncFreeObj) (void *, void *) ) @@ -102,16 +103,8 @@ static inline Vec_Att_t * Vec_AttAlloc( p->pFuncStartObj = pFuncStartObj; p->pFuncFreeObj = pFuncFreeObj; p->nCap = nSize? nSize : 16; - if ( fInteger ) - { - p->pArrayInt = ALLOC( int, p->nCap ); - memset( p->pArrayInt, 0xff, sizeof(int) * p->nCap ); - } - else - { - p->pArrayPtr = ALLOC( void *, p->nCap ); - memset( p->pArrayPtr, 0, sizeof(void *) * p->nCap ); - } + p->pArrayPtr = ALLOC( void *, p->nCap ); + memset( p->pArrayPtr, 0, sizeof(void *) * p->nCap ); return p; } @@ -135,24 +128,14 @@ static inline void * Vec_AttFree( Vec_Att_t * p, int fFreeMan ) if ( p->pFuncFreeObj ) { int i; - if ( p->pArrayInt ) - { - for ( i = 0; i < p->nCap; i++ ) - if ( p->pArrayInt[i] ) - p->pFuncFreeObj( p->pMan, (void *)p->pArrayInt[i] ); - } - else - { - for ( i = 0; i < p->nCap; i++ ) - if ( p->pArrayPtr[i] ) - p->pFuncFreeObj( p->pMan, p->pArrayPtr[i] ); - } + for ( i = 0; i < p->nCap; i++ ) + if ( p->pArrayPtr[i] ) + p->pFuncFreeObj( p->pMan, p->pArrayPtr[i] ); } // free the memory manager pMan = fFreeMan? NULL : p->pMan; if ( p->pMan && fFreeMan ) p->pFuncFreeMan( p->pMan ); - FREE( p->pArrayInt ); FREE( p->pArrayPtr ); FREE( p ); return pMan; @@ -175,26 +158,12 @@ static inline void Vec_AttClear( Vec_Att_t * p ) if ( p->pFuncFreeObj ) { int i; - if ( p->pArrayInt ) - { - if ( p->pFuncFreeObj ) - for ( i = 0; i < p->nCap; i++ ) - if ( p->pArrayInt[i] ) - p->pFuncFreeObj( p->pMan, (void *)p->pArrayInt[i] ); - } - else - { - if ( p->pFuncFreeObj ) - for ( i = 0; i < p->nCap; i++ ) - if ( p->pArrayPtr[i] ) - p->pFuncFreeObj( p->pMan, p->pArrayPtr[i] ); - } + if ( p->pFuncFreeObj ) + for ( i = 0; i < p->nCap; i++ ) + if ( p->pArrayPtr[i] ) + p->pFuncFreeObj( p->pMan, p->pArrayPtr[i] ); } - if ( p->pArrayInt ) - memset( p->pArrayInt, 0xff, sizeof(int) * p->nCap ); - else - memset( p->pArrayPtr, 0, sizeof(void *) * p->nCap ); - + memset( p->pArrayPtr, 0, sizeof(void *) * p->nCap ); } /**Function************************************************************* @@ -214,15 +183,10 @@ static inline void Vec_AttFreeEntry( Vec_Att_t * p, int i ) return; if ( p->pMan ) { - if ( p->pArrayInt[i] && p->pFuncFreeObj ) - p->pFuncFreeObj( p->pMan, (void *)p->pArrayInt[i] ); if ( p->pArrayPtr[i] && p->pFuncFreeObj ) p->pFuncFreeObj( p->pMan, (void *)p->pArrayPtr[i] ); } - if ( p->pArrayInt ) - p->pArrayInt[i] = ~(unsigned)0; - else - p->pArrayPtr[i] = NULL; + p->pArrayPtr[i] = NULL; } /**Function************************************************************* @@ -240,16 +204,8 @@ static inline void Vec_AttGrow( Vec_Att_t * p, int nCapMin ) { if ( p->nCap >= nCapMin ) return; - if ( p->pArrayInt ) - { - p->pArrayInt = REALLOC( int, p->pArrayInt, nCapMin ); - memset( p->pArrayInt + p->nCap, 0xff, sizeof(int) * (nCapMin - p->nCap) ); - } - else - { - p->pArrayPtr = REALLOC( void *, p->pArrayPtr, nCapMin ); - memset( p->pArrayPtr + p->nCap, 0, sizeof(void *) * (nCapMin - p->nCap) ); - } + p->pArrayPtr = REALLOC( void *, p->pArrayPtr, nCapMin ); + memset( p->pArrayPtr + p->nCap, 0, sizeof(void *) * (nCapMin - p->nCap) ); p->nCap = nCapMin; } @@ -273,26 +229,6 @@ static inline void Vec_AttWriteEntry( Vec_Att_t * p, int i, void * pEntry ) p->pArrayPtr[i] = pEntry; } -/**Function************************************************************* - - Synopsis [Writes the entry into its place.] - - Description [Only works if the manager is not defined.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline void Vec_AttWriteEntryInt( Vec_Att_t * p, int i, int Entry ) -{ - assert( p->pArrayInt ); - assert( p->pFuncStartObj == NULL ); - if ( i >= p->nCap ) - Vec_AttGrow( p, (2 * p->nCap > i)? 2 * p->nCap : i + 10 ); - p->pArrayInt[i] = Entry; -} - /**Function************************************************************* Synopsis [Returns the entry.] @@ -314,26 +250,6 @@ static inline void * Vec_AttEntry( Vec_Att_t * p, int i ) return p->pArrayPtr[i]; } -/**Function************************************************************* - - Synopsis [Returns the entry.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Vec_AttEntryInt( Vec_Att_t * p, int i ) -{ - assert( p->pArrayInt ); - assert( p->pMan == NULL ); - if ( i >= p->nCap ) - Vec_AttGrow( p, (2 * p->nCap > i)? 2 * p->nCap : i + 10 ); - return p->pArrayInt[i]; -} - /**Function************************************************************* Synopsis [Returns the entry.] @@ -366,25 +282,8 @@ static inline void ** Vec_AttArray( Vec_Att_t * p ) return p->pArrayPtr; } -/**Function************************************************************* - - Synopsis [Returns the array of attributes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int * Vec_AttArrayInt( Vec_Att_t * p ) -{ - return p->pArrayInt; -} - #endif - //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// diff --git a/src/misc/vec/vecFlt.h b/src/misc/vec/vecFlt.h index 6b36ce84f..513c7dc6d 100644 --- a/src/misc/vec/vecFlt.h +++ b/src/misc/vec/vecFlt.h @@ -570,7 +570,7 @@ static inline int Vec_FltRemove( Vec_Flt_t * p, float Entry ) SeeAlso [] ***********************************************************************/ -static inline int Vec_FltSortCompare1( float * pp1, float * pp2 ) +static int Vec_FltSortCompare1( float * pp1, float * pp2 ) { // for some reason commenting out lines (as shown) led to crashing of the release version if ( *pp1 < *pp2 ) @@ -591,7 +591,7 @@ static inline int Vec_FltSortCompare1( float * pp1, float * pp2 ) SeeAlso [] ***********************************************************************/ -static inline int Vec_FltSortCompare2( float * pp1, float * pp2 ) +static int Vec_FltSortCompare2( float * pp1, float * pp2 ) { // for some reason commenting out lines (as shown) led to crashing of the release version if ( *pp1 > *pp2 ) diff --git a/src/misc/vec/vecInt.h b/src/misc/vec/vecInt.h index 082ebe70e..430b7b639 100644 --- a/src/misc/vec/vecInt.h +++ b/src/misc/vec/vecInt.h @@ -667,7 +667,7 @@ static inline int Vec_IntRemove( Vec_Int_t * p, int Entry ) SeeAlso [] ***********************************************************************/ -static inline int Vec_IntSortCompare1( int * pp1, int * pp2 ) +static int Vec_IntSortCompare1( int * pp1, int * pp2 ) { // for some reason commenting out lines (as shown) led to crashing of the release version if ( *pp1 < *pp2 ) @@ -688,7 +688,7 @@ static inline int Vec_IntSortCompare1( int * pp1, int * pp2 ) SeeAlso [] ***********************************************************************/ -static inline int Vec_IntSortCompare2( int * pp1, int * pp2 ) +static int Vec_IntSortCompare2( int * pp1, int * pp2 ) { // for some reason commenting out lines (as shown) led to crashing of the release version if ( *pp1 > *pp2 ) @@ -731,7 +731,7 @@ static inline void Vec_IntSort( Vec_Int_t * p, int fReverse ) SeeAlso [] ***********************************************************************/ -static inline int Vec_IntSortCompareUnsigned( unsigned * pp1, unsigned * pp2 ) +static int Vec_IntSortCompareUnsigned( unsigned * pp1, unsigned * pp2 ) { if ( *pp1 < *pp2 ) return -1; diff --git a/src/misc/vec/vecPtr.h b/src/misc/vec/vecPtr.h index df06168cb..276430434 100644 --- a/src/misc/vec/vecPtr.h +++ b/src/misc/vec/vecPtr.h @@ -625,7 +625,7 @@ static inline void Vec_PtrReorder( Vec_Ptr_t * p, int nItems ) SeeAlso [] ***********************************************************************/ -static inline void Vec_PtrSort( Vec_Ptr_t * p, int (*Vec_PtrSortCompare)() ) +static void Vec_PtrSort( Vec_Ptr_t * p, int (*Vec_PtrSortCompare)() ) { if ( p->nSize < 2 ) return; @@ -644,7 +644,7 @@ static inline void Vec_PtrSort( Vec_Ptr_t * p, int (*Vec_PtrSortCompare)() ) SeeAlso [] ***********************************************************************/ -static inline void Vec_PtrUniqify( Vec_Ptr_t * p, int (*Vec_PtrSortCompare)() ) +static void Vec_PtrUniqify( Vec_Ptr_t * p, int (*Vec_PtrSortCompare)() ) { int i, k; if ( p->nSize < 2 ) diff --git a/src/misc/vec/vecStr.h b/src/misc/vec/vecStr.h index 47367bc67..863be8bb8 100644 --- a/src/misc/vec/vecStr.h +++ b/src/misc/vec/vecStr.h @@ -523,7 +523,7 @@ static inline char Vec_StrPop( Vec_Str_t * p ) SeeAlso [] ***********************************************************************/ -static inline int Vec_StrSortCompare1( char * pp1, char * pp2 ) +static int Vec_StrSortCompare1( char * pp1, char * pp2 ) { // for some reason commenting out lines (as shown) led to crashing of the release version if ( *pp1 < *pp2 ) @@ -544,7 +544,7 @@ static inline int Vec_StrSortCompare1( char * pp1, char * pp2 ) SeeAlso [] ***********************************************************************/ -static inline int Vec_StrSortCompare2( char * pp1, char * pp2 ) +static int Vec_StrSortCompare2( char * pp1, char * pp2 ) { // for some reason commenting out lines (as shown) led to crashing of the release version if ( *pp1 > *pp2 ) diff --git a/src/misc/vec/vecVec.h b/src/misc/vec/vecVec.h index 13880c21c..0557e9c03 100644 --- a/src/misc/vec/vecVec.h +++ b/src/misc/vec/vecVec.h @@ -340,7 +340,7 @@ static inline void Vec_VecPushUnique( Vec_Vec_t * p, int Level, void * Entry ) SeeAlso [] ***********************************************************************/ -static inline int Vec_VecSortCompare1( Vec_Ptr_t ** pp1, Vec_Ptr_t ** pp2 ) +static int Vec_VecSortCompare1( Vec_Ptr_t ** pp1, Vec_Ptr_t ** pp2 ) { if ( Vec_PtrSize(*pp1) < Vec_PtrSize(*pp2) ) return -1; @@ -360,7 +360,7 @@ static inline int Vec_VecSortCompare1( Vec_Ptr_t ** pp1, Vec_Ptr_t ** pp2 ) SeeAlso [] ***********************************************************************/ -static inline int Vec_VecSortCompare2( Vec_Ptr_t ** pp1, Vec_Ptr_t ** pp2 ) +static int Vec_VecSortCompare2( Vec_Ptr_t ** pp1, Vec_Ptr_t ** pp2 ) { if ( Vec_PtrSize(*pp1) > Vec_PtrSize(*pp2) ) return -1; diff --git a/src/misc/zlib/1.c b/src/misc/zlib/1.c new file mode 100644 index 000000000..8a06a3460 --- /dev/null +++ b/src/misc/zlib/1.c @@ -0,0 +1,35 @@ + Volume in drive C is IBM_PRELOAD + Volume Serial Number is 20EA-F780 + + Directory of C:\_projects\abc\src\misc\zlib + +07/02/2008 03:51 PM

. +07/02/2008 03:51 PM .. +07/02/2008 03:51 PM 0 1.c +12/21/2004 04:52 PM 4,708 adler32.c +06/02/2003 06:16 AM 9,545 algorithm.txt +07/07/2003 07:37 AM 2,568 compress_.c +06/13/2005 01:56 AM 13,616 crc32.c +01/05/2003 04:53 PM 31,009 crc32.h +07/18/2005 04:27 AM 65,899 deflate.c +05/29/2005 05:55 PM 12,445 deflate.h +07/11/2005 10:31 PM 32,129 gzio.c +05/31/2005 12:58 AM 22,787 infback.c +11/13/2004 06:05 AM 12,886 inffast.c +01/01/2003 05:46 PM 418 inffast.h +11/24/2002 11:44 PM 6,437 inffixed.h +06/14/2005 11:50 PM 50,345 inflate.c +11/13/2004 05:38 AM 6,031 inflate.h +07/18/2005 04:27 AM 14,085 inftrees.c +07/11/2005 08:50 AM 2,428 inftrees.h +07/02/2008 02:52 PM 34 link.txt +07/18/2005 04:25 AM 5,821 README +06/13/2005 02:34 AM 45,246 trees.c +02/24/1998 12:14 PM 8,572 trees.h +07/07/2003 07:36 AM 2,148 uncompr.c +05/28/2005 08:40 AM 9,876 zconf.h +07/18/2005 04:26 AM 67,545 zlib.h +06/13/2005 02:37 AM 7,454 zutil.c +07/11/2005 10:35 PM 7,128 zutil.h + 26 File(s) 441,160 bytes + 2 Dir(s) 1,641,279,488 bytes free diff --git a/src/misc/zlib/README b/src/misc/zlib/README new file mode 100644 index 000000000..758cc5002 --- /dev/null +++ b/src/misc/zlib/README @@ -0,0 +1,125 @@ +ZLIB DATA COMPRESSION LIBRARY + +zlib 1.2.3 is a general purpose data compression library. All the code is +thread safe. The data format used by the zlib library is described by RFCs +(Request for Comments) 1950 to 1952 in the files +http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) +and rfc1952.txt (gzip format). These documents are also available in other +formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html + +All functions of the compression library are documented in the file zlib.h +(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example +of the library is given in the file example.c which also tests that the library +is working correctly. Another example is given in the file minigzip.c. The +compression library itself is composed of all source files except example.c and +minigzip.c. + +To compile all files and run the test program, follow the instructions given at +the top of Makefile. In short "make test; make install" should work for most +machines. For Unix: "./configure; make test; make install". For MSDOS, use one +of the special makefiles such as Makefile.msc. For VMS, use make_vms.com. + +Questions about zlib should be sent to , or to Gilles Vollant + for the Windows DLL version. The zlib home page is +http://www.zlib.org or http://www.gzip.org/zlib/ Before reporting a problem, +please check this site to verify that you have the latest version of zlib; +otherwise get the latest version and check whether the problem still exists or +not. + +PLEASE read the zlib FAQ http://www.gzip.org/zlib/zlib_faq.html before asking +for help. + +Mark Nelson wrote an article about zlib for the Jan. 1997 +issue of Dr. Dobb's Journal; a copy of the article is available in +http://dogma.net/markn/articles/zlibtool/zlibtool.htm + +The changes made in version 1.2.3 are documented in the file ChangeLog. + +Unsupported third party contributions are provided in directory "contrib". + +A Java implementation of zlib is available in the Java Development Kit +http://java.sun.com/j2se/1.4.2/docs/api/java/util/zip/package-summary.html +See the zlib home page http://www.zlib.org for details. + +A Perl interface to zlib written by Paul Marquess is in the +CPAN (Comprehensive Perl Archive Network) sites +http://www.cpan.org/modules/by-module/Compress/ + +A Python interface to zlib written by A.M. Kuchling is +available in Python 1.5 and later versions, see +http://www.python.org/doc/lib/module-zlib.html + +A zlib binding for TCL written by Andreas Kupries is +availlable at http://www.oche.de/~akupries/soft/trf/trf_zip.html + +An experimental package to read and write files in .zip format, written on top +of zlib by Gilles Vollant , is available in the +contrib/minizip directory of zlib. + + +Notes for some targets: + +- For Windows DLL versions, please see win32/DLL_FAQ.txt + +- For 64-bit Irix, deflate.c must be compiled without any optimization. With + -O, one libpng test fails. The test works in 32 bit mode (with the -n32 + compiler flag). The compiler bug has been reported to SGI. + +- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works + when compiled with cc. + +- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is + necessary to get gzprintf working correctly. This is done by configure. + +- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with + other compilers. Use "make test" to check your compiler. + +- gzdopen is not supported on RISCOS, BEOS and by some Mac compilers. + +- For PalmOs, see http://palmzlib.sourceforge.net/ + +- When building a shared, i.e. dynamic library on Mac OS X, the library must be + installed before testing (do "make install" before "make test"), since the + library location is specified in the library. + + +Acknowledgments: + + The deflate format used by zlib was defined by Phil Katz. The deflate + and zlib specifications were written by L. Peter Deutsch. Thanks to all the + people who reported problems and suggested various improvements in zlib; + they are too numerous to cite here. + +Copyright notice: + + (C) 1995-2004 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +If you use the zlib library in a product, we would appreciate *not* +receiving lengthy legal documents to sign. The sources are provided +for free but without warranty of any kind. The library has been +entirely written by Jean-loup Gailly and Mark Adler; it does not +include third-party code. + +If you redistribute modified sources, we would appreciate that you include +in the file ChangeLog history information documenting your changes. Please +read the FAQ for more information on the distribution of modified source +versions. diff --git a/src/misc/zlib/adler32.c b/src/misc/zlib/adler32.c new file mode 100644 index 000000000..007ba2627 --- /dev/null +++ b/src/misc/zlib/adler32.c @@ -0,0 +1,149 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +#define BASE 65521UL /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +/* use NO_DIVIDE if your processor does not do division in hardware */ +#ifdef NO_DIVIDE +# define MOD(a) \ + do { \ + if (a >= (BASE << 16)) a -= (BASE << 16); \ + if (a >= (BASE << 15)) a -= (BASE << 15); \ + if (a >= (BASE << 14)) a -= (BASE << 14); \ + if (a >= (BASE << 13)) a -= (BASE << 13); \ + if (a >= (BASE << 12)) a -= (BASE << 12); \ + if (a >= (BASE << 11)) a -= (BASE << 11); \ + if (a >= (BASE << 10)) a -= (BASE << 10); \ + if (a >= (BASE << 9)) a -= (BASE << 9); \ + if (a >= (BASE << 8)) a -= (BASE << 8); \ + if (a >= (BASE << 7)) a -= (BASE << 7); \ + if (a >= (BASE << 6)) a -= (BASE << 6); \ + if (a >= (BASE << 5)) a -= (BASE << 5); \ + if (a >= (BASE << 4)) a -= (BASE << 4); \ + if (a >= (BASE << 3)) a -= (BASE << 3); \ + if (a >= (BASE << 2)) a -= (BASE << 2); \ + if (a >= (BASE << 1)) a -= (BASE << 1); \ + if (a >= BASE) a -= BASE; \ + } while (0) +# define MOD4(a) \ + do { \ + if (a >= (BASE << 4)) a -= (BASE << 4); \ + if (a >= (BASE << 3)) a -= (BASE << 3); \ + if (a >= (BASE << 2)) a -= (BASE << 2); \ + if (a >= (BASE << 1)) a -= (BASE << 1); \ + if (a >= BASE) a -= BASE; \ + } while (0) +#else +# define MOD(a) a %= BASE +# define MOD4(a) a %= BASE +#endif + +/* ========================================================================= */ +uLong ZEXPORT adler32(adler, buf, len) + uLong adler; + const Bytef *buf; + uInt len; +{ + unsigned long sum2; + unsigned n; + + /* split Adler-32 into component sums */ + sum2 = (adler >> 16) & 0xffff; + adler &= 0xffff; + + /* in case user likes doing a byte at a time, keep it fast */ + if (len == 1) { + adler += buf[0]; + if (adler >= BASE) + adler -= BASE; + sum2 += adler; + if (sum2 >= BASE) + sum2 -= BASE; + return adler | (sum2 << 16); + } + + /* initial Adler-32 value (deferred check for len == 1 speed) */ + if (buf == Z_NULL) + return 1L; + + /* in case short lengths are provided, keep it somewhat fast */ + if (len < 16) { + while (len--) { + adler += *buf++; + sum2 += adler; + } + if (adler >= BASE) + adler -= BASE; + MOD4(sum2); /* only added so many BASE's */ + return adler | (sum2 << 16); + } + + /* do length NMAX blocks -- requires just one modulo operation */ + while (len >= NMAX) { + len -= NMAX; + n = NMAX / 16; /* NMAX is divisible by 16 */ + do { + DO16(buf); /* 16 sums unrolled */ + buf += 16; + } while (--n); + MOD(adler); + MOD(sum2); + } + + /* do remaining bytes (less than NMAX, still just one modulo) */ + if (len) { /* avoid modulos if none remaining */ + while (len >= 16) { + len -= 16; + DO16(buf); + buf += 16; + } + while (len--) { + adler += *buf++; + sum2 += adler; + } + MOD(adler); + MOD(sum2); + } + + /* return recombined sums */ + return adler | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32_combine(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off_t len2; +{ + unsigned long sum1; + unsigned long sum2; + unsigned rem; + + /* the derivation of this formula is left as an exercise for the reader */ + rem = (unsigned)(len2 % BASE); + sum1 = adler1 & 0xffff; + sum2 = rem * sum1; + MOD(sum2); + sum1 += (adler2 & 0xffff) + BASE - 1; + sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; + if (sum1 > BASE) sum1 -= BASE; + if (sum1 > BASE) sum1 -= BASE; + if (sum2 > (BASE << 1)) sum2 -= (BASE << 1); + if (sum2 > BASE) sum2 -= BASE; + return sum1 | (sum2 << 16); +} diff --git a/src/misc/zlib/algorithm.txt b/src/misc/zlib/algorithm.txt new file mode 100644 index 000000000..b022dde31 --- /dev/null +++ b/src/misc/zlib/algorithm.txt @@ -0,0 +1,209 @@ +1. Compression algorithm (deflate) + +The deflation algorithm used by gzip (also zip and zlib) is a variation of +LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in +the input data. The second occurrence of a string is replaced by a +pointer to the previous string, in the form of a pair (distance, +length). Distances are limited to 32K bytes, and lengths are limited +to 258 bytes. When a string does not occur anywhere in the previous +32K bytes, it is emitted as a sequence of literal bytes. (In this +description, `string' must be taken as an arbitrary sequence of bytes, +and is not restricted to printable characters.) + +Literals or match lengths are compressed with one Huffman tree, and +match distances are compressed with another tree. The trees are stored +in a compact form at the start of each block. The blocks can have any +size (except that the compressed data for one block must fit in +available memory). A block is terminated when deflate() determines that +it would be useful to start another block with fresh trees. (This is +somewhat similar to the behavior of LZW-based _compress_.) + +Duplicated strings are found using a hash table. All input strings of +length 3 are inserted in the hash table. A hash index is computed for +the next 3 bytes. If the hash chain for this index is not empty, all +strings in the chain are compared with the current input string, and +the longest match is selected. + +The hash chains are searched starting with the most recent strings, to +favor small distances and thus take advantage of the Huffman encoding. +The hash chains are singly linked. There are no deletions from the +hash chains, the algorithm simply discards matches that are too old. + +To avoid a worst-case situation, very long hash chains are arbitrarily +truncated at a certain length, determined by a runtime option (level +parameter of deflateInit). So deflate() does not always find the longest +possible match but generally finds a match which is long enough. + +deflate() also defers the selection of matches with a lazy evaluation +mechanism. After a match of length N has been found, deflate() searches for +a longer match at the next input byte. If a longer match is found, the +previous match is truncated to a length of one (thus producing a single +literal byte) and the process of lazy evaluation begins again. Otherwise, +the original match is kept, and the next match search is attempted only N +steps later. + +The lazy match evaluation is also subject to a runtime parameter. If +the current match is long enough, deflate() reduces the search for a longer +match, thus speeding up the whole process. If compression ratio is more +important than speed, deflate() attempts a complete second search even if +the first match is already long enough. + +The lazy match evaluation is not performed for the fastest compression +modes (level parameter 1 to 3). For these fast modes, new strings +are inserted in the hash table only when no match was found, or +when the match is not too long. This degrades the compression ratio +but saves time since there are both fewer insertions and fewer searches. + + +2. Decompression algorithm (inflate) + +2.1 Introduction + +The key question is how to represent a Huffman code (or any prefix code) so +that you can decode fast. The most important characteristic is that shorter +codes are much more common than longer codes, so pay attention to decoding the +short codes fast, and let the long codes take longer to decode. + +inflate() sets up a first level table that covers some number of bits of +input less than the length of longest code. It gets that many bits from the +stream, and looks it up in the table. The table will tell if the next +code is that many bits or less and how many, and if it is, it will tell +the value, else it will point to the next level table for which inflate() +grabs more bits and tries to decode a longer code. + +How many bits to make the first lookup is a tradeoff between the time it +takes to decode and the time it takes to build the table. If building the +table took no time (and if you had infinite memory), then there would only +be a first level table to cover all the way to the longest code. However, +building the table ends up taking a lot longer for more bits since short +codes are replicated many times in such a table. What inflate() does is +simply to make the number of bits in the first table a variable, and then +to set that variable for the maximum speed. + +For inflate, which has 286 possible codes for the literal/length tree, the size +of the first table is nine bits. Also the distance trees have 30 possible +values, and the size of the first table is six bits. Note that for each of +those cases, the table ended up one bit longer than the ``average'' code +length, i.e. the code length of an approximately flat code which would be a +little more than eight bits for 286 symbols and a little less than five bits +for 30 symbols. + + +2.2 More details on the inflate table lookup + +Ok, you want to know what this cleverly obfuscated inflate tree actually +looks like. You are correct that it's not a Huffman tree. It is simply a +lookup table for the first, let's say, nine bits of a Huffman symbol. The +symbol could be as short as one bit or as long as 15 bits. If a particular +symbol is shorter than nine bits, then that symbol's translation is duplicated +in all those entries that start with that symbol's bits. For example, if the +symbol is four bits, then it's duplicated 32 times in a nine-bit table. If a +symbol is nine bits long, it appears in the table once. + +If the symbol is longer than nine bits, then that entry in the table points +to another similar table for the remaining bits. Again, there are duplicated +entries as needed. The idea is that most of the time the symbol will be short +and there will only be one table look up. (That's whole idea behind data +compression in the first place.) For the less frequent long symbols, there +will be two lookups. If you had a compression method with really long +symbols, you could have as many levels of lookups as is efficient. For +inflate, two is enough. + +So a table entry either points to another table (in which case nine bits in +the above example are gobbled), or it contains the translation for the symbol +and the number of bits to gobble. Then you start again with the next +ungobbled bit. + +You may wonder: why not just have one lookup table for how ever many bits the +longest symbol is? The reason is that if you do that, you end up spending +more time filling in duplicate symbol entries than you do actually decoding. +At least for deflate's output that generates new trees every several 10's of +kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code +would take too long if you're only decoding several thousand symbols. At the +other extreme, you could make a new table for every bit in the code. In fact, +that's essentially a Huffman tree. But then you spend two much time +traversing the tree while decoding, even for short symbols. + +So the number of bits for the first lookup table is a trade of the time to +fill out the table vs. the time spent looking at the second level and above of +the table. + +Here is an example, scaled down: + +The code being decoded, with 10 symbols, from 1 to 6 bits long: + +A: 0 +B: 10 +C: 1100 +D: 11010 +E: 11011 +F: 11100 +G: 11101 +H: 11110 +I: 111110 +J: 111111 + +Let's make the first table three bits long (eight entries): + +000: A,1 +001: A,1 +010: A,1 +011: A,1 +100: B,2 +101: B,2 +110: -> table X (gobble 3 bits) +111: -> table Y (gobble 3 bits) + +Each entry is what the bits decode as and how many bits that is, i.e. how +many bits to gobble. Or the entry points to another table, with the number of +bits to gobble implicit in the size of the table. + +Table X is two bits long since the longest code starting with 110 is five bits +long: + +00: C,1 +01: C,1 +10: D,2 +11: E,2 + +Table Y is three bits long since the longest code starting with 111 is six +bits long: + +000: F,2 +001: F,2 +010: G,2 +011: G,2 +100: H,2 +101: H,2 +110: I,3 +111: J,3 + +So what we have here are three tables with a total of 20 entries that had to +be constructed. That's compared to 64 entries for a single table. Or +compared to 16 entries for a Huffman tree (six two entry tables and one four +entry table). Assuming that the code ideally represents the probability of +the symbols, it takes on the average 1.25 lookups per symbol. That's compared +to one lookup for the single table, or 1.66 lookups per symbol for the +Huffman tree. + +There, I think that gives you a picture of what's going on. For inflate, the +meaning of a particular symbol is often more than just a letter. It can be a +byte (a "literal"), or it can be either a length or a distance which +indicates a base value and a number of bits to fetch after the code that is +added to the base value. Or it might be the special end-of-block code. The +data structures created in inftrees.c try to encode all that information +compactly in the tables. + + +Jean-loup Gailly Mark Adler +jloup@gzip.org madler@alumni.caltech.edu + + +References: + +[LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data +Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3, +pp. 337-343. + +``DEFLATE Compressed Data Format Specification'' available in +http://www.ietf.org/rfc/rfc1951.txt diff --git a/src/misc/zlib/compress_.c b/src/misc/zlib/compress_.c new file mode 100644 index 000000000..df04f0148 --- /dev/null +++ b/src/misc/zlib/compress_.c @@ -0,0 +1,79 @@ +/* compress.c -- compress a memory buffer + * Copyright (C) 1995-2003 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least 0.1% larger than sourceLen plus + 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ +int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; + int level; +{ + z_stream stream; + int err; + + stream.next_in = (Bytef*)source; + stream.avail_in = (uInt)sourceLen; +#ifdef MAXSEG_64K + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; +#endif + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + err = deflateInit(&stream, level); + if (err != Z_OK) return err; + + err = deflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + deflateEnd(&stream); + return err == Z_OK ? Z_BUF_ERROR : err; + } + *destLen = stream.total_out; + + err = deflateEnd(&stream); + return err; +} + +/* =========================================================================== + */ +int ZEXPORT compress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); +} + +/* =========================================================================== + If the default memLevel or windowBits for deflateInit() is changed, then + this function needs to be updated. + */ +uLong ZEXPORT compressBound (sourceLen) + uLong sourceLen; +{ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11; +} diff --git a/src/misc/zlib/crc32.c b/src/misc/zlib/crc32.c new file mode 100644 index 000000000..f658a9ef5 --- /dev/null +++ b/src/misc/zlib/crc32.c @@ -0,0 +1,423 @@ +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Thanks to Rodney Brown for his contribution of faster + * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing + * tables for updating the shift register in one step with three exclusive-ors + * instead of four steps with four exclusive-ors. This results in about a + * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + */ + +/* @(#) $Id$ */ + +/* + Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore + protection on the static variables used to control the first-use generation + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + first call get_crc_table() to initialize the tables before allowing more than + one thread to use crc32(). + */ + +#ifdef MAKECRCH +# include +# ifndef DYNAMIC_CRC_TABLE +# define DYNAMIC_CRC_TABLE +# endif /* !DYNAMIC_CRC_TABLE */ +#endif /* MAKECRCH */ + +#include "zutil.h" /* for STDC and FAR definitions */ + +#define local static + +/* Find a four-byte integer type for crc32_little() and crc32_big(). */ +#ifndef NOBYFOUR +# ifdef STDC /* need ANSI C limits.h to determine sizes */ +# include +# define BYFOUR +# if (UINT_MAX == 0xffffffffUL) + typedef unsigned int u4; +# else +# if (ULONG_MAX == 0xffffffffUL) + typedef unsigned long u4; +# else +# if (USHRT_MAX == 0xffffffffUL) + typedef unsigned short u4; +# else +# undef BYFOUR /* can't find a four-byte integer type! */ +# endif +# endif +# endif +# endif /* STDC */ +#endif /* !NOBYFOUR */ + +/* Definitions for doing the crc four data bytes at a time. */ +#ifdef BYFOUR +# define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ + (((w)&0xff00)<<8)+(((w)&0xff)<<24)) + local unsigned long crc32_little OF((unsigned long, + const unsigned char FAR *, unsigned)); + local unsigned long crc32_big OF((unsigned long, + const unsigned char FAR *, unsigned)); +# define TBLS 8 +#else +# define TBLS 1 +#endif /* BYFOUR */ + +/* Local functions for crc concatenation */ +local unsigned long gf2_matrix_times OF((unsigned long *mat, + unsigned long vec)); +local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); + +#ifdef DYNAMIC_CRC_TABLE + +local volatile int crc_table_empty = 1; +local unsigned long FAR crc_table[TBLS][256]; +local void make_crc_table OF((void)); +#ifdef MAKECRCH + local void write_table OF((FILE *, const unsigned long FAR *)); +#endif /* MAKECRCH */ +/* + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The first table is simply the CRC of all possible eight bit values. This is + all the information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. The remaining tables + allow for word-at-a-time CRC calculation for both big-endian and little- + endian machines, where a word is four bytes. +*/ +local void make_crc_table() +{ + unsigned long c; + int n, k; + unsigned long poly; /* polynomial exclusive-or pattern */ + /* terms of polynomial defining this crc (except x^32): */ + static volatile int first = 1; /* flag to limit concurrent making */ + static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; + + /* See if another task is already doing this (not thread-safe, but better + than nothing -- significantly reduces duration of vulnerability in + case the advice about DYNAMIC_CRC_TABLE is ignored) */ + if (first) { + first = 0; + + /* make exclusive-or pattern from polynomial (0xedb88320UL) */ + poly = 0UL; + for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) + poly |= 1UL << (31 - p[n]); + + /* generate a crc for every 8-bit value */ + for (n = 0; n < 256; n++) { + c = (unsigned long)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc_table[0][n] = c; + } + +#ifdef BYFOUR + /* generate crc for each value followed by one, two, and three zeros, + and then the byte reversal of those as well as the first table */ + for (n = 0; n < 256; n++) { + c = crc_table[0][n]; + crc_table[4][n] = REV(c); + for (k = 1; k < 4; k++) { + c = crc_table[0][c & 0xff] ^ (c >> 8); + crc_table[k][n] = c; + crc_table[k + 4][n] = REV(c); + } + } +#endif /* BYFOUR */ + + crc_table_empty = 0; + } + else { /* not first */ + /* wait for the other guy to finish (not efficient, but rare) */ + while (crc_table_empty) + ; + } + +#ifdef MAKECRCH + /* write out CRC tables to crc32.h */ + { + FILE *out; + + out = fopen("crc32.h", "w"); + if (out == NULL) return; + fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); + fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); + fprintf(out, "local const unsigned long FAR "); + fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); + write_table(out, crc_table[0]); +# ifdef BYFOUR + fprintf(out, "#ifdef BYFOUR\n"); + for (k = 1; k < 8; k++) { + fprintf(out, " },\n {\n"); + write_table(out, crc_table[k]); + } + fprintf(out, "#endif\n"); +# endif /* BYFOUR */ + fprintf(out, " }\n};\n"); + fclose(out); + } +#endif /* MAKECRCH */ +} + +#ifdef MAKECRCH +local void write_table(out, table) + FILE *out; + const unsigned long FAR *table; +{ + int n; + + for (n = 0; n < 256; n++) + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], + n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); +} +#endif /* MAKECRCH */ + +#else /* !DYNAMIC_CRC_TABLE */ +/* ======================================================================== + * Tables of CRC-32s of all single-byte values, made by make_crc_table(). + */ +#include "crc32.h" +#endif /* DYNAMIC_CRC_TABLE */ + +/* ========================================================================= + * This function can be used by asm versions of crc32() + */ +const unsigned long FAR * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + return (const unsigned long FAR *)crc_table; +} + +/* ========================================================================= */ +#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) +#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 + +/* ========================================================================= */ +unsigned long ZEXPORT crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + if (buf == Z_NULL) return 0UL; + +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + +#ifdef BYFOUR + if (sizeof(void *) == sizeof(ptrdiff_t)) { + u4 endian; + + endian = 1; + if (*((unsigned char *)(&endian))) + return crc32_little(crc, buf, len); + else + return crc32_big(crc, buf, len); + } +#endif /* BYFOUR */ + crc = crc ^ 0xffffffffUL; + while (len >= 8) { + DO8; + len -= 8; + } + if (len) do { + DO1; + } while (--len); + return crc ^ 0xffffffffUL; +} + +#ifdef BYFOUR + +/* ========================================================================= */ +#define DOLIT4 c ^= *buf4++; \ + c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ + crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] +#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 + +/* ========================================================================= */ +local unsigned long crc32_little(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register u4 c; + register const u4 FAR *buf4; + + c = (u4)crc; + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + len--; + } + + buf4 = (const u4 FAR *)(const void FAR *)buf; + while (len >= 32) { + DOLIT32; + len -= 32; + } + while (len >= 4) { + DOLIT4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + } while (--len); + c = ~c; + return (unsigned long)c; +} + +/* ========================================================================= */ +#define DOBIG4 c ^= *++buf4; \ + c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ + crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] +#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 + +/* ========================================================================= */ +local unsigned long crc32_big(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register u4 c; + register const u4 FAR *buf4; + + c = REV((u4)crc); + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + len--; + } + + buf4 = (const u4 FAR *)(const void FAR *)buf; + buf4--; + while (len >= 32) { + DOBIG32; + len -= 32; + } + while (len >= 4) { + DOBIG4; + len -= 4; + } + buf4++; + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + } while (--len); + c = ~c; + return (unsigned long)(REV(c)); +} + +#endif /* BYFOUR */ + +#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ + +/* ========================================================================= */ +local unsigned long gf2_matrix_times(mat, vec) + unsigned long *mat; + unsigned long vec; +{ + unsigned long sum; + + sum = 0; + while (vec) { + if (vec & 1) + sum ^= *mat; + vec >>= 1; + mat++; + } + return sum; +} + +/* ========================================================================= */ +local void gf2_matrix_square(square, mat) + unsigned long *square; + unsigned long *mat; +{ + int n; + + for (n = 0; n < GF2_DIM; n++) + square[n] = gf2_matrix_times(mat, mat[n]); +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off_t len2; +{ + int n; + unsigned long row; + unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ + unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ + + /* degenerate case */ + if (len2 == 0) + return crc1; + + /* put operator for one zero bit in odd */ + odd[0] = 0xedb88320L; /* CRC-32 polynomial */ + row = 1; + for (n = 1; n < GF2_DIM; n++) { + odd[n] = row; + row <<= 1; + } + + /* put operator for two zero bits in even */ + gf2_matrix_square(even, odd); + + /* put operator for four zero bits in odd */ + gf2_matrix_square(odd, even); + + /* apply len2 zeros to crc1 (first square will put the operator for one + zero byte, eight zero bits, in even) */ + do { + /* apply zeros operator for this bit of len2 */ + gf2_matrix_square(even, odd); + if (len2 & 1) + crc1 = gf2_matrix_times(even, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + if (len2 == 0) + break; + + /* another iteration of the loop with odd and even swapped */ + gf2_matrix_square(odd, even); + if (len2 & 1) + crc1 = gf2_matrix_times(odd, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + } while (len2 != 0); + + /* return combined crc */ + crc1 ^= crc2; + return crc1; +} diff --git a/src/misc/zlib/crc32.h b/src/misc/zlib/crc32.h new file mode 100644 index 000000000..8053b6117 --- /dev/null +++ b/src/misc/zlib/crc32.h @@ -0,0 +1,441 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const unsigned long FAR crc_table[TBLS][256] = +{ + { + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL +#ifdef BYFOUR + }, + { + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL + }, + { + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL + }, + { + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL + }, + { + 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, + 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, + 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, + 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, + 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, + 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, + 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, + 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, + 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, + 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, + 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, + 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, + 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, + 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, + 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, + 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, + 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, + 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, + 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, + 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, + 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, + 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, + 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, + 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, + 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, + 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, + 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, + 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, + 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, + 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, + 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, + 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, + 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, + 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, + 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, + 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, + 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, + 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, + 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, + 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, + 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, + 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, + 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, + 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, + 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, + 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, + 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, + 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, + 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, + 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, + 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, + 0x8def022dUL + }, + { + 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, + 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, + 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, + 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, + 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, + 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, + 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, + 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, + 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, + 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, + 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, + 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, + 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, + 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, + 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, + 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, + 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, + 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, + 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, + 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, + 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, + 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, + 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, + 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, + 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, + 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, + 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, + 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, + 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, + 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, + 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, + 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, + 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, + 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, + 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, + 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, + 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, + 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, + 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, + 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, + 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, + 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, + 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, + 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, + 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, + 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, + 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, + 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, + 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, + 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, + 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, + 0x72fd2493UL + }, + { + 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, + 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, + 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, + 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, + 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, + 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, + 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, + 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, + 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, + 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, + 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, + 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, + 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, + 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, + 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, + 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, + 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, + 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, + 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, + 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, + 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, + 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, + 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, + 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, + 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, + 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, + 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, + 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, + 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, + 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, + 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, + 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, + 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, + 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, + 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, + 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, + 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, + 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, + 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, + 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, + 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, + 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, + 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, + 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, + 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, + 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, + 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, + 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, + 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, + 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, + 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, + 0xed3498beUL + }, + { + 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, + 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, + 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, + 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, + 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, + 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, + 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, + 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, + 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, + 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, + 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, + 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, + 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, + 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, + 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, + 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, + 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, + 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, + 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, + 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, + 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, + 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, + 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, + 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, + 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, + 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, + 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, + 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, + 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, + 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, + 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, + 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, + 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, + 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, + 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, + 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, + 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, + 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, + 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, + 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, + 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, + 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, + 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, + 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, + 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, + 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, + 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, + 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, + 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, + 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, + 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, + 0xf10605deUL +#endif + } +}; diff --git a/src/misc/zlib/deflate.c b/src/misc/zlib/deflate.c new file mode 100644 index 000000000..29ce1f64a --- /dev/null +++ b/src/misc/zlib/deflate.c @@ -0,0 +1,1736 @@ +/* deflate.c -- compress data using the deflation algorithm + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process depends on being able to identify portions + * of the input text which are identical to earlier input (within a + * sliding window trailing behind the input currently being processed). + * + * The most straightforward technique turns out to be the fastest for + * most input files: try all possible matches and select the longest. + * The key feature of this algorithm is that insertions into the string + * dictionary are very simple and thus fast, and deletions are avoided + * completely. Insertions are performed at each input character, whereas + * string matches are performed only when the previous match ends. So it + * is preferable to spend more time in matches to allow very fast string + * insertions and avoid deletions. The matching algorithm for small + * strings is inspired from that of Rabin & Karp. A brute force approach + * is used to find longer strings when a small match has been found. + * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze + * (by Leonid Broukhis). + * A previous version of this file used a more sophisticated algorithm + * (by Fiala and Greene) which is guaranteed to run in linear amortized + * time, but has a larger average cost, uses more memory and is patented. + * However the F&G algorithm may be faster for some highly redundant + * files if the parameter max_chain_length (described below) is too large. + * + * ACKNOWLEDGEMENTS + * + * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and + * I found it in 'freeze' written by Leonid Broukhis. + * Thanks to many people for bug reports and testing. + * + * REFERENCES + * + * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". + * Available in http://www.ietf.org/rfc/rfc1951.txt + * + * A description of the Rabin and Karp algorithm is given in the book + * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. + * + * Fiala,E.R., and Greene,D.H. + * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 + * + */ + +/* @(#) $Id$ */ + +#include "deflate.h" + +const char deflate_copyright[] = + " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* =========================================================================== + * Function prototypes. + */ +typedef enum { + need_more, /* block not completed, need more input or more output */ + block_done, /* block flush performed */ + finish_started, /* finish started, need only more output at next deflate */ + finish_done /* finish done, accept no more input or output */ +} block_state; + +typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +/* Compression function. Returns the block state after the call. */ + +local void fill_window OF((deflate_state *s)); +local block_state deflate_stored OF((deflate_state *s, int flush)); +local block_state deflate_fast OF((deflate_state *s, int flush)); +#ifndef FASTEST +local block_state deflate_slow OF((deflate_state *s, int flush)); +#endif +local void lm_init OF((deflate_state *s)); +local void putShortMSB OF((deflate_state *s, uInt b)); +local void flush_pending OF((z_streamp strm)); +local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); +#ifndef FASTEST +#ifdef ASMV + void match_init OF((void)); /* asm code initialization */ + uInt longest_match OF((deflate_state *s, IPos cur_match)); +#else +local uInt longest_match OF((deflate_state *s, IPos cur_match)); +#endif +#endif +local uInt longest_match_fast OF((deflate_state *s, IPos cur_match)); + +#ifdef DEBUG +local void check_match OF((deflate_state *s, IPos start, IPos match, + int length)); +#endif + +/* =========================================================================== + * Local data + */ + +#define NIL 0 +/* Tail of hash chains */ + +#ifndef TOO_FAR +# define TOO_FAR 4096 +#endif +/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +/* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ +typedef struct config_s { + ush good_length; /* reduce lazy search above this match length */ + ush max_lazy; /* do not perform lazy search above this match length */ + ush nice_length; /* quit search above this match length */ + ush max_chain; + compress_func func; +} config; + +#ifdef FASTEST +local const config configuration_table[2] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ +#else +local const config configuration_table[10] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ +/* 2 */ {4, 5, 16, 8, deflate_fast}, +/* 3 */ {4, 6, 32, 32, deflate_fast}, + +/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ +/* 5 */ {8, 16, 32, 32, deflate_slow}, +/* 6 */ {8, 16, 128, 128, deflate_slow}, +/* 7 */ {8, 32, 128, 256, deflate_slow}, +/* 8 */ {32, 128, 258, 1024, deflate_slow}, +/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ +#endif + +/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 + * For deflate_fast() (levels <= 3) good is ignored and lazy has a different + * meaning. + */ + +#define EQUAL 0 +/* result of memcmp for equal strings */ + +#ifndef NO_DUMMY_DECL +struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ +#endif + +/* =========================================================================== + * Update a hash value with the given input byte + * IN assertion: all calls to to UPDATE_HASH are made with consecutive + * input characters, so that a running hash key can be computed from the + * previous key instead of complete recalculation each time. + */ +#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) + + +/* =========================================================================== + * Insert string str in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * If this file is compiled with -DFASTEST, the compression level is forced + * to 1, and no hash chains are maintained. + * IN assertion: all calls to to INSERT_STRING are made with consecutive + * input characters and the first MIN_MATCH bytes of str are valid + * (except for the last MIN_MATCH-1 bytes of the input file). + */ +#ifdef FASTEST +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#else +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#endif + +/* =========================================================================== + * Initialize the hash table (avoiding 64K overflow for 16 bit systems). + * prev[] will be initialized on the fly. + */ +#define CLEAR_HASH(s) \ + s->head[s->hash_size-1] = NIL; \ + zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); + +/* ========================================================================= */ +int ZEXPORT deflateInit_(strm, level, version, stream_size) + z_streamp strm; + int level; + const char *version; + int stream_size; +{ + return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, + Z_DEFAULT_STRATEGY, version, stream_size); + /* To do: ignore strm->next_in if we use it as window */ +} + +/* ========================================================================= */ +int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + version, stream_size) + z_streamp strm; + int level; + int method; + int windowBits; + int memLevel; + int strategy; + const char *version; + int stream_size; +{ + deflate_state *s; + int wrap = 1; + static const char my_version[] = ZLIB_VERSION; + + ushf *overlay; + /* We overlay pending_buf and d_buf+l_buf. This works since the average + * output size for (length,distance) codes is <= 24 bits. + */ + + if (version == Z_NULL || version[0] != my_version[0] || + stream_size != sizeof(z_stream)) { + return Z_VERSION_ERROR; + } + if (strm == Z_NULL) return Z_STREAM_ERROR; + + strm->msg = Z_NULL; + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } +#ifdef GZIP + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; + } +#endif + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ + s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); + if (s == Z_NULL) return Z_MEM_ERROR; + strm->state = (struct internal_state FAR *)s; + s->strm = strm; + + s->wrap = wrap; + s->gzhead = Z_NULL; + s->w_bits = windowBits; + s->w_size = 1 << s->w_bits; + s->w_mask = s->w_size - 1; + + s->hash_bits = memLevel + 7; + s->hash_size = 1 << s->hash_bits; + s->hash_mask = s->hash_size - 1; + s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + + s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); + s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); + s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + + s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + s->pending_buf = (uchf *) overlay; + s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + + if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || + s->pending_buf == Z_NULL) { + s->status = FINISH_STATE; + strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); + deflateEnd (strm); + return Z_MEM_ERROR; + } + s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + + s->level = level; + s->strategy = strategy; + s->method = (Byte)method; + + return deflateReset(strm); +} + +/* ========================================================================= */ +int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) + z_streamp strm; + const Bytef *dictionary; + uInt dictLength; +{ + deflate_state *s; + uInt length = dictLength; + uInt n; + IPos hash_head = 0; + + if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || + strm->state->wrap == 2 || + (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) + return Z_STREAM_ERROR; + + s = strm->state; + if (s->wrap) + strm->adler = adler32(strm->adler, dictionary, dictLength); + + if (length < MIN_MATCH) return Z_OK; + if (length > MAX_DIST(s)) { + length = MAX_DIST(s); + dictionary += dictLength - length; /* use the tail of the dictionary */ + } + zmemcpy(s->window, dictionary, length); + s->strstart = length; + s->block_start = (long)length; + + /* Insert all strings in the hash table (except for the last two bytes). + * s->lookahead stays null, so s->ins_h will be recomputed at the next + * call of fill_window. + */ + s->ins_h = s->window[0]; + UPDATE_HASH(s, s->ins_h, s->window[1]); + for (n = 0; n <= length - MIN_MATCH; n++) { + INSERT_STRING(s, n, hash_head); + } + if (hash_head) hash_head = 0; /* to make compiler happy */ + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateReset (strm) + z_streamp strm; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { + return Z_STREAM_ERROR; + } + + strm->total_in = strm->total_out = 0; + strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ + strm->data_type = Z_UNKNOWN; + + s = (deflate_state *)strm->state; + s->pending = 0; + s->pending_out = s->pending_buf; + + if (s->wrap < 0) { + s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ + } + s->status = s->wrap ? INIT_STATE : BUSY_STATE; + strm->adler = +#ifdef GZIP + s->wrap == 2 ? crc32(0L, Z_NULL, 0) : +#endif + adler32(0L, Z_NULL, 0); + s->last_flush = Z_NO_FLUSH; + + _tr_init(s); + lm_init(s); + + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateSetHeader (strm, head) + z_streamp strm; + gz_headerp head; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (strm->state->wrap != 2) return Z_STREAM_ERROR; + strm->state->gzhead = head; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePrime (strm, bits, value) + z_streamp strm; + int bits; + int value; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + strm->state->bi_valid = bits; + strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateParams(strm, level, strategy) + z_streamp strm; + int level; + int strategy; +{ + deflate_state *s; + compress_func func; + int err = Z_OK; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + func = configuration_table[s->level].func; + + if (func != configuration_table[level].func && strm->total_in != 0) { + /* Flush the last buffer: */ + err = deflate(strm, Z_PARTIAL_FLUSH); + } + if (s->level != level) { + s->level = level; + s->max_lazy_match = configuration_table[level].max_lazy; + s->good_match = configuration_table[level].good_length; + s->nice_match = configuration_table[level].nice_length; + s->max_chain_length = configuration_table[level].max_chain; + } + s->strategy = strategy; + return err; +} + +/* ========================================================================= */ +int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) + z_streamp strm; + int good_length; + int max_lazy; + int nice_length; + int max_chain; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + s->good_match = good_length; + s->max_lazy_match = max_lazy; + s->nice_match = nice_length; + s->max_chain_length = max_chain; + return Z_OK; +} + +/* ========================================================================= + * For the default windowBits of 15 and memLevel of 8, this function returns + * a close to exact, as well as small, upper bound on the compressed size. + * They are coded as constants here for a reason--if the #define's are + * changed, then this function needs to be changed as well. The return + * value for 15 and 8 only works for those exact settings. + * + * For any setting other than those defaults for windowBits and memLevel, + * the value returned is a conservative worst case for the maximum expansion + * resulting from using fixed blocks instead of stored blocks, which deflate + * can emit on compressed data for some combinations of the parameters. + * + * This function could be more sophisticated to provide closer upper bounds + * for every combination of windowBits and memLevel, as well as wrap. + * But even the conservative upper bound of about 14% expansion does not + * seem onerous for output buffer allocation. + */ +uLong ZEXPORT deflateBound(strm, sourceLen) + z_streamp strm; + uLong sourceLen; +{ + deflate_state *s; + uLong destLen; + + /* conservative upper bound */ + destLen = sourceLen + + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; + + /* if can't get parameters, return conservative bound */ + if (strm == Z_NULL || strm->state == Z_NULL) + return destLen; + + /* if not default parameters, return conservative bound */ + s = strm->state; + if (s->w_bits != 15 || s->hash_bits != 8 + 7) + return destLen; + + /* default settings: return tight bound for that case */ + return compressBound(sourceLen); +} + +/* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ +local void putShortMSB (s, b) + deflate_state *s; + uInt b; +{ + put_byte(s, (Byte)(b >> 8)); + put_byte(s, (Byte)(b & 0xff)); +} + +/* ========================================================================= + * Flush as much pending output as possible. All deflate() output goes + * through this function so some applications may wish to modify it + * to avoid allocating a large strm->next_out buffer and copying into it. + * (See also read_buf()). + */ +local void flush_pending(strm) + z_streamp strm; +{ + unsigned len = strm->state->pending; + + if (len > strm->avail_out) len = strm->avail_out; + if (len == 0) return; + + zmemcpy(strm->next_out, strm->state->pending_out, len); + strm->next_out += len; + strm->state->pending_out += len; + strm->total_out += len; + strm->avail_out -= len; + strm->state->pending -= len; + if (strm->state->pending == 0) { + strm->state->pending_out = strm->state->pending_buf; + } +} + +/* ========================================================================= */ +int ZEXPORT deflate (strm, flush) + z_streamp strm; + int flush; +{ + int old_flush; /* value of flush param for previous deflate call */ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + flush > Z_FINISH || flush < 0) { + return Z_STREAM_ERROR; + } + s = strm->state; + + if (strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0) || + (s->status == FINISH_STATE && flush != Z_FINISH)) { + ERR_RETURN(strm, Z_STREAM_ERROR); + } + if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); + + s->strm = strm; /* just in case */ + old_flush = s->last_flush; + s->last_flush = flush; + + /* Write the header */ + if (s->status == INIT_STATE) { +#ifdef GZIP + if (s->wrap == 2) { + strm->adler = crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (s->gzhead == NULL) { + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s->status = BUSY_STATE; + } + else { + put_byte(s, (s->gzhead->text ? 1 : 0) + + (s->gzhead->hcrc ? 2 : 0) + + (s->gzhead->extra == Z_NULL ? 0 : 4) + + (s->gzhead->name == Z_NULL ? 0 : 8) + + (s->gzhead->comment == Z_NULL ? 0 : 16) + ); + put_byte(s, (Byte)(s->gzhead->time & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, s->gzhead->os & 0xff); + if (s->gzhead->extra != NULL) { + put_byte(s, s->gzhead->extra_len & 0xff); + put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); + } + if (s->gzhead->hcrc) + strm->adler = crc32(strm->adler, s->pending_buf, + s->pending); + s->gzindex = 0; + s->status = EXTRA_STATE; + } + } + else +#endif + { + uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt level_flags; + + if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) + level_flags = 0; + else if (s->level < 6) + level_flags = 1; + else if (s->level == 6) + level_flags = 2; + else + level_flags = 3; + header |= (level_flags << 6); + if (s->strstart != 0) header |= PRESET_DICT; + header += 31 - (header % 31); + + s->status = BUSY_STATE; + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s->strstart != 0) { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + strm->adler = adler32(0L, Z_NULL, 0); + } + } +#ifdef GZIP + if (s->status == EXTRA_STATE) { + if (s->gzhead->extra != NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + + while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) + break; + } + put_byte(s, s->gzhead->extra[s->gzindex]); + s->gzindex++; + } + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (s->gzindex == s->gzhead->extra_len) { + s->gzindex = 0; + s->status = NAME_STATE; + } + } + else + s->status = NAME_STATE; + } + if (s->status == NAME_STATE) { + if (s->gzhead->name != NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->name[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) { + s->gzindex = 0; + s->status = COMMENT_STATE; + } + } + else + s->status = COMMENT_STATE; + } + if (s->status == COMMENT_STATE) { + if (s->gzhead->comment != NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->comment[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) + s->status = HCRC_STATE; + } + else + s->status = HCRC_STATE; + } + if (s->status == HCRC_STATE) { + if (s->gzhead->hcrc) { + if (s->pending + 2 > s->pending_buf_size) + flush_pending(strm); + if (s->pending + 2 <= s->pending_buf_size) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + strm->adler = crc32(0L, Z_NULL, 0); + s->status = BUSY_STATE; + } + } + else + s->status = BUSY_STATE; + } +#endif + + /* Flush as much pending output as possible */ + if (s->pending != 0) { + flush_pending(strm); + if (strm->avail_out == 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s->last_flush = -1; + return Z_OK; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm->avail_in == 0 && flush <= old_flush && + flush != Z_FINISH) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* User must not provide more input after the first FINISH: */ + if (s->status == FINISH_STATE && strm->avail_in != 0) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* Start a new block or continue the current one. + */ + if (strm->avail_in != 0 || s->lookahead != 0 || + (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { + block_state bstate; + + bstate = (*(configuration_table[s->level].func))(s, flush); + + if (bstate == finish_started || bstate == finish_done) { + s->status = FINISH_STATE; + } + if (bstate == need_more || bstate == finish_started) { + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ + } + return Z_OK; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate == block_done) { + if (flush == Z_PARTIAL_FLUSH) { + _tr_align(s); + } else { /* FULL_FLUSH or SYNC_FLUSH */ + _tr_stored_block(s, (char*)0, 0L, 0); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush == Z_FULL_FLUSH) { + CLEAR_HASH(s); /* forget history */ + } + } + flush_pending(strm); + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK; + } + } + } + Assert(strm->avail_out > 0, "bug2"); + + if (flush != Z_FINISH) return Z_OK; + if (s->wrap <= 0) return Z_STREAM_END; + + /* Write the trailer */ +#ifdef GZIP + if (s->wrap == 2) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); + put_byte(s, (Byte)(strm->total_in & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); + } + else +#endif + { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + flush_pending(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ + return s->pending != 0 ? Z_OK : Z_STREAM_END; +} + +/* ========================================================================= */ +int ZEXPORT deflateEnd (strm) + z_streamp strm; +{ + int status; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + + status = strm->state->status; + if (status != INIT_STATE && + status != EXTRA_STATE && + status != NAME_STATE && + status != COMMENT_STATE && + status != HCRC_STATE && + status != BUSY_STATE && + status != FINISH_STATE) { + return Z_STREAM_ERROR; + } + + /* Deallocate in reverse order of allocations: */ + TRY_FREE(strm, strm->state->pending_buf); + TRY_FREE(strm, strm->state->head); + TRY_FREE(strm, strm->state->prev); + TRY_FREE(strm, strm->state->window); + + ZFREE(strm, strm->state); + strm->state = Z_NULL; + + return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; +} + +/* ========================================================================= + * Copy the source state to the destination state. + * To simplify the source, this is not supported for 16-bit MSDOS (which + * doesn't have enough memory anyway to duplicate compression states). + */ +int ZEXPORT deflateCopy (dest, source) + z_streamp dest; + z_streamp source; +{ +#ifdef MAXSEG_64K + return Z_STREAM_ERROR; +#else + deflate_state *ds; + deflate_state *ss; + ushf *overlay; + + + if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { + return Z_STREAM_ERROR; + } + + ss = source->state; + + zmemcpy(dest, source, sizeof(z_stream)); + + ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); + if (ds == Z_NULL) return Z_MEM_ERROR; + dest->state = (struct internal_state FAR *) ds; + zmemcpy(ds, ss, sizeof(deflate_state)); + ds->strm = dest; + + ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); + ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); + ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); + overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); + ds->pending_buf = (uchf *) overlay; + + if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || + ds->pending_buf == Z_NULL) { + deflateEnd (dest); + return Z_MEM_ERROR; + } + /* following zmemcpy do not work for 16-bit MSDOS */ + zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); + zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); + zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); + zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + + ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); + ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); + ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; + + ds->l_desc.dyn_tree = ds->dyn_ltree; + ds->d_desc.dyn_tree = ds->dyn_dtree; + ds->bl_desc.dyn_tree = ds->bl_tree; + + return Z_OK; +#endif /* MAXSEG_64K */ +} + +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->next_in buffer and copying from it. + * (See also flush_pending()). + */ +local int read_buf(strm, buf, size) + z_streamp strm; + Bytef *buf; + unsigned size; +{ + unsigned len = strm->avail_in; + + if (len > size) len = size; + if (len == 0) return 0; + + strm->avail_in -= len; + + if (strm->state->wrap == 1) { + strm->adler = adler32(strm->adler, strm->next_in, len); + } +#ifdef GZIP + else if (strm->state->wrap == 2) { + strm->adler = crc32(strm->adler, strm->next_in, len); + } +#endif + zmemcpy(buf, strm->next_in, len); + strm->next_in += len; + strm->total_in += len; + + return (int)len; +} + +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +local void lm_init (s) + deflate_state *s; +{ + s->window_size = (ulg)2L*s->w_size; + + CLEAR_HASH(s); + + /* Set the default configuration parameters: + */ + s->max_lazy_match = configuration_table[s->level].max_lazy; + s->good_match = configuration_table[s->level].good_length; + s->nice_match = configuration_table[s->level].nice_length; + s->max_chain_length = configuration_table[s->level].max_chain; + + s->strstart = 0; + s->block_start = 0L; + s->lookahead = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + s->ins_h = 0; +#ifndef FASTEST +#ifdef ASMV + match_init(); /* initialize the asm code */ +#endif +#endif +} + +#ifndef FASTEST +/* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ +#ifndef ASMV +/* For 80x86 and 680x0, an optimized version will be provided in match.asm or + * match.S. The code will be functionally equivalent. + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + unsigned chain_length = s->max_chain_length;/* max hash chain length */ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + int best_len = s->prev_length; /* best match length so far */ + int nice_match = s->nice_match; /* stop if match long enough */ + IPos limit = s->strstart > (IPos)MAX_DIST(s) ? + s->strstart - (IPos)MAX_DIST(s) : NIL; + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + Posf *prev = s->prev; + uInt wmask = s->w_mask; + +#ifdef UNALIGNED_OK + /* Compare two bytes at a time. Note: this is not always beneficial. + * Try with and without -DUNALIGNED_OK to check. + */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; + register ush scan_start = *(ushf*)scan; + register ush scan_end = *(ushf*)(scan+best_len-1); +#else + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + register Byte scan_end1 = scan[best_len-1]; + register Byte scan_end = scan[best_len]; +#endif + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s->prev_length >= s->good_match) { + chain_length >>= 2; + } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + do { + Assert(cur_match < s->strstart, "no future"); + match = s->window + cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ +#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) + /* This code assumes sizeof(unsigned short) == 2. Do not use + * UNALIGNED_OK if your compiler uses a different size. + */ + if (*(ushf*)(match+best_len-1) != scan_end || + *(ushf*)match != scan_start) continue; + + /* It is not necessary to compare scan[2] and match[2] since they are + * always equal when the other bytes match, given that the hash keys + * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at + * strstart+3, +5, ... up to strstart+257. We check for insufficient + * lookahead only every 4th comparison; the 128th check will be made + * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is + * necessary to put more guard bytes at the end of the window, or + * to check more often for insufficient lookahead. + */ + Assert(scan[2] == match[2], "scan[2]?"); + scan++, match++; + do { + } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + scan < strend); + /* The funny "do {}" generates better code on most compilers */ + + /* Here, scan <= window+strstart+257 */ + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + if (*scan == *match) scan++; + + len = (MAX_MATCH - 1) - (int)(strend-scan); + scan = strend - (MAX_MATCH-1); + +#else /* UNALIGNED_OK */ + + if (match[best_len] != scan_end || + match[best_len-1] != scan_end1 || + *match != *scan || + *++match != scan[1]) continue; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match++; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + scan = strend - MAX_MATCH; + +#endif /* UNALIGNED_OK */ + + if (len > best_len) { + s->match_start = cur_match; + best_len = len; + if (len >= nice_match) break; +#ifdef UNALIGNED_OK + scan_end = *(ushf*)(scan+best_len-1); +#else + scan_end1 = scan[best_len-1]; + scan_end = scan[best_len]; +#endif + } + } while ((cur_match = prev[cur_match & wmask]) > limit + && --chain_length != 0); + + if ((uInt)best_len <= s->lookahead) return (uInt)best_len; + return s->lookahead; +} +#endif /* ASMV */ +#endif /* FASTEST */ + +/* --------------------------------------------------------------------------- + * Optimized version for level == 1 or strategy == Z_RLE only + */ +local uInt longest_match_fast(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + Assert(cur_match < s->strstart, "no future"); + + match = s->window + cur_match; + + /* Return failure if the match length is less than 2: + */ + if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match += 2; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + + if (len < MIN_MATCH) return MIN_MATCH - 1; + + s->match_start = cur_match; + return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; +} + +#ifdef DEBUG +/* =========================================================================== + * Check that the match at match_start is indeed a match. + */ +local void check_match(s, start, match, length) + deflate_state *s; + IPos start, match; + int length; +{ + /* check that the match is indeed a match */ + if (zmemcmp(s->window + match, + s->window + start, length) != EQUAL) { + fprintf(stderr, " start %u, match %u, length %d\n", + start, match, length); + do { + fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); + } while (--length != 0); + z_error("invalid match"); + } + if (z_verbose > 1) { + fprintf(stderr,"\\[%d,%d]", start-match, length); + do { putc(s->window[start++], stderr); } while (--length != 0); + } +} +#else +# define check_match(s, start, match, length) +#endif /* DEBUG */ + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +local void fill_window(s) + deflate_state *s; +{ + register unsigned n, m; + register Posf *p; + unsigned more; /* Amount of free space at the end of the window. */ + uInt wsize = s->w_size; + + do { + more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); + + /* Deal with !@#$% 64K limit: */ + if (sizeof(int) <= 2) { + if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + more = wsize; + + } else if (more == (unsigned)(-1)) { + /* Very unlikely, but possible on 16 bit machine if + * strstart == 0 && lookahead == 1 (input done a byte at time) + */ + more--; + } + } + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s->strstart >= wsize+MAX_DIST(s)) { + + zmemcpy(s->window, s->window+wsize, (unsigned)wsize); + s->match_start -= wsize; + s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ + s->block_start -= (long) wsize; + + /* Slide the hash table (could be avoided with 32 bit values + at the expense of memory usage). We slide even when level == 0 + to keep the hash table consistent if we switch back to level > 0 + later. (Using level 0 permanently is not an optimal usage of + zlib, so we don't care about this pathological case.) + */ + /* %%% avoid this when Z_RLE */ + n = s->hash_size; + p = &s->head[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + } while (--n); + + n = wsize; +#ifndef FASTEST + p = &s->prev[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); +#endif + more += wsize; + } + if (s->strm->avail_in == 0) return; + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + Assert(more >= 2, "more < 2"); + + n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s->lookahead >= MIN_MATCH) { + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); +} + +/* =========================================================================== + * Flush the current block, with given end-of-file flag. + * IN assertion: strstart is set to the end of the current match. + */ +#define FLUSH_BLOCK_ONLY(s, eof) { \ + _tr_flush_block(s, (s->block_start >= 0L ? \ + (charf *)&s->window[(unsigned)s->block_start] : \ + (charf *)Z_NULL), \ + (ulg)((long)s->strstart - s->block_start), \ + (eof)); \ + s->block_start = s->strstart; \ + flush_pending(s->strm); \ + Tracev((stderr,"[FLUSH]")); \ +} + +/* Same but force premature exit if necessary. */ +#define FLUSH_BLOCK(s, eof) { \ + FLUSH_BLOCK_ONLY(s, eof); \ + if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ +} + +/* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * This function does not insert new strings in the dictionary since + * uncompressible data is probably not useful. This function is used + * only for the level=0 compression option. + * NOTE: this function should be optimized to avoid extra copying from + * window to pending_buf. + */ +local block_state deflate_stored(s, flush) + deflate_state *s; + int flush; +{ + /* Stored blocks are limited to 0xffff bytes, pending_buf is limited + * to pending_buf_size, and each stored block has a 5 byte header: + */ + ulg max_block_size = 0xffff; + ulg max_start; + + if (max_block_size > s->pending_buf_size - 5) { + max_block_size = s->pending_buf_size - 5; + } + + /* Copy as much as possible from input to output: */ + for (;;) { + /* Fill the window as much as possible: */ + if (s->lookahead <= 1) { + + Assert(s->strstart < s->w_size+MAX_DIST(s) || + s->block_start >= (long)s->w_size, "slide too late"); + + fill_window(s); + if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; + + if (s->lookahead == 0) break; /* flush the current block */ + } + Assert(s->block_start >= 0L, "block gone"); + + s->strstart += s->lookahead; + s->lookahead = 0; + + /* Emit a stored block if pending_buf will be full: */ + max_start = s->block_start + max_block_size; + if (s->strstart == 0 || (ulg)s->strstart >= max_start) { + /* strstart == 0 is possible when wraparound on 16-bit machine */ + s->lookahead = (uInt)(s->strstart - max_start); + s->strstart = (uInt)max_start; + FLUSH_BLOCK(s, 0); + } + /* Flush if we may have to slide, otherwise block_start may become + * negative and the data will be gone: + */ + if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { + FLUSH_BLOCK(s, 0); + } + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} + +/* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ +local block_state deflate_fast(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head = NIL; /* head of the hash chain */ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ +#ifdef FASTEST + if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) || + (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { + s->match_length = longest_match_fast (s, hash_head); + } +#else + if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { + s->match_length = longest_match (s, hash_head); + } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { + s->match_length = longest_match_fast (s, hash_head); + } +#endif + /* longest_match() or longest_match_fast() sets match_start */ + } + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->match_start, s->match_length); + + _tr_tally_dist(s, s->strstart - s->match_start, + s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ +#ifndef FASTEST + if (s->match_length <= s->max_insert_length && + s->lookahead >= MIN_MATCH) { + s->match_length--; /* string at strstart already in table */ + do { + s->strstart++; + INSERT_STRING(s, s->strstart, hash_head); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s->match_length != 0); + s->strstart++; + } else +#endif + { + s->strstart += s->match_length; + s->match_length = 0; + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} + +#ifndef FASTEST +/* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ +local block_state deflate_slow(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head = NIL; /* head of hash chain */ + int bflush; /* set if current block must be flushed */ + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + */ + s->prev_length = s->match_length, s->prev_match = s->match_start; + s->match_length = MIN_MATCH-1; + + if (hash_head != NIL && s->prev_length < s->max_lazy_match && + s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { + s->match_length = longest_match (s, hash_head); + } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { + s->match_length = longest_match_fast (s, hash_head); + } + /* longest_match() or longest_match_fast() sets match_start */ + + if (s->match_length <= 5 && (s->strategy == Z_FILTERED +#if TOO_FAR <= 32767 + || (s->match_length == MIN_MATCH && + s->strstart - s->match_start > TOO_FAR) +#endif + )) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s->match_length = MIN_MATCH-1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { + uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; + /* Do not insert strings in hash table beyond this. */ + + check_match(s, s->strstart-1, s->prev_match, s->prev_length); + + _tr_tally_dist(s, s->strstart -1 - s->prev_match, + s->prev_length - MIN_MATCH, bflush); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s->lookahead -= s->prev_length-1; + s->prev_length -= 2; + do { + if (++s->strstart <= max_insert) { + INSERT_STRING(s, s->strstart, hash_head); + } + } while (--s->prev_length != 0); + s->match_available = 0; + s->match_length = MIN_MATCH-1; + s->strstart++; + + if (bflush) FLUSH_BLOCK(s, 0); + + } else if (s->match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + if (bflush) { + FLUSH_BLOCK_ONLY(s, 0); + } + s->strstart++; + s->lookahead--; + if (s->strm->avail_out == 0) return need_more; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s->match_available = 1; + s->strstart++; + s->lookahead--; + } + } + Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s->match_available) { + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + s->match_available = 0; + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} +#endif /* FASTEST */ + +#if 0 +/* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ +local block_state deflate_rle(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + uInt run; /* length of run */ + uInt max; /* maximum length of run */ + uInt prev; /* byte at distance one to match */ + Bytef *scan; /* scan for end of run */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest encodable run. + */ + if (s->lookahead < MAX_MATCH) { + fill_window(s); + if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + run = 0; + if (s->strstart > 0) { /* if there is a previous byte, that is */ + max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH; + scan = s->window + s->strstart - 1; + prev = *scan++; + do { + if (*scan++ != prev) + break; + } while (++run < max); + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (run >= MIN_MATCH) { + check_match(s, s->strstart, s->strstart - 1, run); + _tr_tally_dist(s, 1, run - MIN_MATCH, bflush); + s->lookahead -= run; + s->strstart += run; + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} +#endif diff --git a/src/misc/zlib/deflate.h b/src/misc/zlib/deflate.h new file mode 100644 index 000000000..05a5ab3a2 --- /dev/null +++ b/src/misc/zlib/deflate.h @@ -0,0 +1,331 @@ +/* deflate.h -- internal compression state + * Copyright (C) 1995-2004 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef DEFLATE_H +#define DEFLATE_H + +#include "zutil.h" + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer creation by deflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip encoding + should be left enabled. */ +#ifndef NO_GZIP +# define GZIP +#endif + +/* =========================================================================== + * Internal compression state. + */ + +#define LENGTH_CODES 29 +/* number of length codes, not counting the special END_BLOCK code */ + +#define LITERALS 256 +/* number of literal bytes 0..255 */ + +#define L_CODES (LITERALS+1+LENGTH_CODES) +/* number of Literal or Length codes, including the END_BLOCK code */ + +#define D_CODES 30 +/* number of distance codes */ + +#define BL_CODES 19 +/* number of codes used to transfer the bit lengths */ + +#define HEAP_SIZE (2*L_CODES+1) +/* maximum heap size */ + +#define MAX_BITS 15 +/* All codes must not exceed MAX_BITS bits */ + +#define INIT_STATE 42 +#define EXTRA_STATE 69 +#define NAME_STATE 73 +#define COMMENT_STATE 91 +#define HCRC_STATE 103 +#define BUSY_STATE 113 +#define FINISH_STATE 666 +/* Stream status */ + + +/* Data structure describing a single value and its code string. */ +typedef struct ct_data_s { + union { + ush freq; /* frequency count */ + ush code; /* bit string */ + } fc; + union { + ush dad; /* father node in Huffman tree */ + ush len; /* length of bit string */ + } dl; +} FAR ct_data; + +#define Freq fc.freq +#define Code fc.code +#define Dad dl.dad +#define Len dl.len + +typedef struct static_tree_desc_s static_tree_desc; + +typedef struct tree_desc_s { + ct_data *dyn_tree; /* the dynamic tree */ + int max_code; /* largest code with non zero frequency */ + static_tree_desc *stat_desc; /* the corresponding static tree */ +} FAR tree_desc; + +typedef ush Pos; +typedef Pos FAR Posf; +typedef unsigned IPos; + +/* A Pos is an index in the character window. We use short instead of int to + * save space in the various tables. IPos is used only for parameter passing. + */ + +typedef struct internal_state { + z_streamp strm; /* pointer back to this zlib stream */ + int status; /* as the name implies */ + Bytef *pending_buf; /* output still pending */ + ulg pending_buf_size; /* size of pending_buf */ + Bytef *pending_out; /* next pending byte to output to the stream */ + uInt pending; /* nb of bytes in the pending buffer */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + gz_headerp gzhead; /* gzip header information to write */ + uInt gzindex; /* where in extra, name, or comment */ + Byte method; /* STORED (for zip only) or DEFLATED */ + int last_flush; /* value of flush param for previous deflate call */ + + /* used by deflate.c: */ + + uInt w_size; /* LZ77 window size (32K by default) */ + uInt w_bits; /* log2(w_size) (8..16) */ + uInt w_mask; /* w_size - 1 */ + + Bytef *window; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. Also, it limits + * the window size to 64K, which is quite useful on MSDOS. + * To do: use the user input buffer as sliding window. + */ + + ulg window_size; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + Posf *prev; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + Posf *head; /* Heads of the hash chains or NIL. */ + + uInt ins_h; /* hash index of string to be inserted */ + uInt hash_size; /* number of elements in hash table */ + uInt hash_bits; /* log2(hash_size) */ + uInt hash_mask; /* hash_size-1 */ + + uInt hash_shift; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + long block_start; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + uInt match_length; /* length of best match */ + IPos prev_match; /* previous match */ + int match_available; /* set if previous match exists */ + uInt strstart; /* start of string to insert */ + uInt match_start; /* start of matching string */ + uInt lookahead; /* number of valid bytes ahead in window */ + + uInt prev_length; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + uInt max_chain_length; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + uInt max_lazy_match; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ +# define max_insert_length max_lazy_match + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + int level; /* compression level (1..9) */ + int strategy; /* favor or force Huffman coding*/ + + uInt good_match; + /* Use a faster search when the previous match is longer than this */ + + int nice_match; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + /* Didn't use ct_data typedef below to supress compiler warning */ + struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + struct tree_desc_s l_desc; /* desc. for literal tree */ + struct tree_desc_s d_desc; /* desc. for distance tree */ + struct tree_desc_s bl_desc; /* desc. for bit length tree */ + + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + int heap_len; /* number of elements in the heap */ + int heap_max; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + uch depth[2*L_CODES+1]; + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + uchf *l_buf; /* buffer for literals or lengths */ + + uInt lit_bufsize; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + uInt last_lit; /* running index in l_buf */ + + ushf *d_buf; + /* Buffer for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + ulg opt_len; /* bit length of current block with optimal trees */ + ulg static_len; /* bit length of current block with static trees */ + uInt matches; /* number of string matches in current block */ + int last_eob_len; /* bit length of EOB code for last block */ + +#ifdef DEBUG + ulg compressed_len; /* total bit length of compressed file mod 2^32 */ + ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ +#endif + + ush bi_buf; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + int bi_valid; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + +} FAR deflate_state; + +/* Output a byte on the stream. + * IN assertion: there is enough room in pending_buf. + */ +#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} + + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) +/* In order to simplify the code, particularly on 16 bit machines, match + * distances are limited to MAX_DIST instead of WSIZE. + */ + + /* in trees.c */ +void _tr_init OF((deflate_state *s)); +int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, + int eof)); +void _tr_align OF((deflate_state *s)); +void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, + int eof)); + +#define d_code(dist) \ + ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) +/* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. _dist_code[256] and _dist_code[257] are never + * used. + */ + +#ifndef DEBUG +/* Inline versions of _tr_tally for speed: */ + +#if defined(GEN_TREES_H) || !defined(STDC) + extern uch _length_code[]; + extern uch _dist_code[]; +#else + extern const uch _length_code[]; + extern const uch _dist_code[]; +#endif + +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->last_lit] = 0; \ + s->l_buf[s->last_lit++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (length); \ + ush dist = (distance); \ + s->d_buf[s->last_lit] = dist; \ + s->l_buf[s->last_lit++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +#else +# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) +# define _tr_tally_dist(s, distance, length, flush) \ + flush = _tr_tally(s, distance, length) +#endif + +#endif /* DEFLATE_H */ diff --git a/src/misc/zlib/gzio.c b/src/misc/zlib/gzio.c new file mode 100644 index 000000000..7e90f4928 --- /dev/null +++ b/src/misc/zlib/gzio.c @@ -0,0 +1,1026 @@ +/* gzio.c -- IO on .gz files + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Compile this file with -DNO_GZCOMPRESS to avoid the compression code. + */ + +/* @(#) $Id$ */ + +#include + +#include "zutil.h" + +#ifdef NO_DEFLATE /* for compatibility with old definition */ +# define NO_GZCOMPRESS +#endif + +#ifndef NO_DUMMY_DECL +struct internal_state {int dummy;}; /* for buggy compilers */ +#endif + +#ifndef Z_BUFSIZE +# ifdef MAXSEG_64K +# define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */ +# else +# define Z_BUFSIZE 16384 +# endif +#endif +#ifndef Z_PRINTF_BUFSIZE +# define Z_PRINTF_BUFSIZE 4096 +#endif + +#ifdef __MVS__ +# pragma map (fdopen , "\174\174FDOPEN") + FILE *fdopen(int, const char *); +#endif + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern void free OF((voidpf ptr)); +#endif + +#define ALLOC(size) malloc(size) +#define TRYFREE(p) {if (p) free(p);} + +static int const gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ + +/* gzip flag byte */ +#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ +#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ +#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ +#define ORIG_NAME 0x08 /* bit 3 set: original file name present */ +#define COMMENT 0x10 /* bit 4 set: file comment present */ +#define RESERVED 0xE0 /* bits 5..7: reserved */ + +typedef struct gz_stream { + z_stream stream; + int z_err; /* error code for last stream operation */ + int z_eof; /* set if end of input file */ + FILE *file; /* .gz file */ + Byte *inbuf; /* input buffer */ + Byte *outbuf; /* output buffer */ + uLong crc; /* crc32 of uncompressed data */ + char *msg; /* error message */ + char *path; /* path name for debugging only */ + int transparent; /* 1 if input file is not a .gz file */ + char mode; /* 'w' or 'r' */ + z_off_t start; /* start of compressed data in file (header skipped) */ + z_off_t in; /* bytes into deflate or inflate */ + z_off_t out; /* bytes out of deflate or inflate */ + int back; /* one character push-back */ + int last; /* true if push-back is last character */ +} gz_stream; + + +local gzFile gz_open OF((const char *path, const char *mode, int fd)); +local int do_flush OF((gzFile file, int flush)); +local int get_byte OF((gz_stream *s)); +local void check_header OF((gz_stream *s)); +local int destroy OF((gz_stream *s)); +local void putLong OF((FILE *file, uLong x)); +local uLong getLong OF((gz_stream *s)); + +/* =========================================================================== + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb"). The file is given either by file descriptor + or path name (if fd == -1). + gz_open returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). +*/ +local gzFile gz_open (path, mode, fd) + const char *path; + const char *mode; + int fd; +{ + int err; + int level = Z_DEFAULT_COMPRESSION; /* compression level */ + int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */ + char *p = (char*)mode; + gz_stream *s; + char fmode[80]; /* copy of mode, without the compression level */ + char *m = fmode; + + if (!path || !mode) return Z_NULL; + + s = (gz_stream *)ALLOC(sizeof(gz_stream)); + if (!s) return Z_NULL; + + s->stream.zalloc = (alloc_func)0; + s->stream.zfree = (free_func)0; + s->stream.opaque = (voidpf)0; + s->stream.next_in = s->inbuf = Z_NULL; + s->stream.next_out = s->outbuf = Z_NULL; + s->stream.avail_in = s->stream.avail_out = 0; + s->file = NULL; + s->z_err = Z_OK; + s->z_eof = 0; + s->in = 0; + s->out = 0; + s->back = EOF; + s->crc = crc32(0L, Z_NULL, 0); + s->msg = NULL; + s->transparent = 0; + + s->path = (char*)ALLOC(strlen(path)+1); + if (s->path == NULL) { + return destroy(s), (gzFile)Z_NULL; + } + strcpy(s->path, path); /* do this early for debugging */ + + s->mode = '\0'; + do { + if (*p == 'r') s->mode = 'r'; + if (*p == 'w' || *p == 'a') s->mode = 'w'; + if (*p >= '0' && *p <= '9') { + level = *p - '0'; + } else if (*p == 'f') { + strategy = Z_FILTERED; + } else if (*p == 'h') { + strategy = Z_HUFFMAN_ONLY; + } else if (*p == 'R') { + strategy = Z_RLE; + } else { + *m++ = *p; /* copy the mode */ + } + } while (*p++ && m != fmode + sizeof(fmode)); + if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL; + + if (s->mode == 'w') { +#ifdef NO_GZCOMPRESS + err = Z_STREAM_ERROR; +#else + err = deflateInit2(&(s->stream), level, + Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy); + /* windowBits is passed < 0 to suppress zlib header */ + + s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); +#endif + if (err != Z_OK || s->outbuf == Z_NULL) { + return destroy(s), (gzFile)Z_NULL; + } + } else { + s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); + + err = inflateInit2(&(s->stream), -MAX_WBITS); + /* windowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are + * present after the compressed stream. + */ + if (err != Z_OK || s->inbuf == Z_NULL) { + return destroy(s), (gzFile)Z_NULL; + } + } + s->stream.avail_out = Z_BUFSIZE; + + errno = 0; + s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode); + + if (s->file == NULL) { + return destroy(s), (gzFile)Z_NULL; + } + if (s->mode == 'w') { + /* Write a very simple .gz header: + */ + fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], + Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); + s->start = 10L; + /* We use 10L instead of ftell(s->file) to because ftell causes an + * fflush on some systems. This version of the library doesn't use + * start anyway in write mode, so this initialization is not + * necessary. + */ + } else { + check_header(s); /* skip the .gz header */ + s->start = ftell(s->file) - s->stream.avail_in; + } + + return (gzFile)s; +} + +/* =========================================================================== + Opens a gzip (.gz) file for reading or writing. +*/ +gzFile ZEXPORT gzopen (path, mode) + const char *path; + const char *mode; +{ + return gz_open (path, mode, -1); +} + +/* =========================================================================== + Associate a gzFile with the file descriptor fd. fd is not dup'ed here + to mimic the behavio(u)r of fdopen. +*/ +gzFile ZEXPORT gzdopen (fd, mode) + int fd; + const char *mode; +{ + char name[46]; /* allow for up to 128-bit integers */ + + if (fd < 0) return (gzFile)Z_NULL; + sprintf(name, "", fd); /* for debugging */ + + return gz_open (name, mode, fd); +} + +/* =========================================================================== + * Update the compression level and strategy + */ +int ZEXPORT gzsetparams (file, level, strategy) + gzFile file; + int level; + int strategy; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; + + /* Make room to allow flushing */ + if (s->stream.avail_out == 0) { + + s->stream.next_out = s->outbuf; + if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { + s->z_err = Z_ERRNO; + } + s->stream.avail_out = Z_BUFSIZE; + } + + return deflateParams (&(s->stream), level, strategy); +} + +/* =========================================================================== + Read a byte from a gz_stream; update next_in and avail_in. Return EOF + for end of file. + IN assertion: the stream s has been sucessfully opened for reading. +*/ +local int get_byte(s) + gz_stream *s; +{ + if (s->z_eof) return EOF; + if (s->stream.avail_in == 0) { + errno = 0; + s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); + if (s->stream.avail_in == 0) { + s->z_eof = 1; + if (ferror(s->file)) s->z_err = Z_ERRNO; + return EOF; + } + s->stream.next_in = s->inbuf; + } + s->stream.avail_in--; + return *(s->stream.next_in)++; +} + +/* =========================================================================== + Check the gzip header of a gz_stream opened for reading. Set the stream + mode to transparent if the gzip magic header is not present; set s->err + to Z_DATA_ERROR if the magic header is present but the rest of the header + is incorrect. + IN assertion: the stream s has already been created sucessfully; + s->stream.avail_in is zero for the first time, but may be non-zero + for concatenated .gz files. +*/ +local void check_header(s) + gz_stream *s; +{ + int method; /* method byte */ + int flags; /* flags byte */ + uInt len; + int c; + + /* Assure two bytes in the buffer so we can peek ahead -- handle case + where first byte of header is at the end of the buffer after the last + gzip segment */ + len = s->stream.avail_in; + if (len < 2) { + if (len) s->inbuf[0] = s->stream.next_in[0]; + errno = 0; + len = (uInt)fread(s->inbuf + len, 1, Z_BUFSIZE >> len, s->file); + if (len == 0 && ferror(s->file)) s->z_err = Z_ERRNO; + s->stream.avail_in += len; + s->stream.next_in = s->inbuf; + if (s->stream.avail_in < 2) { + s->transparent = s->stream.avail_in; + return; + } + } + + /* Peek ahead to check the gzip magic header */ + if (s->stream.next_in[0] != gz_magic[0] || + s->stream.next_in[1] != gz_magic[1]) { + s->transparent = 1; + return; + } + s->stream.avail_in -= 2; + s->stream.next_in += 2; + + /* Check the rest of the gzip header */ + method = get_byte(s); + flags = get_byte(s); + if (method != Z_DEFLATED || (flags & RESERVED) != 0) { + s->z_err = Z_DATA_ERROR; + return; + } + + /* Discard time, xflags and OS code: */ + for (len = 0; len < 6; len++) (void)get_byte(s); + + if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ + len = (uInt)get_byte(s); + len += ((uInt)get_byte(s))<<8; + /* len is garbage if EOF but the loop below will quit anyway */ + while (len-- != 0 && get_byte(s) != EOF) ; + } + if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ + while ((c = get_byte(s)) != 0 && c != EOF) ; + } + if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ + while ((c = get_byte(s)) != 0 && c != EOF) ; + } + if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ + for (len = 0; len < 2; len++) (void)get_byte(s); + } + s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK; +} + + /* =========================================================================== + * Cleanup then free the given gz_stream. Return a zlib error code. + Try freeing in the reverse order of allocations. + */ +local int destroy (s) + gz_stream *s; +{ + int err = Z_OK; + + if (!s) return Z_STREAM_ERROR; + + TRYFREE(s->msg); + + if (s->stream.state != NULL) { + if (s->mode == 'w') { +#ifdef NO_GZCOMPRESS + err = Z_STREAM_ERROR; +#else + err = deflateEnd(&(s->stream)); +#endif + } else if (s->mode == 'r') { + err = inflateEnd(&(s->stream)); + } + } + if (s->file != NULL && fclose(s->file)) { +#ifdef ESPIPE + if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */ +#endif + err = Z_ERRNO; + } + if (s->z_err < 0) err = s->z_err; + + TRYFREE(s->inbuf); + TRYFREE(s->outbuf); + TRYFREE(s->path); + TRYFREE(s); + return err; +} + +/* =========================================================================== + Reads the given number of uncompressed bytes from the compressed file. + gzread returns the number of bytes actually read (0 for end of file). +*/ +int ZEXPORT gzread (file, buf, len) + gzFile file; + voidp buf; + unsigned len; +{ + gz_stream *s = (gz_stream*)file; + Bytef *start = (Bytef*)buf; /* starting point for crc computation */ + Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */ + + if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR; + + if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1; + if (s->z_err == Z_STREAM_END) return 0; /* EOF */ + + next_out = (Byte*)buf; + s->stream.next_out = (Bytef*)buf; + s->stream.avail_out = len; + + if (s->stream.avail_out && s->back != EOF) { + *next_out++ = s->back; + s->stream.next_out++; + s->stream.avail_out--; + s->back = EOF; + s->out++; + start++; + if (s->last) { + s->z_err = Z_STREAM_END; + return 1; + } + } + + while (s->stream.avail_out != 0) { + + if (s->transparent) { + /* Copy first the lookahead bytes: */ + uInt n = s->stream.avail_in; + if (n > s->stream.avail_out) n = s->stream.avail_out; + if (n > 0) { + zmemcpy(s->stream.next_out, s->stream.next_in, n); + next_out += n; + s->stream.next_out = next_out; + s->stream.next_in += n; + s->stream.avail_out -= n; + s->stream.avail_in -= n; + } + if (s->stream.avail_out > 0) { + s->stream.avail_out -= + (uInt)fread(next_out, 1, s->stream.avail_out, s->file); + } + len -= s->stream.avail_out; + s->in += len; + s->out += len; + if (len == 0) s->z_eof = 1; + return (int)len; + } + if (s->stream.avail_in == 0 && !s->z_eof) { + + errno = 0; + s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); + if (s->stream.avail_in == 0) { + s->z_eof = 1; + if (ferror(s->file)) { + s->z_err = Z_ERRNO; + break; + } + } + s->stream.next_in = s->inbuf; + } + s->in += s->stream.avail_in; + s->out += s->stream.avail_out; + s->z_err = inflate(&(s->stream), Z_NO_FLUSH); + s->in -= s->stream.avail_in; + s->out -= s->stream.avail_out; + + if (s->z_err == Z_STREAM_END) { + /* Check CRC and original size */ + s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); + start = s->stream.next_out; + + if (getLong(s) != s->crc) { + s->z_err = Z_DATA_ERROR; + } else { + (void)getLong(s); + /* The uncompressed length returned by above getlong() may be + * different from s->out in case of concatenated .gz files. + * Check for such files: + */ + check_header(s); + if (s->z_err == Z_OK) { + inflateReset(&(s->stream)); + s->crc = crc32(0L, Z_NULL, 0); + } + } + } + if (s->z_err != Z_OK || s->z_eof) break; + } + s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); + + if (len == s->stream.avail_out && + (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO)) + return -1; + return (int)(len - s->stream.avail_out); +} + + +/* =========================================================================== + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +*/ +int ZEXPORT gzgetc(file) + gzFile file; +{ + unsigned char c; + + return gzread(file, &c, 1) == 1 ? c : -1; +} + + +/* =========================================================================== + Push one byte back onto the stream. +*/ +int ZEXPORT gzungetc(c, file) + int c; + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'r' || c == EOF || s->back != EOF) return EOF; + s->back = c; + s->out--; + s->last = (s->z_err == Z_STREAM_END); + if (s->last) s->z_err = Z_OK; + s->z_eof = 0; + return c; +} + + +/* =========================================================================== + Reads bytes from the compressed file until len-1 characters are + read, or a newline character is read and transferred to buf, or an + end-of-file condition is encountered. The string is then terminated + with a null character. + gzgets returns buf, or Z_NULL in case of error. + + The current implementation is not optimized at all. +*/ +char * ZEXPORT gzgets(file, buf, len) + gzFile file; + char *buf; + int len; +{ + char *b = buf; + if (buf == Z_NULL || len <= 0) return Z_NULL; + + while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ; + *buf = '\0'; + return b == buf && len > 0 ? Z_NULL : b; +} + + +#ifndef NO_GZCOMPRESS +/* =========================================================================== + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of bytes actually written (0 in case of error). +*/ +int ZEXPORT gzwrite (file, buf, len) + gzFile file; + voidpc buf; + unsigned len; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; + + s->stream.next_in = (Bytef*)buf; + s->stream.avail_in = len; + + while (s->stream.avail_in != 0) { + + if (s->stream.avail_out == 0) { + + s->stream.next_out = s->outbuf; + if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { + s->z_err = Z_ERRNO; + break; + } + s->stream.avail_out = Z_BUFSIZE; + } + s->in += s->stream.avail_in; + s->out += s->stream.avail_out; + s->z_err = deflate(&(s->stream), Z_NO_FLUSH); + s->in -= s->stream.avail_in; + s->out -= s->stream.avail_out; + if (s->z_err != Z_OK) break; + } + s->crc = crc32(s->crc, (const Bytef *)buf, len); + + return (int)(len - s->stream.avail_in); +} + + +/* =========================================================================== + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). +*/ +#ifdef STDC +#include + +int ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...) +{ + char buf[Z_PRINTF_BUFSIZE]; + va_list va; + int len; + + buf[sizeof(buf) - 1] = 0; + va_start(va, format); +#ifdef NO_vsnprintf +# ifdef HAS_vsprintf_void + (void)vsprintf(buf, format, va); + va_end(va); + for (len = 0; len < sizeof(buf); len++) + if (buf[len] == 0) break; +# else + len = vsprintf(buf, format, va); + va_end(va); +# endif +#else +# ifdef HAS_vsnprintf_void + (void)vsnprintf(buf, sizeof(buf), format, va); + va_end(va); + len = strlen(buf); +# else + len = vsnprintf(buf, sizeof(buf), format, va); + va_end(va); +# endif +#endif + if (len <= 0 || len >= (int)sizeof(buf) || buf[sizeof(buf) - 1] != 0) + return 0; + return gzwrite(file, buf, (unsigned)len); +} +#else /* not ANSI C */ + +int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + gzFile file; + const char *format; + int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +{ + char buf[Z_PRINTF_BUFSIZE]; + int len; + + buf[sizeof(buf) - 1] = 0; +#ifdef NO_snprintf +# ifdef HAS_sprintf_void + sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + for (len = 0; len < sizeof(buf); len++) + if (buf[len] == 0) break; +# else + len = sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#else +# ifdef HAS_snprintf_void + snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = strlen(buf); +# else + len = snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#endif + if (len <= 0 || len >= sizeof(buf) || buf[sizeof(buf) - 1] != 0) + return 0; + return gzwrite(file, buf, len); +} +#endif + +/* =========================================================================== + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +*/ +int ZEXPORT gzputc(file, c) + gzFile file; + int c; +{ + unsigned char cc = (unsigned char) c; /* required for big endian systems */ + + return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1; +} + + +/* =========================================================================== + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + gzputs returns the number of characters written, or -1 in case of error. +*/ +int ZEXPORT gzputs(file, s) + gzFile file; + const char *s; +{ + return gzwrite(file, (char*)s, (unsigned)strlen(s)); +} + + +/* =========================================================================== + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. +*/ +local int do_flush (file, flush) + gzFile file; + int flush; +{ + uInt len; + int done = 0; + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; + + s->stream.avail_in = 0; /* should be zero already anyway */ + + for (;;) { + len = Z_BUFSIZE - s->stream.avail_out; + + if (len != 0) { + if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) { + s->z_err = Z_ERRNO; + return Z_ERRNO; + } + s->stream.next_out = s->outbuf; + s->stream.avail_out = Z_BUFSIZE; + } + if (done) break; + s->out += s->stream.avail_out; + s->z_err = deflate(&(s->stream), flush); + s->out -= s->stream.avail_out; + + /* Ignore the second of two consecutive flushes: */ + if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK; + + /* deflate has finished flushing only when it hasn't used up + * all the available space in the output buffer: + */ + done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END); + + if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break; + } + return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; +} + +int ZEXPORT gzflush (file, flush) + gzFile file; + int flush; +{ + gz_stream *s = (gz_stream*)file; + int err = do_flush (file, flush); + + if (err) return err; + fflush(s->file); + return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; +} +#endif /* NO_GZCOMPRESS */ + +/* =========================================================================== + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error. + SEEK_END is not implemented, returns error. + In this version of the library, gzseek can be extremely slow. +*/ +z_off_t ZEXPORT gzseek (file, offset, whence) + gzFile file; + z_off_t offset; + int whence; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || whence == SEEK_END || + s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) { + return -1L; + } + + if (s->mode == 'w') { +#ifdef NO_GZCOMPRESS + return -1L; +#else + if (whence == SEEK_SET) { + offset -= s->in; + } + if (offset < 0) return -1L; + + /* At this point, offset is the number of zero bytes to write. */ + if (s->inbuf == Z_NULL) { + s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */ + if (s->inbuf == Z_NULL) return -1L; + zmemzero(s->inbuf, Z_BUFSIZE); + } + while (offset > 0) { + uInt size = Z_BUFSIZE; + if (offset < Z_BUFSIZE) size = (uInt)offset; + + size = gzwrite(file, s->inbuf, size); + if (size == 0) return -1L; + + offset -= size; + } + return s->in; +#endif + } + /* Rest of function is for reading only */ + + /* compute absolute position */ + if (whence == SEEK_CUR) { + offset += s->out; + } + if (offset < 0) return -1L; + + if (s->transparent) { + /* map to fseek */ + s->back = EOF; + s->stream.avail_in = 0; + s->stream.next_in = s->inbuf; + if (fseek(s->file, offset, SEEK_SET) < 0) return -1L; + + s->in = s->out = offset; + return offset; + } + + /* For a negative seek, rewind and use positive seek */ + if (offset >= s->out) { + offset -= s->out; + } else if (gzrewind(file) < 0) { + return -1L; + } + /* offset is now the number of bytes to skip. */ + + if (offset != 0 && s->outbuf == Z_NULL) { + s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); + if (s->outbuf == Z_NULL) return -1L; + } + if (offset && s->back != EOF) { + s->back = EOF; + s->out++; + offset--; + if (s->last) s->z_err = Z_STREAM_END; + } + while (offset > 0) { + int size = Z_BUFSIZE; + if (offset < Z_BUFSIZE) size = (int)offset; + + size = gzread(file, s->outbuf, (uInt)size); + if (size <= 0) return -1L; + offset -= size; + } + return s->out; +} + +/* =========================================================================== + Rewinds input file. +*/ +int ZEXPORT gzrewind (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'r') return -1; + + s->z_err = Z_OK; + s->z_eof = 0; + s->back = EOF; + s->stream.avail_in = 0; + s->stream.next_in = s->inbuf; + s->crc = crc32(0L, Z_NULL, 0); + if (!s->transparent) (void)inflateReset(&s->stream); + s->in = 0; + s->out = 0; + return fseek(s->file, s->start, SEEK_SET); +} + +/* =========================================================================== + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. +*/ +z_off_t ZEXPORT gztell (file) + gzFile file; +{ + return gzseek(file, 0L, SEEK_CUR); +} + +/* =========================================================================== + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +*/ +int ZEXPORT gzeof (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + /* With concatenated compressed files that can have embedded + * crc trailers, z_eof is no longer the only/best indicator of EOF + * on a gz_stream. Handle end-of-stream error explicitly here. + */ + if (s == NULL || s->mode != 'r') return 0; + if (s->z_eof) return 1; + return s->z_err == Z_STREAM_END; +} + +/* =========================================================================== + Returns 1 if reading and doing so transparently, otherwise zero. +*/ +int ZEXPORT gzdirect (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'r') return 0; + return s->transparent; +} + +/* =========================================================================== + Outputs a long in LSB order to the given file +*/ +local void putLong (file, x) + FILE *file; + uLong x; +{ + int n; + for (n = 0; n < 4; n++) { + fputc((int)(x & 0xff), file); + x >>= 8; + } +} + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets z_err in case + of error. +*/ +local uLong getLong (s) + gz_stream *s; +{ + uLong x = (uLong)get_byte(s); + int c; + + x += ((uLong)get_byte(s))<<8; + x += ((uLong)get_byte(s))<<16; + c = get_byte(s); + if (c == EOF) s->z_err = Z_DATA_ERROR; + x += ((uLong)c)<<24; + return x; +} + +/* =========================================================================== + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. +*/ +int ZEXPORT gzclose (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL) return Z_STREAM_ERROR; + + if (s->mode == 'w') { +#ifdef NO_GZCOMPRESS + return Z_STREAM_ERROR; +#else + if (do_flush (file, Z_FINISH) != Z_OK) + return destroy((gz_stream*)file); + + putLong (s->file, s->crc); + putLong (s->file, (uLong)(s->in & 0xffffffff)); +#endif + } + return destroy((gz_stream*)file); +} + +#ifdef STDC +# define zstrerror(errnum) strerror(errnum) +#else +# define zstrerror(errnum) "" +#endif + +/* =========================================================================== + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +*/ +const char * ZEXPORT gzerror (file, errnum) + gzFile file; + int *errnum; +{ + char *m; + gz_stream *s = (gz_stream*)file; + + if (s == NULL) { + *errnum = Z_STREAM_ERROR; + return (const char*)ERR_MSG(Z_STREAM_ERROR); + } + *errnum = s->z_err; + if (*errnum == Z_OK) return (const char*)""; + + m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg); + + if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err); + + TRYFREE(s->msg); + s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3); + if (s->msg == Z_NULL) return (const char*)ERR_MSG(Z_MEM_ERROR); + strcpy(s->msg, s->path); + strcat(s->msg, ": "); + strcat(s->msg, m); + return (const char*)s->msg; +} + +/* =========================================================================== + Clear the error and end-of-file flags, and do the same for the real file. +*/ +void ZEXPORT gzclearerr (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL) return; + if (s->z_err != Z_STREAM_END) s->z_err = Z_OK; + s->z_eof = 0; + clearerr(s->file); +} diff --git a/src/misc/zlib/infback.c b/src/misc/zlib/infback.c new file mode 100644 index 000000000..455dbc9ee --- /dev/null +++ b/src/misc/zlib/infback.c @@ -0,0 +1,623 @@ +/* infback.c -- inflate using a call-back interface + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + This code is largely copied from inflate.c. Normally either infback.o or + inflate.o would be linked into an application--not both. The interface + with inffast.c is retained so that optimized assembler-coded versions of + inflate_fast() can be used with either inflate.c or infback.c. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); + +/* + strm provides memory allocation functions in zalloc and zfree, or + Z_NULL to use the library memory allocation functions. + + windowBits is in the range 8..15, and window is a user-supplied + window and output buffer that is 2**windowBits bytes. + */ +int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) +z_streamp strm; +int windowBits; +unsigned char FAR *window; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL || window == Z_NULL || + windowBits < 8 || windowBits > 15) + return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *)ZALLOC(strm, 1, + sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->dmax = 32768U; + state->wbits = windowBits; + state->wsize = 1U << windowBits; + state->window = window; + state->write = 0; + state->whave = 0; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +/* Macros for inflateBack(): */ + +/* Load returned state from inflate_fast() */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Set state from registers for inflate_fast() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Assure that some input is available. If input is requested, but denied, + then return a Z_BUF_ERROR from inflateBack(). */ +#define PULL() \ + do { \ + if (have == 0) { \ + have = in(in_desc, &next); \ + if (have == 0) { \ + next = Z_NULL; \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflateBack() + with an error if there is no input available. */ +#define PULLBYTE() \ + do { \ + PULL(); \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflateBack() with + an error. */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Assure that some output space is available, by writing out the window + if it's full. If the write fails, return from inflateBack() with a + Z_BUF_ERROR. */ +#define ROOM() \ + do { \ + if (left == 0) { \ + put = state->window; \ + left = state->wsize; \ + state->whave = left; \ + if (out(out_desc, put, left)) { \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* + strm provides the memory allocation functions and window buffer on input, + and provides information on the unused input on return. For Z_DATA_ERROR + returns, strm will also provide an error message. + + in() and out() are the call-back input and output functions. When + inflateBack() needs more input, it calls in(). When inflateBack() has + filled the window with output, or when it completes with data in the + window, it calls out() to write out the data. The application must not + change the provided input until in() is called again or inflateBack() + returns. The application must not change the window/output buffer until + inflateBack() returns. + + in() and out() are called with a descriptor parameter provided in the + inflateBack() call. This parameter can be a structure that provides the + information required to do the read or write, as well as accumulated + information on the input and output such as totals and check values. + + in() should return zero on failure. out() should return non-zero on + failure. If either in() or out() fails, than inflateBack() returns a + Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it + was in() or out() that caused in the error. Otherwise, inflateBack() + returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format + error, or Z_MEM_ERROR if it could not allocate memory for the state. + inflateBack() can also return Z_STREAM_ERROR if the input parameters + are not correct, i.e. strm is Z_NULL or the state was not initialized. + */ +int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) +z_streamp strm; +in_func in; +void FAR *in_desc; +out_func out; +void FAR *out_desc; +{ + struct inflate_state FAR *state; + unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code this; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* Check that the strm exists and that the state was initialized */ + if (strm == Z_NULL || strm->state == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* Reset the state */ + strm->msg = Z_NULL; + state->mode = TYPE; + state->last = 0; + state->whave = 0; + next = strm->next_in; + have = next != Z_NULL ? strm->avail_in : 0; + hold = 0; + bits = 0; + put = state->window; + left = state->wsize; + + /* Inflate until end of block marked as last */ + for (;;) + switch (state->mode) { + case TYPE: + /* determine and dispatch block type */ + if (state->last) { + BYTEBITS(); + state->mode = DONE; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + + case STORED: + /* get and verify stored block length */ + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + + /* copy stored block from input to output */ + while (state->length != 0) { + copy = state->length; + PULL(); + ROOM(); + if (copy > have) copy = have; + if (copy > left) copy = left; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + + case TABLE: + /* get dynamic table entries descriptor */ + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + + /* get code length code lengths (not a typo) */ + state->have = 0; + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + + /* get length and distance code code lengths */ + state->have = 0; + while (state->have < state->nlen + state->ndist) { + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.val < 16) { + NEEDBITS(this.bits); + DROPBITS(this.bits); + state->lens[state->have++] = this.val; + } + else { + if (this.val == 16) { + NEEDBITS(this.bits + 2); + DROPBITS(this.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = (unsigned)(state->lens[state->have - 1]); + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (this.val == 17) { + NEEDBITS(this.bits + 3); + DROPBITS(this.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(this.bits + 7); + DROPBITS(this.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* build code tables */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + + case LEN: + /* use inflate_fast() if we have enough input and output */ + if (have >= 6 && left >= 258) { + RESTORE(); + if (state->whave < state->wsize) + state->whave = state->wsize - left; + inflate_fast(strm, state->wsize); + LOAD(); + break; + } + + /* get a literal, length, or end-of-block code */ + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.op && (this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + state->length = (unsigned)this.val; + + /* process literal */ + if (this.op == 0) { + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + ROOM(); + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + } + + /* process end of block */ + if (this.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + + /* invalid code */ + if (this.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + + /* length code -- get extra bits, if any */ + state->extra = (unsigned)(this.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + + /* get distance code */ + for (;;) { + this = state->distcode[BITS(state->distbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if ((this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + if (this.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)this.val; + + /* get distance extra bits, if any */ + state->extra = (unsigned)(this.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } + if (state->offset > state->wsize - (state->whave < state->wsize ? + left : 0)) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + + /* copy match from window to output */ + do { + ROOM(); + copy = state->wsize - state->offset; + if (copy < left) { + from = put + copy; + copy = left - copy; + } + else { + from = put - state->offset; + copy = left; + } + if (copy > state->length) copy = state->length; + state->length -= copy; + left -= copy; + do { + *put++ = *from++; + } while (--copy); + } while (state->length != 0); + break; + + case DONE: + /* inflate stream terminated properly -- write leftover output */ + ret = Z_STREAM_END; + if (left < state->wsize) { + if (out(out_desc, state->window, state->wsize - left)) + ret = Z_BUF_ERROR; + } + goto inf_leave; + + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + + default: /* can't happen, but makes compilers happy */ + ret = Z_STREAM_ERROR; + goto inf_leave; + } + + /* Return unused input */ + inf_leave: + strm->next_in = next; + strm->avail_in = have; + return ret; +} + +int ZEXPORT inflateBackEnd(strm) +z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} diff --git a/src/misc/zlib/inffast.c b/src/misc/zlib/inffast.c new file mode 100644 index 000000000..bbee92ed1 --- /dev/null +++ b/src/misc/zlib/inffast.c @@ -0,0 +1,318 @@ +/* inffast.c -- fast decoding + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifndef ASMINF + +/* Allow machine dependent optimization for post-increment or pre-increment. + Based on testing to date, + Pre-increment preferred for: + - PowerPC G3 (Adler) + - MIPS R5000 (Randers-Pehrson) + Post-increment preferred for: + - none + No measurable difference: + - Pentium III (Anderson) + - M68060 (Nikl) + */ +#ifdef POSTINC +# define OFF 0 +# define PUP(a) *(a)++ +#else +# define OFF 1 +# define PUP(a) *++(a) +#endif + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + unsigned char FAR *in; /* local strm->next_in */ + unsigned char FAR *last; /* while in < last, enough input available */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code this; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in - OFF; + last = in + (strm->avail_in - 5); + out = strm->next_out - OFF; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + write = state->write; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + this = lcode[hold & lmask]; + dolen: + op = (unsigned)(this.bits); + hold >>= op; + bits -= op; + op = (unsigned)(this.op); + if (op == 0) { /* literal */ + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + PUP(out) = (unsigned char)(this.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(this.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + this = dcode[hold & dmask]; + dodist: + op = (unsigned)(this.bits); + hold >>= op; + bits -= op; + op = (unsigned)(this.op); + if (op & 16) { /* distance base */ + dist = (unsigned)(this.val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + from = window - OFF; + if (write == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (write < op) { /* wrap around window */ + from += wsize + write - op; + op -= write; + if (op < len) { /* some from end of window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = window - OFF; + if (write < len) { /* some from start of window */ + op = write; + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += write - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } while (len > 2); + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + this = dcode[this.val + (hold & ((1U << op) - 1))]; + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + this = lcode[this.val + (hold & ((1U << op) - 1))]; + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in + OFF; + strm->next_out = out + OFF; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and write == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ diff --git a/src/misc/zlib/inffast.h b/src/misc/zlib/inffast.h new file mode 100644 index 000000000..1e88d2d97 --- /dev/null +++ b/src/misc/zlib/inffast.h @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +void inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/src/misc/zlib/inffixed.h b/src/misc/zlib/inffixed.h new file mode 100644 index 000000000..75ed4b597 --- /dev/null +++ b/src/misc/zlib/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. It + is part of the implementation of the compression library and + is subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/src/misc/zlib/inflate.c b/src/misc/zlib/inflate.c new file mode 100644 index 000000000..792fdee8e --- /dev/null +++ b/src/misc/zlib/inflate.c @@ -0,0 +1,1368 @@ +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common write == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef MAKEFIXED +# ifndef BUILDFIXED +# define BUILDFIXED +# endif +#endif + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); +local int updatewindow OF((z_streamp strm, unsigned out)); +#ifdef BUILDFIXED + void makefixed OF((void)); +#endif +local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, + unsigned len)); + +int ZEXPORT inflateReset(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + strm->adler = 1; /* to support ill-conceived Java test suite */ + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->head = Z_NULL; + state->wsize = 0; + state->whave = 0; + state->write = 0; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int ZEXPORT inflatePrime(strm, bits, value) +z_streamp strm; +int bits; +int value; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += value << state->bits; + state->bits += bits; + return Z_OK; +} + +int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) +z_streamp strm; +int windowBits; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + if (windowBits < 0) { + state->wrap = 0; + windowBits = -windowBits; + } + else { + state->wrap = (windowBits >> 4) + 1; +#ifdef GUNZIP + if (windowBits < 48) windowBits &= 15; +#endif + } + if (windowBits < 8 || windowBits > 15) { + ZFREE(strm, state); + strm->state = Z_NULL; + return Z_STREAM_ERROR; + } + state->wbits = (unsigned)windowBits; + state->window = Z_NULL; + return inflateReset(strm); +} + +int ZEXPORT inflateInit_(strm, version, stream_size) +z_streamp strm; +const char *version; +int stream_size; +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +#ifdef MAKEFIXED +#include + +/* + Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also + defines BUILDFIXED, so the tables are built on the fly. makefixed() writes + those tables to stdout, which would be piped to inffixed.h. A small program + can simply call makefixed to do this: + + void makefixed(void); + + int main(void) + { + makefixed(); + return 0; + } + + Then that can be linked with zlib built with MAKEFIXED defined and run: + + a.out > inffixed.h + */ +void makefixed() +{ + unsigned low, size; + struct inflate_state state; + + fixedtables(&state); + puts(" /* inffixed.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) printf("\n "); + printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, + state.lencode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, + state.distcode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow(strm, out) +z_streamp strm; +unsigned out; +{ + struct inflate_state FAR *state; + unsigned copy, dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + state->window = (unsigned char FAR *) + ZALLOC(strm, 1U << state->wbits, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->write = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + copy = out - strm->avail_out; + if (copy >= state->wsize) { + zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); + state->write = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->write; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->write, strm->next_out - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, strm->next_out - copy, copy); + state->write = copy; + state->whave = state->wsize; + } + else { + state->write += dist; + if (state->write == state->wsize) state->write = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Reverse the bytes in a 32-bit value */ +#define REVERSE(q) \ + ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int ZEXPORT inflate(strm, flush) +z_streamp strm; +int flush; +{ + struct inflate_state FAR *state; + unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code this; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + state->flags = 0; /* expect zlib header */ + if (state->head != Z_NULL) + state->head->done = -1; + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->head != Z_NULL) + state->head->text = (int)((hold >> 8) & 1); + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + case TIME: + NEEDBITS(32); + if (state->head != Z_NULL) + state->head->time = hold; + if (state->flags & 0x0200) CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + case OS: + NEEDBITS(16); + if (state->head != Z_NULL) { + state->head->xflags = (int)(hold & 0xff); + state->head->os = (int)(hold >> 8); + } + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->head != Z_NULL) + state->head->extra_len = (unsigned)hold; + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + } + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && + state->head->extra != Z_NULL) { + len = state->head->extra_len - state->length; + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); + } + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->length = 0; + state->mode = NAME; + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->name != Z_NULL && + state->length < state->head->name_max) + state->head->name[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->comment != Z_NULL && + state->length < state->head->comm_max) + state->head->comment[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if (hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + if (state->head != Z_NULL) { + state->head->hcrc = (int)((state->flags >> 9) & 1); + state->head->done = 1; + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = REVERSE(hold); + INITBITS(); + state->mode = DICT; + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + case TYPE: + if (flush == Z_BLOCK) goto inf_leave; + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY; + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.val < 16) { + NEEDBITS(this.bits); + DROPBITS(this.bits); + state->lens[state->have++] = this.val; + } + else { + if (this.val == 16) { + NEEDBITS(this.bits + 2); + DROPBITS(this.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (this.val == 17) { + NEEDBITS(this.bits + 3); + DROPBITS(this.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(this.bits + 7); + DROPBITS(this.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* build code tables */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + break; + } + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.op && (this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + state->length = (unsigned)this.val; + if ((int)(this.op) == 0) { + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + state->mode = LIT; + break; + } + if (this.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + if (this.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(this.op) & 15; + state->mode = LENEXT; + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->mode = DIST; + case DIST: + for (;;) { + this = state->distcode[BITS(state->distbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if ((this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + if (this.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)this.val; + state->extra = (unsigned)(this.op) & 15; + state->mode = DISTEXT; + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + if (state->offset > state->whave + out - left) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->write) { + copy -= state->write; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->write - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if (out) + strm->adler = state->check = + UPDATE(state->check, put - out, out); + out = left; + if (( +#ifdef GUNZIP + state->flags ? hold : +#endif + REVERSE(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if (hold != (state->total & 0xffffffffUL)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: + RESTORE(); + if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) + if (updatewindow(strm, out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if (state->wrap && out) + strm->adler = state->check = + UPDATE(state->check, strm->next_out - out, out); + strm->data_type = state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int ZEXPORT inflateEnd(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) +z_streamp strm; +const Bytef *dictionary; +uInt dictLength; +{ + struct inflate_state FAR *state; + unsigned long id; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary id */ + if (state->mode == DICT) { + id = adler32(0L, Z_NULL, 0); + id = adler32(id, dictionary, dictLength); + if (id != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window */ + if (updatewindow(strm, strm->avail_out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + if (dictLength > state->wsize) { + zmemcpy(state->window, dictionary + dictLength - state->wsize, + state->wsize); + state->whave = state->wsize; + } + else { + zmemcpy(state->window + state->wsize - dictLength, dictionary, + dictLength); + state->whave = dictLength; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +int ZEXPORT inflateGetHeader(strm, head) +z_streamp strm; +gz_headerp head; +{ + struct inflate_state FAR *state; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; + + /* save header structure */ + state->head = head; + head->done = 0; + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch(have, buf, len) +unsigned FAR *have; +unsigned char FAR *buf; +unsigned len; +{ + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int ZEXPORT inflateSync(strm) +z_streamp strm; +{ + unsigned len; /* number of bytes to look at or looked at */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int ZEXPORT inflateSyncPoint(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int ZEXPORT inflateCopy(dest, source) +z_streamp dest; +z_streamp source; +{ + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + unsigned wsize; + + /* check input */ + if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || + source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *) + ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + zmemcpy(dest, source, sizeof(z_stream)); + zmemcpy(copy, state, sizeof(struct inflate_state)); + if (state->lencode >= state->codes && + state->lencode <= state->codes + ENOUGH - 1) { + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { + wsize = 1U << state->wbits; + zmemcpy(window, state->window, wsize); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; + return Z_OK; +} diff --git a/src/misc/zlib/inflate.h b/src/misc/zlib/inflate.h new file mode 100644 index 000000000..07bd3e78a --- /dev/null +++ b/src/misc/zlib/inflate.h @@ -0,0 +1,115 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN, /* i: waiting for length/lit code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to the BAD or MEM mode -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME + NAME -> COMMENT -> HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + Read deflate blocks: + TYPE -> STORED or TABLE or LEN or CHECK + STORED -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN + Read deflate codes: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* state maintained between inflate() calls. Approximately 7K bytes. */ +struct inflate_state { + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ +}; diff --git a/src/misc/zlib/inftrees.c b/src/misc/zlib/inftrees.c new file mode 100644 index 000000000..8a9c13ff0 --- /dev/null +++ b/src/misc/zlib/inftrees.c @@ -0,0 +1,329 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#define MAXBITS 15 + +const char inflate_copyright[] = + " inflate 1.2.3 Copyright 1995-2005 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int inflate_table(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code this; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196}; + static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)1; + this.val = (unsigned short)0; + *(*table)++ = this; /* make a table to force an error */ + *(*table)++ = this; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min <= MAXBITS; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked when a LENS table is being made + against the space in *table, ENOUGH, minus the maximum space needed by + the worst case distance code, MAXD. This should never happen, but the + sufficiency of ENOUGH has not been proven exhaustively, hence the check. + This assumes that when type == LENS, bits == 9. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + this.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + this.op = (unsigned char)0; + this.val = work[sym]; + } + else if ((int)(work[sym]) > end) { + this.op = (unsigned char)(extra[work[sym]]); + this.val = base[work[sym]]; + } + else { + this.op = (unsigned char)(32 + 64); /* end of block */ + this.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + next[(huff >> drop) + fill] = this; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* + Fill in rest of table for incomplete codes. This loop is similar to the + loop above in incrementing huff for table indices. It is assumed that + len is equal to curr + drop, so there is no loop needed to increment + through high index bits. When the current sub-table is filled, the loop + drops back to the root table to fill in any remaining entries there. + */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)(len - drop); + this.val = (unsigned short)0; + while (huff != 0) { + /* when done with sub-table, drop back to root table */ + if (drop != 0 && (huff & mask) != low) { + drop = 0; + len = root; + next = *table; + this.bits = (unsigned char)len; + } + + /* put invalid code marker in table */ + next[huff >> drop] = this; + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/src/misc/zlib/inftrees.h b/src/misc/zlib/inftrees.h new file mode 100644 index 000000000..b1104c87e --- /dev/null +++ b/src/misc/zlib/inftrees.h @@ -0,0 +1,55 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of dynamic tree. The maximum found in a long but non- + exhaustive search was 1444 code structures (852 for length/literals + and 592 for distances, the latter actually the result of an + exhaustive search). The true maximum is not known, but the value + below is more than safe. */ +#define ENOUGH 2048 +#define MAXD 592 + +/* Type of code to build for inftable() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +extern int inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/src/misc/zlib/link.txt b/src/misc/zlib/link.txt new file mode 100644 index 000000000..c96e37ccd --- /dev/null +++ b/src/misc/zlib/link.txt @@ -0,0 +1 @@ +http://www.winimage.com/zLibDll/ diff --git a/src/misc/zlib/module.make b/src/misc/zlib/module.make new file mode 100644 index 000000000..067acbaaa --- /dev/null +++ b/src/misc/zlib/module.make @@ -0,0 +1,12 @@ +SRC += src/misc/zlib/adler32.c \ + src/misc/zlib/compress_.c \ + src/misc/zlib/crc32.c \ + src/misc/zlib/deflate.c \ + src/misc/zlib/gzio.c \ + src/misc/zlib/infback.c \ + src/misc/zlib/inffast.c \ + src/misc/zlib/inflate.c \ + src/misc/zlib/inftrees.c \ + src/misc/zlib/trees.c \ + src/misc/zlib/uncompr.c \ + src/misc/zlib/zutil.c diff --git a/src/misc/zlib/trees.c b/src/misc/zlib/trees.c new file mode 100644 index 000000000..395e4e168 --- /dev/null +++ b/src/misc/zlib/trees.c @@ -0,0 +1,1219 @@ +/* trees.c -- output deflated data using Huffman coding + * Copyright (C) 1995-2005 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process uses several Huffman trees. The more + * common source values are represented by shorter bit sequences. + * + * Each code tree is stored in a compressed form which is itself + * a Huffman encoding of the lengths of all the code strings (in + * ascending order by source values). The actual code strings are + * reconstructed from the lengths in the inflate process, as described + * in the deflate specification. + * + * REFERENCES + * + * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". + * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc + * + * Storer, James A. + * Data Compression: Methods and Theory, pp. 49-50. + * Computer Science Press, 1988. ISBN 0-7167-8156-5. + * + * Sedgewick, R. + * Algorithms, p290. + * Addison-Wesley, 1983. ISBN 0-201-06672-6. + */ + +/* @(#) $Id$ */ + +/* #define GEN_TREES_H */ + +#include "deflate.h" + +#ifdef DEBUG +# include +#endif + +/* =========================================================================== + * Constants + */ + +#define MAX_BL_BITS 7 +/* Bit length codes must not exceed MAX_BL_BITS bits */ + +#define END_BLOCK 256 +/* end of block literal code */ + +#define REP_3_6 16 +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + +#define REPZ_3_10 17 +/* repeat a zero length 3-10 times (3 bits of repeat count) */ + +#define REPZ_11_138 18 +/* repeat a zero length 11-138 times (7 bits of repeat count) */ + +local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ + = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; + +local const int extra_dbits[D_CODES] /* extra bits for each distance code */ + = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ + = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; + +local const uch bl_order[BL_CODES] + = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + +#define Buf_size (8 * 2*sizeof(char)) +/* Number of bits used within bi_buf. (bi_buf might be implemented on + * more than 16 bits on some systems.) + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ + +#if defined(GEN_TREES_H) || !defined(STDC) +/* non ANSI compilers may not accept trees.h */ + +local ct_data static_ltree[L_CODES+2]; +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + +local ct_data static_dtree[D_CODES]; +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +uch _dist_code[DIST_CODE_LEN]; +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + +uch _length_code[MAX_MATCH-MIN_MATCH+1]; +/* length code for each normalized match length (0 == MIN_MATCH) */ + +local int base_length[LENGTH_CODES]; +/* First normalized length for each code (0 = MIN_MATCH) */ + +local int base_dist[D_CODES]; +/* First normalized distance for each code (0 = distance of 1) */ + +#else +# include "trees.h" +#endif /* GEN_TREES_H */ + +struct static_tree_desc_s { + const ct_data *static_tree; /* static tree or NULL */ + const intf *extra_bits; /* extra bits for each code or NULL */ + int extra_base; /* base index for extra_bits */ + int elems; /* max number of elements in the tree */ + int max_length; /* max bit length for the codes */ +}; + +local static_tree_desc static_l_desc = +{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; + +local static_tree_desc static_d_desc = +{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; + +local static_tree_desc static_bl_desc = +{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; + +/* =========================================================================== + * Local (static) routines in this file. + */ + +local void tr_static_init OF((void)); +local void init_block OF((deflate_state *s)); +local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); +local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); +local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); +local void build_tree OF((deflate_state *s, tree_desc *desc)); +local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local int build_bl_tree OF((deflate_state *s)); +local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, + int blcodes)); +local void compress_block OF((deflate_state *s, ct_data *ltree, + ct_data *dtree)); +local void set_data_type OF((deflate_state *s)); +local unsigned bi_reverse OF((unsigned value, int length)); +local void bi_windup OF((deflate_state *s)); +local void bi_flush OF((deflate_state *s)); +local void copy_block OF((deflate_state *s, charf *buf, unsigned len, + int header)); + +#ifdef GEN_TREES_H +local void gen_trees_header OF((void)); +#endif + +#ifndef DEBUG +# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) + /* Send a code of the given tree. c and tree must not have side effects */ + +#else /* DEBUG */ +# define send_code(s, c, tree) \ + { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ + send_bits(s, tree[c].Code, tree[c].Len); } +#endif + +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +#define put_short(s, w) { \ + put_byte(s, (uch)((w) & 0xff)); \ + put_byte(s, (uch)((ush)(w) >> 8)); \ +} + +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +#ifdef DEBUG +local void send_bits OF((deflate_state *s, int value, int length)); + +local void send_bits(s, value, length) + deflate_state *s; + int value; /* value to send */ + int length; /* number of bits */ +{ + Tracevv((stderr," l %2d v %4x ", length, value)); + Assert(length > 0 && length <= 15, "invalid length"); + s->bits_sent += (ulg)length; + + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (s->bi_valid > (int)Buf_size - length) { + s->bi_buf |= (value << s->bi_valid); + put_short(s, s->bi_buf); + s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); + s->bi_valid += length - Buf_size; + } else { + s->bi_buf |= value << s->bi_valid; + s->bi_valid += length; + } +} +#else /* !DEBUG */ + +#define send_bits(s, value, length) \ +{ int len = length;\ + if (s->bi_valid > (int)Buf_size - len) {\ + int val = value;\ + s->bi_buf |= (val << s->bi_valid);\ + put_short(s, s->bi_buf);\ + s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ + s->bi_valid += len - Buf_size;\ + } else {\ + s->bi_buf |= (value) << s->bi_valid;\ + s->bi_valid += len;\ + }\ +} +#endif /* DEBUG */ + + +/* the arguments must not have side effects */ + +/* =========================================================================== + * Initialize the various 'constant' tables. + */ +local void tr_static_init() +{ +#if defined(GEN_TREES_H) || !defined(STDC) + static int static_init_done = 0; + int n; /* iterates over tree elements */ + int bits; /* bit counter */ + int length; /* length value */ + int code; /* code value */ + int dist; /* distance index */ + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + if (static_init_done) return; + + /* For some embedded targets, global variables are not initialized: */ + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES-1; code++) { + base_length[code] = length; + for (n = 0; n < (1< dist code (0..29) */ + dist = 0; + for (code = 0 ; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ + for ( ; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + _dist_code[256 + dist++] = (uch)code; + } + } + Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; + n = 0; + while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; + while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; + while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; + while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n].Len = 5; + static_dtree[n].Code = bi_reverse((unsigned)n, 5); + } + static_init_done = 1; + +# ifdef GEN_TREES_H + gen_trees_header(); +# endif +#endif /* defined(GEN_TREES_H) || !defined(STDC) */ +} + +/* =========================================================================== + * Genererate the file trees.h describing the static trees. + */ +#ifdef GEN_TREES_H +# ifndef DEBUG +# include +# endif + +# define SEPARATOR(i, last, width) \ + ((i) == (last)? "\n};\n\n" : \ + ((i) % (width) == (width)-1 ? ",\n" : ", ")) + +void gen_trees_header() +{ + FILE *header = fopen("trees.h", "w"); + int i; + + Assert (header != NULL, "Can't open trees.h"); + fprintf(header, + "/* header created automatically with -DGEN_TREES_H */\n\n"); + + fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); + for (i = 0; i < L_CODES+2; i++) { + fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, + static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); + } + + fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, + static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); + } + + fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n"); + for (i = 0; i < DIST_CODE_LEN; i++) { + fprintf(header, "%2u%s", _dist_code[i], + SEPARATOR(i, DIST_CODE_LEN-1, 20)); + } + + fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); + for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { + fprintf(header, "%2u%s", _length_code[i], + SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); + } + + fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); + for (i = 0; i < LENGTH_CODES; i++) { + fprintf(header, "%1u%s", base_length[i], + SEPARATOR(i, LENGTH_CODES-1, 20)); + } + + fprintf(header, "local const int base_dist[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "%5u%s", base_dist[i], + SEPARATOR(i, D_CODES-1, 10)); + } + + fclose(header); +} +#endif /* GEN_TREES_H */ + +/* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ +void _tr_init(s) + deflate_state *s; +{ + tr_static_init(); + + s->l_desc.dyn_tree = s->dyn_ltree; + s->l_desc.stat_desc = &static_l_desc; + + s->d_desc.dyn_tree = s->dyn_dtree; + s->d_desc.stat_desc = &static_d_desc; + + s->bl_desc.dyn_tree = s->bl_tree; + s->bl_desc.stat_desc = &static_bl_desc; + + s->bi_buf = 0; + s->bi_valid = 0; + s->last_eob_len = 8; /* enough lookahead for inflate */ +#ifdef DEBUG + s->compressed_len = 0L; + s->bits_sent = 0L; +#endif + + /* Initialize the first block of the first file: */ + init_block(s); +} + +/* =========================================================================== + * Initialize a new block. + */ +local void init_block(s) + deflate_state *s; +{ + int n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; + for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; + for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; + s->last_lit = s->matches = 0; +} + +#define SMALLEST 1 +/* Index within the heap array of least frequent node in the Huffman tree */ + + +/* =========================================================================== + * Remove the smallest element from the heap and recreate the heap with + * one less element. Updates heap and heap_len. + */ +#define pqremove(s, tree, top) \ +{\ + top = s->heap[SMALLEST]; \ + s->heap[SMALLEST] = s->heap[s->heap_len--]; \ + pqdownheap(s, tree, SMALLEST); \ +} + +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +#define smaller(tree, n, m, depth) \ + (tree[n].Freq < tree[m].Freq || \ + (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) + +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +local void pqdownheap(s, tree, k) + deflate_state *s; + ct_data *tree; /* the tree to restore */ + int k; /* node to move down */ +{ + int v = s->heap[k]; + int j = k << 1; /* left son of k */ + while (j <= s->heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s->heap_len && + smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s->heap[j], s->depth)) break; + + /* Exchange v with the smallest son */ + s->heap[k] = s->heap[j]; k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s->heap[k] = v; +} + +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +local void gen_bitlen(s, desc) + deflate_state *s; + tree_desc *desc; /* the tree descriptor */ +{ + ct_data *tree = desc->dyn_tree; + int max_code = desc->max_code; + const ct_data *stree = desc->stat_desc->static_tree; + const intf *extra = desc->stat_desc->extra_bits; + int base = desc->stat_desc->extra_base; + int max_length = desc->stat_desc->max_length; + int h; /* heap index */ + int n, m; /* iterate over the tree elements */ + int bits; /* bit length */ + int xbits; /* extra bits */ + ush f; /* frequency */ + int overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ + + for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + n = s->heap[h]; + bits = tree[tree[n].Dad].Len + 1; + if (bits > max_length) bits = max_length, overflow++; + tree[n].Len = (ush)bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) continue; /* not a leaf node */ + + s->bl_count[bits]++; + xbits = 0; + if (n >= base) xbits = extra[n-base]; + f = tree[n].Freq; + s->opt_len += (ulg)f * (bits + xbits); + if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); + } + if (overflow == 0) return; + + Trace((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length-1; + while (s->bl_count[bits] == 0) bits--; + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = s->bl_count[bits]; + while (n != 0) { + m = s->heap[--h]; + if (m > max_code) continue; + if ((unsigned) tree[m].Len != (unsigned) bits) { + Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s->opt_len += ((long)bits - (long)tree[m].Len) + *(long)tree[m].Freq; + tree[m].Len = (ush)bits; + } + n--; + } + } +} + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +local void gen_codes (tree, max_code, bl_count) + ct_data *tree; /* the tree to decorate */ + int max_code; /* largest code with non zero frequency */ + ushf *bl_count; /* number of codes at each bit length */ +{ + ush next_code[MAX_BITS+1]; /* next code value for each bit length */ + ush code = 0; /* running code value */ + int bits; /* bit index */ + int n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + next_code[bits] = code = (code + bl_count[bits-1]) << 1; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; + const ct_data *stree = desc->stat_desc->static_tree; + int elems = desc->stat_desc->elems; + int n, m; /* iterate over heap elements */ + int max_code = -1; /* largest code with non zero frequency */ + int node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s->heap_len = 0, s->heap_max = HEAP_SIZE; + + for (n = 0; n < elems; n++) { + if (tree[n].Freq != 0) { + s->heap[++(s->heap_len)] = max_code = n; + s->depth[n] = 0; + } else { + tree[n].Len = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s->heap_len < 2) { + node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); + tree[node].Freq = 1; + s->depth[node] = 0; + s->opt_len--; if (stree) s->static_len -= stree[node].Len; + /* node is 0 or 1 so it does not have extra bits */ + } + desc->max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + pqremove(s, tree, n); /* n = node of least frequency */ + m = s->heap[SMALLEST]; /* m = node of next least frequency */ + + s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ + s->heap[--(s->heap_max)] = m; + + /* Create a new node father of n and m */ + tree[node].Freq = tree[n].Freq + tree[m].Freq; + s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? + s->depth[n] : s->depth[m]) + 1); + tree[n].Dad = tree[m].Dad = (ush)node; +#ifdef DUMP_BL_TREE + if (tree == s->bl_tree) { + fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", + node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); + } +#endif + /* and insert the new node in the heap */ + s->heap[SMALLEST] = node++; + pqdownheap(s, tree, SMALLEST); + + } while (s->heap_len >= 2); + + s->heap[--(s->heap_max)] = s->heap[SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, (tree_desc *)desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes ((ct_data *)tree, max_code, s->bl_count); +} + +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +local void scan_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + if (nextlen == 0) max_count = 138, min_count = 3; + tree[max_code+1].Len = (ush)0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + s->bl_tree[curlen].Freq += count; + } else if (curlen != 0) { + if (curlen != prevlen) s->bl_tree[curlen].Freq++; + s->bl_tree[REP_3_6].Freq++; + } else if (count <= 10) { + s->bl_tree[REPZ_3_10].Freq++; + } else { + s->bl_tree[REPZ_11_138].Freq++; + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ +local void send_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen == 0) max_count = 138, min_count = 3; + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { send_code(s, curlen, s->bl_tree); } while (--count != 0); + + } else if (curlen != 0) { + if (curlen != prevlen) { + send_code(s, curlen, s->bl_tree); count--; + } + Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); + + } else if (count <= 10) { + send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); + + } else { + send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +local int build_bl_tree(s) + deflate_state *s; +{ + int max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); + scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); + + /* Build the bit length tree: */ + build_tree(s, (tree_desc *)(&(s->bl_desc))); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { + if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + s->opt_len += 3*(max_blindex+1) + 5+5+4; + Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + s->opt_len, s->static_len)); + + return max_blindex; +} + +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +local void send_all_trees(s, lcodes, dcodes, blcodes) + deflate_state *s; + int lcodes, dcodes, blcodes; /* number of codes for each tree */ +{ + int rank; /* index in bl_order */ + + Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + "too many codes"); + Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes-1, 5); + send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); + } + Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ + Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ + Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +} + +/* =========================================================================== + * Send a stored block + */ +void _tr_stored_block(s, buf, stored_len, eof) + deflate_state *s; + charf *buf; /* input block */ + ulg stored_len; /* length of input block */ + int eof; /* true if this is the last block for a file */ +{ + send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ +#ifdef DEBUG + s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; + s->compressed_len += (stored_len + 4) << 3; +#endif + copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ +} + +/* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + * The current inflate code requires 9 bits of lookahead. If the + * last two codes for the previous block (real code plus EOB) were coded + * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode + * the last real code. In this case we send two empty static blocks instead + * of one. (There are no problems if the previous block is stored or fixed.) + * To simplify the code, we assume the worst case of last real code encoded + * on one bit only. + */ +void _tr_align(s) + deflate_state *s; +{ + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef DEBUG + s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ +#endif + bi_flush(s); + /* Of the 10 bits for the empty block, we have already sent + * (10 - bi_valid) bits. The lookahead for the last real code (before + * the EOB of the previous block) was thus at least one plus the length + * of the EOB plus what we have just sent of the empty static block. + */ + if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef DEBUG + s->compressed_len += 10L; +#endif + bi_flush(s); + } + s->last_eob_len = 7; +} + +/* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ +void _tr_flush_block(s, buf, stored_len, eof) + deflate_state *s; + charf *buf; /* input block, or NULL if too old */ + ulg stored_len; /* length of input block */ + int eof; /* true if this is the last block for a file */ +{ + ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + int max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s->level > 0) { + + /* Check if the file is binary or text */ + if (stored_len > 0 && s->strm->data_type == Z_UNKNOWN) + set_data_type(s); + + /* Construct the literal and distance trees */ + build_tree(s, (tree_desc *)(&(s->l_desc))); + Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + + build_tree(s, (tree_desc *)(&(s->d_desc))); + Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s->opt_len+3+7)>>3; + static_lenb = (s->static_len+3+7)>>3; + + Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + s->last_lit)); + + if (static_lenb <= opt_lenb) opt_lenb = static_lenb; + + } else { + Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + +#ifdef FORCE_STORED + if (buf != (char*)0) { /* force stored block */ +#else + if (stored_len+4 <= opt_lenb && buf != (char*)0) { + /* 4: two words for the lengths */ +#endif + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block(s, buf, stored_len, eof); + +#ifdef FORCE_STATIC + } else if (static_lenb >= 0) { /* force static trees */ +#else + } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { +#endif + send_bits(s, (STATIC_TREES<<1)+eof, 3); + compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->static_len; +#endif + } else { + send_bits(s, (DYN_TREES<<1)+eof, 3); + send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, + max_blindex+1); + compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->opt_len; +#endif + } + Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block(s); + + if (eof) { + bi_windup(s); +#ifdef DEBUG + s->compressed_len += 7; /* align on byte boundary */ +#endif + } + Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + s->compressed_len-7*eof)); +} + +/* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ +int _tr_tally (s, dist, lc) + deflate_state *s; + unsigned dist; /* distance of matched string */ + unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ +{ + s->d_buf[s->last_lit] = (ush)dist; + s->l_buf[s->last_lit++] = (uch)lc; + if (dist == 0) { + /* lc is the unmatched char */ + s->dyn_ltree[lc].Freq++; + } else { + s->matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + Assert((ush)dist < (ush)MAX_DIST(s) && + (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_dtree[d_code(dist)].Freq++; + } + +#ifdef TRUNCATE_BLOCK + /* Try to guess if it is profitable to stop the current block here */ + if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { + /* Compute an upper bound for the compressed length */ + ulg out_length = (ulg)s->last_lit*8L; + ulg in_length = (ulg)((long)s->strstart - s->block_start); + int dcode; + for (dcode = 0; dcode < D_CODES; dcode++) { + out_length += (ulg)s->dyn_dtree[dcode].Freq * + (5L+extra_dbits[dcode]); + } + out_length >>= 3; + Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", + s->last_lit, in_length, out_length, + 100L - out_length*100L/in_length)); + if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; + } +#endif + return (s->last_lit == s->lit_bufsize-1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ +} + +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +local void compress_block(s, ltree, dtree) + deflate_state *s; + ct_data *ltree; /* literal tree */ + ct_data *dtree; /* distance tree */ +{ + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ + unsigned lx = 0; /* running index in l_buf */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + + if (s->last_lit != 0) do { + dist = s->d_buf[lx]; + lc = s->l_buf[lx++]; + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code+LITERALS+1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra != 0) { + dist -= base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + "pendingBuf overflow"); + + } while (lx < s->last_lit); + + send_code(s, END_BLOCK, ltree); + s->last_eob_len = ltree[END_BLOCK].Len; +} + +/* =========================================================================== + * Set the data type to BINARY or TEXT, using a crude approximation: + * set it to Z_TEXT if all symbols are either printable characters (33 to 255) + * or white spaces (9 to 13, or 32); or set it to Z_BINARY otherwise. + * IN assertion: the fields Freq of dyn_ltree are set. + */ +local void set_data_type(s) + deflate_state *s; +{ + int n; + + for (n = 0; n < 9; n++) + if (s->dyn_ltree[n].Freq != 0) + break; + if (n == 9) + for (n = 14; n < 32; n++) + if (s->dyn_ltree[n].Freq != 0) + break; + s->strm->data_type = (n == 32) ? Z_TEXT : Z_BINARY; +} + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +local unsigned bi_reverse(code, len) + unsigned code; /* the value to invert */ + int len; /* its bit length */ +{ + register unsigned res = 0; + do { + res |= code & 1; + code >>= 1, res <<= 1; + } while (--len > 0); + return res >> 1; +} + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +local void bi_flush(s) + deflate_state *s; +{ + if (s->bi_valid == 16) { + put_short(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else if (s->bi_valid >= 8) { + put_byte(s, (Byte)s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } +} + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +local void bi_windup(s) + deflate_state *s; +{ + if (s->bi_valid > 8) { + put_short(s, s->bi_buf); + } else if (s->bi_valid > 0) { + put_byte(s, (Byte)s->bi_buf); + } + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef DEBUG + s->bits_sent = (s->bits_sent+7) & ~7; +#endif +} + +/* =========================================================================== + * Copy a stored block, storing first the length and its + * one's complement if requested. + */ +local void copy_block(s, buf, len, header) + deflate_state *s; + charf *buf; /* the input data */ + unsigned len; /* its length */ + int header; /* true if block header must be written */ +{ + bi_windup(s); /* align on byte boundary */ + s->last_eob_len = 8; /* enough lookahead for inflate */ + + if (header) { + put_short(s, (ush)len); + put_short(s, (ush)~len); +#ifdef DEBUG + s->bits_sent += 2*16; +#endif + } +#ifdef DEBUG + s->bits_sent += (ulg)len<<3; +#endif + while (len--) { + put_byte(s, *buf++); + } +} diff --git a/src/misc/zlib/trees.h b/src/misc/zlib/trees.h new file mode 100644 index 000000000..72facf900 --- /dev/null +++ b/src/misc/zlib/trees.h @@ -0,0 +1,128 @@ +/* header created automatically with -DGEN_TREES_H */ + +local const ct_data static_ltree[L_CODES+2] = { +{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, +{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, +{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, +{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, +{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, +{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, +{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, +{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, +{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, +{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, +{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, +{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, +{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, +{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, +{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, +{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, +{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, +{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, +{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, +{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, +{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, +{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, +{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, +{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, +{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, +{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, +{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, +{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, +{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, +{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, +{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, +{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, +{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, +{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, +{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, +{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, +{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, +{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, +{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, +{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, +{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, +{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, +{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, +{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, +{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, +{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, +{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, +{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, +{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, +{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, +{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, +{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, +{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, +{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, +{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, +{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, +{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, +{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} +}; + +local const ct_data static_dtree[D_CODES] = { +{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, +{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, +{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, +{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, +{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, +{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} +}; + +const uch _dist_code[DIST_CODE_LEN] = { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, +10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, +11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, +12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, +18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 +}; + +const uch _length_code[MAX_MATCH-MIN_MATCH+1]= { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, +13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, +17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, +19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, +22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 +}; + +local const int base_length[LENGTH_CODES] = { +0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, +64, 80, 96, 112, 128, 160, 192, 224, 0 +}; + +local const int base_dist[D_CODES] = { + 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, + 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, + 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 +}; + diff --git a/src/misc/zlib/uncompr.c b/src/misc/zlib/uncompr.c new file mode 100644 index 000000000..b59e3d0de --- /dev/null +++ b/src/misc/zlib/uncompr.c @@ -0,0 +1,61 @@ +/* uncompr.c -- decompress a memory buffer + * Copyright (C) 1995-2003 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted. +*/ +int ZEXPORT uncompress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + z_stream stream; + int err; + + stream.next_in = (Bytef*)source; + stream.avail_in = (uInt)sourceLen; + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; + + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + + err = inflateInit(&stream); + if (err != Z_OK) return err; + + err = inflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + inflateEnd(&stream); + if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) + return Z_DATA_ERROR; + return err; + } + *destLen = stream.total_out; + + err = inflateEnd(&stream); + return err; +} diff --git a/src/misc/zlib/zconf.h b/src/misc/zlib/zconf.h new file mode 100644 index 000000000..03a9431c8 --- /dev/null +++ b/src/misc/zlib/zconf.h @@ -0,0 +1,332 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + */ +#ifdef Z_PREFIX +# define deflateInit_ z_deflateInit_ +# define deflate z_deflate +# define deflateEnd z_deflateEnd +# define inflateInit_ z_inflateInit_ +# define inflate z_inflate +# define inflateEnd z_inflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateSetDictionary z_deflateSetDictionary +# define deflateCopy z_deflateCopy +# define deflateReset z_deflateReset +# define deflateParams z_deflateParams +# define deflateBound z_deflateBound +# define deflatePrime z_deflatePrime +# define inflateInit2_ z_inflateInit2_ +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateCopy z_inflateCopy +# define inflateReset z_inflateReset +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# define uncompress z_uncompress +# define adler32 z_adler32 +# define crc32 z_crc32 +# define get_crc_table z_get_crc_table +# define zError z_zError + +# define alloc_func z_alloc_func +# define free_func z_free_func +# define in_func z_in_func +# define out_func z_out_func +# define Byte z_Byte +# define uInt z_uInt +# define uLong z_uLong +# define Bytef z_Bytef +# define charf z_charf +# define intf z_intf +# define uIntf z_uIntf +# define uLongf z_uLongf +# define voidpf z_voidpf +# define voidp z_voidp +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ +# include /* for off_t */ +# include /* for SEEK_* and off_t */ +# ifdef VMS +# include /* for off_t */ +# endif +# define z_off_t off_t +#endif +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif +#ifndef z_off_t +# define z_off_t long +#endif + +#if defined(__OS400__) +# define NO_vsnprintf +#endif + +#if defined(__MVS__) +# define NO_vsnprintf +# ifdef FAR +# undef FAR +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) +# pragma map(deflateInit_,"DEIN") +# pragma map(deflateInit2_,"DEIN2") +# pragma map(deflateEnd,"DEEND") +# pragma map(deflateBound,"DEBND") +# pragma map(inflateInit_,"ININ") +# pragma map(inflateInit2_,"ININ2") +# pragma map(inflateEnd,"INEND") +# pragma map(inflateSync,"INSY") +# pragma map(inflateSetDictionary,"INSEDI") +# pragma map(compressBound,"CMBND") +# pragma map(inflate_table,"INTABL") +# pragma map(inflate_fast,"INFA") +# pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/src/misc/zlib/zlib.h b/src/misc/zlib/zlib.h new file mode 100644 index 000000000..022817927 --- /dev/null +++ b/src/misc/zlib/zlib.h @@ -0,0 +1,1357 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.3, July 18th, 2005 + + Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt + (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.3" +#define ZLIB_VERNUM 0x1230 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed + data. This version of the library supports only one compression method + (deflation) but other algorithms will be added later and will have the same + stream interface. + + Compression can be done in a single step if the buffers are large + enough (for example if an input file is mmap'ed), or can be done by + repeated calls of the compression function. In the latter case, the + application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never + crash even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total nb of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total nb of bytes output so far */ + + char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has + dropped to zero. It must update next_out and avail_out when avail_out + has dropped to zero. The application must initialize zalloc, zfree and + opaque before calling the init function. All other fields are set by the + compression library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this + if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, + pointers returned by zalloc for objects of exactly 65536 bytes *must* + have their offset normalized to zero. The default allocation function + provided by this library ensures this (see zutil.c). To reduce memory + requirements and avoid any allocation of 64K objects, at the expense of + compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or + progress reports. After compression, total_in holds the total size of + the uncompressed data and may be saved for use in the decompressor + (particularly if the decompressor wants to decompress everything in + a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative + * values are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is + not compatible with the zlib.h header file used by the application. + This check is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. + If zalloc and zfree are set to Z_NULL, deflateInit updates them to + use default allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at + all (the input data is simply copied a block at a time). + Z_DEFAULT_COMPRESSION requests a default compromise between speed and + compression (currently equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if level is not a valid compression level, + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). + msg is set to null if there is no error message. deflateInit does not + perform any compression: this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce some + output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). + Some output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating avail_in or avail_out accordingly; avail_out + should never be zero before the call. The application can consume the + compressed output when it wants, for example when the output buffer is full + (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK + and with zero avail_out, it must be called again after making room in the + output buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumualte before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In particular + avail_in is zero after the call if enough output space has been provided + before the call.) Flushing may degrade compression for some compression + algorithms and so it should be used only when necessary. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there + was enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the + stream are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least + the value returned by deflateBound (see below). If deflate does not return + Z_STREAM_END, then it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect + the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, + msg may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the exact + value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller. msg is set to null if there is no error + message. inflateInit does not perform any decompression apart from reading + the zlib header if present: this will be done by inflate(). (So next_in and + avail_in may be modified, but next_out and avail_out are unchanged.) +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing + will resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there + is no more input data or no more space in the output buffer (see below + about the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating the next_* and avail_* values accordingly. + The application can consume the uncompressed output when it wants, for + example when the output buffer is full (avail_out == 0), or after each + call of inflate(). If inflate returns Z_OK and with zero avail_out, it + must be called again after making room in the output buffer because there + might be more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, + Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() stop + if and when it gets to the next deflate block boundary. When decoding the + zlib or gzip format, this will cause inflate() to return immediately after + the header and before the first block. When doing a raw inflate, inflate() + will go ahead and process the first block, and will return when it gets to + the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 + if inflate() is currently decoding the last block in the deflate stream, + plus 128 if inflate() returned immediately after decoding an end-of-block + code or decoding the complete header up to just before the first byte of the + deflate stream. The end-of-block will not be indicated until all of the + uncompressed data from that block has been written to strm->next_out. The + number of unused bits may in general be greater than seven, except when + bit 7 of data_type is set, in which case the number of unused bits will be + less than eight. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step + (a single call of inflate), the parameter flush should be set to + Z_FINISH. In this case all pending input is processed and all pending + output is flushed; avail_out must be large enough to hold all the + uncompressed data. (The size of the uncompressed data may have been saved + by the compressor for this purpose.) The next operation on this stream must + be inflateEnd to deallocate the decompression state. The use of Z_FINISH + is never required, but can be used to inform inflate that a faster approach + may be used for the single inflate() call. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the only effect of the flush parameter in this implementation + is on the return value of inflate(), as noted below, or when it returns early + because Z_BLOCK is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the adler32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the adler32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() will decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically. Any information + contained in the gzip header is not retained, so applications that need that + information should instead use raw inflate, see inflateInit2() below, or + inflateBack() and perform their own processing of the gzip header and + trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may then + call inflateSync() to look for a good compression block if a partial recovery + of the data is desired. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by + the caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), + no header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but + is slow and reduces compression ratio; memLevel=9 uses maximum memory + for optimal speed. The default value is 8. See zconf.h for total memory + usage as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as + Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy + parameter only affects the compression ratio but not the correctness of the + compressed output even if it is not set appropriately. Z_FIXED prevents the + use of dynamic Huffman codes, allowing for a simpler decoder for special + applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid + method). msg is set to null if there is no error message. deflateInit2 does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any + call of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size in + deflate or deflate2. Thus the strings most likely to be useful should be + put at the end of the dictionary, not at the front. In addition, the + current implementation of deflate will use at most the window size minus + 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and + can consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. + The stream will keep the same compression level and any other attributes + that may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different + strategy. If the compression level is changed, the input available so far + is compressed with the old level (and may be flushed); the new level will + take effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to + be compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR + if strm->avail_out was zero. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() + or deflateInit2(). This would be used to allocate an output buffer + for deflation in a single pass, and so would be called before deflate(). +*/ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the + bits leftover from a previous deflate stream when appending to it. As such, + this function can only be used for raw deflate, and must be used before the + first deflate() call after a deflateInit2() or deflateReset(). bits must be + less than or equal to 16, and that many of the least significant bits of + value will be inserted in the output. + + deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is + a crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg + is set to null if there is no error message. inflateInit2 does not perform + any decompression apart from reading the zlib header if present: this will + be done by inflate(). (So next_in and avail_in may be modified, but next_out + and avail_out are unchanged.) +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called + immediately after inflateInit2() or inflateReset() and before any call of + inflate() to set the dictionary. The application must insure that the + dictionary that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been found, + or Z_STREAM_ERROR if the stream structure was inconsistent. In the success + case, the application may save the current current value of total_in which + indicates where valid compressed data was found. In the error case, the + application may repeatedly call inflateSync, providing more input each time, + until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. + The stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK can be used to + force inflate() to return immediately after header processing is complete + and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When + any of extra, name, or comment are not Z_NULL and the respective field is + not present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the paramaters are invalid, Z_MEM_ERROR if the internal state could not + be allocated, or Z_VERSION_ERROR if the version of the library does not + match the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is more efficient than inflate() for + file i/o applications in that it avoids copying between the output and the + sliding window by simply making the window itself the output buffer. This + function trusts the application to not change the output buffer passed by + the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free + the allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects + only the raw deflate stream to decompress. This is different from the + normal behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format + error in the deflate stream (in which case strm->msg is set to indicate the + nature of the error), or Z_STREAM_ERROR if the stream was not properly + initialized. In the case of Z_BUF_ERROR, an input or output error can be + distinguished using strm->next_in which will be Z_NULL only if in() returned + an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to + out() returning non-zero. (in() will always be called before out(), so + strm->next_in is assured to be defined if out() returns non-zero.) Note + that inflateBack() cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + + + /* utility functions */ + +/* + The following utility functions are implemented on top of the + basic stream-oriented functions. To simplify the interface, some + default options are assumed (compression level and memory usage, + standard memory allocation functions). The source code of these + utility functions can easily be modified if you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be at least the value returned + by compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + This function can be used to compress a whole file at once if the + input file is mmap'ed. + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before + a compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. +*/ + + +typedef voidp gzFile; + +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); +/* + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb") but can also include a compression level + ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for + Huffman only compression as in "wb1h", or 'R' for run-length encoding + as in "wb1R". (See the description of deflateInit2 for more information + about the strategy parameter.) + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. + + gzopen returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). */ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen() associates a gzFile with the file descriptor fd. File + descriptors are obtained from calls like open, dup, creat, pipe or + fileno (in the file has been previously opened with fopen). + The mode parameter is as in gzopen. + The next call of gzclose on the returned gzFile will also close the + file descriptor fd, just like fclose(fdopen(fd), mode) closes the file + descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). + gzdopen returns NULL if there was insufficient memory to allocate + the (de)compression state. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. + If the input file was not in gzip format, gzread copies the given number + of bytes into the buffer. + gzread returns the number of uncompressed bytes actually read (0 for + end of file, -1 for error). */ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes actually written + (0 in case of error). +*/ + +ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). The number of + uncompressed bytes written is limited to 4095. The caller should assure that + this limit is not exceeded. If it is exceeded, then gzprintf() will return + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf() + because the secure snprintf() or vsnprintf() functions were not available. +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or + a newline character is read and transferred to buf, or an end-of-file + condition is encountered. The string is then terminated with a null + character. + gzgets returns buf, or Z_NULL in case of error. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read again later. + Only one character of push-back is allowed. gzungetc() returns the + character pushed, or -1 on failure. gzungetc() will fail if a + character has been pushed but not read yet, or if c is -1. The pushed + character will be discarded if the stream is repositioned with gzseek() + or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. The return value is the zlib + error number (see function gzerror below). gzflush returns Z_OK if + the flush parameter is Z_FINISH and all output could be flushed. + gzflush should be called only when strictly necessary because it can + degrade compression. +*/ + +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); +/* + Sets the starting position for the next gzread or gzwrite on the + given compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); +/* + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns 1 if file is being read directly without decompression, otherwise + zero. +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. The return value is the zlib + error number (see function gzerror below). +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the + compression library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is NULL, this function returns + the required initial value for the checksum. + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); +/* + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is NULL, this function returns the required initial + value for the for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + +/* + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + + +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; /* hack for buggy compilers */ +#endif + +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); +ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/src/misc/zlib/zutil.c b/src/misc/zlib/zutil.c new file mode 100644 index 000000000..d55f5948a --- /dev/null +++ b/src/misc/zlib/zutil.c @@ -0,0 +1,318 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" + +#ifndef NO_DUMMY_DECL +struct internal_state {int dummy;}; /* for buggy compilers */ +#endif + +const char * const z_errmsg[10] = { +"need dictionary", /* Z_NEED_DICT 2 */ +"stream end", /* Z_STREAM_END 1 */ +"", /* Z_OK 0 */ +"file error", /* Z_ERRNO (-1) */ +"stream error", /* Z_STREAM_ERROR (-2) */ +"data error", /* Z_DATA_ERROR (-3) */ +"insufficient memory", /* Z_MEM_ERROR (-4) */ +"buffer error", /* Z_BUF_ERROR (-5) */ +"incompatible version",/* Z_VERSION_ERROR (-6) */ +""}; + + +const char * ZEXPORT zlibVersion() +{ + return ZLIB_VERSION; +} + +uLong ZEXPORT zlibCompileFlags() +{ + uLong flags; + + flags = 0; + switch (sizeof(uInt)) { + case 2: break; + case 4: flags += 1; break; + case 8: flags += 2; break; + default: flags += 3; + } + switch (sizeof(uLong)) { + case 2: break; + case 4: flags += 1 << 2; break; + case 8: flags += 2 << 2; break; + default: flags += 3 << 2; + } + switch (sizeof(voidpf)) { + case 2: break; + case 4: flags += 1 << 4; break; + case 8: flags += 2 << 4; break; + default: flags += 3 << 4; + } + switch (sizeof(z_off_t)) { + case 2: break; + case 4: flags += 1 << 6; break; + case 8: flags += 2 << 6; break; + default: flags += 3 << 6; + } +#ifdef DEBUG + flags += 1 << 8; +#endif +#if defined(ASMV) || defined(ASMINF) + flags += 1 << 9; +#endif +#ifdef ZLIB_WINAPI + flags += 1 << 10; +#endif +#ifdef BUILDFIXED + flags += 1 << 12; +#endif +#ifdef DYNAMIC_CRC_TABLE + flags += 1 << 13; +#endif +#ifdef NO_GZCOMPRESS + flags += 1L << 16; +#endif +#ifdef NO_GZIP + flags += 1L << 17; +#endif +#ifdef PKZIP_BUG_WORKAROUND + flags += 1L << 20; +#endif +#ifdef FASTEST + flags += 1L << 21; +#endif +#ifdef STDC +# ifdef NO_vsnprintf + flags += 1L << 25; +# ifdef HAS_vsprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_vsnprintf_void + flags += 1L << 26; +# endif +# endif +#else + flags += 1L << 24; +# ifdef NO_snprintf + flags += 1L << 25; +# ifdef HAS_sprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_snprintf_void + flags += 1L << 26; +# endif +# endif +#endif + return flags; +} + +#ifdef DEBUG + +# ifndef verbose +# define verbose 0 +# endif +int z_verbose = verbose; + +void z_error (m) + char *m; +{ + fprintf(stderr, "%s\n", m); + exit(1); +} +#endif + +/* exported to allow conversion of error code to string for compress() and + * uncompress() + */ +const char * ZEXPORT zError(err) + int err; +{ + return ERR_MSG(err); +} + +#if defined(_WIN32_WCE) + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. + */ + int errno = 0; +#endif + +#ifndef HAVE_MEMCPY + +void zmemcpy(dest, source, len) + Bytef* dest; + const Bytef* source; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int zmemcmp(s1, s2, len) + const Bytef* s1; + const Bytef* s2; + uInt len; +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void zmemzero(dest, len) + Bytef* dest; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + + +#ifdef SYS16BIT + +#ifdef __TURBOC__ +/* Turbo C in 16-bit mode */ + +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf = opaque; /* just to make some compilers happy */ + ulg bsize = (ulg)items*size; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + int n; + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + ptr = opaque; /* just to make some compilers happy */ + Assert(0, "zcfree: ptr not found"); +} + +#endif /* __TURBOC__ */ + + +#ifdef M_I86 +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + return _halloc((long)items, size); +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + _hfree(ptr); +} + +#endif /* M_I86 */ + +#endif /* SYS16BIT */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern voidp calloc OF((uInt items, uInt size)); +extern void free OF((voidpf ptr)); +#endif + +voidpf zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + if (opaque) items += size - size; /* make compiler happy */ + return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : + (voidpf)calloc(items, size); +} + +void zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + free(ptr); + if (opaque) return; /* make compiler happy */ +} + +#endif /* MY_ZCALLOC */ diff --git a/src/misc/zlib/zutil.h b/src/misc/zlib/zutil.h new file mode 100644 index 000000000..b7d5eff81 --- /dev/null +++ b/src/misc/zlib/zutil.h @@ -0,0 +1,269 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#define ZLIB_INTERNAL +#include "zlib.h" + +#ifdef STDC +# ifndef _WIN32_WCE +# include +# endif +# include +# include +#endif +#ifdef NO_ERRNO_H +# ifdef _WIN32_WCE + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. We rename it to + * avoid conflict with other libraries that use the same workaround. + */ +# define errno z_errno +# endif + extern int errno; +#else +# ifndef _WIN32_WCE +# include +# endif +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = (char*)ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 0x01 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +# ifdef M_I86 + #include +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 0x07 +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#ifdef WIN32 +# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ +# define OS_CODE 0x0b +# endif +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0f +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS + /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 + /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# define vsnprintf _vsnprintf +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +#endif +#ifdef VMS +# define NO_vsnprintf +#endif + +#if defined(pyr) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + extern void zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef DEBUG +# include + extern int z_verbose; + extern void z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + + +voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); +void zcfree OF((voidpf opaque, voidpf ptr)); + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +#endif /* ZUTIL_H */ diff --git a/src/opt/cut/cutMan.c b/src/opt/cut/cutMan.c index 8593ef938..882567fd7 100644 --- a/src/opt/cut/cutMan.c +++ b/src/opt/cut/cutMan.c @@ -44,7 +44,6 @@ extern void Npn_StartTruth8( uint8 uTruths[][32] ); Cut_Man_t * Cut_ManStart( Cut_Params_t * pParams ) { Cut_Man_t * p; - int clk = clock(); // extern int nTruthDsd; // nTruthDsd = 0; assert( pParams->nVarsMax >= 3 && pParams->nVarsMax <= CUT_SIZE_MAX ); @@ -121,16 +120,6 @@ Cut_Man_t * Cut_ManStart( Cut_Params_t * pParams ) ***********************************************************************/ void Cut_ManStop( Cut_Man_t * p ) { - Cut_Cut_t * pCut; - int i; -// extern int nTruthDsd; -// printf( "Decomposable cuts = %d.\n", nTruthDsd ); - - Vec_PtrForEachEntry( p->vCutsNew, pCut, i ) - if ( pCut != NULL ) - { - int k = 0; - } if ( p->vCutsNew ) Vec_PtrFree( p->vCutsNew ); if ( p->vCutsOld ) Vec_PtrFree( p->vCutsOld ); if ( p->vCutsTemp ) Vec_PtrFree( p->vCutsTemp ); diff --git a/src/opt/cut/cutNode.c b/src/opt/cut/cutNode.c index 1f93b14bd..2d17020bf 100644 --- a/src/opt/cut/cutNode.c +++ b/src/opt/cut/cutNode.c @@ -561,7 +561,8 @@ int Cut_ManMappingArea_rec( Cut_Man_t * p, int Node ) ***********************************************************************/ void Cut_NodeDoComputeCuts( Cut_Man_t * p, Cut_List_t * pSuper, int Node, int fCompl0, int fCompl1, Cut_Cut_t * pList0, Cut_Cut_t * pList1, int fTriv, int TreeCode ) { - Cut_Cut_t * pStop0, * pStop1, * pTemp0, * pTemp1, * pStore0, * pStore1; + Cut_Cut_t * pStop0, * pStop1, * pTemp0, * pTemp1; + Cut_Cut_t * pStore0 = NULL, * pStore1 = NULL; // Suppress "might be used uninitialized" int i, nCutsOld, Limit; // start with the elementary cut if ( fTriv ) @@ -667,7 +668,8 @@ Quits: Cut_Cut_t * Cut_NodeUnionCuts( Cut_Man_t * p, Vec_Int_t * vNodes ) { Cut_List_t Super, * pSuper = &Super; - Cut_Cut_t * pList, * pListStart, * pCut, * pCut2, * pTop; + Cut_Cut_t * pList, * pListStart, * pCut, * pCut2; + Cut_Cut_t * pTop = NULL; // Suppress "might be used uninitialized" int i, k, Node, Root, Limit = p->pParams->nVarsMax; int clk = clock(); @@ -973,11 +975,9 @@ int Cut_CutListVerify( Cut_Cut_t * pList ) { if ( Cut_CutCheckDominance( pDom, pCut ) ) { - int x = 0; printf( "******************* These are contained cuts:\n" ); Cut_CutPrint( pDom, 1 ); Cut_CutPrint( pDom, 1 ); - return 0; } } diff --git a/src/opt/cut/cutOracle.c b/src/opt/cut/cutOracle.c index 3eb4462b0..4ec6bc05b 100644 --- a/src/opt/cut/cutOracle.c +++ b/src/opt/cut/cutOracle.c @@ -70,7 +70,6 @@ static Cut_Cut_t * Cut_CutMerge( Cut_Oracle_t * p, Cut_Cut_t * pCut0, Cut_Cut_t Cut_Oracle_t * Cut_OracleStart( Cut_Man_t * pMan ) { Cut_Oracle_t * p; - int clk = clock(); assert( pMan->pParams->nVarsMax >= 3 && pMan->pParams->nVarsMax <= CUT_SIZE_MAX ); assert( pMan->pParams->fRecord ); @@ -135,10 +134,7 @@ void Cut_OracleStop( Cut_Oracle_t * p ) } Vec_PtrForEachEntry( p->vCutsNew, pCut, i ) - if ( pCut != NULL ) - { - int k = 0; - } + if ( p->vCuts0 ) Vec_PtrFree( p->vCuts0 ); if ( p->vCuts1 ) Vec_PtrFree( p->vCuts1 ); if ( p->vCutsNew ) Vec_PtrFree( p->vCutsNew ); diff --git a/src/opt/cut/cutPre22.c b/src/opt/cut/cutPre22.c index 5cb87a9cb..5ba860c9f 100644 --- a/src/opt/cut/cutPre22.c +++ b/src/opt/cut/cutPre22.c @@ -74,30 +74,30 @@ struct Cut_CMan_t_ }; // NP-classes of functions of 3 variables (22) -static char * s_NP3[22] = { - " 0\n", // 00 const 0 // 0 vars - " 1\n", // 01 const 1 // 0 vars - "1 1\n", // 02 a // 1 vars - "11 1\n", // 03 ab // 2 vars - "11 0\n", // 04 (ab)' // 2 vars - "10 1\n01 1\n", // 05 a<+>b // 2 vars - "111 1\n", // 06 0s abc // 3 vars - "111 0\n", // 07 (abc)' // - "11- 1\n1-1 1\n", // 08 1p a(b+c) // - "11- 0\n1-1 0\n", // 09 (a(b+c))' // - "111 1\n100 1\n010 1\n001 1\n", // 10 2s a<+>b<+>c // - "10- 0\n1-0 0\n011 0\n", // 11 3p a<+>bc // - "101 1\n110 1\n", // 12 4p a(b<+>c) // - "101 0\n110 0\n", // 13 (a(b<+>c))' // - "11- 1\n1-1 1\n-11 1\n", // 14 5s ab+bc+ac // - "111 1\n000 1\n", // 15 6s abc+a'b'c' // - "111 0\n000 0\n", // 16 (abc+a'b'c')' // - "11- 1\n-11 1\n0-1 1\n", // 17 7 ab+bc+a'c // - "011 1\n101 1\n110 1\n", // 18 8s a'bc+ab'c+abc' // - "011 0\n101 0\n110 0\n", // 19 (a'bc+ab'c+abc')' // - "100 1\n-11 1\n", // 20 9p ab'c'+bc // - "100 0\n-11 0\n" // 21 (ab'c'+bc)' // -}; +//static char * s_NP3[22] = { +// " 0\n", // 00 const 0 // 0 vars +// " 1\n", // 01 const 1 // 0 vars +// "1 1\n", // 02 a // 1 vars +// "11 1\n", // 03 ab // 2 vars +// "11 0\n", // 04 (ab)' // 2 vars +// "10 1\n01 1\n", // 05 a<+>b // 2 vars +// "111 1\n", // 06 0s abc // 3 vars +// "111 0\n", // 07 (abc)' // +// "11- 1\n1-1 1\n", // 08 1p a(b+c) // +// "11- 0\n1-1 0\n", // 09 (a(b+c))' // +// "111 1\n100 1\n010 1\n001 1\n", // 10 2s a<+>b<+>c // +// "10- 0\n1-0 0\n011 0\n", // 11 3p a<+>bc // +// "101 1\n110 1\n", // 12 4p a(b<+>c) // +// "101 0\n110 0\n", // 13 (a(b<+>c))' // +// "11- 1\n1-1 1\n-11 1\n", // 14 5s ab+bc+ac // +// "111 1\n000 1\n", // 15 6s abc+a'b'c' // +// "111 0\n000 0\n", // 16 (abc+a'b'c')' // +// "11- 1\n-11 1\n0-1 1\n", // 17 7 ab+bc+a'c // +// "011 1\n101 1\n110 1\n", // 18 8s a'bc+ab'c+abc' // +// "011 0\n101 0\n110 0\n", // 19 (a'bc+ab'c+abc')' // +// "100 1\n-11 1\n", // 20 9p ab'c'+bc // +// "100 0\n-11 0\n" // 21 (ab'c'+bc)' // +//}; // NP-classes of functions of 3 variables (22) static char * s_NP3Names[22] = { @@ -126,16 +126,16 @@ static char * s_NP3Names[22] = { }; // the number of variables in each function -static int s_NP3VarNums[22] = { 0, 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; +//static int s_NP3VarNums[22] = { 0, 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; // NPN classes of functions of exactly 3 inputs (10) static int s_NPNe3[10] = { 6, 8, 10, 11, 12, 14, 15, 17, 18, 20 }; // NPN classes of functions of exactly 3 inputs that are symmetric (5) -static int s_NPNe3s[10] = { 6, 10, 14, 15, 18 }; +//static int s_NPNe3s[10] = { 6, 10, 14, 15, 18 }; // NPN classes of functions of exactly 3 inputs (4) -static int s_NPNe3p[10] = { 8, 11, 12, 20 }; +//static int s_NPNe3p[10] = { 8, 11, 12, 20 }; static Cut_CMan_t * Cut_CManStart(); static void Cut_CManStop( Cut_CMan_t * p ); @@ -231,7 +231,7 @@ void Cut_CellPrecompute() { Cut_CMan_t * p; Cut_Cell_t * pCell, * pTemp; - int i1, i2, i3, i, j, k, c, clk = clock(), clk2 = clock(); + int i1, i2, i3, i, j, k, c, clk = clock(); //, clk2 = clock(); p = Cut_CManStart(); @@ -397,7 +397,7 @@ void Cut_CellPrecompute() } } - printf( "BASIC: Total = %d. Good = %d. Entry = %d. ", p->nTotal, p->nGood, sizeof(Cut_Cell_t) ); + printf( "BASIC: Total = %d. Good = %d. Entry = %d. ", (int)p->nTotal, (int)p->nGood, (int)sizeof(Cut_Cell_t) ); PRT( "Time", clock() - clk ); printf( "Cells: " ); for ( i = 0; i <= 9; i++ ) @@ -481,7 +481,7 @@ void Cut_CellPrecompute() //p->timeTable += clock() - clk2; } - printf( "VAR %d: Total = %d. Good = %d. Entry = %d. ", k, p->nTotal, p->nGood, sizeof(Cut_Cell_t) ); + printf( "VAR %d: Total = %d. Good = %d. Entry = %d. ", k, p->nTotal, p->nGood, (int)sizeof(Cut_Cell_t) ); PRT( "Time", clock() - clk ); printf( "Cells: " ); for ( i = 0; i <= 9; i++ ) @@ -517,7 +517,7 @@ int Cut_CellTableLookup( Cut_CMan_t * p, Cut_Cell_t * pCell ) Cut_Cell_t ** pSlot, * pTemp; unsigned Hash; Hash = Extra_TruthHash( pCell->uTruth, Extra_TruthWordNum( pCell->nVars ) ); - if ( !st_find_or_add( p->tTable, (char *)Hash, (char ***)&pSlot ) ) + if ( !st_find_or_add( p->tTable, (char *)(PORT_PTRUINT_T)Hash, (char ***)&pSlot ) ) *pSlot = NULL; for ( pTemp = *pSlot; pTemp; pTemp = pTemp->pNext ) { @@ -863,15 +863,15 @@ void Cut_CellDumpToFile() for ( i = 0; i < 4; i++ ) if ( pTemp->nUsed == 0 ) - BoxUsed[ pTemp->Box[i] ][0]++; + BoxUsed[ (int)pTemp->Box[i] ][0]++; else if ( pTemp->nUsed < 10 ) - BoxUsed[ pTemp->Box[i] ][1]++; + BoxUsed[ (int)pTemp->Box[i] ][1]++; else if ( pTemp->nUsed < 100 ) - BoxUsed[ pTemp->Box[i] ][2]++; + BoxUsed[ (int)pTemp->Box[i] ][2]++; else if ( pTemp->nUsed < 1000 ) - BoxUsed[ pTemp->Box[i] ][3]++; + BoxUsed[ (int)pTemp->Box[i] ][3]++; else - BoxUsed[ pTemp->Box[i] ][4]++; + BoxUsed[ (int)pTemp->Box[i] ][4]++; } } @@ -962,7 +962,7 @@ int Cut_CellTruthLookup( unsigned * pTruth, int nVars ) // check if the cell exists Hash = Extra_TruthHash( pCell->uTruth, Extra_TruthWordNum(pCell->nVars) ); - if ( st_lookup( p->tTable, (char *)Hash, (char **)&pTemp ) ) + if ( st_lookup( p->tTable, (char *)(PORT_PTRUINT_T)Hash, (char **)&pTemp ) ) { for ( ; pTemp; pTemp = pTemp->pNext ) { diff --git a/src/opt/cut/cutTruth.c b/src/opt/cut/cutTruth.c index c3514ad7c..6ecf20e42 100644 --- a/src/opt/cut/cutTruth.c +++ b/src/opt/cut/cutTruth.c @@ -30,9 +30,10 @@ /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// -extern int nTotal = 0; -extern int nGood = 0; -extern int nEqual = 0; +// used in abcCut.c +int nTotal = 0; +int nGood = 0; +int nEqual = 0; //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// diff --git a/src/opt/dec/decAbc.c b/src/opt/dec/decAbc.c index 6adb0f989..2886668e3 100644 --- a/src/opt/dec/decAbc.c +++ b/src/opt/dec/decAbc.c @@ -43,7 +43,7 @@ Abc_Obj_t * Dec_GraphToNetwork( Abc_Ntk_t * pNtk, Dec_Graph_t * pGraph ) { Abc_Obj_t * pAnd0, * pAnd1; - Dec_Node_t * pNode; + Dec_Node_t * pNode = NULL; // Suppress "might be used uninitialized" int i; // check for constant function if ( Dec_GraphIsConst(pGraph) ) @@ -77,7 +77,7 @@ Abc_Obj_t * Dec_GraphToNetwork( Abc_Ntk_t * pNtk, Dec_Graph_t * pGraph ) Abc_Obj_t * Dec_GraphToNetworkNoStrash( Abc_Ntk_t * pNtk, Dec_Graph_t * pGraph ) { Abc_Obj_t * pAnd, * pAnd0, * pAnd1; - Dec_Node_t * pNode; + Dec_Node_t * pNode = NULL; // Suppress "might be used uninitialized" int i; // check for constant function if ( Dec_GraphIsConst(pGraph) ) @@ -217,7 +217,7 @@ void Dec_GraphUpdateNetwork( Abc_Obj_t * pRoot, Dec_Graph_t * pGraph, bool fUpda ***********************************************************************/ Hop_Obj_t * Dec_GraphToNetworkAig( Hop_Man_t * pMan, Dec_Graph_t * pGraph ) { - Dec_Node_t * pNode; + Dec_Node_t * pNode = NULL; // Suppress "might be used uninitialized" Hop_Obj_t * pAnd0, * pAnd1; int i; // check for constant function @@ -278,7 +278,7 @@ Hop_Obj_t * Dec_GraphFactorSop( Hop_Man_t * pMan, char * pSop ) ***********************************************************************/ Ivy_Obj_t * Dec_GraphToNetworkIvy( Ivy_Man_t * pMan, Dec_Graph_t * pGraph ) { - Dec_Node_t * pNode; + Dec_Node_t * pNode = NULL; // Suppress "might be used uninitialized" Ivy_Obj_t * pAnd0, * pAnd1; int i; // check for constant function diff --git a/src/opt/dec/decFactor.c b/src/opt/dec/decFactor.c index 768dcd9b5..942051969 100644 --- a/src/opt/dec/decFactor.c +++ b/src/opt/dec/decFactor.c @@ -231,7 +231,6 @@ Dec_Edge_t Dec_FactorTrivial( Dec_Graph_t * pFForm, Mvc_Cover_t * pCover ) Dec_Man_t * pManDec = Abc_FrameReadManDec(); Vec_Int_t * vEdgeCubes = pManDec->vCubes; Vec_Int_t * vEdgeLits = pManDec->vLits; - Mvc_Manager_t * pMem = pManDec->pMvcMem; Dec_Edge_t eNode; Mvc_Cube_t * pCube; // create the factored form for each cube diff --git a/src/opt/dec/decMan.c b/src/opt/dec/decMan.c index 65857461b..3d65ffc59 100644 --- a/src/opt/dec/decMan.c +++ b/src/opt/dec/decMan.c @@ -42,7 +42,7 @@ Dec_Man_t * Dec_ManStart() { Dec_Man_t * p; - int clk = clock(); +// int clk = clock(); p = ALLOC( Dec_Man_t, 1 ); p->pMvcMem = Mvc_ManagerStart(); p->vCubes = Vec_IntAlloc( 8 ); diff --git a/src/opt/dec/decUtil.c b/src/opt/dec/decUtil.c index 463bc7e29..aeabeac42 100644 --- a/src/opt/dec/decUtil.c +++ b/src/opt/dec/decUtil.c @@ -41,7 +41,7 @@ DdNode * Dec_GraphDeriveBdd( DdManager * dd, Dec_Graph_t * pGraph ) { DdNode * bFunc, * bFunc0, * bFunc1; - Dec_Node_t * pNode; + Dec_Node_t * pNode = NULL; // Suppress "might be used uninitialized" int i; // sanity checks @@ -91,7 +91,8 @@ DdNode * Dec_GraphDeriveBdd( DdManager * dd, Dec_Graph_t * pGraph ) unsigned Dec_GraphDeriveTruth( Dec_Graph_t * pGraph ) { unsigned uTruths[5] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000 }; - unsigned uTruth, uTruth0, uTruth1; + unsigned uTruth = 0; // Suppress "might be used uninitialized" + unsigned uTruth0, uTruth1; Dec_Node_t * pNode; int i; @@ -109,17 +110,17 @@ unsigned Dec_GraphDeriveTruth( Dec_Graph_t * pGraph ) // assign the elementary variables Dec_GraphForEachLeaf( pGraph, pNode, i ) - pNode->pFunc = (void *)uTruths[i]; + pNode->pFunc = (void *)(PORT_PTRUINT_T)uTruths[i]; // compute the function for each internal node Dec_GraphForEachNode( pGraph, pNode, i ) { - uTruth0 = (unsigned)Dec_GraphNode(pGraph, pNode->eEdge0.Node)->pFunc; - uTruth1 = (unsigned)Dec_GraphNode(pGraph, pNode->eEdge1.Node)->pFunc; + uTruth0 = (unsigned)(PORT_PTRUINT_T)Dec_GraphNode(pGraph, pNode->eEdge0.Node)->pFunc; + uTruth1 = (unsigned)(PORT_PTRUINT_T)Dec_GraphNode(pGraph, pNode->eEdge1.Node)->pFunc; uTruth0 = pNode->eEdge0.fCompl? ~uTruth0 : uTruth0; uTruth1 = pNode->eEdge1.fCompl? ~uTruth1 : uTruth1; uTruth = uTruth0 & uTruth1; - pNode->pFunc = (void *)uTruth; + pNode->pFunc = (void *)(PORT_PTRUINT_T)uTruth; } // complement the result if necessary diff --git a/src/opt/fret/fretInit.c b/src/opt/fret/fretInit.c index bf2490354..0c7b1e297 100644 --- a/src/opt/fret/fretInit.c +++ b/src/opt/fret/fretInit.c @@ -1205,9 +1205,9 @@ static void Abc_FlowRetime_ConnectBiasNode(Abc_Obj_t *pBiasNode, Abc_Obj_t *pObj ***********************************************************************/ void Abc_FlowRetime_AddInitBias( ) { Abc_Ntk_t *pNtk = pManMR->pNtk; - Abc_Obj_t *pBiasNode, *pObj, *pNext, *pNext2; + Abc_Obj_t *pBiasNode, *pObj; InitConstraint_t *pConstraint; - int i, j, k, l, id; + int i, j, id; const int nConstraints = Vec_PtrSize( pManMR->vInitConstraints ); pManMR->pDataArray = REALLOC( Flow_Data_t, pManMR->pDataArray, pManMR->nNodes + (nConstraints*(pManMR->iteration+1)) ); diff --git a/src/opt/fret/fretMain.c b/src/opt/fret/fretMain.c index df784e6ac..77ea8468a 100644 --- a/src/opt/fret/fretMain.c +++ b/src/opt/fret/fretMain.c @@ -478,7 +478,7 @@ int Abc_FlowRetime_PushFlows( Abc_Ntk_t * pNtk, bool fVerbose ) { int i, j, flow = 0, last, srcDist = 0; Abc_Obj_t *pObj, *pObj2; - int clk = clock(); +// int clk = clock(); pManMR->constraintMask |= BLOCK; diff --git a/src/opt/fxu/fxu.c b/src/opt/fxu/fxu.c index d11fd7935..b49ef9aaf 100644 --- a/src/opt/fxu/fxu.c +++ b/src/opt/fxu/fxu.c @@ -79,7 +79,7 @@ int Fxu_FastExtract( Fxu_Data_t * pData ) Weight1 = Fxu_HeapSingleReadMaxWeight( p->pHeapSingle ); if ( pData->fVerbose ) printf( "Div %5d : Best single = %5d.\r", Counter++, Weight1 ); - if ( Weight1 > 0 || Weight1 == 0 && pData->fUse0 ) + if ( Weight1 > 0 || (Weight1 == 0 && pData->fUse0) ) Fxu_UpdateSingle( p ); else break; @@ -94,7 +94,7 @@ int Fxu_FastExtract( Fxu_Data_t * pData ) Weight2 = Fxu_HeapDoubleReadMaxWeight( p->pHeapDouble ); if ( pData->fVerbose ) printf( "Div %5d : Best double = %5d.\r", Counter++, Weight2 ); - if ( Weight2 > 0 || Weight2 == 0 && pData->fUse0 ) + if ( Weight2 > 0 || (Weight2 == 0 && pData->fUse0) ) Fxu_UpdateDouble( p ); else break; @@ -115,14 +115,14 @@ int Fxu_FastExtract( Fxu_Data_t * pData ) if ( Weight1 >= Weight2 ) { - if ( Weight1 > 0 || Weight1 == 0 && pData->fUse0 ) + if ( Weight1 > 0 || (Weight1 == 0 && pData->fUse0) ) Fxu_UpdateSingle( p ); else break; } else { - if ( Weight2 > 0 || Weight2 == 0 && pData->fUse0 ) + if ( Weight2 > 0 || (Weight2 == 0 && pData->fUse0) ) Fxu_UpdateDouble( p ); else break; @@ -144,7 +144,7 @@ int Fxu_FastExtract( Fxu_Data_t * pData ) printf( "Div %5d : Best double = %5d. Best single = %5d. Best complement = %5d.\r", Counter++, Weight2, Weight1, Weight3 ); - if ( Weight3 > 0 || Weight3 == 0 && pData->fUse0 ) + if ( Weight3 > 0 || (Weight3 == 0 && pData->fUse0) ) Fxu_Update( p, pSingle, pDouble ); else break; diff --git a/src/opt/fxu/fxuCreate.c b/src/opt/fxu/fxuCreate.c index 55026b27a..21dfd419b 100644 --- a/src/opt/fxu/fxuCreate.c +++ b/src/opt/fxu/fxuCreate.c @@ -71,7 +71,7 @@ Fxu_Matrix * Fxu_CreateMatrix( Fxu_Data_t * pData ) nPairsStore = 0; nBitsMax = -1; for ( i = 0; i < pData->nNodesOld; i++ ) - if ( pSopCover = pData->vSops->pArray[i] ) + if ( (pSopCover = pData->vSops->pArray[i]) ) { nCubes = Abc_SopGetCubeNum( pSopCover ); nFanins = Abc_SopGetVarNum( pSopCover ); @@ -109,7 +109,7 @@ Fxu_Matrix * Fxu_CreateMatrix( Fxu_Data_t * pData ) iCube = 0; iPair = 0; for ( i = 0; i < pData->nNodesOld; i++ ) - if ( pSopCover = pData->vSops->pArray[i] ) + if ( (pSopCover = pData->vSops->pArray[i]) ) { // get the number of cubes nCubes = Abc_SopGetCubeNum( pSopCover ); @@ -136,7 +136,7 @@ Fxu_Matrix * Fxu_CreateMatrix( Fxu_Data_t * pData ) pOrder = ALLOC( int, nBitsMax ); // create the rows for ( i = 0; i < pData->nNodesOld; i++ ) - if ( pSopCover = pData->vSops->pArray[i] ) + if ( (pSopCover = pData->vSops->pArray[i]) ) { // get the new var in the matrix pVar = p->ppVars[2*i+1]; @@ -272,7 +272,7 @@ void Fxu_CreateCovers( Fxu_Matrix * p, Fxu_Data_t * pData ) // go through the internal nodes for ( n = 0; n < pData->nNodesOld; n++ ) - if ( pSopCover = pData->vSops->pArray[n] ) + if ( (pSopCover = pData->vSops->pArray[n]) ) { // get the number of this node iNode = n; diff --git a/src/opt/fxu/fxuInt.h b/src/opt/fxu/fxuInt.h index ea85cb795..4e3d72ebb 100644 --- a/src/opt/fxu/fxuInt.h +++ b/src/opt/fxu/fxuInt.h @@ -365,7 +365,7 @@ struct FxuSingle // 7 words #define Fxu_CubeForEachPair( pCube, pPair, i )\ for ( i = 0;\ i < pCube->pVar->nCubes &&\ - (((unsigned)(pPair = pCube->pVar->ppPairs[pCube->iCube][i])) >= 0);\ + (((unsigned)(PORT_PTRUINT_T)(pPair = pCube->pVar->ppPairs[pCube->iCube][i])) >= 0);\ i++ )\ if ( pPair ) diff --git a/src/opt/fxu/fxuPair.c b/src/opt/fxu/fxuPair.c index 3c031ce80..87645cc73 100644 --- a/src/opt/fxu/fxuPair.c +++ b/src/opt/fxu/fxuPair.c @@ -24,7 +24,7 @@ #define MAX_PRIMES 304 -static s_Primes[MAX_PRIMES] = +static int s_Primes[MAX_PRIMES] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, diff --git a/src/opt/fxu/fxuReduce.c b/src/opt/fxu/fxuReduce.c index 0ab8a1576..38032bfa5 100644 --- a/src/opt/fxu/fxuReduce.c +++ b/src/opt/fxu/fxuReduce.c @@ -55,9 +55,9 @@ int Fxu_PreprocessCubePairs( Fxu_Matrix * p, Vec_Ptr_t * vCovers, int nPairsTota Fxu_Cube * pCube1, * pCube2; Fxu_Var * pVar; int nCubes, nBitsMax, nSum; - int CutOffNum, CutOffQuant; + int CutOffNum = -1, CutOffQuant = -1; // Suppress "might be used uninitialized" int iPair, iQuant, k, c; - int clk = clock(); +// int clk = clock(); char * pSopCover; int nFanins; @@ -69,7 +69,7 @@ int Fxu_PreprocessCubePairs( Fxu_Matrix * p, Vec_Ptr_t * vCovers, int nPairsTota iPair = 0; nBitsMax = -1; for ( c = 0; c < vCovers->nSize; c++ ) - if ( pSopCover = vCovers->pArray[c] ) + if ( (pSopCover = vCovers->pArray[c]) ) { nFanins = Abc_SopGetVarNum(pSopCover); // precompute the differences @@ -135,7 +135,7 @@ int Fxu_PreprocessCubePairs( Fxu_Matrix * p, Vec_Ptr_t * vCovers, int nPairsTota // collect the corresponding pairs and add the divisors iPair = 0; for ( c = 0; c < vCovers->nSize; c++ ) - if ( pSopCover = vCovers->pArray[c] ) + if ( (pSopCover = vCovers->pArray[c]) ) { // get the var pVar = p->ppVars[2*c+1]; diff --git a/src/opt/fxu/fxuSingle.c b/src/opt/fxu/fxuSingle.c index 73d9a76c5..d2e3607cb 100644 --- a/src/opt/fxu/fxuSingle.c +++ b/src/opt/fxu/fxuSingle.c @@ -63,7 +63,7 @@ void Fxu_MatrixComputeSingles( Fxu_Matrix * p, int fUse0, int nSingleMax ) memset( pWeigtCounts, 0, sizeof(int) * 1000 ); for ( i = 2; i < Vec_PtrSize(vSingles); i += 3 ) { - Weight = (int)Vec_PtrEntry(vSingles, i); + Weight = (int)(PORT_PTRUINT_T)Vec_PtrEntry(vSingles, i); if ( Weight >= 999 ) pWeigtCounts[999]++; else @@ -82,7 +82,7 @@ void Fxu_MatrixComputeSingles( Fxu_Matrix * p, int fUse0, int nSingleMax ) k = 0; for ( i = 2; i < Vec_PtrSize(vSingles); i += 3 ) { - Weight = (int)Vec_PtrEntry(vSingles, i); + Weight = (int)(PORT_PTRUINT_T)Vec_PtrEntry(vSingles, i); if ( Weight < c ) continue; Vec_PtrWriteEntry( vSingles, k++, Vec_PtrEntry(vSingles, i-2) ); @@ -102,7 +102,7 @@ void Fxu_MatrixComputeSingles( Fxu_Matrix * p, int fUse0, int nSingleMax ) Fxu_MatrixAddSingle( p, Vec_PtrEntry(vSingles,i), Vec_PtrEntry(vSingles,i+1), - (int)Vec_PtrEntry(vSingles,i+2) ); + (int)(PORT_PTRUINT_T)Vec_PtrEntry(vSingles,i+2) ); } Vec_PtrFree( vSingles ); } @@ -159,7 +159,7 @@ void Fxu_MatrixComputeSinglesOneCollect( Fxu_Matrix * p, Fxu_Var * pVar, Vec_Ptr { Vec_PtrPush( vSingles, pVar2 ); Vec_PtrPush( vSingles, pVar ); - Vec_PtrPush( vSingles, (void *)WeightCur ); + Vec_PtrPush( vSingles, (void *)(PORT_PTRUINT_T)WeightCur ); } } diff --git a/src/opt/lpk/lpkAbcDec.c b/src/opt/lpk/lpkAbcDec.c index aa2d4bc0a..c06f0bf11 100644 --- a/src/opt/lpk/lpkAbcDec.c +++ b/src/opt/lpk/lpkAbcDec.c @@ -143,7 +143,6 @@ Abc_Obj_t * Lpk_Implement( Lpk_Man_t * pMan, Abc_Ntk_t * pNtk, Vec_Ptr_t * vLeav ***********************************************************************/ int Lpk_Decompose_rec( Lpk_Man_t * pMan, Lpk_Fun_t * p ) { - static Lpk_Res_t Res0, * pRes0 = &Res0; Lpk_Res_t * pResMux, * pResDsd; Lpk_Fun_t * p2; int clk; diff --git a/src/opt/lpk/lpkAbcDsd.c b/src/opt/lpk/lpkAbcDsd.c index f4095914f..46d9179aa 100644 --- a/src/opt/lpk/lpkAbcDsd.c +++ b/src/opt/lpk/lpkAbcDsd.c @@ -43,7 +43,11 @@ ***********************************************************************/ int Lpk_FunComputeMinSuppSizeVar( Lpk_Fun_t * p, unsigned ** ppTruths, int nTruths, unsigned ** ppCofs, unsigned uNonDecSupp ) { - int i, Var, VarBest, nSuppSize0, nSuppSize1, nSuppTotalMin, nSuppTotalCur, nSuppMaxMin, nSuppMaxCur; + int i, Var, VarBest, nSuppSize0, nSuppSize1; + int nSuppTotalMin = -1; // Suppress "might be used uninitialized" + int nSuppTotalCur; + int nSuppMaxMin = -1; // Suppress "might be used uninitialized" + int nSuppMaxCur; assert( nTruths > 0 ); VarBest = -1; Lpk_SuppForEachVar( p->uSupp, Var ) diff --git a/src/opt/lpk/lpkCore.c b/src/opt/lpk/lpkCore.c index 4eb64aa28..78356d81a 100644 --- a/src/opt/lpk/lpkCore.c +++ b/src/opt/lpk/lpkCore.c @@ -100,7 +100,7 @@ int Lpk_NodeHasChanged( Lpk_Man_t * p, int iNode ) Vec_PtrForEachEntry( vNodes, pTemp, i ) { // check if the node has changed - pTemp = Abc_NtkObj( p->pNtk, (int)pTemp ); + pTemp = Abc_NtkObj( p->pNtk, (int)(PORT_PTRUINT_T)pTemp ); if ( pTemp == NULL ) return 1; // check if the number of fanouts has changed @@ -233,7 +233,7 @@ p->timeMap += clock() - clk; ***********************************************************************/ int Lpk_ResynthesizeNode( Lpk_Man_t * p ) { - static int Count = 0; +// static int Count = 0; Kit_DsdNtk_t * pDsdNtk; Lpk_Cut_t * pCut; unsigned * pTruth; @@ -361,7 +361,7 @@ void Lpk_ComputeSupports( Lpk_Man_t * p, Lpk_Cut_t * pCut, unsigned * pTruth ) ***********************************************************************/ int Lpk_ResynthesizeNodeNew( Lpk_Man_t * p ) { - static int Count = 0; +// static int Count = 0; Abc_Obj_t * pObjNew, * pLeaf; Lpk_Cut_t * pCut; unsigned * pTruth; @@ -497,7 +497,7 @@ p->timeEval += clock() - clk; ***********************************************************************/ int Lpk_Resynthesize( Abc_Ntk_t * pNtk, Lpk_Par_t * pPars ) { - ProgressBar * pProgress; + ProgressBar * pProgress = NULL; // Suppress "might be used uninitialized" Lpk_Man_t * p; Abc_Obj_t * pObj; double Delta; diff --git a/src/opt/lpk/lpkCut.c b/src/opt/lpk/lpkCut.c index facd330b4..a2f46b09c 100644 --- a/src/opt/lpk/lpkCut.c +++ b/src/opt/lpk/lpkCut.c @@ -46,7 +46,7 @@ CloudNode * Lpk_CutTruthBdd_rec( CloudManager * dd, Hop_Man_t * pMan, Hop_Obj_t assert( !Hop_IsComplement(pObj) ); if ( pObj->pData ) { - assert( ((unsigned)pObj->pData) & 0xffff0000 ); + assert( ((unsigned)(PORT_PTRUINT_T)pObj->pData) & 0xffff0000 ); return pObj->pData; } // get the plan for a new truth table @@ -84,8 +84,8 @@ CloudNode * Lpk_CutTruthBdd( Lpk_Man_t * p, Lpk_Cut_t * pCut ) Hop_Man_t * pManHop = p->pNtk->pManFunc; Hop_Obj_t * pObjHop; Abc_Obj_t * pObj, * pFanin; - CloudNode * pTruth; - int i, k, iCount = 0; + CloudNode * pTruth = NULL; // Suppress "might be used uninitialized" + int i, k; // return NULL; // Lpk_NodePrintCut( p, pCut ); @@ -103,7 +103,7 @@ CloudNode * Lpk_CutTruthBdd( Lpk_Man_t * p, Lpk_Cut_t * pCut ) // set the initial truth tables at the fanins Abc_ObjForEachFanin( pObj, pFanin, k ) { - assert( ((unsigned)pFanin->pCopy) & 0xffff0000 ); + assert( ((unsigned)(PORT_PTRUINT_T)pFanin->pCopy) & 0xffff0000 ); Hop_ManPi( pManHop, k )->pData = pFanin->pCopy; } // compute the truth table of internal nodes @@ -138,7 +138,7 @@ unsigned * Lpk_CutTruth_rec( Hop_Man_t * pMan, Hop_Obj_t * pObj, int nVars, Vec_ assert( !Hop_IsComplement(pObj) ); if ( pObj->pData ) { - assert( ((unsigned)pObj->pData) & 0xffff0000 ); + assert( ((unsigned)(PORT_PTRUINT_T)pObj->pData) & 0xffff0000 ); return pObj->pData; } // get the plan for a new truth table @@ -173,8 +173,9 @@ unsigned * Lpk_CutTruth( Lpk_Man_t * p, Lpk_Cut_t * pCut, int fInv ) { Hop_Man_t * pManHop = p->pNtk->pManFunc; Hop_Obj_t * pObjHop; - Abc_Obj_t * pObj, * pFanin; - unsigned * pTruth; + Abc_Obj_t * pObj = NULL; // Suppress "might be used uninitialized" + Abc_Obj_t * pFanin; + unsigned * pTruth = NULL; // Suppress "might be used uninitialized" int i, k, iCount = 0; // Lpk_NodePrintCut( p, pCut ); assert( pCut->nNodes > 0 ); @@ -193,7 +194,7 @@ unsigned * Lpk_CutTruth( Lpk_Man_t * p, Lpk_Cut_t * pCut, int fInv ) // set the initial truth tables at the fanins Abc_ObjForEachFanin( pObj, pFanin, k ) { - assert( ((unsigned)pFanin->pCopy) & 0xffff0000 ); + assert( ((unsigned)(PORT_PTRUINT_T)pFanin->pCopy) & 0xffff0000 ); Hop_ManPi( pManHop, k )->pData = pFanin->pCopy; } // compute the truth table of internal nodes @@ -208,7 +209,7 @@ unsigned * Lpk_CutTruth( Lpk_Man_t * p, Lpk_Cut_t * pCut, int fInv ) if ( fInv == 0 ) { pTruth = Vec_PtrEntry( p->vTtNodes, iCount++ ); - Kit_TruthCopy( pTruth, (unsigned *)pObj->pCopy, pCut->nLeaves ); + Kit_TruthCopy( pTruth, (unsigned *)(PORT_PTRUINT_T)pObj->pCopy, pCut->nLeaves ); } assert( iCount <= Vec_PtrSize(p->vTtNodes) ); return pTruth; @@ -243,14 +244,14 @@ void Lpk_NodeRecordImpact( Lpk_Man_t * p ) if ( pNode->fMarkC ) continue; pNode->fMarkC = 1; - Vec_PtrPush( vNodes, (void *)pNode->Id ); - Vec_PtrPush( vNodes, (void *)Abc_ObjFanoutNum(pNode) ); + Vec_PtrPush( vNodes, (void *)(PORT_PTRUINT_T)pNode->Id ); + Vec_PtrPush( vNodes, (void *)(PORT_PTRUINT_T)Abc_ObjFanoutNum(pNode) ); } } // clear the marks Vec_PtrForEachEntry( vNodes, pNode, i ) { - pNode = Abc_NtkObj( p->pNtk, (int)pNode ); + pNode = Abc_NtkObj( p->pNtk, (int)(PORT_PTRUINT_T)pNode ); pNode->fMarkC = 0; i++; } @@ -280,7 +281,7 @@ int Lpk_NodeCutsCheckDsd( Lpk_Man_t * p, Lpk_Cut_t * pCut ) { assert( pObj->fMarkA == 0 ); pObj->fMarkA = 1; - pObj->pCopy = (void *)i; + pObj->pCopy = (void *)(PORT_PTRUINT_T)i; } // ref leaves pointed from the internal nodes nCands = 0; @@ -289,7 +290,7 @@ int Lpk_NodeCutsCheckDsd( Lpk_Man_t * p, Lpk_Cut_t * pCut ) fLeavesOnly = 1; Abc_ObjForEachFanin( pObj, pFanin, k ) if ( pFanin->fMarkA ) - p->pRefs[(int)pFanin->pCopy]++; + p->pRefs[(int)(PORT_PTRUINT_T)pFanin->pCopy]++; else fLeavesOnly = 0; if ( fLeavesOnly ) @@ -303,7 +304,7 @@ int Lpk_NodeCutsCheckDsd( Lpk_Man_t * p, Lpk_Cut_t * pCut ) Abc_ObjForEachFanin( pObj, pFanin, k ) { assert( pFanin->fMarkA == 1 ); - if ( p->pRefs[(int)pFanin->pCopy] > 1 ) + if ( p->pRefs[(int)(PORT_PTRUINT_T)pFanin->pCopy] > 1 ) break; } if ( k == Abc_ObjFaninNum(pObj) ) diff --git a/src/opt/lpk/lpkMap.c b/src/opt/lpk/lpkMap.c index 698aeea1b..f959f8f9c 100644 --- a/src/opt/lpk/lpkMap.c +++ b/src/opt/lpk/lpkMap.c @@ -41,7 +41,7 @@ ***********************************************************************/ If_Obj_t * Lpk_MapPrimeInternal( If_Man_t * pIfMan, Kit_Graph_t * pGraph ) { - Kit_Node_t * pNode; + Kit_Node_t * pNode = NULL; // Suppress "might be used uninitialized" If_Obj_t * pAnd0, * pAnd1; int i; // check for constant function diff --git a/src/opt/lpk/lpkMulti.c b/src/opt/lpk/lpkMulti.c index 82cf35786..3d2093e75 100644 --- a/src/opt/lpk/lpkMulti.c +++ b/src/opt/lpk/lpkMulti.c @@ -343,14 +343,31 @@ If_Obj_t * Lpk_MapTreeMulti_rec( Lpk_Man_t * p, Kit_DsdNtk_t ** ppNtks, int * pi ***********************************************************************/ If_Obj_t * Lpk_MapTreeMulti( Lpk_Man_t * p, unsigned * pTruth, int nVars, If_Obj_t ** ppLeaves ) { - static Counter = 0; + static int Counter = 0; If_Obj_t * pResult; Kit_DsdNtk_t * ppNtks[8] = {0}, * pTemp; Kit_DsdObj_t * pRoot; int piCofVar[4], pPrios[16], pFreqs[16] = {0}, piLits[16]; int i, k, nCBars, nSize, nMemSize; unsigned * ppCofs[4][8], uSupport; - char pTable[16][16] = {0}; + char pTable[16][16] = { + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} + }; int fVerbose = p->pPars->fVeryVerbose; Counter++; @@ -422,10 +439,6 @@ If_Obj_t * Lpk_MapTreeMulti( Lpk_Man_t * p, unsigned * pTruth, int nVars, If_Obj if ( fVerbose ) printf( "After restructuring with priority:\n" ); - if ( Counter == 1 ) - { - int x = 0; - } // transform all networks according to the variable order for ( i = 0; i < nSize; i++ ) { diff --git a/src/opt/mfs/mfsCore.c b/src/opt/mfs/mfsCore.c index a941f153e..0b2ba47d2 100644 --- a/src/opt/mfs/mfsCore.c +++ b/src/opt/mfs/mfsCore.c @@ -267,7 +267,7 @@ int Abc_NtkMfs( Abc_Ntk_t * pNtk, Mfs_Par_t * pPars ) if ( p->pCare ) { Abc_NtkForEachCi( pNtk, pObj, i ) - pObj->pData = (void *)i; + pObj->pData = (void *)(PORT_PTRUINT_T)i; } // compute levels diff --git a/src/opt/mfs/mfsStrash.c b/src/opt/mfs/mfsStrash.c index 88f7554ce..1153e4fdd 100644 --- a/src/opt/mfs/mfsStrash.c +++ b/src/opt/mfs/mfsStrash.c @@ -193,14 +193,14 @@ Aig_Man_t * Abc_NtkConstructAig( Mfs_Man_t * p, Abc_Obj_t * pNode ) Aig_ManIncrementTravId( p->pCare ); Vec_PtrForEachEntry( p->vSupp, pFanin, i ) { - pPi = Aig_ManPi( p->pCare, (int)pFanin->pData ); + pPi = Aig_ManPi( p->pCare, (int)(PORT_PTRUINT_T)pFanin->pData ); Aig_ObjSetTravIdCurrent( p->pCare, pPi ); pPi->pData = pFanin->pCopy; } // construct the constraints Vec_PtrForEachEntry( p->vSupp, pFanin, i ) { - vOuts = Vec_PtrEntry( p->vSuppsInv, (int)pFanin->pData ); + vOuts = Vec_PtrEntry( p->vSuppsInv, (int)(PORT_PTRUINT_T)pFanin->pData ); Vec_IntForEachEntry( vOuts, iOut, k ) { pPo = Aig_ManPo( p->pCare, iOut ); @@ -280,7 +280,7 @@ Aig_Man_t * Abc_NtkAigForConstraints( Mfs_Man_t * p, Abc_Obj_t * pNode ) Aig_ManIncrementTravId( p->pCare ); Vec_PtrForEachEntry( p->vSupp, pFanin, i ) { - pPi = Aig_ManPi( p->pCare, (int)pFanin->pData ); + pPi = Aig_ManPi( p->pCare, (int)(PORT_PTRUINT_T)pFanin->pData ); Aig_ObjSetTravIdCurrent( p->pCare, pPi ); pPi->pData = Aig_ObjCreatePi(pMan); } @@ -288,7 +288,7 @@ Aig_Man_t * Abc_NtkAigForConstraints( Mfs_Man_t * p, Abc_Obj_t * pNode ) pObjRoot = Aig_ManConst1(pMan); Vec_PtrForEachEntry( p->vSupp, pFanin, i ) { - vOuts = Vec_PtrEntry( p->vSuppsInv, (int)pFanin->pData ); + vOuts = Vec_PtrEntry( p->vSuppsInv, (int)(PORT_PTRUINT_T)pFanin->pData ); Vec_IntForEachEntry( vOuts, iOut, k ) { pPo = Aig_ManPo( p->pCare, iOut ); diff --git a/src/opt/res/resSat.c b/src/opt/res/resSat.c index dd0e7a23a..798e7abc0 100644 --- a/src/opt/res/resSat.c +++ b/src/opt/res/resSat.c @@ -63,44 +63,44 @@ void * Res_SatProveUnsat( Abc_Ntk_t * pAig, Vec_Ptr_t * vFanins ) // assign unique numbers to each node nNodes = 0; - Abc_AigConst1(pAig)->pCopy = (void *)nNodes++; + Abc_AigConst1(pAig)->pCopy = (void *)(PORT_PTRUINT_T)nNodes++; Abc_NtkForEachPi( pAig, pObj, i ) - pObj->pCopy = (void *)nNodes++; + pObj->pCopy = (void *)(PORT_PTRUINT_T)nNodes++; Vec_PtrForEachEntry( vNodes, pObj, i ) - pObj->pCopy = (void *)nNodes++; + pObj->pCopy = (void *)(PORT_PTRUINT_T)nNodes++; Vec_PtrForEachEntry( vFanins, pObj, i ) // useful POs - pObj->pCopy = (void *)nNodes++; + pObj->pCopy = (void *)(PORT_PTRUINT_T)nNodes++; // start the solver pSat = sat_solver_new(); sat_solver_store_alloc( pSat ); // add clause for the constant node - Res_SatAddConst1( pSat, (int)Abc_AigConst1(pAig)->pCopy, 0 ); + Res_SatAddConst1( pSat, (int)(PORT_PTRUINT_T)Abc_AigConst1(pAig)->pCopy, 0 ); // add clauses for AND gates Vec_PtrForEachEntry( vNodes, pObj, i ) - Res_SatAddAnd( pSat, (int)pObj->pCopy, - (int)Abc_ObjFanin0(pObj)->pCopy, (int)Abc_ObjFanin1(pObj)->pCopy, Abc_ObjFaninC0(pObj), Abc_ObjFaninC1(pObj) ); + Res_SatAddAnd( pSat, (int)(PORT_PTRUINT_T)pObj->pCopy, + (int)(PORT_PTRUINT_T)Abc_ObjFanin0(pObj)->pCopy, (int)(PORT_PTRUINT_T)Abc_ObjFanin1(pObj)->pCopy, Abc_ObjFaninC0(pObj), Abc_ObjFaninC1(pObj) ); Vec_PtrFree( vNodes ); // add clauses for POs Vec_PtrForEachEntry( vFanins, pObj, i ) - Res_SatAddEqual( pSat, (int)pObj->pCopy, - (int)Abc_ObjFanin0(pObj)->pCopy, Abc_ObjFaninC0(pObj) ); + Res_SatAddEqual( pSat, (int)(PORT_PTRUINT_T)pObj->pCopy, + (int)(PORT_PTRUINT_T)Abc_ObjFanin0(pObj)->pCopy, Abc_ObjFaninC0(pObj) ); // add trivial clauses pObj = Vec_PtrEntry(vFanins, 0); - Res_SatAddConst1( pSat, (int)pObj->pCopy, 0 ); // care-set + Res_SatAddConst1( pSat, (int)(PORT_PTRUINT_T)pObj->pCopy, 0 ); // care-set pObj = Vec_PtrEntry(vFanins, 1); - Res_SatAddConst1( pSat, (int)pObj->pCopy, 0 ); // on-set + Res_SatAddConst1( pSat, (int)(PORT_PTRUINT_T)pObj->pCopy, 0 ); // on-set // bookmark the clauses of A sat_solver_store_mark_clauses_a( pSat ); // duplicate the clauses pObj = Vec_PtrEntry(vFanins, 1); - Sat_SolverDoubleClauses( pSat, (int)pObj->pCopy ); + Sat_SolverDoubleClauses( pSat, (int)(PORT_PTRUINT_T)pObj->pCopy ); // add the equality constraints Vec_PtrForEachEntryStart( vFanins, pObj, i, 2 ) - Res_SatAddEqual( pSat, (int)pObj->pCopy, ((int)pObj->pCopy) + nNodes, 0 ); + Res_SatAddEqual( pSat, (int)(PORT_PTRUINT_T)pObj->pCopy, ((int)(PORT_PTRUINT_T)pObj->pCopy) + nNodes, 0 ); // bookmark the roots sat_solver_store_mark_roots( pSat ); @@ -155,39 +155,39 @@ void * Res_SatSimulateConstr( Abc_Ntk_t * pAig, int fOnSet ) // assign unique numbers to each node nNodes = 0; - Abc_AigConst1(pAig)->pCopy = (void *)nNodes++; + Abc_AigConst1(pAig)->pCopy = (void *)(PORT_PTRUINT_T)nNodes++; Abc_NtkForEachPi( pAig, pObj, i ) - pObj->pCopy = (void *)nNodes++; + pObj->pCopy = (void *)(PORT_PTRUINT_T)nNodes++; Vec_PtrForEachEntry( vNodes, pObj, i ) - pObj->pCopy = (void *)nNodes++; + pObj->pCopy = (void *)(PORT_PTRUINT_T)nNodes++; Vec_PtrForEachEntry( vFanins, pObj, i ) // useful POs - pObj->pCopy = (void *)nNodes++; + pObj->pCopy = (void *)(PORT_PTRUINT_T)nNodes++; // start the solver pSat = sat_solver_new(); // add clause for the constant node - Res_SatAddConst1( pSat, (int)Abc_AigConst1(pAig)->pCopy, 0 ); + Res_SatAddConst1( pSat, (int)(PORT_PTRUINT_T)Abc_AigConst1(pAig)->pCopy, 0 ); // add clauses for AND gates Vec_PtrForEachEntry( vNodes, pObj, i ) - Res_SatAddAnd( pSat, (int)pObj->pCopy, - (int)Abc_ObjFanin0(pObj)->pCopy, (int)Abc_ObjFanin1(pObj)->pCopy, Abc_ObjFaninC0(pObj), Abc_ObjFaninC1(pObj) ); + Res_SatAddAnd( pSat, (int)(PORT_PTRUINT_T)pObj->pCopy, + (int)(PORT_PTRUINT_T)Abc_ObjFanin0(pObj)->pCopy, (int)(PORT_PTRUINT_T)Abc_ObjFanin1(pObj)->pCopy, Abc_ObjFaninC0(pObj), Abc_ObjFaninC1(pObj) ); Vec_PtrFree( vNodes ); // add clauses for the first PO pObj = Abc_NtkPo( pAig, 0 ); - Res_SatAddEqual( pSat, (int)pObj->pCopy, - (int)Abc_ObjFanin0(pObj)->pCopy, Abc_ObjFaninC0(pObj) ); + Res_SatAddEqual( pSat, (int)(PORT_PTRUINT_T)pObj->pCopy, + (int)(PORT_PTRUINT_T)Abc_ObjFanin0(pObj)->pCopy, Abc_ObjFaninC0(pObj) ); // add clauses for the second PO pObj = Abc_NtkPo( pAig, 1 ); - Res_SatAddEqual( pSat, (int)pObj->pCopy, - (int)Abc_ObjFanin0(pObj)->pCopy, Abc_ObjFaninC0(pObj) ); + Res_SatAddEqual( pSat, (int)(PORT_PTRUINT_T)pObj->pCopy, + (int)(PORT_PTRUINT_T)Abc_ObjFanin0(pObj)->pCopy, Abc_ObjFaninC0(pObj) ); // add trivial clauses pObj = Abc_NtkPo( pAig, 0 ); - Res_SatAddConst1( pSat, (int)pObj->pCopy, 0 ); // care-set + Res_SatAddConst1( pSat, (int)(PORT_PTRUINT_T)pObj->pCopy, 0 ); // care-set pObj = Abc_NtkPo( pAig, 1 ); - Res_SatAddConst1( pSat, (int)pObj->pCopy, !fOnSet ); // on-set + Res_SatAddConst1( pSat, (int)(PORT_PTRUINT_T)pObj->pCopy, !fOnSet ); // on-set Vec_PtrFree( vFanins ); return pSat; @@ -211,13 +211,14 @@ int Res_SatSimulate( Res_Sim_t * p, int nPatsLimit, int fOnSet ) Vec_Int_t * vLits; Vec_Ptr_t * vPats; sat_solver * pSat; - int RetValue, i, k, value, status, Lit, Var, iPat; + int RetValue = -1; // Suppress "might be used uninitialized" + int i, k, value, status, Lit, Var, iPat; int clk = clock(); //printf( "Looking for %s: ", fOnSet? "onset " : "offset" ); // decide what problem should be solved - Lit = toLitCond( (int)Abc_NtkPo(p->pAig,1)->pCopy, !fOnSet ); + Lit = toLitCond( (int)(PORT_PTRUINT_T)Abc_NtkPo(p->pAig,1)->pCopy, !fOnSet ); if ( fOnSet ) { iPat = p->nPats1; @@ -274,7 +275,7 @@ int Res_SatSimulate( Res_Sim_t * p, int nPatsLimit, int fOnSet ) Vec_IntClear( vLits ); for ( i = 0; i < p->nTruePis; i++ ) { - Var = (int)Abc_NtkPi(p->pAig,i)->pCopy; + Var = (int)(PORT_PTRUINT_T)Abc_NtkPi(p->pAig,i)->pCopy; value = (int)(pSat->model.ptr[Var] == l_True); if ( value ) Abc_InfoSetBit( Vec_PtrEntry(vPats, i), k ); diff --git a/src/opt/ret/retArea.c b/src/opt/ret/retArea.c index 5eec8e80c..318147f55 100644 --- a/src/opt/ret/retArea.c +++ b/src/opt/ret/retArea.c @@ -75,7 +75,7 @@ int Abc_NtkRetimeMinArea( Abc_Ntk_t * pNtk, int fForwardOnly, int fBackwardOnly, if ( fOneFrame ) pNtkTotal = Abc_NtkRetimeMinAreaOne( pNtk, 0, fVerbose ); else - while ( pNtkBottom = Abc_NtkRetimeMinAreaOne( pNtk, 0, fVerbose ) ) + while ( (pNtkBottom = Abc_NtkRetimeMinAreaOne( pNtk, 0, fVerbose )) ) pNtkTotal = Abc_NtkAttachBottom( pNtkTotal, pNtkBottom ); } // compute initial values @@ -109,7 +109,6 @@ Abc_Ntk_t * Abc_NtkRetimeMinAreaOne( Abc_Ntk_t * pNtk, int fForward, int fVerbos { Abc_Ntk_t * pNtkNew = NULL; Vec_Ptr_t * vMinCut; - int nLatches = Abc_NtkLatchNum(pNtk); // mark current latches and TFI(POs) Abc_NtkRetimeMinAreaPrepare( pNtk, fForward ); // run the maximum forward flow @@ -265,22 +264,22 @@ int Abc_NtkRetimeMinAreaInitValues_rec( Abc_Obj_t * pObj ) int i; // skip visited nodes if ( Abc_NodeIsTravIdCurrent(pObj) ) - return (int)pObj->pCopy; + return (int)(PORT_PTRUINT_T)pObj->pCopy; Abc_NodeSetTravIdCurrent(pObj); // consider the case of a latch output if ( Abc_ObjIsBo(pObj) ) { assert( Abc_ObjIsLatch(Abc_ObjFanin0(pObj)) ); - pObj->pCopy = (void *)Abc_NtkRetimeMinAreaInitValues_rec( Abc_ObjFanin0(pObj) ); - return (int)pObj->pCopy; + pObj->pCopy = (void *)(PORT_PTRUINT_T)Abc_NtkRetimeMinAreaInitValues_rec( Abc_ObjFanin0(pObj) ); + return (int)(PORT_PTRUINT_T)pObj->pCopy; } assert( Abc_ObjIsNode(pObj) ); // visit the fanins Abc_ObjForEachFanin( pObj, pFanin, i ) Abc_NtkRetimeMinAreaInitValues_rec( pFanin ); // compute the value of the node - pObj->pCopy = (void *)Abc_ObjSopSimulate(pObj); - return (int)pObj->pCopy; + pObj->pCopy = (void *)(PORT_PTRUINT_T)Abc_ObjSopSimulate(pObj); + return (int)(PORT_PTRUINT_T)pObj->pCopy; } /**Function************************************************************* @@ -302,7 +301,7 @@ void Abc_NtkRetimeMinAreaInitValues( Abc_Ntk_t * pNtk, Vec_Ptr_t * vMinCut ) Abc_NtkIncrementTravId(pNtk); Abc_NtkForEachLatch( pNtk, pObj, i ) { - pObj->pCopy = (void *)Abc_LatchIsInit1(pObj); + pObj->pCopy = (void *)(PORT_PTRUINT_T)Abc_LatchIsInit1(pObj); Abc_NodeSetTravIdCurrent( pObj ); } // propagate initial values @@ -479,7 +478,7 @@ void Abc_NtkRetimeMinAreaUpdateLatches( Abc_Ntk_t * pNtk, Vec_Ptr_t * vMinCut, i Abc_ObjAddFanin( pLatch, pLatchIn ); if ( fForward ) { - pLatch->pData = (void *)(pObj->pCopy? ABC_INIT_ONE : ABC_INIT_ZERO); + pLatch->pData = (void *)(PORT_PTRUINT_T)(pObj->pCopy? ABC_INIT_ONE : ABC_INIT_ZERO); // redirect edges to the unvisited fanouts of the node Abc_NodeCollectFanouts( pObj, vNodes ); Vec_PtrForEachEntry( vNodes, pNext, k ) diff --git a/src/opt/ret/retDelay.c b/src/opt/ret/retDelay.c index bcfe3a2ea..0f3c3daa0 100644 --- a/src/opt/ret/retDelay.c +++ b/src/opt/ret/retDelay.c @@ -74,9 +74,11 @@ int Abc_NtkRetimeMinDelayTry( Abc_Ntk_t * pNtk, int fForward, int fInitial, int { Abc_Ntk_t * pNtkNew = NULL; Vec_Ptr_t * vCritical; - Vec_Int_t * vValues; + Vec_Int_t * vValues = NULL; // Suppress "might be used uninitialized" Abc_Obj_t * pObj; - int i, k, IterBest, DelayCur, DelayBest, DelayStart, LatchesBest; + int i, k, IterBest, DelayCur, DelayBest; + int DelayStart = -1; // Suppress "might be used uninitialized" + int LatchesBest; // transfer intitial values if ( fInitial ) { diff --git a/src/opt/ret/retFlow.c b/src/opt/ret/retFlow.c index 47ee8516e..bad4b7e74 100644 --- a/src/opt/ret/retFlow.c +++ b/src/opt/ret/retFlow.c @@ -709,7 +709,8 @@ int Abc_NtkMaxFlowVerifyCut( Abc_Ntk_t * pNtk, Vec_Ptr_t * vMinCut, int fForward ***********************************************************************/ void Abc_NtkMaxFlowPrintFlow( Abc_Ntk_t * pNtk, int fForward ) { - Abc_Obj_t * pLatch, * pNext, * pPrev; + Abc_Obj_t * pLatch, * pNext; + Abc_Obj_t * pPrev = NULL; // Suppress "might be used uninitialized" int i; if ( fForward ) { diff --git a/src/opt/ret/retIncrem.c b/src/opt/ret/retIncrem.c index ba8104be4..140e5dcc2 100644 --- a/src/opt/ret/retIncrem.c +++ b/src/opt/ret/retIncrem.c @@ -48,7 +48,8 @@ int Abc_NtkRetimeIncremental( Abc_Ntk_t * pNtk, int fForward, int fMinDelay, int st_table * tLatches; int nLatches = Abc_NtkLatchNum(pNtk); int nIdMaxStart = Abc_NtkObjNumMax(pNtk); - int RetValue, nIterLimit; + int RetValue; + int nIterLimit = -1; // Suppress "might be used uninitialized" if ( Abc_NtkNodeNum(pNtk) == 0 ) return 0; // reorder CI/CO/latch inputs @@ -112,7 +113,7 @@ st_table * Abc_NtkRetimePrepareLatches( Abc_Ntk_t * pNtk ) Abc_NtkForEachLatch( pNtk, pLatch, i ) { // map latch into its true number - st_insert( tLatches, (void *)pLatch, (void *)(i-nOffSet) ); + st_insert( tLatches, (void *)(PORT_PTRUINT_T)pLatch, (void *)(PORT_PTRUINT_T)(i-nOffSet) ); // disconnect LI pLatchIn = Abc_ObjFanin0(pLatch); pFanin = Abc_ObjFanin0(pLatchIn); @@ -220,8 +221,8 @@ int Abc_NtkRetimeFinalizeLatches( Abc_Ntk_t * pNtk, st_table * tLatches, int nId ***********************************************************************/ int Abc_NtkRetimeOneWay( Abc_Ntk_t * pNtk, int fForward, int fVerbose ) { - Abc_Ntk_t * pNtkNew; - Vec_Int_t * vValues; + Abc_Ntk_t * pNtkNew = NULL; // Suppress "might be used uninitialized" + Vec_Int_t * vValues = NULL; // Suppress "might be used uninitialized" Abc_Obj_t * pObj; int i, fChanges, nTotalMoves = 0, nTotalMovesLimit = 10000; if ( fForward ) @@ -319,7 +320,7 @@ void Abc_NtkRetimeNode( Abc_Obj_t * pObj, int fForward, int fInitial ) { // compute the initial value if ( fInitial ) - pObj->pCopy = (void *)Abc_ObjSopSimulate( pObj ); + pObj->pCopy = (void *)(PORT_PTRUINT_T)Abc_ObjSopSimulate( pObj ); // collect fanins Abc_NodeCollectFanins( pObj, vNodes ); // make the node point to the fanins fanins @@ -399,10 +400,10 @@ int Abc_NtkRetimeCheckCompatibleLatchFanouts( Abc_Obj_t * pObj ) continue; if ( Init == -1 ) { - Init = (int)pObj->pData; + Init = (int)(PORT_PTRUINT_T)pObj->pData; nLatches++; } - else if ( Init == (int)pObj->pData ) + else if ( Init == (int)(PORT_PTRUINT_T)pObj->pData ) nLatches++; } return nLatches; diff --git a/src/opt/ret/retInit.c b/src/opt/ret/retInit.c index dcb71c603..8de0ef474 100644 --- a/src/opt/ret/retInit.c +++ b/src/opt/ret/retInit.c @@ -100,9 +100,9 @@ int Abc_ObjSopSimulate( Abc_Obj_t * pObj ) Abc_CubeForEachVar( pCube, Value, v ) { if ( Value == '0' ) - ResVar = 1 ^ ((int)Abc_ObjFanin(pObj, v)->pCopy); + ResVar = 1 ^ ((int)(PORT_PTRUINT_T)Abc_ObjFanin(pObj, v)->pCopy); else if ( Value == '1' ) - ResVar = (int)Abc_ObjFanin(pObj, v)->pCopy; + ResVar = (int)(PORT_PTRUINT_T)Abc_ObjFanin(pObj, v)->pCopy; else continue; ResAnd &= ResVar; @@ -134,17 +134,17 @@ int Abc_NtkRetimeVerifyModel( Abc_Ntk_t * pNtkCone, Vec_Int_t * vValues, int * p assert( Abc_NtkIsSopLogic(pNtkCone) ); // set the PIs Abc_NtkForEachPi( pNtkCone, pObj, i ) - pObj->pCopy = (void *)pModel[i]; + pObj->pCopy = (void *)(PORT_PTRUINT_T)pModel[i]; // simulate the internal nodes vNodes = Abc_NtkDfs( pNtkCone, 0 ); Vec_PtrForEachEntry( vNodes, pObj, i ) - pObj->pCopy = (void *)Abc_ObjSopSimulate( pObj ); + pObj->pCopy = (void *)(PORT_PTRUINT_T)Abc_ObjSopSimulate( pObj ); Vec_PtrFree( vNodes ); // compare the outputs Abc_NtkForEachPo( pNtkCone, pObj, i ) pObj->pCopy = Abc_ObjFanin0(pObj)->pCopy; Abc_NtkForEachPo( pNtkCone, pObj, i ) - Counter += (Vec_IntEntry(vValues, i) != (int)pObj->pCopy); + Counter += (Vec_IntEntry(vValues, i) != (int)(PORT_PTRUINT_T)pObj->pCopy); if ( Counter > 0 ) printf( "%d outputs (out of %d) have a value mismatch.\n", Counter, Abc_NtkPoNum(pNtkCone) ); return 1; @@ -167,7 +167,7 @@ void Abc_NtkRetimeTranferToCopy( Abc_Ntk_t * pNtk ) int i; Abc_NtkForEachObj( pNtk, pObj, i ) if ( Abc_ObjIsLatch(pObj) ) - pObj->pCopy = (void *)Abc_LatchIsInit1(pObj); + pObj->pCopy = (void *)(PORT_PTRUINT_T)Abc_LatchIsInit1(pObj); } /**Function************************************************************* @@ -187,7 +187,7 @@ void Abc_NtkRetimeTranferFromCopy( Abc_Ntk_t * pNtk ) int i; Abc_NtkForEachObj( pNtk, pObj, i ) if ( Abc_ObjIsLatch(pObj) ) - pObj->pData = (void *)(pObj->pCopy? ABC_INIT_ONE : ABC_INIT_ZERO); + pObj->pData = (void *)(PORT_PTRUINT_T)(pObj->pCopy? ABC_INIT_ONE : ABC_INIT_ZERO); } /**Function************************************************************* @@ -230,10 +230,10 @@ void Abc_NtkRetimeInsertLatchValues( Abc_Ntk_t * pNtk, Vec_Int_t * vValues ) int i, Counter = 0; Abc_NtkForEachObj( pNtk, pObj, i ) if ( Abc_ObjIsLatch(pObj) ) - pObj->pCopy = (void *)Counter++; + pObj->pCopy = (void *)(PORT_PTRUINT_T)Counter++; Abc_NtkForEachObj( pNtk, pObj, i ) if ( Abc_ObjIsLatch(pObj) ) - pObj->pData = (void *)(vValues? (Vec_IntEntry(vValues,(int)pObj->pCopy)? ABC_INIT_ONE : ABC_INIT_ZERO) : ABC_INIT_DC); + pObj->pData = (void *)(PORT_PTRUINT_T)(vValues? (Vec_IntEntry(vValues,(int)(PORT_PTRUINT_T)pObj->pCopy)? ABC_INIT_ONE : ABC_INIT_ZERO) : ABC_INIT_DC); } /**Function************************************************************* @@ -316,22 +316,22 @@ void Abc_NtkCycleInitStateSop( Abc_Ntk_t * pNtk, int nFrames, int fVerbose ) srand( 0x12341234 ); // initialize the values Abc_NtkForEachPi( pNtk, pObj, i ) - pObj->pCopy = (void *)(rand() & 1); + pObj->pCopy = (void *)(PORT_PTRUINT_T)(rand() & 1); Abc_NtkForEachLatch( pNtk, pObj, i ) - pObj->pCopy = (void *)Abc_LatchIsInit1(pObj); + pObj->pCopy = (void *)(PORT_PTRUINT_T)Abc_LatchIsInit1(pObj); // simulate for the given number of timeframes vNodes = Abc_NtkDfs( pNtk, 0 ); for ( f = 0; f < nFrames; f++ ) { // simulate internal nodes Vec_PtrForEachEntry( vNodes, pObj, i ) - pObj->pCopy = (void *)Abc_ObjSopSimulate( pObj ); + pObj->pCopy = (void *)(PORT_PTRUINT_T)Abc_ObjSopSimulate( pObj ); // bring the results to the COs Abc_NtkForEachCo( pNtk, pObj, i ) pObj->pCopy = Abc_ObjFanin0(pObj)->pCopy; // assign PI values Abc_NtkForEachPi( pNtk, pObj, i ) - pObj->pCopy = (void *)(rand() & 1); + pObj->pCopy = (void *)(PORT_PTRUINT_T)(rand() & 1); // transfer the latch values Abc_NtkForEachLatch( pNtk, pObj, i ) Abc_ObjFanout0(pObj)->pCopy = Abc_ObjFanin0(pObj)->pCopy; @@ -339,7 +339,7 @@ void Abc_NtkCycleInitStateSop( Abc_Ntk_t * pNtk, int nFrames, int fVerbose ) Vec_PtrFree( vNodes ); // set the final values Abc_NtkForEachLatch( pNtk, pObj, i ) - pObj->pData = (void *)(Abc_ObjFanout0(pObj)->pCopy ? ABC_INIT_ONE : ABC_INIT_ZERO); + pObj->pData = (void *)(PORT_PTRUINT_T)(Abc_ObjFanout0(pObj)->pCopy ? ABC_INIT_ONE : ABC_INIT_ZERO); } //////////////////////////////////////////////////////////////////////// diff --git a/src/opt/ret/retLvalue.c b/src/opt/ret/retLvalue.c index b4d9e946c..26f51f094 100644 --- a/src/opt/ret/retLvalue.c +++ b/src/opt/ret/retLvalue.c @@ -37,8 +37,8 @@ static Vec_Ptr_t * Abc_ManCollectLatches( Abc_Ntk_t * pNtk ); static int Abc_NtkRetimeUsingLags( Abc_Ntk_t * pNtk, Vec_Int_t * vLags, int fVerbose ); static inline int Abc_NodeComputeLag( int LValue, int Fi ) { return (LValue + (1<<16)*Fi)/Fi - (1<<16) - (int)(LValue % Fi == 0); } -static inline int Abc_NodeGetLValue( Abc_Obj_t * pNode ) { return (int)pNode->pCopy; } -static inline void Abc_NodeSetLValue( Abc_Obj_t * pNode, int Value ) { pNode->pCopy = (void *)Value; } +static inline int Abc_NodeGetLValue( Abc_Obj_t * pNode ) { return (int)(PORT_PTRUINT_T)pNode->pCopy; } +static inline void Abc_NodeSetLValue( Abc_Obj_t * pNode, int Value ) { pNode->pCopy = (void *)(PORT_PTRUINT_T)Value; } //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// diff --git a/src/opt/rwr/rwrDec.c b/src/opt/rwr/rwrDec.c index ef7af34f6..ae01b8963 100644 --- a/src/opt/rwr/rwrDec.c +++ b/src/opt/rwr/rwrDec.c @@ -60,7 +60,7 @@ void Rwr_ManPreprocess( Rwr_Man_t * p ) for ( pNode = p->pTable[i]; pNode; pNode = pNode->pNext ) { assert( pNode->uTruth == p->pTable[i]->uTruth ); - assert( p->pMap[pNode->uTruth] >= 0 && p->pMap[pNode->uTruth] < 222 ); + assert( p->pMap[pNode->uTruth] < 222 ); // Guaranteed to be >=0 b/c unsigned Vec_VecPush( p->vClasses, p->pMap[pNode->uTruth], pNode ); p->pMapInv[ p->pMap[pNode->uTruth] ] = p->puCanons[pNode->uTruth]; } diff --git a/src/opt/rwr/rwrEva.c b/src/opt/rwr/rwrEva.c index 396a659c4..42c370ab1 100644 --- a/src/opt/rwr/rwrEva.c +++ b/src/opt/rwr/rwrEva.c @@ -58,9 +58,12 @@ int Rwr_NodeRewrite( Rwr_Man_t * p, Cut_Man_t * pManCut, Abc_Obj_t * pNode, int Dec_Graph_t * pGraph; Cut_Cut_t * pCut;//, * pTemp; Abc_Obj_t * pFanin; - unsigned uPhase, uTruthBest, uTruth; + unsigned uPhase; + unsigned uTruthBest = 0; // Suppress "might be used uninitialized" + unsigned uTruth; char * pPerm; - int Required, nNodesSaved, nNodesSaveCur; + int Required, nNodesSaved; + int nNodesSaveCur = -1; // Suppress "might be used uninitialized" int i, GainCur, GainBest = -1; int clk, clk2;//, Counter; @@ -92,14 +95,14 @@ clk = clock(); // get the fanin permutation uTruth = 0xFFFF & *Cut_CutReadTruth(pCut); - pPerm = p->pPerms4[ p->pPerms[uTruth] ]; + pPerm = p->pPerms4[ (int)p->pPerms[uTruth] ]; uPhase = p->pPhases[uTruth]; // collect fanins with the corresponding permutation/phase Vec_PtrClear( p->vFaninsCur ); Vec_PtrFill( p->vFaninsCur, (int)pCut->nLeaves, 0 ); for ( i = 0; i < (int)pCut->nLeaves; i++ ) { - pFanin = Abc_NtkObj( pNode->pNtk, pCut->pLeaves[pPerm[i]] ); + pFanin = Abc_NtkObj( pNode->pNtk, pCut->pLeaves[(int)pPerm[i]] ); if ( pFanin == NULL ) break; pFanin = Abc_ObjNotCond(pFanin, ((uPhase & (1< 0) ); @@ -247,7 +250,8 @@ Dec_Graph_t * Rwr_CutEvaluate( Rwr_Man_t * p, Abc_Obj_t * pRoot, Cut_Cut_t * pCu { extern int Dec_GraphToNetworkCount( Abc_Obj_t * pRoot, Dec_Graph_t * pGraph, int NodeMax, int LevelMax ); Vec_Ptr_t * vSubgraphs; - Dec_Graph_t * pGraphBest, * pGraphCur; + Dec_Graph_t * pGraphBest = NULL; // Suppress "might be used uninitialized" + Dec_Graph_t * pGraphCur; Rwr_Node_t * pNode, * pFanin; int nNodesAdded, GainBest, i, k; unsigned uTruth; diff --git a/src/opt/rwr/rwrExp.c b/src/opt/rwr/rwrExp.c index 2d00bb1c5..5729cdbc3 100644 --- a/src/opt/rwr/rwrExp.c +++ b/src/opt/rwr/rwrExp.c @@ -199,7 +199,7 @@ void Rwt_Man5ExploreStart() void Rwt_Man5ExploreCount( unsigned uTruth ) { int * pCounter; - if ( !stmm_find_or_add( s_pManRwrExp5->tTableNN, (char *)uTruth, (char***)&pCounter ) ) + if ( !stmm_find_or_add( s_pManRwrExp5->tTableNN, (char *)(PORT_PTRUINT_T)uTruth, (char***)&pCounter ) ) *pCounter = 0; (*pCounter)++; } @@ -271,7 +271,7 @@ void Rwt_Man5ExplorePrint() pFile = fopen( "nnclass_stats5.txt", "w" ); Vec_IntForEachEntry( vClassesNN, uTruth, i ) { - if ( !stmm_lookup( s_pManRwrExp5->tTableNN, (char *)uTruth, (char **)&Counter ) ) + if ( !stmm_lookup( s_pManRwrExp5->tTableNN, (char *)(PORT_PTRUINT_T)uTruth, (char **)&Counter ) ) { assert( 0 ); } @@ -288,9 +288,9 @@ clk = clock(); { int * pCounter; uTruthC = Extra_TruthCanonNPN( uTruth, 5 ); - if ( !stmm_find_or_add( s_pManRwrExp5->tTableNPN, (char *)uTruthC, (char***)&pCounter ) ) + if ( !stmm_find_or_add( s_pManRwrExp5->tTableNPN, (char *)(PORT_PTRUINT_T)uTruthC, (char***)&pCounter ) ) *pCounter = 0; - if ( !stmm_lookup( s_pManRwrExp5->tTableNN, (char *)uTruth, (char **)&Counter ) ) + if ( !stmm_lookup( s_pManRwrExp5->tTableNN, (char *)(PORT_PTRUINT_T)uTruth, (char **)&Counter ) ) { assert( 0 ); } @@ -309,7 +309,7 @@ PRT( "Computing NPN classes", clock() - clk ); pFile = fopen( "npnclass_stats5.txt", "w" ); Vec_IntForEachEntry( vClassesNPN, uTruth, i ) { - if ( !stmm_lookup( s_pManRwrExp5->tTableNPN, (char *)uTruth, (char **)&Counter ) ) + if ( !stmm_lookup( s_pManRwrExp5->tTableNPN, (char *)(PORT_PTRUINT_T)uTruth, (char **)&Counter ) ) { assert( 0 ); } @@ -324,8 +324,6 @@ PRT( "Computing NPN classes", clock() - clk ); } - - //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// diff --git a/src/opt/sim/simMan.c b/src/opt/sim/simMan.c index 3b50ad84d..139a1a057 100644 --- a/src/opt/sim/simMan.c +++ b/src/opt/sim/simMan.c @@ -77,7 +77,7 @@ Sym_Man_t * Sym_ManStart( Abc_Ntk_t * pNtk, int fVerbose ) for ( i = 0; i < p->nOutputs; i++ ) for ( v = 0; v < p->nInputs; v++ ) if ( Sim_SuppFunHasVar( p->vSuppFun, i, v ) ) - Vec_VecPush( p->vSupports, i, (void *)v ); + Vec_VecPush( p->vSupports, i, (void *)(PORT_PTRUINT_T)v ); return p; } diff --git a/src/opt/sim/simSupp.c b/src/opt/sim/simSupp.c index f7048f4af..e6ba853cc 100644 --- a/src/opt/sim/simSupp.c +++ b/src/opt/sim/simSupp.c @@ -319,7 +319,7 @@ void Sim_ComputeSuppSetTargets( Sim_Man_t * p ) // find vars in the structural support that are not in the functional support Sim_UtilInfoDetectNews( pSuppFun, pSuppStr, p->nSuppWords, p->vDiffs ); Vec_IntForEachEntry( p->vDiffs, Num, k ) - Vec_VecPush( p->vSuppTargs, Num, (void *)i ); + Vec_VecPush( p->vSuppTargs, Num, (void *)(PORT_PTRUINT_T)i ); } } @@ -460,7 +460,7 @@ void Sim_SolveTargetsUsingSat( Sim_Man_t * p, int Limit ) Vec_VecForEachEntryReverse( p->vSuppTargs, pEntry, Input, k ) { p->nSatRuns++; - Output = (int)pEntry; + Output = (int)(PORT_PTRUINT_T)pEntry; // set up the miter for the two cofactors of this output w.r.t. this input pMiter = Abc_NtkMiterForCofactors( p->pNtk, Output, Input, -1 ); @@ -545,7 +545,7 @@ int Sim_NtkSimTwoPats_rec( Abc_Obj_t * pNode ) { int Value0, Value1; if ( Abc_NodeIsTravIdCurrent( pNode ) ) - return (int)pNode->pCopy; + return (int)(PORT_PTRUINT_T)pNode->pCopy; Abc_NodeSetTravIdCurrent( pNode ); Value0 = Sim_NtkSimTwoPats_rec( Abc_ObjFanin0(pNode) ); Value1 = Sim_NtkSimTwoPats_rec( Abc_ObjFanin1(pNode) ); @@ -553,7 +553,7 @@ int Sim_NtkSimTwoPats_rec( Abc_Obj_t * pNode ) Value0 = ~Value0; if ( Abc_ObjFaninC1(pNode) ) Value1 = ~Value1; - pNode->pCopy = (Abc_Obj_t *)(Value0 & Value1); + pNode->pCopy = (Abc_Obj_t *)(PORT_PTRUINT_T)(Value0 & Value1); return Value0 & Value1; } diff --git a/src/opt/sim/simUtils.c b/src/opt/sim/simUtils.c index b06600012..b74f3abe5 100644 --- a/src/opt/sim/simUtils.c +++ b/src/opt/sim/simUtils.c @@ -118,7 +118,7 @@ void Sim_UtilInfoDetectDiffs( unsigned * pInfo1, unsigned * pInfo2, int nWords, unsigned uMask; vDiffs->nSize = 0; for ( w = 0; w < nWords; w++ ) - if ( uMask = (pInfo2[w] ^ pInfo1[w]) ) + if ( (uMask = (pInfo2[w] ^ pInfo1[w])) ) for ( b = 0; b < 32; b++ ) if ( uMask & (1 << b) ) Vec_IntPush( vDiffs, 32*w + b ); @@ -141,7 +141,7 @@ void Sim_UtilInfoDetectNews( unsigned * pInfo1, unsigned * pInfo2, int nWords, V unsigned uMask; vDiffs->nSize = 0; for ( w = 0; w < nWords; w++ ) - if ( uMask = (pInfo2[w] & ~pInfo1[w]) ) + if ( (uMask = (pInfo2[w] & ~pInfo1[w])) ) for ( b = 0; b < 32; b++ ) if ( uMask & (1 << b) ) Vec_IntPush( vDiffs, 32*w + b ); diff --git a/src/sat/csat/csat_apis.c b/src/sat/csat/csat_apis.c index 5872f5bcb..e755d8d41 100644 --- a/src/sat/csat/csat_apis.c +++ b/src/sat/csat/csat_apis.c @@ -169,8 +169,10 @@ void ABC_UseOnlyCoreSatSolver( ABC_Manager mng ) ***********************************************************************/ int ABC_AddGate( ABC_Manager mng, enum GateType type, char * name, int nofi, char ** fanins, int dc_attr ) { - Abc_Obj_t * pObj, * pFanin; - char * pSop, * pNewName; + Abc_Obj_t * pObj = NULL; // Suppress "might be used uninitialized" + Abc_Obj_t * pFanin; + char * pSop = NULL; // Suppress "might be used uninitialized" + char * pNewName; int i; // save the name in the local memory manager diff --git a/src/sat/fraig/fraigFeed.c b/src/sat/fraig/fraigFeed.c index 8a3cc6c73..e1e8d12c5 100644 --- a/src/sat/fraig/fraigFeed.c +++ b/src/sat/fraig/fraigFeed.c @@ -634,7 +634,6 @@ void Fraig_FeedBackCheckTable( Fraig_Man_t * p ) Fraig_HashTable_t * pT = p->pTableF; Fraig_Node_t * pEntF, * pEntD; int i, k, m, nPairs; - int clk = clock(); nPairs = 0; for ( i = 0; i < pT->nBins; i++ ) diff --git a/src/sat/fraig/fraigInt.h b/src/sat/fraig/fraigInt.h index dc7bc8158..c13d7083e 100644 --- a/src/sat/fraig/fraigInt.h +++ b/src/sat/fraig/fraigInt.h @@ -107,7 +107,7 @@ // copied from "extra.h" for stand-aloneness #define Fraig_PrintTime(a,t) printf( "%s = ", (a) ); printf( "%6.2f sec\n", (float)(t)/(float)(CLOCKS_PER_SEC) ) -#define Fraig_HashKey2(a,b,TSIZE) (((unsigned)(a) + (unsigned)(b) * 12582917) % TSIZE) +#define Fraig_HashKey2(a,b,TSIZE) (((PORT_PTRUINT_T)(a) + (PORT_PTRUINT_T)(b) * 12582917) % TSIZE) //#define Fraig_HashKey2(a,b,TSIZE) (( ((unsigned)(a)->Num * 19) ^ ((unsigned)(b)->Num * 1999) ) % TSIZE) //#define Fraig_HashKey2(a,b,TSIZE) ( ((unsigned)((a)->Num + (b)->Num) * ((a)->Num + (b)->Num + 1) / 2) % TSIZE) // the other two hash functions give bad distribution of hash chain lengths (not clear why) diff --git a/src/sat/fraig/fraigMan.c b/src/sat/fraig/fraigMan.c index 12cb5c451..cbeef4c6b 100644 --- a/src/sat/fraig/fraigMan.c +++ b/src/sat/fraig/fraigMan.c @@ -95,13 +95,13 @@ void Prove_ParamsPrint( Prove_Params_t * pParams ) printf( "Multiplicative coeficient for mitering: %.2f\n", pParams->nMiteringLimitMulti ); printf( "Starting number of rewriting iterations: %d\n", pParams->nRewritingLimitStart ); printf( "Multiplicative coeficient for rewriting: %.2f\n", pParams->nRewritingLimitMulti ); - printf( "Starting number of conflicts in fraiging: %d\n", pParams->nFraigingLimitMulti ); + printf( "Starting number of conflicts in fraiging: %.2f\n", pParams->nFraigingLimitMulti ); printf( "Multiplicative coeficient for fraiging: %.2f\n", pParams->nRewritingLimitMulti ); - printf( "BDD size limit for bailing out: %.2f\n", pParams->nBddSizeLimit ); + printf( "BDD size limit for bailing out: %d\n", pParams->nBddSizeLimit ); printf( "BDD reordering enabled: %s\n", pParams->fBddReorder? "yes":"no" ); printf( "Last-gasp mitering limit: %d\n", pParams->nMiteringLimitLast ); - printf( "Total conflict limit: %d\n", pParams->nTotalBacktrackLimit ); - printf( "Total inspection limit: %d\n", pParams->nTotalInspectLimit ); + printf( "Total conflict limit: %lld\n", pParams->nTotalBacktrackLimit ); + printf( "Total inspection limit: %lld\n", pParams->nTotalInspectLimit ); printf( "Parameter dump complete.\n" ); } @@ -347,7 +347,6 @@ void Fraig_ManCreateSolver( Fraig_Man_t * p ) void Fraig_ManPrintStats( Fraig_Man_t * p ) { double nMemory; - int clk = clock(); nMemory = ((double)(p->vInputs->nSize + p->vNodes->nSize) * (sizeof(Fraig_Node_t) + sizeof(unsigned)*(p->nWordsRand + p->nWordsDyna) /*+ p->nSuppWords*sizeof(unsigned)*/))/(1<<20); printf( "Words: Random = %d. Dynamic = %d. Used = %d. Memory = %0.2f Mb.\n", diff --git a/src/sat/msat/msatRead.c b/src/sat/msat/msatRead.c index 738562efa..20453feda 100644 --- a/src/sat/msat/msatRead.c +++ b/src/sat/msat/msatRead.c @@ -196,8 +196,8 @@ static void Msat_ReadClause( char ** pIn, Msat_Solver_t * p, Msat_IntVec_t * pLi ***********************************************************************/ static bool Msat_ReadDimacs( char * pText, Msat_Solver_t ** pS, bool fVerbose ) { - Msat_Solver_t * p; - Msat_IntVec_t * pLits; + Msat_Solver_t * p = NULL; // Suppress "might be used uninitialized" + Msat_IntVec_t * pLits = NULL; // Suppress "might be used uninitialized" char * pIn = pText; int nVars, nClas; while ( 1 ) diff --git a/src/sat/msat/msatSolverCore.c b/src/sat/msat/msatSolverCore.c index f9fee73cc..e86ab5118 100644 --- a/src/sat/msat/msatSolverCore.c +++ b/src/sat/msat/msatSolverCore.c @@ -138,8 +138,6 @@ bool Msat_SolverSolve( Msat_Solver_t * p, Msat_IntVec_t * vAssumps, int nBackTra double nConflictsLimit, nLearnedLimit; Msat_Type_t Status; int timeStart = clock(); - int64 nConflictsOld = p->Stats.nConflicts; - int64 nDecisionsOld = p->Stats.nDecisions; // p->pFreq = ALLOC( int, p->nVarsAlloc ); // memset( p->pFreq, 0, sizeof(int) * p->nVarsAlloc ); diff --git a/src/sat/msat/msatVec.c b/src/sat/msat/msatVec.c index 75f530475..36ad55ba4 100644 --- a/src/sat/msat/msatVec.c +++ b/src/sat/msat/msatVec.c @@ -399,8 +399,8 @@ void Msat_IntVecPushUniqueOrder( Msat_IntVec_t * p, int Entry, int fIncrease ) { Entry1 = p->pArray[i ]; Entry2 = p->pArray[i-1]; - if ( fIncrease && Entry1 >= Entry2 || - !fIncrease && Entry1 <= Entry2 ) + if (( fIncrease && Entry1 >= Entry2) || + (!fIncrease && Entry1 <= Entry2) ) break; p->pArray[i ] = Entry2; p->pArray[i-1] = Entry1;