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,894 @@
|
|
1
|
+
/*******************************************************/
|
2
|
+
/* "C" Language Integrated Production System */
|
3
|
+
/* */
|
4
|
+
/* CLIPS Version 6.41 01/27/23 */
|
5
|
+
/* */
|
6
|
+
/* SYSTEM DEPENDENT MODULE */
|
7
|
+
/*******************************************************/
|
8
|
+
|
9
|
+
/*************************************************************/
|
10
|
+
/* Purpose: Isolation of system dependent 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.23: Modified GenOpen to check the file length */
|
21
|
+
/* against the system constant FILENAME_MAX. */
|
22
|
+
/* */
|
23
|
+
/* 6.24: Support for run-time programs directly passing */
|
24
|
+
/* the hash tables for initialization. */
|
25
|
+
/* */
|
26
|
+
/* Made gensystem functional for Xcode. */
|
27
|
+
/* */
|
28
|
+
/* Added BeforeOpenFunction and AfterOpenFunction */
|
29
|
+
/* hooks. */
|
30
|
+
/* */
|
31
|
+
/* Added environment parameter to GenClose. */
|
32
|
+
/* Added environment parameter to GenOpen. */
|
33
|
+
/* */
|
34
|
+
/* Updated UNIX_V gentime functionality. */
|
35
|
+
/* */
|
36
|
+
/* Removed GenOpen check against FILENAME_MAX. */
|
37
|
+
/* */
|
38
|
+
/* 6.30: Changed integer type/precision. */
|
39
|
+
/* */
|
40
|
+
/* Removed conditional code for unsupported */
|
41
|
+
/* compilers/operating systems (IBM_MCW, */
|
42
|
+
/* MAC_MCW, IBM_ICB, IBM_TBC, IBM_ZTC, and */
|
43
|
+
/* IBM_SC). */
|
44
|
+
/* */
|
45
|
+
/* Renamed IBM_MSC and WIN_MVC compiler flags */
|
46
|
+
/* and IBM_GCC to WIN_GCC. */
|
47
|
+
/* */
|
48
|
+
/* Added LINUX and DARWIN compiler flags. */
|
49
|
+
/* */
|
50
|
+
/* Removed HELP_FUNCTIONS compilation flag and */
|
51
|
+
/* associated functionality. */
|
52
|
+
/* */
|
53
|
+
/* Removed EMACS_EDITOR compilation flag and */
|
54
|
+
/* associated functionality. */
|
55
|
+
/* */
|
56
|
+
/* Combined BASIC_IO and EXT_IO compilation */
|
57
|
+
/* flags into the single IO_FUNCTIONS flag. */
|
58
|
+
/* */
|
59
|
+
/* Changed the EX_MATH compilation flag to */
|
60
|
+
/* EXTENDED_MATH_FUNCTIONS. */
|
61
|
+
/* */
|
62
|
+
/* Support for typed EXTERNAL_ADDRESS_TYPE. */
|
63
|
+
/* */
|
64
|
+
/* GenOpen function checks for UTF-8 Byte Order */
|
65
|
+
/* Marker. */
|
66
|
+
/* */
|
67
|
+
/* Added gengetchar, genungetchar, genprintfile, */
|
68
|
+
/* genstrcpy, genstrncpy, genstrcat, genstrncat, */
|
69
|
+
/* and gensprintf functions. */
|
70
|
+
/* */
|
71
|
+
/* Added SetJmpBuffer function. */
|
72
|
+
/* */
|
73
|
+
/* Added environment argument to genexit. */
|
74
|
+
/* */
|
75
|
+
/* Added const qualifiers to remove C++ */
|
76
|
+
/* deprecation warnings. */
|
77
|
+
/* */
|
78
|
+
/* 6.31: Compiler warning fix. */
|
79
|
+
/* */
|
80
|
+
/* 6.32: GenWrite returns number of bytes written. */
|
81
|
+
/* */
|
82
|
+
/* 6.40: Added genchdir function for changing the */
|
83
|
+
/* current directory. */
|
84
|
+
/* */
|
85
|
+
/* Modified gentime to return "comparable" epoch */
|
86
|
+
/* based values across platforms. */
|
87
|
+
/* */
|
88
|
+
/* Refactored code to reduce header dependencies */
|
89
|
+
/* in sysdep.c. */
|
90
|
+
/* */
|
91
|
+
/* Pragma once and other inclusion changes. */
|
92
|
+
/* */
|
93
|
+
/* Added support for booleans with <stdbool.h>. */
|
94
|
+
/* */
|
95
|
+
/* Removed use of void pointers for specific */
|
96
|
+
/* data structures. */
|
97
|
+
/* */
|
98
|
+
/* Moved CatchCtrlC to main.c. */
|
99
|
+
/* */
|
100
|
+
/* Removed VAX_VMS support. */
|
101
|
+
/* */
|
102
|
+
/* Removed ContinueEnvFunction, PauseEnvFunction, */
|
103
|
+
/* and RedrawScreenFunction callbacks. */
|
104
|
+
/* */
|
105
|
+
/* Completion code now returned by gensystem. */
|
106
|
+
/* */
|
107
|
+
/* Added flush, rewind, tell, and seek functions. */
|
108
|
+
/* */
|
109
|
+
/* Removed fflush calls after printing. */
|
110
|
+
/* */
|
111
|
+
/* GenOpen, genchdir, genremove, and genrename */
|
112
|
+
/* use wide character functions on Windows to */
|
113
|
+
/* work properly with file and directory names */
|
114
|
+
/* containing unicode characters. */
|
115
|
+
/* */
|
116
|
+
/* 6.41: Added SYSTEM_FUNCTION compiler flag. */
|
117
|
+
/* */
|
118
|
+
/* Function GenReadBinary returns the number of */
|
119
|
+
/* bytes read. */
|
120
|
+
/* */
|
121
|
+
/* Added gensnprint function. */
|
122
|
+
/* */
|
123
|
+
/* Fixed compiler warning caused by using & */
|
124
|
+
/* instead of &&. */
|
125
|
+
/* */
|
126
|
+
/* Changed gengetcwd buffer length parameter from */
|
127
|
+
/* int to size_t. */
|
128
|
+
/* */
|
129
|
+
/*************************************************************/
|
130
|
+
|
131
|
+
#include "setup.h"
|
132
|
+
|
133
|
+
#include <stdio.h>
|
134
|
+
#include <string.h>
|
135
|
+
|
136
|
+
#include <stdlib.h>
|
137
|
+
#include <time.h>
|
138
|
+
#include <stdarg.h>
|
139
|
+
#include <errno.h>
|
140
|
+
#include <limits.h>
|
141
|
+
|
142
|
+
#if MAC_XCD
|
143
|
+
#include <sys/time.h>
|
144
|
+
#include <unistd.h>
|
145
|
+
#endif
|
146
|
+
|
147
|
+
#if WIN_MVC
|
148
|
+
#include <windows.h>
|
149
|
+
#include <direct.h>
|
150
|
+
#include <io.h>
|
151
|
+
#include <fcntl.h>
|
152
|
+
#include <signal.h>
|
153
|
+
#endif
|
154
|
+
|
155
|
+
#if UNIX_7 || WIN_GCC
|
156
|
+
#include <sys/types.h>
|
157
|
+
#include <sys/timeb.h>
|
158
|
+
#include <signal.h>
|
159
|
+
#endif
|
160
|
+
|
161
|
+
#if UNIX_V || LINUX || DARWIN
|
162
|
+
#include <sys/time.h>
|
163
|
+
#include <signal.h>
|
164
|
+
#include <unistd.h>
|
165
|
+
#endif
|
166
|
+
|
167
|
+
#include "envrnmnt.h"
|
168
|
+
#include "memalloc.h"
|
169
|
+
#include "sysdep.h"
|
170
|
+
|
171
|
+
/********************/
|
172
|
+
/* ENVIRONMENT DATA */
|
173
|
+
/********************/
|
174
|
+
|
175
|
+
#define SYSTEM_DEPENDENT_DATA 58
|
176
|
+
|
177
|
+
struct systemDependentData
|
178
|
+
{
|
179
|
+
#if WIN_MVC
|
180
|
+
int BinaryFileHandle;
|
181
|
+
unsigned char getcBuffer[7];
|
182
|
+
int getcLength;
|
183
|
+
int getcPosition;
|
184
|
+
#endif
|
185
|
+
#if (! WIN_MVC)
|
186
|
+
FILE *BinaryFP;
|
187
|
+
#endif
|
188
|
+
int (*BeforeOpenFunction)(Environment *);
|
189
|
+
int (*AfterOpenFunction)(Environment *);
|
190
|
+
jmp_buf *jmpBuffer;
|
191
|
+
};
|
192
|
+
|
193
|
+
#define SystemDependentData(theEnv) ((struct systemDependentData *) GetEnvironmentData(theEnv,SYSTEM_DEPENDENT_DATA))
|
194
|
+
|
195
|
+
/********************************************************/
|
196
|
+
/* InitializeSystemDependentData: Allocates environment */
|
197
|
+
/* data for system dependent routines. */
|
198
|
+
/********************************************************/
|
199
|
+
void InitializeSystemDependentData(
|
200
|
+
Environment *theEnv)
|
201
|
+
{
|
202
|
+
AllocateEnvironmentData(theEnv,SYSTEM_DEPENDENT_DATA,sizeof(struct systemDependentData),NULL);
|
203
|
+
}
|
204
|
+
|
205
|
+
/*********************************************************/
|
206
|
+
/* gentime: A function to return a floating point number */
|
207
|
+
/* which indicates the present time. Used internally */
|
208
|
+
/* for timing rule firings and debugging. */
|
209
|
+
/*********************************************************/
|
210
|
+
double gentime()
|
211
|
+
{
|
212
|
+
#if MAC_XCD || UNIX_V || DARWIN || LINUX || UNIX_7
|
213
|
+
struct timeval now;
|
214
|
+
gettimeofday(&now, 0);
|
215
|
+
return (now.tv_usec / 1000000.0) + now.tv_sec;
|
216
|
+
#elif WIN_MVC
|
217
|
+
FILETIME ft;
|
218
|
+
unsigned long long tt;
|
219
|
+
|
220
|
+
GetSystemTimeAsFileTime(&ft);
|
221
|
+
tt = ft.dwHighDateTime;
|
222
|
+
tt <<=32;
|
223
|
+
tt |= ft.dwLowDateTime;
|
224
|
+
tt /=10;
|
225
|
+
tt -= 11644473600000000ULL;
|
226
|
+
return (double) tt / 1000000.0;
|
227
|
+
#else
|
228
|
+
return((double) time(NULL));
|
229
|
+
#endif
|
230
|
+
}
|
231
|
+
|
232
|
+
#if SYSTEM_FUNCTION
|
233
|
+
/*****************************************************/
|
234
|
+
/* gensystem: Generic routine for passing a string */
|
235
|
+
/* representing a command to the operating system. */
|
236
|
+
/*****************************************************/
|
237
|
+
int gensystem(
|
238
|
+
Environment *theEnv,
|
239
|
+
const char *commandBuffer)
|
240
|
+
{
|
241
|
+
return system(commandBuffer);
|
242
|
+
}
|
243
|
+
#endif
|
244
|
+
|
245
|
+
/*******************************************/
|
246
|
+
/* gengetchar: Generic routine for getting */
|
247
|
+
/* a character from stdin. */
|
248
|
+
/*******************************************/
|
249
|
+
int gengetchar(
|
250
|
+
Environment *theEnv)
|
251
|
+
{
|
252
|
+
return(getc(stdin));
|
253
|
+
}
|
254
|
+
|
255
|
+
/***********************************************/
|
256
|
+
/* genungetchar: Generic routine for ungetting */
|
257
|
+
/* a character from stdin. */
|
258
|
+
/***********************************************/
|
259
|
+
int genungetchar(
|
260
|
+
Environment *theEnv,
|
261
|
+
int theChar)
|
262
|
+
{
|
263
|
+
return(ungetc(theChar,stdin));
|
264
|
+
}
|
265
|
+
|
266
|
+
/****************************************************/
|
267
|
+
/* genprintfile: Generic routine for print a single */
|
268
|
+
/* character string to a file (including stdout). */
|
269
|
+
/****************************************************/
|
270
|
+
void genprintfile(
|
271
|
+
Environment *theEnv,
|
272
|
+
FILE *fptr,
|
273
|
+
const char *str)
|
274
|
+
{
|
275
|
+
fprintf(fptr,"%s",str);
|
276
|
+
}
|
277
|
+
|
278
|
+
/***********************************************************/
|
279
|
+
/* InitializeNonportableFeatures: Initializes non-portable */
|
280
|
+
/* features. Currently, the only non-portable feature */
|
281
|
+
/* requiring initialization is the interrupt handler */
|
282
|
+
/* which allows execution to be halted. */
|
283
|
+
/***********************************************************/
|
284
|
+
void InitializeNonportableFeatures(
|
285
|
+
Environment *theEnv)
|
286
|
+
{
|
287
|
+
#if MAC_XCD
|
288
|
+
#pragma unused(theEnv)
|
289
|
+
#endif
|
290
|
+
}
|
291
|
+
|
292
|
+
/**************************************/
|
293
|
+
/* genexit: A generic exit function. */
|
294
|
+
/**************************************/
|
295
|
+
void genexit(
|
296
|
+
Environment *theEnv,
|
297
|
+
int num)
|
298
|
+
{
|
299
|
+
if (SystemDependentData(theEnv)->jmpBuffer != NULL)
|
300
|
+
{ longjmp(*SystemDependentData(theEnv)->jmpBuffer,1); }
|
301
|
+
|
302
|
+
exit(num);
|
303
|
+
}
|
304
|
+
|
305
|
+
/**************************************/
|
306
|
+
/* SetJmpBuffer: */
|
307
|
+
/**************************************/
|
308
|
+
void SetJmpBuffer(
|
309
|
+
Environment *theEnv,
|
310
|
+
jmp_buf *theJmpBuffer)
|
311
|
+
{
|
312
|
+
SystemDependentData(theEnv)->jmpBuffer = theJmpBuffer;
|
313
|
+
}
|
314
|
+
|
315
|
+
/******************************************/
|
316
|
+
/* genstrcpy: Generic genstrcpy function. */
|
317
|
+
/******************************************/
|
318
|
+
char *genstrcpy(
|
319
|
+
char *dest,
|
320
|
+
const char *src)
|
321
|
+
{
|
322
|
+
return strcpy(dest,src);
|
323
|
+
}
|
324
|
+
|
325
|
+
/********************************************/
|
326
|
+
/* genstrncpy: Generic genstrncpy function. */
|
327
|
+
/********************************************/
|
328
|
+
char *genstrncpy(
|
329
|
+
char *dest,
|
330
|
+
const char *src,
|
331
|
+
size_t n)
|
332
|
+
{
|
333
|
+
return strncpy(dest,src,n);
|
334
|
+
}
|
335
|
+
|
336
|
+
/******************************************/
|
337
|
+
/* genstrcat: Generic genstrcat function. */
|
338
|
+
/******************************************/
|
339
|
+
char *genstrcat(
|
340
|
+
char *dest,
|
341
|
+
const char *src)
|
342
|
+
{
|
343
|
+
return strcat(dest,src);
|
344
|
+
}
|
345
|
+
|
346
|
+
/********************************************/
|
347
|
+
/* genstrncat: Generic genstrncat function. */
|
348
|
+
/********************************************/
|
349
|
+
char *genstrncat(
|
350
|
+
char *dest,
|
351
|
+
const char *src,
|
352
|
+
size_t n)
|
353
|
+
{
|
354
|
+
return strncat(dest,src,n);
|
355
|
+
}
|
356
|
+
|
357
|
+
/*****************************************/
|
358
|
+
/* gensprintf: Generic sprintf function. */
|
359
|
+
/*****************************************/
|
360
|
+
int gensprintf(
|
361
|
+
char *buffer,
|
362
|
+
const char *restrictStr,
|
363
|
+
...)
|
364
|
+
{
|
365
|
+
va_list args;
|
366
|
+
int rv;
|
367
|
+
|
368
|
+
va_start(args,restrictStr);
|
369
|
+
|
370
|
+
rv = vsprintf(buffer,restrictStr,args);
|
371
|
+
|
372
|
+
va_end(args);
|
373
|
+
|
374
|
+
return rv;
|
375
|
+
}
|
376
|
+
|
377
|
+
/*******************************************/
|
378
|
+
/* gensnprintf: Generic snprintf function. */
|
379
|
+
/*******************************************/
|
380
|
+
int gensnprintf(
|
381
|
+
char *buffer,
|
382
|
+
size_t bufferSize,
|
383
|
+
const char *restrictStr,
|
384
|
+
...)
|
385
|
+
{
|
386
|
+
va_list args;
|
387
|
+
int rv;
|
388
|
+
|
389
|
+
va_start(args,restrictStr);
|
390
|
+
|
391
|
+
rv = vsnprintf(buffer,bufferSize,restrictStr,args);
|
392
|
+
|
393
|
+
va_end(args);
|
394
|
+
|
395
|
+
return rv;
|
396
|
+
}
|
397
|
+
|
398
|
+
/******************************************************/
|
399
|
+
/* genrand: Generic random number generator function. */
|
400
|
+
/******************************************************/
|
401
|
+
int genrand()
|
402
|
+
{
|
403
|
+
return(rand());
|
404
|
+
}
|
405
|
+
|
406
|
+
/**********************************************************************/
|
407
|
+
/* genseed: Generic function for seeding the random number generator. */
|
408
|
+
/**********************************************************************/
|
409
|
+
void genseed(
|
410
|
+
unsigned int seed)
|
411
|
+
{
|
412
|
+
srand(seed);
|
413
|
+
}
|
414
|
+
|
415
|
+
/*********************************************/
|
416
|
+
/* gengetcwd: Generic function for returning */
|
417
|
+
/* the current directory. */
|
418
|
+
/*********************************************/
|
419
|
+
char *gengetcwd(
|
420
|
+
char *buffer,
|
421
|
+
size_t buflength)
|
422
|
+
{
|
423
|
+
#if MAC_XCD
|
424
|
+
return(getcwd(buffer,buflength));
|
425
|
+
#else
|
426
|
+
if (buffer != NULL)
|
427
|
+
{ buffer[0] = 0; }
|
428
|
+
return(buffer);
|
429
|
+
#endif
|
430
|
+
}
|
431
|
+
|
432
|
+
/*************************************************/
|
433
|
+
/* genchdir: Generic function for setting the */
|
434
|
+
/* current directory. Returns 1 if successful, */
|
435
|
+
/* 0 if unsuccessful, and -1 if unavailable. */
|
436
|
+
/*************************************************/
|
437
|
+
int genchdir(
|
438
|
+
Environment *theEnv,
|
439
|
+
const char *directory)
|
440
|
+
{
|
441
|
+
int rv = -1;
|
442
|
+
|
443
|
+
/*==========================================================*/
|
444
|
+
/* If the directory argument is NULL, then the return value */
|
445
|
+
/* indicates whether the chdir functionality is supported. */
|
446
|
+
/*==========================================================*/
|
447
|
+
|
448
|
+
if (directory == NULL)
|
449
|
+
{
|
450
|
+
#if MAC_XCD || DARWIN || LINUX || WIN_MVC
|
451
|
+
return 1;
|
452
|
+
#else
|
453
|
+
return 0;
|
454
|
+
#endif
|
455
|
+
}
|
456
|
+
|
457
|
+
/*========================================*/
|
458
|
+
/* Otherwise, try changing the directory. */
|
459
|
+
/*========================================*/
|
460
|
+
|
461
|
+
#if MAC_XCD || DARWIN || LINUX
|
462
|
+
rv = chdir(directory) + 1;
|
463
|
+
#endif
|
464
|
+
#if WIN_MVC
|
465
|
+
wchar_t *wdirectory;
|
466
|
+
int wlength;
|
467
|
+
|
468
|
+
wlength = MultiByteToWideChar(CP_UTF8,0,directory,-1,NULL,0);
|
469
|
+
|
470
|
+
wdirectory = (wchar_t *) genalloc(theEnv,wlength * sizeof(wchar_t));
|
471
|
+
|
472
|
+
MultiByteToWideChar(CP_UTF8,0,directory,-1,wdirectory,wlength);
|
473
|
+
|
474
|
+
rv = _wchdir(wdirectory) + 1;
|
475
|
+
|
476
|
+
genfree(theEnv,wdirectory,wlength * sizeof(wchar_t));
|
477
|
+
#endif
|
478
|
+
|
479
|
+
return rv;
|
480
|
+
}
|
481
|
+
|
482
|
+
/****************************************************/
|
483
|
+
/* genremove: Generic function for removing a file. */
|
484
|
+
/****************************************************/
|
485
|
+
bool genremove(
|
486
|
+
Environment *theEnv,
|
487
|
+
const char *fileName)
|
488
|
+
{
|
489
|
+
#if WIN_MVC
|
490
|
+
wchar_t *wfileName;
|
491
|
+
int wfnlength;
|
492
|
+
#endif
|
493
|
+
|
494
|
+
#if WIN_MVC
|
495
|
+
wfnlength = MultiByteToWideChar(CP_UTF8,0,fileName,-1,NULL,0);
|
496
|
+
|
497
|
+
wfileName = (wchar_t *) genalloc(theEnv,wfnlength * sizeof(wchar_t));
|
498
|
+
|
499
|
+
MultiByteToWideChar(CP_UTF8,0,fileName,-1,wfileName,wfnlength);
|
500
|
+
|
501
|
+
if (_wremove(wfileName))
|
502
|
+
{
|
503
|
+
genfree(theEnv,wfileName,wfnlength * sizeof(wchar_t));
|
504
|
+
return false;
|
505
|
+
}
|
506
|
+
|
507
|
+
genfree(theEnv,wfileName,wfnlength * sizeof(wchar_t));
|
508
|
+
#else
|
509
|
+
if (remove(fileName)) return false;
|
510
|
+
#endif
|
511
|
+
|
512
|
+
return true;
|
513
|
+
}
|
514
|
+
|
515
|
+
/****************************************************/
|
516
|
+
/* genrename: Generic function for renaming a file. */
|
517
|
+
/****************************************************/
|
518
|
+
bool genrename(
|
519
|
+
Environment *theEnv,
|
520
|
+
const char *oldFileName,
|
521
|
+
const char *newFileName)
|
522
|
+
{
|
523
|
+
#if WIN_MVC
|
524
|
+
wchar_t *woldFileName, *wnewFileName;
|
525
|
+
int wofnlength, wnfnlength;
|
526
|
+
#endif
|
527
|
+
|
528
|
+
#if WIN_MVC
|
529
|
+
wofnlength = MultiByteToWideChar(CP_UTF8,0,oldFileName,-1,NULL,0);
|
530
|
+
wnfnlength = MultiByteToWideChar(CP_UTF8,0,newFileName,-1,NULL,0);
|
531
|
+
|
532
|
+
woldFileName = (wchar_t *) genalloc(theEnv,wofnlength * sizeof(wchar_t));
|
533
|
+
wnewFileName = (wchar_t *) genalloc(theEnv,wnfnlength * sizeof(wchar_t));
|
534
|
+
|
535
|
+
MultiByteToWideChar(CP_UTF8,0,oldFileName,-1,woldFileName,wofnlength);
|
536
|
+
MultiByteToWideChar(CP_UTF8,0,newFileName,-1,wnewFileName,wnfnlength);
|
537
|
+
|
538
|
+
if (_wrename(woldFileName,wnewFileName))
|
539
|
+
{
|
540
|
+
genfree(theEnv,woldFileName,wofnlength * sizeof(wchar_t));
|
541
|
+
genfree(theEnv,wnewFileName,wnfnlength * sizeof(wchar_t));
|
542
|
+
return false;
|
543
|
+
}
|
544
|
+
|
545
|
+
genfree(theEnv,woldFileName,wofnlength * sizeof(wchar_t));
|
546
|
+
genfree(theEnv,wnewFileName,wnfnlength * sizeof(wchar_t));
|
547
|
+
#else
|
548
|
+
if (rename(oldFileName,newFileName)) return false;
|
549
|
+
#endif
|
550
|
+
|
551
|
+
return true;
|
552
|
+
}
|
553
|
+
|
554
|
+
/***********************************/
|
555
|
+
/* SetBeforeOpenFunction: Sets the */
|
556
|
+
/* value of BeforeOpenFunction. */
|
557
|
+
/***********************************/
|
558
|
+
int (*SetBeforeOpenFunction(Environment *theEnv,
|
559
|
+
int (*theFunction)(Environment *)))(Environment *)
|
560
|
+
{
|
561
|
+
int (*tempFunction)(Environment *);
|
562
|
+
|
563
|
+
tempFunction = SystemDependentData(theEnv)->BeforeOpenFunction;
|
564
|
+
SystemDependentData(theEnv)->BeforeOpenFunction = theFunction;
|
565
|
+
return(tempFunction);
|
566
|
+
}
|
567
|
+
|
568
|
+
/**********************************/
|
569
|
+
/* SetAfterOpenFunction: Sets the */
|
570
|
+
/* value of AfterOpenFunction. */
|
571
|
+
/**********************************/
|
572
|
+
int (*SetAfterOpenFunction(Environment *theEnv,
|
573
|
+
int (*theFunction)(Environment *)))(Environment *)
|
574
|
+
{
|
575
|
+
int (*tempFunction)(Environment *);
|
576
|
+
|
577
|
+
tempFunction = SystemDependentData(theEnv)->AfterOpenFunction;
|
578
|
+
SystemDependentData(theEnv)->AfterOpenFunction = theFunction;
|
579
|
+
return(tempFunction);
|
580
|
+
}
|
581
|
+
|
582
|
+
/*********************************************/
|
583
|
+
/* GenOpen: Trap routine for opening a file. */
|
584
|
+
/*********************************************/
|
585
|
+
FILE *GenOpen(
|
586
|
+
Environment *theEnv,
|
587
|
+
const char *fileName,
|
588
|
+
const char *accessType)
|
589
|
+
{
|
590
|
+
FILE *theFile;
|
591
|
+
#if WIN_MVC
|
592
|
+
wchar_t *wfileName;
|
593
|
+
wchar_t *waccessType;
|
594
|
+
int wfnlength, watlength;
|
595
|
+
#endif
|
596
|
+
/*==================================*/
|
597
|
+
/* Invoke the before open function. */
|
598
|
+
/*==================================*/
|
599
|
+
|
600
|
+
if (SystemDependentData(theEnv)->BeforeOpenFunction != NULL)
|
601
|
+
{ (*SystemDependentData(theEnv)->BeforeOpenFunction)(theEnv); }
|
602
|
+
|
603
|
+
/*================*/
|
604
|
+
/* Open the file. */
|
605
|
+
/*================*/
|
606
|
+
|
607
|
+
#if WIN_MVC
|
608
|
+
wfnlength = MultiByteToWideChar(CP_UTF8,0,fileName,-1,NULL,0);
|
609
|
+
watlength = MultiByteToWideChar(CP_UTF8,0,accessType,-1,NULL,0);
|
610
|
+
|
611
|
+
wfileName = (wchar_t *) genalloc(theEnv,wfnlength * sizeof(wchar_t));
|
612
|
+
waccessType = (wchar_t *) genalloc(theEnv,watlength * sizeof(wchar_t));
|
613
|
+
|
614
|
+
MultiByteToWideChar(CP_UTF8,0,fileName,-1,wfileName,wfnlength);
|
615
|
+
MultiByteToWideChar(CP_UTF8,0,accessType,-1,waccessType,watlength);
|
616
|
+
|
617
|
+
_wfopen_s(&theFile,wfileName,waccessType);
|
618
|
+
|
619
|
+
genfree(theEnv,wfileName,wfnlength * sizeof(wchar_t));
|
620
|
+
genfree(theEnv,waccessType,watlength * sizeof(wchar_t));
|
621
|
+
#else
|
622
|
+
theFile = fopen(fileName,accessType);
|
623
|
+
#endif
|
624
|
+
|
625
|
+
/*=====================================*/
|
626
|
+
/* Check for a UTF-8 Byte Order Marker */
|
627
|
+
/* (BOM): 0xEF,0xBB,0xBF. */
|
628
|
+
/*=====================================*/
|
629
|
+
|
630
|
+
if ((theFile != NULL) && (strcmp(accessType,"r") == 0))
|
631
|
+
{
|
632
|
+
int theChar;
|
633
|
+
|
634
|
+
theChar = getc(theFile);
|
635
|
+
if (theChar == 0xEF)
|
636
|
+
{
|
637
|
+
theChar = getc(theFile);
|
638
|
+
if (theChar == 0xBB)
|
639
|
+
{
|
640
|
+
theChar = getc(theFile);
|
641
|
+
if (theChar != 0xBF)
|
642
|
+
{ ungetc(theChar,theFile);}
|
643
|
+
}
|
644
|
+
else
|
645
|
+
{ ungetc(theChar,theFile);}
|
646
|
+
}
|
647
|
+
else
|
648
|
+
{ ungetc(theChar,theFile); }
|
649
|
+
}
|
650
|
+
|
651
|
+
/*=================================*/
|
652
|
+
/* Invoke the after open function. */
|
653
|
+
/*=================================*/
|
654
|
+
|
655
|
+
if (SystemDependentData(theEnv)->AfterOpenFunction != NULL)
|
656
|
+
{ (*SystemDependentData(theEnv)->AfterOpenFunction)(theEnv); }
|
657
|
+
|
658
|
+
/*===============================*/
|
659
|
+
/* Return a pointer to the file. */
|
660
|
+
/*===============================*/
|
661
|
+
|
662
|
+
return theFile;
|
663
|
+
}
|
664
|
+
|
665
|
+
/**********************************************/
|
666
|
+
/* GenClose: Trap routine for closing a file. */
|
667
|
+
/**********************************************/
|
668
|
+
int GenClose(
|
669
|
+
Environment *theEnv,
|
670
|
+
FILE *theFile)
|
671
|
+
{
|
672
|
+
int rv;
|
673
|
+
|
674
|
+
rv = fclose(theFile);
|
675
|
+
|
676
|
+
return rv;
|
677
|
+
}
|
678
|
+
|
679
|
+
/***********************************************/
|
680
|
+
/* GenFlush: Trap routine for flushing a file. */
|
681
|
+
/***********************************************/
|
682
|
+
int GenFlush(
|
683
|
+
Environment *theEnv,
|
684
|
+
FILE *theFile)
|
685
|
+
{
|
686
|
+
int rv;
|
687
|
+
|
688
|
+
rv = fflush(theFile);
|
689
|
+
|
690
|
+
return rv;
|
691
|
+
}
|
692
|
+
|
693
|
+
/*************************************************/
|
694
|
+
/* GenRewind: Trap routine for rewinding a file. */
|
695
|
+
/*************************************************/
|
696
|
+
void GenRewind(
|
697
|
+
Environment *theEnv,
|
698
|
+
FILE *theFile)
|
699
|
+
{
|
700
|
+
rewind(theFile);
|
701
|
+
}
|
702
|
+
|
703
|
+
/*************************************************/
|
704
|
+
/* GenTell: Trap routine for the ftell function. */
|
705
|
+
/*************************************************/
|
706
|
+
long long GenTell(
|
707
|
+
Environment *theEnv,
|
708
|
+
FILE *theFile)
|
709
|
+
{
|
710
|
+
long long rv;
|
711
|
+
|
712
|
+
rv = ftell(theFile);
|
713
|
+
|
714
|
+
if (rv == -1)
|
715
|
+
{
|
716
|
+
if (errno > 0)
|
717
|
+
{ return LLONG_MIN; }
|
718
|
+
}
|
719
|
+
|
720
|
+
return rv;
|
721
|
+
}
|
722
|
+
|
723
|
+
/*************************************************/
|
724
|
+
/* GenSeek: Trap routine for the fseek function. */
|
725
|
+
/*************************************************/
|
726
|
+
int GenSeek(
|
727
|
+
Environment *theEnv,
|
728
|
+
FILE *theFile,
|
729
|
+
long offset,
|
730
|
+
int whereFrom)
|
731
|
+
{
|
732
|
+
return fseek(theFile,offset,whereFrom);
|
733
|
+
}
|
734
|
+
|
735
|
+
/************************************************************/
|
736
|
+
/* GenOpenReadBinary: Generic and machine specific code for */
|
737
|
+
/* opening a file for binary access. Only one file may be */
|
738
|
+
/* open at a time when using this function since the file */
|
739
|
+
/* pointer is stored in a global variable. */
|
740
|
+
/************************************************************/
|
741
|
+
bool GenOpenReadBinary(
|
742
|
+
Environment *theEnv,
|
743
|
+
const char *funcName,
|
744
|
+
const char *fileName)
|
745
|
+
{
|
746
|
+
if (SystemDependentData(theEnv)->BeforeOpenFunction != NULL)
|
747
|
+
{ (*SystemDependentData(theEnv)->BeforeOpenFunction)(theEnv); }
|
748
|
+
|
749
|
+
#if WIN_MVC
|
750
|
+
SystemDependentData(theEnv)->BinaryFileHandle = _open(fileName,O_RDONLY | O_BINARY);
|
751
|
+
if (SystemDependentData(theEnv)->BinaryFileHandle == -1)
|
752
|
+
{
|
753
|
+
if (SystemDependentData(theEnv)->AfterOpenFunction != NULL)
|
754
|
+
{ (*SystemDependentData(theEnv)->AfterOpenFunction)(theEnv); }
|
755
|
+
return false;
|
756
|
+
}
|
757
|
+
#endif
|
758
|
+
|
759
|
+
#if (! WIN_MVC)
|
760
|
+
if ((SystemDependentData(theEnv)->BinaryFP = fopen(fileName,"rb")) == NULL)
|
761
|
+
{
|
762
|
+
if (SystemDependentData(theEnv)->AfterOpenFunction != NULL)
|
763
|
+
{ (*SystemDependentData(theEnv)->AfterOpenFunction)(theEnv); }
|
764
|
+
return false;
|
765
|
+
}
|
766
|
+
#endif
|
767
|
+
|
768
|
+
if (SystemDependentData(theEnv)->AfterOpenFunction != NULL)
|
769
|
+
{ (*SystemDependentData(theEnv)->AfterOpenFunction)(theEnv); }
|
770
|
+
|
771
|
+
return true;
|
772
|
+
}
|
773
|
+
|
774
|
+
/***********************************************/
|
775
|
+
/* GenReadBinary: Generic and machine specific */
|
776
|
+
/* code for reading from a file. */
|
777
|
+
/***********************************************/
|
778
|
+
size_t GenReadBinary(
|
779
|
+
Environment *theEnv,
|
780
|
+
void *dataPtr,
|
781
|
+
size_t size)
|
782
|
+
{
|
783
|
+
#if WIN_MVC
|
784
|
+
char *tempPtr;
|
785
|
+
size_t rv = 0;
|
786
|
+
|
787
|
+
tempPtr = (char *) dataPtr;
|
788
|
+
while (size > INT_MAX)
|
789
|
+
{
|
790
|
+
rv += _read(SystemDependentData(theEnv)->BinaryFileHandle,tempPtr,INT_MAX);
|
791
|
+
size -= INT_MAX;
|
792
|
+
tempPtr = tempPtr + INT_MAX;
|
793
|
+
}
|
794
|
+
|
795
|
+
if (size > 0)
|
796
|
+
{ rv += _read(SystemDependentData(theEnv)->BinaryFileHandle,tempPtr,(unsigned int) size); }
|
797
|
+
|
798
|
+
return rv;
|
799
|
+
#endif
|
800
|
+
|
801
|
+
#if (! WIN_MVC)
|
802
|
+
return fread(dataPtr,size,1,SystemDependentData(theEnv)->BinaryFP);
|
803
|
+
#endif
|
804
|
+
}
|
805
|
+
|
806
|
+
/***************************************************/
|
807
|
+
/* GetSeekCurBinary: Generic and machine specific */
|
808
|
+
/* code for seeking a position in a file. */
|
809
|
+
/***************************************************/
|
810
|
+
void GetSeekCurBinary(
|
811
|
+
Environment *theEnv,
|
812
|
+
long offset)
|
813
|
+
{
|
814
|
+
#if WIN_MVC
|
815
|
+
_lseek(SystemDependentData(theEnv)->BinaryFileHandle,offset,SEEK_CUR);
|
816
|
+
#endif
|
817
|
+
|
818
|
+
#if (! WIN_MVC)
|
819
|
+
fseek(SystemDependentData(theEnv)->BinaryFP,offset,SEEK_CUR);
|
820
|
+
#endif
|
821
|
+
}
|
822
|
+
|
823
|
+
/***************************************************/
|
824
|
+
/* GetSeekSetBinary: Generic and machine specific */
|
825
|
+
/* code for seeking a position in a file. */
|
826
|
+
/***************************************************/
|
827
|
+
void GetSeekSetBinary(
|
828
|
+
Environment *theEnv,
|
829
|
+
long offset)
|
830
|
+
{
|
831
|
+
#if WIN_MVC
|
832
|
+
_lseek(SystemDependentData(theEnv)->BinaryFileHandle,offset,SEEK_SET);
|
833
|
+
#endif
|
834
|
+
|
835
|
+
#if (! WIN_MVC)
|
836
|
+
fseek(SystemDependentData(theEnv)->BinaryFP,offset,SEEK_SET);
|
837
|
+
#endif
|
838
|
+
}
|
839
|
+
|
840
|
+
/************************************************/
|
841
|
+
/* GenTellBinary: Generic and machine specific */
|
842
|
+
/* code for telling a position in a file. */
|
843
|
+
/************************************************/
|
844
|
+
void GenTellBinary(
|
845
|
+
Environment *theEnv,
|
846
|
+
long *offset)
|
847
|
+
{
|
848
|
+
#if WIN_MVC
|
849
|
+
*offset = _lseek(SystemDependentData(theEnv)->BinaryFileHandle,0,SEEK_CUR);
|
850
|
+
#endif
|
851
|
+
|
852
|
+
#if (! WIN_MVC)
|
853
|
+
*offset = ftell(SystemDependentData(theEnv)->BinaryFP);
|
854
|
+
#endif
|
855
|
+
}
|
856
|
+
|
857
|
+
/****************************************/
|
858
|
+
/* GenCloseBinary: Generic and machine */
|
859
|
+
/* specific code for closing a file. */
|
860
|
+
/****************************************/
|
861
|
+
void GenCloseBinary(
|
862
|
+
Environment *theEnv)
|
863
|
+
{
|
864
|
+
if (SystemDependentData(theEnv)->BeforeOpenFunction != NULL)
|
865
|
+
{ (*SystemDependentData(theEnv)->BeforeOpenFunction)(theEnv); }
|
866
|
+
|
867
|
+
#if WIN_MVC
|
868
|
+
_close(SystemDependentData(theEnv)->BinaryFileHandle);
|
869
|
+
#endif
|
870
|
+
|
871
|
+
#if (! WIN_MVC)
|
872
|
+
fclose(SystemDependentData(theEnv)->BinaryFP);
|
873
|
+
#endif
|
874
|
+
|
875
|
+
if (SystemDependentData(theEnv)->AfterOpenFunction != NULL)
|
876
|
+
{ (*SystemDependentData(theEnv)->AfterOpenFunction)(theEnv); }
|
877
|
+
}
|
878
|
+
|
879
|
+
/***********************************************/
|
880
|
+
/* GenWrite: Generic routine for writing to a */
|
881
|
+
/* file. No machine specific code as of yet. */
|
882
|
+
/***********************************************/
|
883
|
+
size_t GenWrite(
|
884
|
+
void *dataPtr,
|
885
|
+
size_t size,
|
886
|
+
FILE *fp)
|
887
|
+
{
|
888
|
+
if (size == 0) return 0;
|
889
|
+
|
890
|
+
if (fwrite(dataPtr,size,1,fp) != 1)
|
891
|
+
{ return 0; }
|
892
|
+
|
893
|
+
return size;
|
894
|
+
}
|