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.40 10/19/17 */
|
5
|
+
/* */
|
6
|
+
/* FILE I/O ROUTER MODULE */
|
7
|
+
/*******************************************************/
|
8
|
+
|
9
|
+
/*************************************************************/
|
10
|
+
/* Purpose: I/O Router routines which allow files to be used */
|
11
|
+
/* as input and output sources. */
|
12
|
+
/* */
|
13
|
+
/* Principal Programmer(s): */
|
14
|
+
/* Gary D. Riley */
|
15
|
+
/* */
|
16
|
+
/* Contributing Programmer(s): */
|
17
|
+
/* Brian L. Dantes */
|
18
|
+
/* */
|
19
|
+
/* Revision History: */
|
20
|
+
/* */
|
21
|
+
/* 6.24: Added environment parameter to GenClose. */
|
22
|
+
/* Added environment parameter to GenOpen. */
|
23
|
+
/* */
|
24
|
+
/* Added pragmas to remove compilation warnings. */
|
25
|
+
/* */
|
26
|
+
/* 6.30: Removed conditional code for unsupported */
|
27
|
+
/* compilers/operating systems (IBM_MCW, */
|
28
|
+
/* MAC_MCW, and IBM_TBC). */
|
29
|
+
/* */
|
30
|
+
/* Used gengetc and genungetchar rather than */
|
31
|
+
/* getc and ungetc. */
|
32
|
+
/* */
|
33
|
+
/* Replaced BASIC_IO and ADVANCED_IO compiler */
|
34
|
+
/* flags with the single IO_FUNCTIONS compiler */
|
35
|
+
/* flag. */
|
36
|
+
/* */
|
37
|
+
/* Added const qualifiers to remove C++ */
|
38
|
+
/* deprecation warnings. */
|
39
|
+
/* */
|
40
|
+
/* Added STDOUT and STDIN logical name */
|
41
|
+
/* definitions. */
|
42
|
+
/* */
|
43
|
+
/* 6.31: Output to logical WERROR is now sent to stderr */
|
44
|
+
/* rather than stdout. */
|
45
|
+
/* */
|
46
|
+
/* 6.40: Pragma once and other inclusion changes. */
|
47
|
+
/* */
|
48
|
+
/* Added support for booleans with <stdbool.h>. */
|
49
|
+
/* */
|
50
|
+
/* Changed return values for router functions. */
|
51
|
+
/* */
|
52
|
+
/* Removed use of void pointers for specific */
|
53
|
+
/* data structures. */
|
54
|
+
/* */
|
55
|
+
/* Added flush, rewind, tell, and seek functions. */
|
56
|
+
/* */
|
57
|
+
/*************************************************************/
|
58
|
+
|
59
|
+
#include <stdio.h>
|
60
|
+
#include <string.h>
|
61
|
+
|
62
|
+
#include "setup.h"
|
63
|
+
|
64
|
+
#include "constant.h"
|
65
|
+
#include "envrnmnt.h"
|
66
|
+
#include "memalloc.h"
|
67
|
+
#include "router.h"
|
68
|
+
#include "sysdep.h"
|
69
|
+
|
70
|
+
#include "filertr.h"
|
71
|
+
|
72
|
+
/***************************************/
|
73
|
+
/* LOCAL INTERNAL FUNCTION DEFINITIONS */
|
74
|
+
/***************************************/
|
75
|
+
|
76
|
+
static void ExitFileCallback(Environment *,int,void *);
|
77
|
+
static void WriteFileCallback(Environment *,const char *,const char *,void *);
|
78
|
+
static int ReadFileCallback(Environment *,const char *,void *);
|
79
|
+
static int UnreadFileCallback(Environment *,const char *,int,void *);
|
80
|
+
static void DeallocateFileRouterData(Environment *);
|
81
|
+
|
82
|
+
/***************************************************************/
|
83
|
+
/* InitializeFileRouter: Initializes file input/output router. */
|
84
|
+
/***************************************************************/
|
85
|
+
void InitializeFileRouter(
|
86
|
+
Environment *theEnv)
|
87
|
+
{
|
88
|
+
AllocateEnvironmentData(theEnv,FILE_ROUTER_DATA,sizeof(struct fileRouterData),DeallocateFileRouterData);
|
89
|
+
|
90
|
+
AddRouter(theEnv,"fileio",0,FindFile,
|
91
|
+
WriteFileCallback,ReadFileCallback,
|
92
|
+
UnreadFileCallback,ExitFileCallback,NULL);
|
93
|
+
}
|
94
|
+
|
95
|
+
/*****************************************/
|
96
|
+
/* DeallocateFileRouterData: Deallocates */
|
97
|
+
/* environment data for file routers. */
|
98
|
+
/*****************************************/
|
99
|
+
static void DeallocateFileRouterData(
|
100
|
+
Environment *theEnv)
|
101
|
+
{
|
102
|
+
struct fileRouter *tmpPtr, *nextPtr;
|
103
|
+
|
104
|
+
tmpPtr = FileRouterData(theEnv)->ListOfFileRouters;
|
105
|
+
while (tmpPtr != NULL)
|
106
|
+
{
|
107
|
+
nextPtr = tmpPtr->next;
|
108
|
+
GenClose(theEnv,tmpPtr->stream);
|
109
|
+
rm(theEnv,(void *) tmpPtr->logicalName,strlen(tmpPtr->logicalName) + 1);
|
110
|
+
rtn_struct(theEnv,fileRouter,tmpPtr);
|
111
|
+
tmpPtr = nextPtr;
|
112
|
+
}
|
113
|
+
}
|
114
|
+
|
115
|
+
/*****************************************/
|
116
|
+
/* FindFptr: Returns a pointer to a file */
|
117
|
+
/* stream for a given logical name. */
|
118
|
+
/*****************************************/
|
119
|
+
FILE *FindFptr(
|
120
|
+
Environment *theEnv,
|
121
|
+
const char *logicalName)
|
122
|
+
{
|
123
|
+
struct fileRouter *fptr;
|
124
|
+
|
125
|
+
/*========================================================*/
|
126
|
+
/* Check to see if standard input or output is requested. */
|
127
|
+
/*========================================================*/
|
128
|
+
|
129
|
+
if (strcmp(logicalName,STDOUT) == 0)
|
130
|
+
{ return stdout; }
|
131
|
+
else if (strcmp(logicalName,STDIN) == 0)
|
132
|
+
{ return stdin; }
|
133
|
+
else if (strcmp(logicalName,STDERR) == 0)
|
134
|
+
{ return stderr; }
|
135
|
+
else if (strcmp(logicalName,STDWRN) == 0)
|
136
|
+
{ return stdout; }
|
137
|
+
|
138
|
+
/*==============================================================*/
|
139
|
+
/* Otherwise, look up the logical name on the global file list. */
|
140
|
+
/*==============================================================*/
|
141
|
+
|
142
|
+
fptr = FileRouterData(theEnv)->ListOfFileRouters;
|
143
|
+
while ((fptr != NULL) ? (strcmp(logicalName,fptr->logicalName) != 0) : false)
|
144
|
+
{ fptr = fptr->next; }
|
145
|
+
|
146
|
+
if (fptr != NULL) return fptr->stream;
|
147
|
+
|
148
|
+
return NULL;
|
149
|
+
}
|
150
|
+
|
151
|
+
/*****************************************************/
|
152
|
+
/* FindFile: Find routine for file router logical */
|
153
|
+
/* names. Returns true if the specified logical */
|
154
|
+
/* name has an associated file stream (which means */
|
155
|
+
/* that the logical name can be handled by the */
|
156
|
+
/* file router). Otherwise, false is returned. */
|
157
|
+
/*****************************************************/
|
158
|
+
bool FindFile(
|
159
|
+
Environment *theEnv,
|
160
|
+
const char *logicalName,
|
161
|
+
void *context)
|
162
|
+
{
|
163
|
+
if (FindFptr(theEnv,logicalName) != NULL) return true;
|
164
|
+
|
165
|
+
return false;
|
166
|
+
}
|
167
|
+
|
168
|
+
/***************************************************/
|
169
|
+
/* ExitFileCallback: Exit routine for file router. */
|
170
|
+
/***************************************************/
|
171
|
+
static void ExitFileCallback(
|
172
|
+
Environment *theEnv,
|
173
|
+
int num,
|
174
|
+
void *context)
|
175
|
+
{
|
176
|
+
#if MAC_XCD
|
177
|
+
#pragma unused(num)
|
178
|
+
#endif
|
179
|
+
#if IO_FUNCTIONS
|
180
|
+
CloseAllFiles(theEnv);
|
181
|
+
#else
|
182
|
+
#if MAC_XCD
|
183
|
+
#pragma unused(theEnv)
|
184
|
+
#endif
|
185
|
+
#endif
|
186
|
+
}
|
187
|
+
|
188
|
+
/******************************************************/
|
189
|
+
/* WriteFileCallback: Write callback for file router. */
|
190
|
+
/******************************************************/
|
191
|
+
static void WriteFileCallback(
|
192
|
+
Environment *theEnv,
|
193
|
+
const char *logicalName,
|
194
|
+
const char *str,
|
195
|
+
void *context)
|
196
|
+
{
|
197
|
+
FILE *fptr;
|
198
|
+
|
199
|
+
fptr = FindFptr(theEnv,logicalName);
|
200
|
+
|
201
|
+
genprintfile(theEnv,fptr,str);
|
202
|
+
}
|
203
|
+
|
204
|
+
/****************************************************/
|
205
|
+
/* ReadFileCallback: Read callback for file router. */
|
206
|
+
/****************************************************/
|
207
|
+
static int ReadFileCallback(
|
208
|
+
Environment *theEnv,
|
209
|
+
const char *logicalName,
|
210
|
+
void *context)
|
211
|
+
{
|
212
|
+
FILE *fptr;
|
213
|
+
int theChar;
|
214
|
+
|
215
|
+
fptr = FindFptr(theEnv,logicalName);
|
216
|
+
|
217
|
+
if (fptr == stdin)
|
218
|
+
{ theChar = gengetchar(theEnv); }
|
219
|
+
else
|
220
|
+
{ theChar = getc(fptr); }
|
221
|
+
|
222
|
+
/*=================================================*/
|
223
|
+
/* The following code prevents Control-D on UNIX */
|
224
|
+
/* machines from terminating all input from stdin. */
|
225
|
+
/*=================================================*/
|
226
|
+
|
227
|
+
if ((fptr == stdin) && (theChar == EOF)) clearerr(stdin);
|
228
|
+
|
229
|
+
return theChar;
|
230
|
+
}
|
231
|
+
|
232
|
+
/********************************************************/
|
233
|
+
/* UnreadFileCallback: Unread callback for file router. */
|
234
|
+
/********************************************************/
|
235
|
+
static int UnreadFileCallback(
|
236
|
+
Environment *theEnv,
|
237
|
+
const char *logicalName,
|
238
|
+
int ch,
|
239
|
+
void *context)
|
240
|
+
{
|
241
|
+
FILE *fptr;
|
242
|
+
|
243
|
+
fptr = FindFptr(theEnv,logicalName);
|
244
|
+
|
245
|
+
if (fptr == stdin)
|
246
|
+
{ return genungetchar(theEnv,ch); }
|
247
|
+
else
|
248
|
+
{ return ungetc(ch,fptr); }
|
249
|
+
}
|
250
|
+
|
251
|
+
/*********************************************************/
|
252
|
+
/* OpenFile: Opens a file with the specified access mode */
|
253
|
+
/* and stores the opened stream on the list of files */
|
254
|
+
/* associated with logical names Returns true if the */
|
255
|
+
/* file was succesfully opened, otherwise false. */
|
256
|
+
/*********************************************************/
|
257
|
+
bool OpenAFile(
|
258
|
+
Environment *theEnv,
|
259
|
+
const char *fileName,
|
260
|
+
const char *accessMode,
|
261
|
+
const char *logicalName)
|
262
|
+
{
|
263
|
+
FILE *newstream;
|
264
|
+
struct fileRouter *newRouter;
|
265
|
+
char *theName;
|
266
|
+
|
267
|
+
/*==================================*/
|
268
|
+
/* Make sure the file can be opened */
|
269
|
+
/* with the specified access mode. */
|
270
|
+
/*==================================*/
|
271
|
+
|
272
|
+
if ((newstream = GenOpen(theEnv,fileName,accessMode)) == NULL)
|
273
|
+
{ return false; }
|
274
|
+
|
275
|
+
/*===========================*/
|
276
|
+
/* Create a new file router. */
|
277
|
+
/*===========================*/
|
278
|
+
|
279
|
+
newRouter = get_struct(theEnv,fileRouter);
|
280
|
+
theName = (char *) gm2(theEnv,strlen(logicalName) + 1);
|
281
|
+
genstrcpy(theName,logicalName);
|
282
|
+
newRouter->logicalName = theName;
|
283
|
+
newRouter->stream = newstream;
|
284
|
+
|
285
|
+
/*==========================================*/
|
286
|
+
/* Add the newly opened file to the list of */
|
287
|
+
/* files associated with logical names. */
|
288
|
+
/*==========================================*/
|
289
|
+
|
290
|
+
newRouter->next = FileRouterData(theEnv)->ListOfFileRouters;
|
291
|
+
FileRouterData(theEnv)->ListOfFileRouters = newRouter;
|
292
|
+
|
293
|
+
/*==================================*/
|
294
|
+
/* Return true to indicate the file */
|
295
|
+
/* was opened successfully. */
|
296
|
+
/*==================================*/
|
297
|
+
|
298
|
+
return true;
|
299
|
+
}
|
300
|
+
|
301
|
+
/*************************************************************/
|
302
|
+
/* CloseFile: Closes the file associated with the specified */
|
303
|
+
/* logical name. Returns true if the file was successfully */
|
304
|
+
/* closed, otherwise false. */
|
305
|
+
/*************************************************************/
|
306
|
+
bool CloseFile(
|
307
|
+
Environment *theEnv,
|
308
|
+
const char *fid)
|
309
|
+
{
|
310
|
+
struct fileRouter *fptr, *prev;
|
311
|
+
|
312
|
+
for (fptr = FileRouterData(theEnv)->ListOfFileRouters, prev = NULL;
|
313
|
+
fptr != NULL;
|
314
|
+
fptr = fptr->next)
|
315
|
+
{
|
316
|
+
if (strcmp(fptr->logicalName,fid) == 0)
|
317
|
+
{
|
318
|
+
GenClose(theEnv,fptr->stream);
|
319
|
+
rm(theEnv,(void *) fptr->logicalName,strlen(fptr->logicalName) + 1);
|
320
|
+
if (prev == NULL)
|
321
|
+
{ FileRouterData(theEnv)->ListOfFileRouters = fptr->next; }
|
322
|
+
else
|
323
|
+
{ prev->next = fptr->next; }
|
324
|
+
rm(theEnv,fptr,sizeof(struct fileRouter));
|
325
|
+
|
326
|
+
return true;
|
327
|
+
}
|
328
|
+
|
329
|
+
prev = fptr;
|
330
|
+
}
|
331
|
+
|
332
|
+
return false;
|
333
|
+
}
|
334
|
+
|
335
|
+
/**********************************************/
|
336
|
+
/* CloseAllFiles: Closes all files associated */
|
337
|
+
/* with a file I/O router. Returns true if */
|
338
|
+
/* any file was closed, otherwise false. */
|
339
|
+
/**********************************************/
|
340
|
+
bool CloseAllFiles(
|
341
|
+
Environment *theEnv)
|
342
|
+
{
|
343
|
+
struct fileRouter *fptr, *prev;
|
344
|
+
|
345
|
+
if (FileRouterData(theEnv)->ListOfFileRouters == NULL) return false;
|
346
|
+
|
347
|
+
fptr = FileRouterData(theEnv)->ListOfFileRouters;
|
348
|
+
|
349
|
+
while (fptr != NULL)
|
350
|
+
{
|
351
|
+
GenClose(theEnv,fptr->stream);
|
352
|
+
prev = fptr;
|
353
|
+
rm(theEnv,(void *) fptr->logicalName,strlen(fptr->logicalName) + 1);
|
354
|
+
fptr = fptr->next;
|
355
|
+
rm(theEnv,prev,sizeof(struct fileRouter));
|
356
|
+
}
|
357
|
+
|
358
|
+
FileRouterData(theEnv)->ListOfFileRouters = NULL;
|
359
|
+
|
360
|
+
return true;
|
361
|
+
}
|
362
|
+
|
363
|
+
/*************************************************************/
|
364
|
+
/* FlushFile: Flushes the file associated with the specified */
|
365
|
+
/* logical name. Returns true if the file was successfully */
|
366
|
+
/* flushed, otherwise false. */
|
367
|
+
/*************************************************************/
|
368
|
+
bool FlushFile(
|
369
|
+
Environment *theEnv,
|
370
|
+
const char *fid)
|
371
|
+
{
|
372
|
+
struct fileRouter *fptr;
|
373
|
+
|
374
|
+
for (fptr = FileRouterData(theEnv)->ListOfFileRouters;
|
375
|
+
fptr != NULL;
|
376
|
+
fptr = fptr->next)
|
377
|
+
{
|
378
|
+
if (strcmp(fptr->logicalName,fid) == 0)
|
379
|
+
{
|
380
|
+
GenFlush(theEnv,fptr->stream);
|
381
|
+
return true;
|
382
|
+
}
|
383
|
+
}
|
384
|
+
|
385
|
+
return false;
|
386
|
+
}
|
387
|
+
|
388
|
+
/***********************************************/
|
389
|
+
/* FlushAllFiles: Flushes all files associated */
|
390
|
+
/* with a file I/O router. Returns true if */
|
391
|
+
/* any file was flushed, otherwise false. */
|
392
|
+
/***********************************************/
|
393
|
+
bool FlushAllFiles(
|
394
|
+
Environment *theEnv)
|
395
|
+
{
|
396
|
+
struct fileRouter *fptr;
|
397
|
+
|
398
|
+
if (FileRouterData(theEnv)->ListOfFileRouters == NULL) return false;
|
399
|
+
|
400
|
+
for (fptr = FileRouterData(theEnv)->ListOfFileRouters;
|
401
|
+
fptr != NULL;
|
402
|
+
fptr = fptr->next)
|
403
|
+
{ GenFlush(theEnv,fptr->stream); }
|
404
|
+
|
405
|
+
return true;
|
406
|
+
}
|
407
|
+
|
408
|
+
/*****************************************************/
|
409
|
+
/* RewindFile: Rewinds the file associated with the */
|
410
|
+
/* specified logical name. Returns true if the */
|
411
|
+
/* file was successfully rewound, otherwise false. */
|
412
|
+
/*****************************************************/
|
413
|
+
bool RewindFile(
|
414
|
+
Environment *theEnv,
|
415
|
+
const char *fid)
|
416
|
+
{
|
417
|
+
struct fileRouter *fptr;
|
418
|
+
|
419
|
+
for (fptr = FileRouterData(theEnv)->ListOfFileRouters;
|
420
|
+
fptr != NULL;
|
421
|
+
fptr = fptr->next)
|
422
|
+
{
|
423
|
+
if (strcmp(fptr->logicalName,fid) == 0)
|
424
|
+
{
|
425
|
+
GenRewind(theEnv,fptr->stream);
|
426
|
+
return true;
|
427
|
+
}
|
428
|
+
}
|
429
|
+
|
430
|
+
return false;
|
431
|
+
}
|
432
|
+
|
433
|
+
/**************************************************/
|
434
|
+
/* TellFile: Returns the file position associated */
|
435
|
+
/* with the specified logical name. */
|
436
|
+
/**************************************************/
|
437
|
+
long long TellFile(
|
438
|
+
Environment *theEnv,
|
439
|
+
const char *fid)
|
440
|
+
{
|
441
|
+
struct fileRouter *fptr;
|
442
|
+
|
443
|
+
for (fptr = FileRouterData(theEnv)->ListOfFileRouters;
|
444
|
+
fptr != NULL;
|
445
|
+
fptr = fptr->next)
|
446
|
+
{
|
447
|
+
if (strcmp(fptr->logicalName,fid) == 0)
|
448
|
+
{ return GenTell(theEnv,fptr->stream); }
|
449
|
+
}
|
450
|
+
|
451
|
+
return LLONG_MIN;
|
452
|
+
}
|
453
|
+
|
454
|
+
/***********************************************/
|
455
|
+
/* SeekFile: Sets the file position associated */
|
456
|
+
/* with the specified logical name. */
|
457
|
+
/***********************************************/
|
458
|
+
bool SeekFile(
|
459
|
+
Environment *theEnv,
|
460
|
+
const char *fid,
|
461
|
+
long offset,
|
462
|
+
int whereFrom)
|
463
|
+
{
|
464
|
+
struct fileRouter *fptr;
|
465
|
+
|
466
|
+
for (fptr = FileRouterData(theEnv)->ListOfFileRouters;
|
467
|
+
fptr != NULL;
|
468
|
+
fptr = fptr->next)
|
469
|
+
{
|
470
|
+
if (strcmp(fptr->logicalName,fid) == 0)
|
471
|
+
{
|
472
|
+
if (GenSeek(theEnv,fptr->stream,offset,whereFrom))
|
473
|
+
{ return false; }
|
474
|
+
else
|
475
|
+
{ return true; }
|
476
|
+
}
|
477
|
+
}
|
478
|
+
|
479
|
+
return false;
|
480
|
+
}
|
481
|
+
|
@@ -0,0 +1,94 @@
|
|
1
|
+
/*******************************************************/
|
2
|
+
/* "C" Language Integrated Production System */
|
3
|
+
/* */
|
4
|
+
/* CLIPS Version 6.40 10/19/17 */
|
5
|
+
/* */
|
6
|
+
/* FILE I/O ROUTER HEADER FILE */
|
7
|
+
/*******************************************************/
|
8
|
+
|
9
|
+
/*************************************************************/
|
10
|
+
/* Purpose: I/O Router routines which allow files to be used */
|
11
|
+
/* as input and output sources. */
|
12
|
+
/* */
|
13
|
+
/* Principal Programmer(s): */
|
14
|
+
/* Gary D. Riley */
|
15
|
+
/* */
|
16
|
+
/* Contributing Programmer(s): */
|
17
|
+
/* */
|
18
|
+
/* Revision History: */
|
19
|
+
/* */
|
20
|
+
/* 6.24: Added environment parameter to GenClose. */
|
21
|
+
/* Added environment parameter to GenOpen. */
|
22
|
+
/* */
|
23
|
+
/* Added pragmas to remove compilation warnings. */
|
24
|
+
/* */
|
25
|
+
/* 6.30: Removed conditional code for unsupported */
|
26
|
+
/* compilers/operating systems (IBM_MCW, */
|
27
|
+
/* MAC_MCW, and IBM_TBC). */
|
28
|
+
/* */
|
29
|
+
/* Used gengetc and genungetchar rather than */
|
30
|
+
/* getc and ungetc. */
|
31
|
+
/* */
|
32
|
+
/* Replaced BASIC_IO and ADVANCED_IO compiler */
|
33
|
+
/* flags with the single IO_FUNCTIONS compiler */
|
34
|
+
/* flag. */
|
35
|
+
/* */
|
36
|
+
/* Added const qualifiers to remove C++ */
|
37
|
+
/* deprecation warnings. */
|
38
|
+
/* */
|
39
|
+
/* 6.40: Removed LOCALE definition. */
|
40
|
+
/* */
|
41
|
+
/* Pragma once and other inclusion changes. */
|
42
|
+
/* */
|
43
|
+
/* Added support for booleans with <stdbool.h>. */
|
44
|
+
/* */
|
45
|
+
/* Removed use of void pointers for specific */
|
46
|
+
/* data structures. */
|
47
|
+
/* */
|
48
|
+
/* Added flush, rewind, tell, and seek functions. */
|
49
|
+
/* */
|
50
|
+
/*************************************************************/
|
51
|
+
|
52
|
+
#ifndef _H_filertr
|
53
|
+
|
54
|
+
#pragma once
|
55
|
+
|
56
|
+
#define _H_filertr
|
57
|
+
|
58
|
+
#include <stdio.h>
|
59
|
+
|
60
|
+
#define FILE_ROUTER_DATA 47
|
61
|
+
|
62
|
+
struct fileRouter
|
63
|
+
{
|
64
|
+
const char *logicalName;
|
65
|
+
FILE *stream;
|
66
|
+
struct fileRouter *next;
|
67
|
+
};
|
68
|
+
|
69
|
+
struct fileRouterData
|
70
|
+
{
|
71
|
+
struct fileRouter *ListOfFileRouters;
|
72
|
+
};
|
73
|
+
|
74
|
+
#define FileRouterData(theEnv) ((struct fileRouterData *) GetEnvironmentData(theEnv,FILE_ROUTER_DATA))
|
75
|
+
|
76
|
+
void InitializeFileRouter(Environment *);
|
77
|
+
FILE *FindFptr(Environment *,const char *);
|
78
|
+
bool OpenAFile(Environment *,const char *,const char *,const char *);
|
79
|
+
bool CloseAllFiles(Environment *);
|
80
|
+
bool CloseFile(Environment *,const char *);
|
81
|
+
bool FindFile(Environment *,const char *,void *);
|
82
|
+
bool FlushAllFiles(Environment *);
|
83
|
+
bool FlushFile(Environment *,const char *);
|
84
|
+
bool RewindFile(Environment *,const char *);
|
85
|
+
long long TellFile(Environment *,const char *);
|
86
|
+
bool SeekFile(Environment *,const char *,long,int);
|
87
|
+
|
88
|
+
#endif /* _H_filertr */
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
|