clipsruby 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/ext/clipsruby/agenda.c +1373 -0
- data/ext/clipsruby/agenda.h +169 -0
- data/ext/clipsruby/analysis.c +1142 -0
- data/ext/clipsruby/analysis.h +61 -0
- data/ext/clipsruby/argacces.c +526 -0
- data/ext/clipsruby/argacces.h +77 -0
- data/ext/clipsruby/bload.c +884 -0
- data/ext/clipsruby/bload.h +94 -0
- data/ext/clipsruby/bmathfun.c +557 -0
- data/ext/clipsruby/bmathfun.h +66 -0
- data/ext/clipsruby/bsave.c +634 -0
- data/ext/clipsruby/bsave.h +130 -0
- data/ext/clipsruby/classcom.c +976 -0
- data/ext/clipsruby/classcom.h +115 -0
- data/ext/clipsruby/classexm.c +1376 -0
- data/ext/clipsruby/classexm.h +97 -0
- data/ext/clipsruby/classfun.c +1392 -0
- data/ext/clipsruby/classfun.h +164 -0
- data/ext/clipsruby/classinf.c +1245 -0
- data/ext/clipsruby/classinf.h +94 -0
- data/ext/clipsruby/classini.c +843 -0
- data/ext/clipsruby/classini.h +75 -0
- data/ext/clipsruby/classpsr.c +957 -0
- data/ext/clipsruby/classpsr.h +73 -0
- data/ext/clipsruby/clips.h +133 -0
- data/ext/clipsruby/clipsruby.c +619 -0
- data/ext/clipsruby/clsltpsr.c +931 -0
- data/ext/clipsruby/clsltpsr.h +72 -0
- data/ext/clipsruby/commline.c +1217 -0
- data/ext/clipsruby/commline.h +131 -0
- data/ext/clipsruby/conscomp.c +1593 -0
- data/ext/clipsruby/conscomp.h +150 -0
- data/ext/clipsruby/constant.h +264 -0
- data/ext/clipsruby/constrct.c +1090 -0
- data/ext/clipsruby/constrct.h +216 -0
- data/ext/clipsruby/constrnt.c +554 -0
- data/ext/clipsruby/constrnt.h +132 -0
- data/ext/clipsruby/crstrtgy.c +1088 -0
- data/ext/clipsruby/crstrtgy.h +85 -0
- data/ext/clipsruby/cstrcbin.c +185 -0
- data/ext/clipsruby/cstrcbin.h +61 -0
- data/ext/clipsruby/cstrccmp.h +43 -0
- data/ext/clipsruby/cstrccom.c +1791 -0
- data/ext/clipsruby/cstrccom.h +115 -0
- data/ext/clipsruby/cstrcpsr.c +835 -0
- data/ext/clipsruby/cstrcpsr.h +97 -0
- data/ext/clipsruby/cstrnbin.c +282 -0
- data/ext/clipsruby/cstrnbin.h +55 -0
- data/ext/clipsruby/cstrnchk.c +826 -0
- data/ext/clipsruby/cstrnchk.h +91 -0
- data/ext/clipsruby/cstrncmp.c +238 -0
- data/ext/clipsruby/cstrncmp.h +57 -0
- data/ext/clipsruby/cstrnops.c +1176 -0
- data/ext/clipsruby/cstrnops.h +47 -0
- data/ext/clipsruby/cstrnpsr.c +1394 -0
- data/ext/clipsruby/cstrnpsr.h +88 -0
- data/ext/clipsruby/cstrnutl.c +564 -0
- data/ext/clipsruby/cstrnutl.h +54 -0
- data/ext/clipsruby/default.c +454 -0
- data/ext/clipsruby/default.h +57 -0
- data/ext/clipsruby/defins.c +971 -0
- data/ext/clipsruby/defins.h +127 -0
- data/ext/clipsruby/developr.c +677 -0
- data/ext/clipsruby/developr.h +69 -0
- data/ext/clipsruby/dffctbin.c +477 -0
- data/ext/clipsruby/dffctbin.h +76 -0
- data/ext/clipsruby/dffctbsc.c +308 -0
- data/ext/clipsruby/dffctbsc.h +72 -0
- data/ext/clipsruby/dffctcmp.c +297 -0
- data/ext/clipsruby/dffctcmp.h +44 -0
- data/ext/clipsruby/dffctdef.c +364 -0
- data/ext/clipsruby/dffctdef.h +104 -0
- data/ext/clipsruby/dffctpsr.c +179 -0
- data/ext/clipsruby/dffctpsr.h +49 -0
- data/ext/clipsruby/dffnxbin.c +520 -0
- data/ext/clipsruby/dffnxbin.h +67 -0
- data/ext/clipsruby/dffnxcmp.c +378 -0
- data/ext/clipsruby/dffnxcmp.h +54 -0
- data/ext/clipsruby/dffnxexe.c +241 -0
- data/ext/clipsruby/dffnxexe.h +58 -0
- data/ext/clipsruby/dffnxfun.c +1192 -0
- data/ext/clipsruby/dffnxfun.h +155 -0
- data/ext/clipsruby/dffnxpsr.c +514 -0
- data/ext/clipsruby/dffnxpsr.h +57 -0
- data/ext/clipsruby/dfinsbin.c +509 -0
- data/ext/clipsruby/dfinsbin.h +66 -0
- data/ext/clipsruby/dfinscmp.c +345 -0
- data/ext/clipsruby/dfinscmp.h +48 -0
- data/ext/clipsruby/drive.c +1191 -0
- data/ext/clipsruby/drive.h +65 -0
- data/ext/clipsruby/emathfun.c +1213 -0
- data/ext/clipsruby/emathfun.h +99 -0
- data/ext/clipsruby/engine.c +1568 -0
- data/ext/clipsruby/engine.h +203 -0
- data/ext/clipsruby/entities.h +276 -0
- data/ext/clipsruby/envrnbld.c +514 -0
- data/ext/clipsruby/envrnbld.h +40 -0
- data/ext/clipsruby/envrnmnt.c +257 -0
- data/ext/clipsruby/envrnmnt.h +112 -0
- data/ext/clipsruby/evaluatn.c +1736 -0
- data/ext/clipsruby/evaluatn.h +211 -0
- data/ext/clipsruby/expressn.c +494 -0
- data/ext/clipsruby/expressn.h +154 -0
- data/ext/clipsruby/exprnbin.c +538 -0
- data/ext/clipsruby/exprnbin.h +60 -0
- data/ext/clipsruby/exprnops.c +564 -0
- data/ext/clipsruby/exprnops.h +67 -0
- data/ext/clipsruby/exprnpsr.c +1112 -0
- data/ext/clipsruby/exprnpsr.h +98 -0
- data/ext/clipsruby/extconf.rb +2 -0
- data/ext/clipsruby/extnfunc.c +1015 -0
- data/ext/clipsruby/extnfunc.h +157 -0
- data/ext/clipsruby/factbin.c +447 -0
- data/ext/clipsruby/factbin.h +56 -0
- data/ext/clipsruby/factbld.c +1035 -0
- data/ext/clipsruby/factbld.h +63 -0
- data/ext/clipsruby/factcmp.c +386 -0
- data/ext/clipsruby/factcmp.h +46 -0
- data/ext/clipsruby/factcom.c +759 -0
- data/ext/clipsruby/factcom.h +80 -0
- data/ext/clipsruby/factfile.c +1761 -0
- data/ext/clipsruby/factfile.h +54 -0
- data/ext/clipsruby/factfun.c +682 -0
- data/ext/clipsruby/factfun.h +77 -0
- data/ext/clipsruby/factgen.c +1305 -0
- data/ext/clipsruby/factgen.h +229 -0
- data/ext/clipsruby/facthsh.c +438 -0
- data/ext/clipsruby/facthsh.h +81 -0
- data/ext/clipsruby/factlhs.c +250 -0
- data/ext/clipsruby/factlhs.h +54 -0
- data/ext/clipsruby/factmch.c +905 -0
- data/ext/clipsruby/factmch.h +68 -0
- data/ext/clipsruby/factmngr.c +3373 -0
- data/ext/clipsruby/factmngr.h +325 -0
- data/ext/clipsruby/factprt.c +498 -0
- data/ext/clipsruby/factprt.h +60 -0
- data/ext/clipsruby/factqpsr.c +796 -0
- data/ext/clipsruby/factqpsr.h +61 -0
- data/ext/clipsruby/factqury.c +1267 -0
- data/ext/clipsruby/factqury.h +112 -0
- data/ext/clipsruby/factrete.c +978 -0
- data/ext/clipsruby/factrete.h +70 -0
- data/ext/clipsruby/factrhs.c +667 -0
- data/ext/clipsruby/factrhs.h +55 -0
- data/ext/clipsruby/filecom.c +353 -0
- data/ext/clipsruby/filecom.h +137 -0
- data/ext/clipsruby/filertr.c +481 -0
- data/ext/clipsruby/filertr.h +94 -0
- data/ext/clipsruby/fileutil.c +1020 -0
- data/ext/clipsruby/fileutil.h +50 -0
- data/ext/clipsruby/generate.c +1079 -0
- data/ext/clipsruby/generate.h +57 -0
- data/ext/clipsruby/genrcbin.c +902 -0
- data/ext/clipsruby/genrcbin.h +69 -0
- data/ext/clipsruby/genrccmp.c +640 -0
- data/ext/clipsruby/genrccmp.h +59 -0
- data/ext/clipsruby/genrccom.c +2017 -0
- data/ext/clipsruby/genrccom.h +119 -0
- data/ext/clipsruby/genrcexe.c +737 -0
- data/ext/clipsruby/genrcexe.h +73 -0
- data/ext/clipsruby/genrcfun.c +890 -0
- data/ext/clipsruby/genrcfun.h +185 -0
- data/ext/clipsruby/genrcpsr.c +1618 -0
- data/ext/clipsruby/genrcpsr.h +80 -0
- data/ext/clipsruby/globlbin.c +458 -0
- data/ext/clipsruby/globlbin.h +71 -0
- data/ext/clipsruby/globlbsc.c +361 -0
- data/ext/clipsruby/globlbsc.h +83 -0
- data/ext/clipsruby/globlcmp.c +330 -0
- data/ext/clipsruby/globlcmp.h +52 -0
- data/ext/clipsruby/globlcom.c +289 -0
- data/ext/clipsruby/globlcom.h +63 -0
- data/ext/clipsruby/globldef.c +1087 -0
- data/ext/clipsruby/globldef.h +151 -0
- data/ext/clipsruby/globlpsr.c +530 -0
- data/ext/clipsruby/globlpsr.h +59 -0
- data/ext/clipsruby/immthpsr.c +431 -0
- data/ext/clipsruby/immthpsr.h +55 -0
- data/ext/clipsruby/incrrset.c +530 -0
- data/ext/clipsruby/incrrset.h +73 -0
- data/ext/clipsruby/inherpsr.c +850 -0
- data/ext/clipsruby/inherpsr.h +52 -0
- data/ext/clipsruby/inscom.c +2076 -0
- data/ext/clipsruby/inscom.h +182 -0
- data/ext/clipsruby/insfile.c +1764 -0
- data/ext/clipsruby/insfile.h +96 -0
- data/ext/clipsruby/insfun.c +1451 -0
- data/ext/clipsruby/insfun.h +134 -0
- data/ext/clipsruby/insmngr.c +2550 -0
- data/ext/clipsruby/insmngr.h +125 -0
- data/ext/clipsruby/insmoddp.c +1041 -0
- data/ext/clipsruby/insmoddp.h +91 -0
- data/ext/clipsruby/insmult.c +804 -0
- data/ext/clipsruby/insmult.h +62 -0
- data/ext/clipsruby/inspsr.c +602 -0
- data/ext/clipsruby/inspsr.h +60 -0
- data/ext/clipsruby/insquery.c +1278 -0
- data/ext/clipsruby/insquery.h +115 -0
- data/ext/clipsruby/insqypsr.c +729 -0
- data/ext/clipsruby/insqypsr.h +63 -0
- data/ext/clipsruby/iofun.c +2045 -0
- data/ext/clipsruby/iofun.h +116 -0
- data/ext/clipsruby/lgcldpnd.c +644 -0
- data/ext/clipsruby/lgcldpnd.h +75 -0
- data/ext/clipsruby/main.c +112 -0
- data/ext/clipsruby/match.h +142 -0
- data/ext/clipsruby/memalloc.c +481 -0
- data/ext/clipsruby/memalloc.h +197 -0
- data/ext/clipsruby/miscfun.c +1801 -0
- data/ext/clipsruby/miscfun.h +132 -0
- data/ext/clipsruby/modulbin.c +607 -0
- data/ext/clipsruby/modulbin.h +84 -0
- data/ext/clipsruby/modulbsc.c +347 -0
- data/ext/clipsruby/modulbsc.h +67 -0
- data/ext/clipsruby/modulcmp.c +499 -0
- data/ext/clipsruby/modulcmp.h +54 -0
- data/ext/clipsruby/moduldef.c +817 -0
- data/ext/clipsruby/moduldef.h +271 -0
- data/ext/clipsruby/modulpsr.c +1150 -0
- data/ext/clipsruby/modulpsr.h +69 -0
- data/ext/clipsruby/modulutl.c +1036 -0
- data/ext/clipsruby/modulutl.h +84 -0
- data/ext/clipsruby/msgcom.c +1221 -0
- data/ext/clipsruby/msgcom.h +125 -0
- data/ext/clipsruby/msgfun.c +1076 -0
- data/ext/clipsruby/msgfun.h +118 -0
- data/ext/clipsruby/msgpass.c +1441 -0
- data/ext/clipsruby/msgpass.h +103 -0
- data/ext/clipsruby/msgpsr.c +698 -0
- data/ext/clipsruby/msgpsr.h +73 -0
- data/ext/clipsruby/multifld.c +1404 -0
- data/ext/clipsruby/multifld.h +130 -0
- data/ext/clipsruby/multifun.c +2182 -0
- data/ext/clipsruby/multifun.h +102 -0
- data/ext/clipsruby/network.h +142 -0
- data/ext/clipsruby/objbin.c +1522 -0
- data/ext/clipsruby/objbin.h +79 -0
- data/ext/clipsruby/objcmp.c +1507 -0
- data/ext/clipsruby/objcmp.h +71 -0
- data/ext/clipsruby/object.h +260 -0
- data/ext/clipsruby/objrtbin.c +701 -0
- data/ext/clipsruby/objrtbin.h +79 -0
- data/ext/clipsruby/objrtbld.c +2393 -0
- data/ext/clipsruby/objrtbld.h +66 -0
- data/ext/clipsruby/objrtcmp.c +734 -0
- data/ext/clipsruby/objrtcmp.h +66 -0
- data/ext/clipsruby/objrtfnx.c +1330 -0
- data/ext/clipsruby/objrtfnx.h +222 -0
- data/ext/clipsruby/objrtgen.c +736 -0
- data/ext/clipsruby/objrtgen.h +63 -0
- data/ext/clipsruby/objrtmch.c +1524 -0
- data/ext/clipsruby/objrtmch.h +160 -0
- data/ext/clipsruby/parsefun.c +415 -0
- data/ext/clipsruby/parsefun.h +67 -0
- data/ext/clipsruby/pattern.c +1265 -0
- data/ext/clipsruby/pattern.h +163 -0
- data/ext/clipsruby/pprint.c +328 -0
- data/ext/clipsruby/pprint.h +79 -0
- data/ext/clipsruby/prccode.c +1478 -0
- data/ext/clipsruby/prccode.h +145 -0
- data/ext/clipsruby/prcdrfun.c +640 -0
- data/ext/clipsruby/prcdrfun.h +95 -0
- data/ext/clipsruby/prcdrpsr.c +1068 -0
- data/ext/clipsruby/prcdrpsr.h +79 -0
- data/ext/clipsruby/prdctfun.c +869 -0
- data/ext/clipsruby/prdctfun.h +77 -0
- data/ext/clipsruby/prntutil.c +878 -0
- data/ext/clipsruby/prntutil.h +125 -0
- data/ext/clipsruby/proflfun.c +827 -0
- data/ext/clipsruby/proflfun.h +118 -0
- data/ext/clipsruby/reorder.c +2082 -0
- data/ext/clipsruby/reorder.h +172 -0
- data/ext/clipsruby/reteutil.c +1732 -0
- data/ext/clipsruby/reteutil.h +111 -0
- data/ext/clipsruby/retract.c +710 -0
- data/ext/clipsruby/retract.h +74 -0
- data/ext/clipsruby/router.c +737 -0
- data/ext/clipsruby/router.h +147 -0
- data/ext/clipsruby/rulebin.c +1136 -0
- data/ext/clipsruby/rulebin.h +153 -0
- data/ext/clipsruby/rulebld.c +1328 -0
- data/ext/clipsruby/rulebld.h +62 -0
- data/ext/clipsruby/rulebsc.c +517 -0
- data/ext/clipsruby/rulebsc.h +91 -0
- data/ext/clipsruby/rulecmp.c +733 -0
- data/ext/clipsruby/rulecmp.h +63 -0
- data/ext/clipsruby/rulecom.c +1583 -0
- data/ext/clipsruby/rulecom.h +116 -0
- data/ext/clipsruby/rulecstr.c +892 -0
- data/ext/clipsruby/rulecstr.h +53 -0
- data/ext/clipsruby/ruledef.c +559 -0
- data/ext/clipsruby/ruledef.h +179 -0
- data/ext/clipsruby/ruledlt.c +599 -0
- data/ext/clipsruby/ruledlt.h +58 -0
- data/ext/clipsruby/rulelhs.c +1216 -0
- data/ext/clipsruby/rulelhs.h +52 -0
- data/ext/clipsruby/rulepsr.c +1073 -0
- data/ext/clipsruby/rulepsr.h +61 -0
- data/ext/clipsruby/scanner.c +856 -0
- data/ext/clipsruby/scanner.h +112 -0
- data/ext/clipsruby/setup.h +488 -0
- data/ext/clipsruby/sortfun.c +433 -0
- data/ext/clipsruby/sortfun.h +55 -0
- data/ext/clipsruby/strngfun.c +1173 -0
- data/ext/clipsruby/strngfun.h +96 -0
- data/ext/clipsruby/strngrtr.c +523 -0
- data/ext/clipsruby/strngrtr.h +97 -0
- data/ext/clipsruby/symblbin.c +648 -0
- data/ext/clipsruby/symblbin.h +64 -0
- data/ext/clipsruby/symblcmp.c +893 -0
- data/ext/clipsruby/symblcmp.h +61 -0
- data/ext/clipsruby/symbol.c +1961 -0
- data/ext/clipsruby/symbol.h +243 -0
- data/ext/clipsruby/sysdep.c +894 -0
- data/ext/clipsruby/sysdep.h +164 -0
- data/ext/clipsruby/textpro.c +1388 -0
- data/ext/clipsruby/textpro.h +77 -0
- data/ext/clipsruby/tmpltbin.c +609 -0
- data/ext/clipsruby/tmpltbin.h +108 -0
- data/ext/clipsruby/tmpltbsc.c +327 -0
- data/ext/clipsruby/tmpltbsc.h +87 -0
- data/ext/clipsruby/tmpltcmp.c +450 -0
- data/ext/clipsruby/tmpltcmp.h +57 -0
- data/ext/clipsruby/tmpltdef.c +584 -0
- data/ext/clipsruby/tmpltdef.h +155 -0
- data/ext/clipsruby/tmpltfun.c +2477 -0
- data/ext/clipsruby/tmpltfun.h +122 -0
- data/ext/clipsruby/tmpltlhs.c +379 -0
- data/ext/clipsruby/tmpltlhs.h +50 -0
- data/ext/clipsruby/tmpltpsr.c +819 -0
- data/ext/clipsruby/tmpltpsr.h +59 -0
- data/ext/clipsruby/tmpltrhs.c +595 -0
- data/ext/clipsruby/tmpltrhs.h +55 -0
- data/ext/clipsruby/tmpltutl.c +637 -0
- data/ext/clipsruby/tmpltutl.h +82 -0
- data/ext/clipsruby/userdata.c +156 -0
- data/ext/clipsruby/userdata.h +72 -0
- data/ext/clipsruby/userfunctions.c +70 -0
- data/ext/clipsruby/usrsetup.h +7 -0
- data/ext/clipsruby/utility.c +1594 -0
- data/ext/clipsruby/utility.h +250 -0
- data/ext/clipsruby/watch.c +865 -0
- data/ext/clipsruby/watch.h +124 -0
- data/lib/clipsruby.rb +1 -0
- metadata +388 -0
@@ -0,0 +1,481 @@
|
|
1
|
+
/*******************************************************/
|
2
|
+
/* "C" Language Integrated Production System */
|
3
|
+
/* */
|
4
|
+
/* CLIPS Version 6.41 05/24/21 */
|
5
|
+
/* */
|
6
|
+
/* MEMORY MODULE */
|
7
|
+
/*******************************************************/
|
8
|
+
|
9
|
+
/*************************************************************/
|
10
|
+
/* Purpose: Memory allocation routines. */
|
11
|
+
/* */
|
12
|
+
/* Principal Programmer(s): */
|
13
|
+
/* Gary D. Riley */
|
14
|
+
/* */
|
15
|
+
/* Contributing Programmer(s): */
|
16
|
+
/* Brian L. Dantes */
|
17
|
+
/* */
|
18
|
+
/* Revision History: */
|
19
|
+
/* */
|
20
|
+
/* 6.24: Removed HaltExecution check from the */
|
21
|
+
/* EnvReleaseMem function. DR0863 */
|
22
|
+
/* */
|
23
|
+
/* Renamed BOOLEAN macro type to intBool. */
|
24
|
+
/* */
|
25
|
+
/* Corrected code to remove compiler warnings. */
|
26
|
+
/* */
|
27
|
+
/* 6.30: Removed conditional code for unsupported */
|
28
|
+
/* compilers/operating systems. */
|
29
|
+
/* */
|
30
|
+
/* Changed integer type/precision. */
|
31
|
+
/* */
|
32
|
+
/* Removed genlongalloc/genlongfree functions. */
|
33
|
+
/* */
|
34
|
+
/* Added get_mem and rtn_mem macros. */
|
35
|
+
/* */
|
36
|
+
/* Converted API macros to function calls. */
|
37
|
+
/* */
|
38
|
+
/* Removed deallocating message parameter from */
|
39
|
+
/* EnvReleaseMem. */
|
40
|
+
/* */
|
41
|
+
/* Removed support for BLOCK_MEMORY. */
|
42
|
+
/* */
|
43
|
+
/* 6.40: Pragma once and other inclusion changes. */
|
44
|
+
/* */
|
45
|
+
/* Added support for booleans with <stdbool.h>. */
|
46
|
+
/* */
|
47
|
+
/* Removed use of void pointers for specific */
|
48
|
+
/* data structures. */
|
49
|
+
/* */
|
50
|
+
/* ALLOW_ENVIRONMENT_GLOBALS no longer supported. */
|
51
|
+
/* */
|
52
|
+
/* 6.41: Fixed MEM_TABLE_SIZE=0 release-mem crash. */
|
53
|
+
/* */
|
54
|
+
/*************************************************************/
|
55
|
+
|
56
|
+
#include <stdio.h>
|
57
|
+
|
58
|
+
#include "setup.h"
|
59
|
+
|
60
|
+
#include "constant.h"
|
61
|
+
#include "envrnmnt.h"
|
62
|
+
#include "memalloc.h"
|
63
|
+
#include "prntutil.h"
|
64
|
+
#include "router.h"
|
65
|
+
#include "utility.h"
|
66
|
+
|
67
|
+
#include <stdlib.h>
|
68
|
+
|
69
|
+
#if WIN_MVC
|
70
|
+
#include <malloc.h>
|
71
|
+
#endif
|
72
|
+
|
73
|
+
#define STRICT_ALIGN_SIZE sizeof(double)
|
74
|
+
|
75
|
+
#define SpecialMalloc(sz) malloc((STD_SIZE) sz)
|
76
|
+
#define SpecialFree(ptr) free(ptr)
|
77
|
+
|
78
|
+
/********************************************/
|
79
|
+
/* InitializeMemory: Sets up memory tables. */
|
80
|
+
/********************************************/
|
81
|
+
void InitializeMemory(
|
82
|
+
Environment *theEnv)
|
83
|
+
{
|
84
|
+
AllocateEnvironmentData(theEnv,MEMORY_DATA,sizeof(struct memoryData),NULL);
|
85
|
+
|
86
|
+
MemoryData(theEnv)->OutOfMemoryCallback = DefaultOutOfMemoryFunction;
|
87
|
+
|
88
|
+
#if (MEM_TABLE_SIZE > 0)
|
89
|
+
MemoryData(theEnv)->MemoryTable = (struct memoryPtr **)
|
90
|
+
malloc((STD_SIZE) (sizeof(struct memoryPtr *) * MEM_TABLE_SIZE));
|
91
|
+
|
92
|
+
if (MemoryData(theEnv)->MemoryTable == NULL)
|
93
|
+
{
|
94
|
+
PrintErrorID(theEnv,"MEMORY",1,true);
|
95
|
+
WriteString(theEnv,STDERR,"Out of memory.\n");
|
96
|
+
ExitRouter(theEnv,EXIT_FAILURE);
|
97
|
+
}
|
98
|
+
else
|
99
|
+
{
|
100
|
+
int i;
|
101
|
+
|
102
|
+
for (i = 0; i < MEM_TABLE_SIZE; i++) MemoryData(theEnv)->MemoryTable[i] = NULL;
|
103
|
+
}
|
104
|
+
#else // MEM_TABLE_SIZE == 0
|
105
|
+
MemoryData(theEnv)->MemoryTable = NULL;
|
106
|
+
#endif
|
107
|
+
}
|
108
|
+
|
109
|
+
/***************************************************/
|
110
|
+
/* genalloc: A generic memory allocation function. */
|
111
|
+
/***************************************************/
|
112
|
+
void *genalloc(
|
113
|
+
Environment *theEnv,
|
114
|
+
size_t size)
|
115
|
+
{
|
116
|
+
void *memPtr;
|
117
|
+
|
118
|
+
memPtr = malloc(size);
|
119
|
+
|
120
|
+
if (memPtr == NULL)
|
121
|
+
{
|
122
|
+
ReleaseMem(theEnv,(long long) ((size * 5 > 4096) ? size * 5 : 4096));
|
123
|
+
memPtr = malloc(size);
|
124
|
+
if (memPtr == NULL)
|
125
|
+
{
|
126
|
+
ReleaseMem(theEnv,-1);
|
127
|
+
memPtr = malloc(size);
|
128
|
+
while (memPtr == NULL)
|
129
|
+
{
|
130
|
+
if ((*MemoryData(theEnv)->OutOfMemoryCallback)(theEnv,size))
|
131
|
+
return NULL;
|
132
|
+
memPtr = malloc(size);
|
133
|
+
}
|
134
|
+
}
|
135
|
+
}
|
136
|
+
|
137
|
+
MemoryData(theEnv)->MemoryAmount += size;
|
138
|
+
MemoryData(theEnv)->MemoryCalls++;
|
139
|
+
|
140
|
+
return memPtr;
|
141
|
+
}
|
142
|
+
|
143
|
+
/***********************************************/
|
144
|
+
/* DefaultOutOfMemoryFunction: Function called */
|
145
|
+
/* when the KB runs out of memory. */
|
146
|
+
/***********************************************/
|
147
|
+
bool DefaultOutOfMemoryFunction(
|
148
|
+
Environment *theEnv,
|
149
|
+
size_t size)
|
150
|
+
{
|
151
|
+
#if MAC_XCD
|
152
|
+
#pragma unused(size)
|
153
|
+
#endif
|
154
|
+
|
155
|
+
PrintErrorID(theEnv,"MEMORY",1,true);
|
156
|
+
WriteString(theEnv,STDERR,"Out of memory.\n");
|
157
|
+
ExitRouter(theEnv,EXIT_FAILURE);
|
158
|
+
return true;
|
159
|
+
}
|
160
|
+
|
161
|
+
/**********************************************************/
|
162
|
+
/* SetOutOfMemoryFunction: Allows the function which is */
|
163
|
+
/* called when the KB runs out of memory to be changed. */
|
164
|
+
/**********************************************************/
|
165
|
+
OutOfMemoryFunction *SetOutOfMemoryFunction(
|
166
|
+
Environment *theEnv,
|
167
|
+
OutOfMemoryFunction *functionPtr)
|
168
|
+
{
|
169
|
+
OutOfMemoryFunction *tmpPtr;
|
170
|
+
|
171
|
+
tmpPtr = MemoryData(theEnv)->OutOfMemoryCallback;
|
172
|
+
MemoryData(theEnv)->OutOfMemoryCallback = functionPtr;
|
173
|
+
return tmpPtr;
|
174
|
+
}
|
175
|
+
|
176
|
+
/****************************************************/
|
177
|
+
/* genfree: A generic memory deallocation function. */
|
178
|
+
/****************************************************/
|
179
|
+
void genfree(
|
180
|
+
Environment *theEnv,
|
181
|
+
void *waste,
|
182
|
+
size_t size)
|
183
|
+
{
|
184
|
+
free(waste);
|
185
|
+
|
186
|
+
MemoryData(theEnv)->MemoryAmount -= size;
|
187
|
+
MemoryData(theEnv)->MemoryCalls--;
|
188
|
+
}
|
189
|
+
|
190
|
+
/******************************************************/
|
191
|
+
/* genrealloc: Simple (i.e. dumb) version of realloc. */
|
192
|
+
/******************************************************/
|
193
|
+
void *genrealloc(
|
194
|
+
Environment *theEnv,
|
195
|
+
void *oldaddr,
|
196
|
+
size_t oldsz,
|
197
|
+
size_t newsz)
|
198
|
+
{
|
199
|
+
char *newaddr;
|
200
|
+
unsigned i;
|
201
|
+
size_t limit;
|
202
|
+
|
203
|
+
newaddr = ((newsz != 0) ? (char *) gm2(theEnv,newsz) : NULL);
|
204
|
+
|
205
|
+
if (oldaddr != NULL)
|
206
|
+
{
|
207
|
+
limit = (oldsz < newsz) ? oldsz : newsz;
|
208
|
+
for (i = 0 ; i < limit ; i++)
|
209
|
+
{ newaddr[i] = ((char *) oldaddr)[i]; }
|
210
|
+
for ( ; i < newsz; i++)
|
211
|
+
{ newaddr[i] = '\0'; }
|
212
|
+
rm(theEnv,oldaddr,oldsz);
|
213
|
+
}
|
214
|
+
|
215
|
+
return((void *) newaddr);
|
216
|
+
}
|
217
|
+
|
218
|
+
/********************************/
|
219
|
+
/* MemUsed: C access routine */
|
220
|
+
/* for the mem-used command. */
|
221
|
+
/********************************/
|
222
|
+
long long MemUsed(
|
223
|
+
Environment *theEnv)
|
224
|
+
{
|
225
|
+
return MemoryData(theEnv)->MemoryAmount;
|
226
|
+
}
|
227
|
+
|
228
|
+
/***********************************/
|
229
|
+
/* MemRequests: C access routine */
|
230
|
+
/* for the mem-requests command. */
|
231
|
+
/***********************************/
|
232
|
+
long long MemRequests(
|
233
|
+
Environment *theEnv)
|
234
|
+
{
|
235
|
+
return MemoryData(theEnv)->MemoryCalls;
|
236
|
+
}
|
237
|
+
|
238
|
+
/***************************************/
|
239
|
+
/* UpdateMemoryUsed: Allows the amount */
|
240
|
+
/* of memory used to be updated. */
|
241
|
+
/***************************************/
|
242
|
+
long long UpdateMemoryUsed(
|
243
|
+
Environment *theEnv,
|
244
|
+
long long value)
|
245
|
+
{
|
246
|
+
MemoryData(theEnv)->MemoryAmount += value;
|
247
|
+
return MemoryData(theEnv)->MemoryAmount;
|
248
|
+
}
|
249
|
+
|
250
|
+
/*******************************************/
|
251
|
+
/* UpdateMemoryRequests: Allows the number */
|
252
|
+
/* of memory requests to be updated. */
|
253
|
+
/*******************************************/
|
254
|
+
long long UpdateMemoryRequests(
|
255
|
+
Environment *theEnv,
|
256
|
+
long long value)
|
257
|
+
{
|
258
|
+
MemoryData(theEnv)->MemoryCalls += value;
|
259
|
+
return MemoryData(theEnv)->MemoryCalls;
|
260
|
+
}
|
261
|
+
|
262
|
+
/**********************************/
|
263
|
+
/* ReleaseMem: C access routine */
|
264
|
+
/* for the release-mem command. */
|
265
|
+
/**********************************/
|
266
|
+
long long ReleaseMem(
|
267
|
+
Environment *theEnv,
|
268
|
+
long long maximum)
|
269
|
+
{
|
270
|
+
long long amount = 0;
|
271
|
+
#if (MEM_TABLE_SIZE > 0)
|
272
|
+
struct memoryPtr *tmpPtr, *memPtr;
|
273
|
+
unsigned int i;
|
274
|
+
long long returns = 0;
|
275
|
+
|
276
|
+
for (i = (MEM_TABLE_SIZE - 1) ; i >= sizeof(char *) ; i--)
|
277
|
+
{
|
278
|
+
YieldTime(theEnv);
|
279
|
+
memPtr = MemoryData(theEnv)->MemoryTable[i];
|
280
|
+
while (memPtr != NULL)
|
281
|
+
{
|
282
|
+
tmpPtr = memPtr->next;
|
283
|
+
genfree(theEnv,memPtr,i);
|
284
|
+
memPtr = tmpPtr;
|
285
|
+
amount += i;
|
286
|
+
returns++;
|
287
|
+
if ((returns % 100) == 0)
|
288
|
+
{ YieldTime(theEnv); }
|
289
|
+
}
|
290
|
+
MemoryData(theEnv)->MemoryTable[i] = NULL;
|
291
|
+
if ((amount > maximum) && (maximum > 0))
|
292
|
+
{ return amount; }
|
293
|
+
}
|
294
|
+
#endif
|
295
|
+
|
296
|
+
return amount;
|
297
|
+
}
|
298
|
+
|
299
|
+
/*****************************************************/
|
300
|
+
/* gm1: Allocates memory and sets all bytes to zero. */
|
301
|
+
/*****************************************************/
|
302
|
+
void *gm1(
|
303
|
+
Environment *theEnv,
|
304
|
+
size_t size)
|
305
|
+
{
|
306
|
+
struct memoryPtr *memPtr;
|
307
|
+
char *tmpPtr;
|
308
|
+
size_t i;
|
309
|
+
|
310
|
+
if ((size < sizeof(char *)) ||
|
311
|
+
(size >= MEM_TABLE_SIZE))
|
312
|
+
{
|
313
|
+
tmpPtr = (char *) genalloc(theEnv,size);
|
314
|
+
for (i = 0 ; i < size ; i++)
|
315
|
+
{ tmpPtr[i] = '\0'; }
|
316
|
+
return((void *) tmpPtr);
|
317
|
+
}
|
318
|
+
|
319
|
+
memPtr = (struct memoryPtr *) MemoryData(theEnv)->MemoryTable[size];
|
320
|
+
if (memPtr == NULL)
|
321
|
+
{
|
322
|
+
tmpPtr = (char *) genalloc(theEnv,size);
|
323
|
+
for (i = 0 ; i < size ; i++)
|
324
|
+
{ tmpPtr[i] = '\0'; }
|
325
|
+
return((void *) tmpPtr);
|
326
|
+
}
|
327
|
+
|
328
|
+
MemoryData(theEnv)->MemoryTable[size] = memPtr->next;
|
329
|
+
|
330
|
+
tmpPtr = (char *) memPtr;
|
331
|
+
for (i = 0 ; i < size ; i++)
|
332
|
+
{ tmpPtr[i] = '\0'; }
|
333
|
+
|
334
|
+
return ((void *) tmpPtr);
|
335
|
+
}
|
336
|
+
|
337
|
+
/*****************************************************/
|
338
|
+
/* gm2: Allocates memory and does not initialize it. */
|
339
|
+
/*****************************************************/
|
340
|
+
void *gm2(
|
341
|
+
Environment *theEnv,
|
342
|
+
size_t size)
|
343
|
+
{
|
344
|
+
#if (MEM_TABLE_SIZE > 0)
|
345
|
+
struct memoryPtr *memPtr;
|
346
|
+
#endif
|
347
|
+
|
348
|
+
if (size < sizeof(char *))
|
349
|
+
{ return genalloc(theEnv,size); }
|
350
|
+
|
351
|
+
#if (MEM_TABLE_SIZE > 0)
|
352
|
+
if (size >= MEM_TABLE_SIZE) return genalloc(theEnv,size);
|
353
|
+
|
354
|
+
memPtr = (struct memoryPtr *) MemoryData(theEnv)->MemoryTable[size];
|
355
|
+
if (memPtr == NULL)
|
356
|
+
{ return genalloc(theEnv,size); }
|
357
|
+
|
358
|
+
MemoryData(theEnv)->MemoryTable[size] = memPtr->next;
|
359
|
+
|
360
|
+
return ((void *) memPtr);
|
361
|
+
#else
|
362
|
+
return genalloc(theEnv,size);
|
363
|
+
#endif
|
364
|
+
}
|
365
|
+
|
366
|
+
/****************************************/
|
367
|
+
/* rm: Returns a block of memory to the */
|
368
|
+
/* maintained pool of free memory. */
|
369
|
+
/****************************************/
|
370
|
+
void rm(
|
371
|
+
Environment *theEnv,
|
372
|
+
void *str,
|
373
|
+
size_t size)
|
374
|
+
{
|
375
|
+
#if (MEM_TABLE_SIZE > 0)
|
376
|
+
struct memoryPtr *memPtr;
|
377
|
+
#endif
|
378
|
+
|
379
|
+
if (size == 0)
|
380
|
+
{
|
381
|
+
SystemError(theEnv,"MEMORY",1);
|
382
|
+
ExitRouter(theEnv,EXIT_FAILURE);
|
383
|
+
return;
|
384
|
+
}
|
385
|
+
|
386
|
+
if (size < sizeof(char *))
|
387
|
+
{
|
388
|
+
genfree(theEnv,str,size);
|
389
|
+
return;
|
390
|
+
}
|
391
|
+
|
392
|
+
#if (MEM_TABLE_SIZE > 0)
|
393
|
+
if (size >= MEM_TABLE_SIZE)
|
394
|
+
{
|
395
|
+
genfree(theEnv,str,size);
|
396
|
+
return;
|
397
|
+
}
|
398
|
+
|
399
|
+
memPtr = (struct memoryPtr *) str;
|
400
|
+
memPtr->next = MemoryData(theEnv)->MemoryTable[size];
|
401
|
+
MemoryData(theEnv)->MemoryTable[size] = memPtr;
|
402
|
+
#else
|
403
|
+
genfree(theEnv,str,size);
|
404
|
+
#endif
|
405
|
+
}
|
406
|
+
|
407
|
+
/***************************************************/
|
408
|
+
/* PoolSize: Returns number of bytes in free pool. */
|
409
|
+
/***************************************************/
|
410
|
+
unsigned long PoolSize(
|
411
|
+
Environment *theEnv)
|
412
|
+
{
|
413
|
+
unsigned long cnt = 0;
|
414
|
+
|
415
|
+
#if (MEM_TABLE_SIZE > 0)
|
416
|
+
int i;
|
417
|
+
struct memoryPtr *memPtr;
|
418
|
+
|
419
|
+
for (i = sizeof(char *) ; i < MEM_TABLE_SIZE ; i++)
|
420
|
+
{
|
421
|
+
memPtr = MemoryData(theEnv)->MemoryTable[i];
|
422
|
+
while (memPtr != NULL)
|
423
|
+
{
|
424
|
+
cnt += (unsigned long) i;
|
425
|
+
memPtr = memPtr->next;
|
426
|
+
}
|
427
|
+
}
|
428
|
+
#endif
|
429
|
+
|
430
|
+
return(cnt);
|
431
|
+
}
|
432
|
+
|
433
|
+
/***************************************************************/
|
434
|
+
/* ActualPoolSize : Returns number of bytes DOS requires to */
|
435
|
+
/* store the free pool. This routine is functionally */
|
436
|
+
/* equivalent to pool_size on anything other than the IBM-PC */
|
437
|
+
/***************************************************************/
|
438
|
+
unsigned long ActualPoolSize(
|
439
|
+
Environment *theEnv)
|
440
|
+
{
|
441
|
+
return(PoolSize(theEnv));
|
442
|
+
}
|
443
|
+
|
444
|
+
/*****************************************/
|
445
|
+
/* SetConserveMemory: Allows the setting */
|
446
|
+
/* of the memory conservation flag. */
|
447
|
+
/*****************************************/
|
448
|
+
bool SetConserveMemory(
|
449
|
+
Environment *theEnv,
|
450
|
+
bool value)
|
451
|
+
{
|
452
|
+
bool ov;
|
453
|
+
|
454
|
+
ov = MemoryData(theEnv)->ConserveMemory;
|
455
|
+
MemoryData(theEnv)->ConserveMemory = value;
|
456
|
+
return ov;
|
457
|
+
}
|
458
|
+
|
459
|
+
/****************************************/
|
460
|
+
/* GetConserveMemory: Returns the value */
|
461
|
+
/* of the memory conservation flag. */
|
462
|
+
/****************************************/
|
463
|
+
bool GetConserveMemory(
|
464
|
+
Environment *theEnv)
|
465
|
+
{
|
466
|
+
return MemoryData(theEnv)->ConserveMemory;
|
467
|
+
}
|
468
|
+
|
469
|
+
/**************************/
|
470
|
+
/* genmemcpy: */
|
471
|
+
/**************************/
|
472
|
+
void genmemcpy(
|
473
|
+
char *dst,
|
474
|
+
char *src,
|
475
|
+
unsigned long size)
|
476
|
+
{
|
477
|
+
unsigned long i;
|
478
|
+
|
479
|
+
for (i = 0L ; i < size ; i++)
|
480
|
+
dst[i] = src[i];
|
481
|
+
}
|
@@ -0,0 +1,197 @@
|
|
1
|
+
/*******************************************************/
|
2
|
+
/* "C" Language Integrated Production System */
|
3
|
+
/* */
|
4
|
+
/* CLIPS Version 6.40 10/11/17 */
|
5
|
+
/* */
|
6
|
+
/* MEMORY ALLOCATION HEADER FILE */
|
7
|
+
/*******************************************************/
|
8
|
+
|
9
|
+
/*************************************************************/
|
10
|
+
/* Purpose: Memory allocation routines. */
|
11
|
+
/* */
|
12
|
+
/* Principal Programmer(s): */
|
13
|
+
/* Gary D. Riley */
|
14
|
+
/* */
|
15
|
+
/* Contributing Programmer(s): */
|
16
|
+
/* */
|
17
|
+
/* Revision History: */
|
18
|
+
/* */
|
19
|
+
/* 6.24: Removed HaltExecution check from the */
|
20
|
+
/* EnvReleaseMem function. DR0863 */
|
21
|
+
/* */
|
22
|
+
/* Renamed BOOLEAN macro type to intBool. */
|
23
|
+
/* */
|
24
|
+
/* Corrected code to remove compiler warnings. */
|
25
|
+
/* */
|
26
|
+
/* 6.30: Removed conditional code for unsupported */
|
27
|
+
/* compilers/operating systems. */
|
28
|
+
/* */
|
29
|
+
/* Changed integer type/precision. */
|
30
|
+
/* */
|
31
|
+
/* Removed genlongalloc/genlongfree functions. */
|
32
|
+
/* */
|
33
|
+
/* Added get_mem and rtn_mem macros. */
|
34
|
+
/* */
|
35
|
+
/* Converted API macros to function calls. */
|
36
|
+
/* */
|
37
|
+
/* Removed deallocating message parameter from */
|
38
|
+
/* EnvReleaseMem. */
|
39
|
+
/* */
|
40
|
+
/* Removed support for BLOCK_MEMORY. */
|
41
|
+
/* */
|
42
|
+
/* 6.31: Fix for get_mem macro. */
|
43
|
+
/* */
|
44
|
+
/* 6.40: Removed LOCALE definition. */
|
45
|
+
/* */
|
46
|
+
/* Pragma once and other inclusion changes. */
|
47
|
+
/* */
|
48
|
+
/* Added support for booleans with <stdbool.h>. */
|
49
|
+
/* */
|
50
|
+
/* Removed use of void pointers for specific */
|
51
|
+
/* data structures. */
|
52
|
+
/* */
|
53
|
+
/* ALLOW_ENVIRONMENT_GLOBALS no longer supported. */
|
54
|
+
/* */
|
55
|
+
/*************************************************************/
|
56
|
+
|
57
|
+
#ifndef _H_memalloc
|
58
|
+
|
59
|
+
#pragma once
|
60
|
+
|
61
|
+
#define _H_memalloc
|
62
|
+
|
63
|
+
#include <string.h>
|
64
|
+
|
65
|
+
struct memoryPtr;
|
66
|
+
|
67
|
+
typedef bool OutOfMemoryFunction(Environment *,size_t);
|
68
|
+
|
69
|
+
#ifndef MEM_TABLE_SIZE
|
70
|
+
#define MEM_TABLE_SIZE 500
|
71
|
+
#endif
|
72
|
+
|
73
|
+
struct memoryPtr
|
74
|
+
{
|
75
|
+
struct memoryPtr *next;
|
76
|
+
};
|
77
|
+
|
78
|
+
#if (MEM_TABLE_SIZE > 0)
|
79
|
+
/*
|
80
|
+
* Normal memory management case
|
81
|
+
*/
|
82
|
+
|
83
|
+
#define get_struct(theEnv,type) \
|
84
|
+
((MemoryData(theEnv)->MemoryTable[sizeof(struct type)] == NULL) ? \
|
85
|
+
((struct type *) genalloc(theEnv,sizeof(struct type))) :\
|
86
|
+
((MemoryData(theEnv)->TempMemoryPtr = MemoryData(theEnv)->MemoryTable[sizeof(struct type)]),\
|
87
|
+
MemoryData(theEnv)->MemoryTable[sizeof(struct type)] = MemoryData(theEnv)->TempMemoryPtr->next,\
|
88
|
+
((struct type *) MemoryData(theEnv)->TempMemoryPtr)))
|
89
|
+
|
90
|
+
#define rtn_struct(theEnv,type,struct_ptr) \
|
91
|
+
(MemoryData(theEnv)->TempMemoryPtr = (struct memoryPtr *) struct_ptr,\
|
92
|
+
MemoryData(theEnv)->TempMemoryPtr->next = MemoryData(theEnv)->MemoryTable[sizeof(struct type)], \
|
93
|
+
MemoryData(theEnv)->MemoryTable[sizeof(struct type)] = MemoryData(theEnv)->TempMemoryPtr)
|
94
|
+
|
95
|
+
#define rtn_sized_struct(theEnv,size,struct_ptr) \
|
96
|
+
(MemoryData(theEnv)->TempMemoryPtr = (struct memoryPtr *) struct_ptr,\
|
97
|
+
MemoryData(theEnv)->TempMemoryPtr->next = MemoryData(theEnv)->MemoryTable[size], \
|
98
|
+
MemoryData(theEnv)->MemoryTable[size] = MemoryData(theEnv)->TempMemoryPtr)
|
99
|
+
|
100
|
+
#define get_var_struct(theEnv,type,vsize) \
|
101
|
+
((((sizeof(struct type) + vsize) < MEM_TABLE_SIZE) ? \
|
102
|
+
(MemoryData(theEnv)->MemoryTable[sizeof(struct type) + vsize] == NULL) : 1) ? \
|
103
|
+
((struct type *) genalloc(theEnv,(sizeof(struct type) + vsize))) :\
|
104
|
+
((MemoryData(theEnv)->TempMemoryPtr = MemoryData(theEnv)->MemoryTable[sizeof(struct type) + vsize]),\
|
105
|
+
MemoryData(theEnv)->MemoryTable[sizeof(struct type) + vsize] = MemoryData(theEnv)->TempMemoryPtr->next,\
|
106
|
+
((struct type *) MemoryData(theEnv)->TempMemoryPtr)))
|
107
|
+
|
108
|
+
#define rtn_var_struct(theEnv,type,vsize,struct_ptr) \
|
109
|
+
(MemoryData(theEnv)->TempSize = sizeof(struct type) + vsize, \
|
110
|
+
((MemoryData(theEnv)->TempSize < MEM_TABLE_SIZE) ? \
|
111
|
+
(MemoryData(theEnv)->TempMemoryPtr = (struct memoryPtr *) struct_ptr,\
|
112
|
+
MemoryData(theEnv)->TempMemoryPtr->next = MemoryData(theEnv)->MemoryTable[MemoryData(theEnv)->TempSize], \
|
113
|
+
MemoryData(theEnv)->MemoryTable[MemoryData(theEnv)->TempSize] = MemoryData(theEnv)->TempMemoryPtr) : \
|
114
|
+
(genfree(theEnv,struct_ptr,MemoryData(theEnv)->TempSize),(struct memoryPtr *) struct_ptr)))
|
115
|
+
|
116
|
+
#define get_mem(theEnv,size) \
|
117
|
+
(((size < MEM_TABLE_SIZE) ? \
|
118
|
+
(MemoryData(theEnv)->MemoryTable[size] == NULL) : 1) ? \
|
119
|
+
((void *) genalloc(theEnv,(size_t) (size))) :\
|
120
|
+
((MemoryData(theEnv)->TempMemoryPtr = MemoryData(theEnv)->MemoryTable[size]),\
|
121
|
+
MemoryData(theEnv)->MemoryTable[size] = MemoryData(theEnv)->TempMemoryPtr->next,\
|
122
|
+
((void *) MemoryData(theEnv)->TempMemoryPtr)))
|
123
|
+
|
124
|
+
#define rtn_mem(theEnv,size,ptr) \
|
125
|
+
(MemoryData(theEnv)->TempSize = size, \
|
126
|
+
((MemoryData(theEnv)->TempSize < MEM_TABLE_SIZE) ? \
|
127
|
+
(MemoryData(theEnv)->TempMemoryPtr = (struct memoryPtr *) ptr,\
|
128
|
+
MemoryData(theEnv)->TempMemoryPtr->next = MemoryData(theEnv)->MemoryTable[MemoryData(theEnv)->TempSize], \
|
129
|
+
MemoryData(theEnv)->MemoryTable[MemoryData(theEnv)->TempSize] = MemoryData(theEnv)->TempMemoryPtr) : \
|
130
|
+
(genfree(theEnv,ptr,MemoryData(theEnv)->TempSize),(struct memoryPtr *) ptr)))
|
131
|
+
|
132
|
+
#else // MEM_TABLE_SIZE == 0
|
133
|
+
/*
|
134
|
+
* Debug case (routes all memory management through genalloc/genfree to take advantage of
|
135
|
+
* platform, memory debugging aids)
|
136
|
+
*/
|
137
|
+
#define get_struct(theEnv,type) ((struct type *) genalloc(theEnv,sizeof(struct type)))
|
138
|
+
|
139
|
+
#define rtn_struct(theEnv,type,struct_ptr) (genfree(theEnv,struct_ptr,sizeof(struct type)))
|
140
|
+
|
141
|
+
#define rtn_sized_struct(theEnv,size,struct_ptr) (genfree(theEnv,struct_ptr,size))
|
142
|
+
|
143
|
+
#define get_var_struct(theEnv,type,vsize) ((struct type *) genalloc(theEnv,(sizeof(struct type) + vsize)))
|
144
|
+
|
145
|
+
#define rtn_var_struct(theEnv,type,vsize,struct_ptr) (genfree(theEnv,struct_ptr,sizeof(struct type)+vsize))
|
146
|
+
|
147
|
+
#define get_mem(theEnv,size) ((struct type *) genalloc(theEnv,(size_t) (size)))
|
148
|
+
|
149
|
+
#define rtn_mem(theEnv,size,ptr) (genfree(theEnv,ptr,size))
|
150
|
+
|
151
|
+
#endif
|
152
|
+
|
153
|
+
#define GenCopyMemory(type,cnt,dst,src) \
|
154
|
+
memcpy((void *) (dst),(void *) (src),sizeof(type) * (size_t) (cnt))
|
155
|
+
|
156
|
+
#define MEMORY_DATA 59
|
157
|
+
|
158
|
+
struct memoryData
|
159
|
+
{
|
160
|
+
long long MemoryAmount;
|
161
|
+
long long MemoryCalls;
|
162
|
+
bool ConserveMemory;
|
163
|
+
OutOfMemoryFunction *OutOfMemoryCallback;
|
164
|
+
struct memoryPtr *TempMemoryPtr;
|
165
|
+
struct memoryPtr **MemoryTable;
|
166
|
+
size_t TempSize;
|
167
|
+
};
|
168
|
+
|
169
|
+
#define MemoryData(theEnv) ((struct memoryData *) GetEnvironmentData(theEnv,MEMORY_DATA))
|
170
|
+
|
171
|
+
void InitializeMemory(Environment *);
|
172
|
+
void *genalloc(Environment *,size_t);
|
173
|
+
bool DefaultOutOfMemoryFunction(Environment *,size_t);
|
174
|
+
OutOfMemoryFunction *SetOutOfMemoryFunction(Environment *,OutOfMemoryFunction *);
|
175
|
+
void genfree(Environment *,void *,size_t);
|
176
|
+
void *genrealloc(Environment *,void *,size_t,size_t);
|
177
|
+
long long MemUsed(Environment *);
|
178
|
+
long long MemRequests(Environment *);
|
179
|
+
long long UpdateMemoryUsed(Environment *,long long);
|
180
|
+
long long UpdateMemoryRequests(Environment *,long long);
|
181
|
+
long long ReleaseMem(Environment *,long long);
|
182
|
+
void *gm1(Environment *,size_t);
|
183
|
+
void *gm2(Environment *,size_t);
|
184
|
+
void rm(Environment *,void *,size_t);
|
185
|
+
unsigned long PoolSize(Environment *);
|
186
|
+
unsigned long ActualPoolSize(Environment *);
|
187
|
+
bool SetConserveMemory(Environment *,bool);
|
188
|
+
bool GetConserveMemory(Environment *);
|
189
|
+
void genmemcpy(char *,char *,unsigned long);
|
190
|
+
|
191
|
+
#endif /* _H_memalloc */
|
192
|
+
|
193
|
+
|
194
|
+
|
195
|
+
|
196
|
+
|
197
|
+
|