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.
Files changed (346) hide show
  1. checksums.yaml +7 -0
  2. data/ext/clipsruby/agenda.c +1373 -0
  3. data/ext/clipsruby/agenda.h +169 -0
  4. data/ext/clipsruby/analysis.c +1142 -0
  5. data/ext/clipsruby/analysis.h +61 -0
  6. data/ext/clipsruby/argacces.c +526 -0
  7. data/ext/clipsruby/argacces.h +77 -0
  8. data/ext/clipsruby/bload.c +884 -0
  9. data/ext/clipsruby/bload.h +94 -0
  10. data/ext/clipsruby/bmathfun.c +557 -0
  11. data/ext/clipsruby/bmathfun.h +66 -0
  12. data/ext/clipsruby/bsave.c +634 -0
  13. data/ext/clipsruby/bsave.h +130 -0
  14. data/ext/clipsruby/classcom.c +976 -0
  15. data/ext/clipsruby/classcom.h +115 -0
  16. data/ext/clipsruby/classexm.c +1376 -0
  17. data/ext/clipsruby/classexm.h +97 -0
  18. data/ext/clipsruby/classfun.c +1392 -0
  19. data/ext/clipsruby/classfun.h +164 -0
  20. data/ext/clipsruby/classinf.c +1245 -0
  21. data/ext/clipsruby/classinf.h +94 -0
  22. data/ext/clipsruby/classini.c +843 -0
  23. data/ext/clipsruby/classini.h +75 -0
  24. data/ext/clipsruby/classpsr.c +957 -0
  25. data/ext/clipsruby/classpsr.h +73 -0
  26. data/ext/clipsruby/clips.h +133 -0
  27. data/ext/clipsruby/clipsruby.c +619 -0
  28. data/ext/clipsruby/clsltpsr.c +931 -0
  29. data/ext/clipsruby/clsltpsr.h +72 -0
  30. data/ext/clipsruby/commline.c +1217 -0
  31. data/ext/clipsruby/commline.h +131 -0
  32. data/ext/clipsruby/conscomp.c +1593 -0
  33. data/ext/clipsruby/conscomp.h +150 -0
  34. data/ext/clipsruby/constant.h +264 -0
  35. data/ext/clipsruby/constrct.c +1090 -0
  36. data/ext/clipsruby/constrct.h +216 -0
  37. data/ext/clipsruby/constrnt.c +554 -0
  38. data/ext/clipsruby/constrnt.h +132 -0
  39. data/ext/clipsruby/crstrtgy.c +1088 -0
  40. data/ext/clipsruby/crstrtgy.h +85 -0
  41. data/ext/clipsruby/cstrcbin.c +185 -0
  42. data/ext/clipsruby/cstrcbin.h +61 -0
  43. data/ext/clipsruby/cstrccmp.h +43 -0
  44. data/ext/clipsruby/cstrccom.c +1791 -0
  45. data/ext/clipsruby/cstrccom.h +115 -0
  46. data/ext/clipsruby/cstrcpsr.c +835 -0
  47. data/ext/clipsruby/cstrcpsr.h +97 -0
  48. data/ext/clipsruby/cstrnbin.c +282 -0
  49. data/ext/clipsruby/cstrnbin.h +55 -0
  50. data/ext/clipsruby/cstrnchk.c +826 -0
  51. data/ext/clipsruby/cstrnchk.h +91 -0
  52. data/ext/clipsruby/cstrncmp.c +238 -0
  53. data/ext/clipsruby/cstrncmp.h +57 -0
  54. data/ext/clipsruby/cstrnops.c +1176 -0
  55. data/ext/clipsruby/cstrnops.h +47 -0
  56. data/ext/clipsruby/cstrnpsr.c +1394 -0
  57. data/ext/clipsruby/cstrnpsr.h +88 -0
  58. data/ext/clipsruby/cstrnutl.c +564 -0
  59. data/ext/clipsruby/cstrnutl.h +54 -0
  60. data/ext/clipsruby/default.c +454 -0
  61. data/ext/clipsruby/default.h +57 -0
  62. data/ext/clipsruby/defins.c +971 -0
  63. data/ext/clipsruby/defins.h +127 -0
  64. data/ext/clipsruby/developr.c +677 -0
  65. data/ext/clipsruby/developr.h +69 -0
  66. data/ext/clipsruby/dffctbin.c +477 -0
  67. data/ext/clipsruby/dffctbin.h +76 -0
  68. data/ext/clipsruby/dffctbsc.c +308 -0
  69. data/ext/clipsruby/dffctbsc.h +72 -0
  70. data/ext/clipsruby/dffctcmp.c +297 -0
  71. data/ext/clipsruby/dffctcmp.h +44 -0
  72. data/ext/clipsruby/dffctdef.c +364 -0
  73. data/ext/clipsruby/dffctdef.h +104 -0
  74. data/ext/clipsruby/dffctpsr.c +179 -0
  75. data/ext/clipsruby/dffctpsr.h +49 -0
  76. data/ext/clipsruby/dffnxbin.c +520 -0
  77. data/ext/clipsruby/dffnxbin.h +67 -0
  78. data/ext/clipsruby/dffnxcmp.c +378 -0
  79. data/ext/clipsruby/dffnxcmp.h +54 -0
  80. data/ext/clipsruby/dffnxexe.c +241 -0
  81. data/ext/clipsruby/dffnxexe.h +58 -0
  82. data/ext/clipsruby/dffnxfun.c +1192 -0
  83. data/ext/clipsruby/dffnxfun.h +155 -0
  84. data/ext/clipsruby/dffnxpsr.c +514 -0
  85. data/ext/clipsruby/dffnxpsr.h +57 -0
  86. data/ext/clipsruby/dfinsbin.c +509 -0
  87. data/ext/clipsruby/dfinsbin.h +66 -0
  88. data/ext/clipsruby/dfinscmp.c +345 -0
  89. data/ext/clipsruby/dfinscmp.h +48 -0
  90. data/ext/clipsruby/drive.c +1191 -0
  91. data/ext/clipsruby/drive.h +65 -0
  92. data/ext/clipsruby/emathfun.c +1213 -0
  93. data/ext/clipsruby/emathfun.h +99 -0
  94. data/ext/clipsruby/engine.c +1568 -0
  95. data/ext/clipsruby/engine.h +203 -0
  96. data/ext/clipsruby/entities.h +276 -0
  97. data/ext/clipsruby/envrnbld.c +514 -0
  98. data/ext/clipsruby/envrnbld.h +40 -0
  99. data/ext/clipsruby/envrnmnt.c +257 -0
  100. data/ext/clipsruby/envrnmnt.h +112 -0
  101. data/ext/clipsruby/evaluatn.c +1736 -0
  102. data/ext/clipsruby/evaluatn.h +211 -0
  103. data/ext/clipsruby/expressn.c +494 -0
  104. data/ext/clipsruby/expressn.h +154 -0
  105. data/ext/clipsruby/exprnbin.c +538 -0
  106. data/ext/clipsruby/exprnbin.h +60 -0
  107. data/ext/clipsruby/exprnops.c +564 -0
  108. data/ext/clipsruby/exprnops.h +67 -0
  109. data/ext/clipsruby/exprnpsr.c +1112 -0
  110. data/ext/clipsruby/exprnpsr.h +98 -0
  111. data/ext/clipsruby/extconf.rb +2 -0
  112. data/ext/clipsruby/extnfunc.c +1015 -0
  113. data/ext/clipsruby/extnfunc.h +157 -0
  114. data/ext/clipsruby/factbin.c +447 -0
  115. data/ext/clipsruby/factbin.h +56 -0
  116. data/ext/clipsruby/factbld.c +1035 -0
  117. data/ext/clipsruby/factbld.h +63 -0
  118. data/ext/clipsruby/factcmp.c +386 -0
  119. data/ext/clipsruby/factcmp.h +46 -0
  120. data/ext/clipsruby/factcom.c +759 -0
  121. data/ext/clipsruby/factcom.h +80 -0
  122. data/ext/clipsruby/factfile.c +1761 -0
  123. data/ext/clipsruby/factfile.h +54 -0
  124. data/ext/clipsruby/factfun.c +682 -0
  125. data/ext/clipsruby/factfun.h +77 -0
  126. data/ext/clipsruby/factgen.c +1305 -0
  127. data/ext/clipsruby/factgen.h +229 -0
  128. data/ext/clipsruby/facthsh.c +438 -0
  129. data/ext/clipsruby/facthsh.h +81 -0
  130. data/ext/clipsruby/factlhs.c +250 -0
  131. data/ext/clipsruby/factlhs.h +54 -0
  132. data/ext/clipsruby/factmch.c +905 -0
  133. data/ext/clipsruby/factmch.h +68 -0
  134. data/ext/clipsruby/factmngr.c +3373 -0
  135. data/ext/clipsruby/factmngr.h +325 -0
  136. data/ext/clipsruby/factprt.c +498 -0
  137. data/ext/clipsruby/factprt.h +60 -0
  138. data/ext/clipsruby/factqpsr.c +796 -0
  139. data/ext/clipsruby/factqpsr.h +61 -0
  140. data/ext/clipsruby/factqury.c +1267 -0
  141. data/ext/clipsruby/factqury.h +112 -0
  142. data/ext/clipsruby/factrete.c +978 -0
  143. data/ext/clipsruby/factrete.h +70 -0
  144. data/ext/clipsruby/factrhs.c +667 -0
  145. data/ext/clipsruby/factrhs.h +55 -0
  146. data/ext/clipsruby/filecom.c +353 -0
  147. data/ext/clipsruby/filecom.h +137 -0
  148. data/ext/clipsruby/filertr.c +481 -0
  149. data/ext/clipsruby/filertr.h +94 -0
  150. data/ext/clipsruby/fileutil.c +1020 -0
  151. data/ext/clipsruby/fileutil.h +50 -0
  152. data/ext/clipsruby/generate.c +1079 -0
  153. data/ext/clipsruby/generate.h +57 -0
  154. data/ext/clipsruby/genrcbin.c +902 -0
  155. data/ext/clipsruby/genrcbin.h +69 -0
  156. data/ext/clipsruby/genrccmp.c +640 -0
  157. data/ext/clipsruby/genrccmp.h +59 -0
  158. data/ext/clipsruby/genrccom.c +2017 -0
  159. data/ext/clipsruby/genrccom.h +119 -0
  160. data/ext/clipsruby/genrcexe.c +737 -0
  161. data/ext/clipsruby/genrcexe.h +73 -0
  162. data/ext/clipsruby/genrcfun.c +890 -0
  163. data/ext/clipsruby/genrcfun.h +185 -0
  164. data/ext/clipsruby/genrcpsr.c +1618 -0
  165. data/ext/clipsruby/genrcpsr.h +80 -0
  166. data/ext/clipsruby/globlbin.c +458 -0
  167. data/ext/clipsruby/globlbin.h +71 -0
  168. data/ext/clipsruby/globlbsc.c +361 -0
  169. data/ext/clipsruby/globlbsc.h +83 -0
  170. data/ext/clipsruby/globlcmp.c +330 -0
  171. data/ext/clipsruby/globlcmp.h +52 -0
  172. data/ext/clipsruby/globlcom.c +289 -0
  173. data/ext/clipsruby/globlcom.h +63 -0
  174. data/ext/clipsruby/globldef.c +1087 -0
  175. data/ext/clipsruby/globldef.h +151 -0
  176. data/ext/clipsruby/globlpsr.c +530 -0
  177. data/ext/clipsruby/globlpsr.h +59 -0
  178. data/ext/clipsruby/immthpsr.c +431 -0
  179. data/ext/clipsruby/immthpsr.h +55 -0
  180. data/ext/clipsruby/incrrset.c +530 -0
  181. data/ext/clipsruby/incrrset.h +73 -0
  182. data/ext/clipsruby/inherpsr.c +850 -0
  183. data/ext/clipsruby/inherpsr.h +52 -0
  184. data/ext/clipsruby/inscom.c +2076 -0
  185. data/ext/clipsruby/inscom.h +182 -0
  186. data/ext/clipsruby/insfile.c +1764 -0
  187. data/ext/clipsruby/insfile.h +96 -0
  188. data/ext/clipsruby/insfun.c +1451 -0
  189. data/ext/clipsruby/insfun.h +134 -0
  190. data/ext/clipsruby/insmngr.c +2550 -0
  191. data/ext/clipsruby/insmngr.h +125 -0
  192. data/ext/clipsruby/insmoddp.c +1041 -0
  193. data/ext/clipsruby/insmoddp.h +91 -0
  194. data/ext/clipsruby/insmult.c +804 -0
  195. data/ext/clipsruby/insmult.h +62 -0
  196. data/ext/clipsruby/inspsr.c +602 -0
  197. data/ext/clipsruby/inspsr.h +60 -0
  198. data/ext/clipsruby/insquery.c +1278 -0
  199. data/ext/clipsruby/insquery.h +115 -0
  200. data/ext/clipsruby/insqypsr.c +729 -0
  201. data/ext/clipsruby/insqypsr.h +63 -0
  202. data/ext/clipsruby/iofun.c +2045 -0
  203. data/ext/clipsruby/iofun.h +116 -0
  204. data/ext/clipsruby/lgcldpnd.c +644 -0
  205. data/ext/clipsruby/lgcldpnd.h +75 -0
  206. data/ext/clipsruby/main.c +112 -0
  207. data/ext/clipsruby/match.h +142 -0
  208. data/ext/clipsruby/memalloc.c +481 -0
  209. data/ext/clipsruby/memalloc.h +197 -0
  210. data/ext/clipsruby/miscfun.c +1801 -0
  211. data/ext/clipsruby/miscfun.h +132 -0
  212. data/ext/clipsruby/modulbin.c +607 -0
  213. data/ext/clipsruby/modulbin.h +84 -0
  214. data/ext/clipsruby/modulbsc.c +347 -0
  215. data/ext/clipsruby/modulbsc.h +67 -0
  216. data/ext/clipsruby/modulcmp.c +499 -0
  217. data/ext/clipsruby/modulcmp.h +54 -0
  218. data/ext/clipsruby/moduldef.c +817 -0
  219. data/ext/clipsruby/moduldef.h +271 -0
  220. data/ext/clipsruby/modulpsr.c +1150 -0
  221. data/ext/clipsruby/modulpsr.h +69 -0
  222. data/ext/clipsruby/modulutl.c +1036 -0
  223. data/ext/clipsruby/modulutl.h +84 -0
  224. data/ext/clipsruby/msgcom.c +1221 -0
  225. data/ext/clipsruby/msgcom.h +125 -0
  226. data/ext/clipsruby/msgfun.c +1076 -0
  227. data/ext/clipsruby/msgfun.h +118 -0
  228. data/ext/clipsruby/msgpass.c +1441 -0
  229. data/ext/clipsruby/msgpass.h +103 -0
  230. data/ext/clipsruby/msgpsr.c +698 -0
  231. data/ext/clipsruby/msgpsr.h +73 -0
  232. data/ext/clipsruby/multifld.c +1404 -0
  233. data/ext/clipsruby/multifld.h +130 -0
  234. data/ext/clipsruby/multifun.c +2182 -0
  235. data/ext/clipsruby/multifun.h +102 -0
  236. data/ext/clipsruby/network.h +142 -0
  237. data/ext/clipsruby/objbin.c +1522 -0
  238. data/ext/clipsruby/objbin.h +79 -0
  239. data/ext/clipsruby/objcmp.c +1507 -0
  240. data/ext/clipsruby/objcmp.h +71 -0
  241. data/ext/clipsruby/object.h +260 -0
  242. data/ext/clipsruby/objrtbin.c +701 -0
  243. data/ext/clipsruby/objrtbin.h +79 -0
  244. data/ext/clipsruby/objrtbld.c +2393 -0
  245. data/ext/clipsruby/objrtbld.h +66 -0
  246. data/ext/clipsruby/objrtcmp.c +734 -0
  247. data/ext/clipsruby/objrtcmp.h +66 -0
  248. data/ext/clipsruby/objrtfnx.c +1330 -0
  249. data/ext/clipsruby/objrtfnx.h +222 -0
  250. data/ext/clipsruby/objrtgen.c +736 -0
  251. data/ext/clipsruby/objrtgen.h +63 -0
  252. data/ext/clipsruby/objrtmch.c +1524 -0
  253. data/ext/clipsruby/objrtmch.h +160 -0
  254. data/ext/clipsruby/parsefun.c +415 -0
  255. data/ext/clipsruby/parsefun.h +67 -0
  256. data/ext/clipsruby/pattern.c +1265 -0
  257. data/ext/clipsruby/pattern.h +163 -0
  258. data/ext/clipsruby/pprint.c +328 -0
  259. data/ext/clipsruby/pprint.h +79 -0
  260. data/ext/clipsruby/prccode.c +1478 -0
  261. data/ext/clipsruby/prccode.h +145 -0
  262. data/ext/clipsruby/prcdrfun.c +640 -0
  263. data/ext/clipsruby/prcdrfun.h +95 -0
  264. data/ext/clipsruby/prcdrpsr.c +1068 -0
  265. data/ext/clipsruby/prcdrpsr.h +79 -0
  266. data/ext/clipsruby/prdctfun.c +869 -0
  267. data/ext/clipsruby/prdctfun.h +77 -0
  268. data/ext/clipsruby/prntutil.c +878 -0
  269. data/ext/clipsruby/prntutil.h +125 -0
  270. data/ext/clipsruby/proflfun.c +827 -0
  271. data/ext/clipsruby/proflfun.h +118 -0
  272. data/ext/clipsruby/reorder.c +2082 -0
  273. data/ext/clipsruby/reorder.h +172 -0
  274. data/ext/clipsruby/reteutil.c +1732 -0
  275. data/ext/clipsruby/reteutil.h +111 -0
  276. data/ext/clipsruby/retract.c +710 -0
  277. data/ext/clipsruby/retract.h +74 -0
  278. data/ext/clipsruby/router.c +737 -0
  279. data/ext/clipsruby/router.h +147 -0
  280. data/ext/clipsruby/rulebin.c +1136 -0
  281. data/ext/clipsruby/rulebin.h +153 -0
  282. data/ext/clipsruby/rulebld.c +1328 -0
  283. data/ext/clipsruby/rulebld.h +62 -0
  284. data/ext/clipsruby/rulebsc.c +517 -0
  285. data/ext/clipsruby/rulebsc.h +91 -0
  286. data/ext/clipsruby/rulecmp.c +733 -0
  287. data/ext/clipsruby/rulecmp.h +63 -0
  288. data/ext/clipsruby/rulecom.c +1583 -0
  289. data/ext/clipsruby/rulecom.h +116 -0
  290. data/ext/clipsruby/rulecstr.c +892 -0
  291. data/ext/clipsruby/rulecstr.h +53 -0
  292. data/ext/clipsruby/ruledef.c +559 -0
  293. data/ext/clipsruby/ruledef.h +179 -0
  294. data/ext/clipsruby/ruledlt.c +599 -0
  295. data/ext/clipsruby/ruledlt.h +58 -0
  296. data/ext/clipsruby/rulelhs.c +1216 -0
  297. data/ext/clipsruby/rulelhs.h +52 -0
  298. data/ext/clipsruby/rulepsr.c +1073 -0
  299. data/ext/clipsruby/rulepsr.h +61 -0
  300. data/ext/clipsruby/scanner.c +856 -0
  301. data/ext/clipsruby/scanner.h +112 -0
  302. data/ext/clipsruby/setup.h +488 -0
  303. data/ext/clipsruby/sortfun.c +433 -0
  304. data/ext/clipsruby/sortfun.h +55 -0
  305. data/ext/clipsruby/strngfun.c +1173 -0
  306. data/ext/clipsruby/strngfun.h +96 -0
  307. data/ext/clipsruby/strngrtr.c +523 -0
  308. data/ext/clipsruby/strngrtr.h +97 -0
  309. data/ext/clipsruby/symblbin.c +648 -0
  310. data/ext/clipsruby/symblbin.h +64 -0
  311. data/ext/clipsruby/symblcmp.c +893 -0
  312. data/ext/clipsruby/symblcmp.h +61 -0
  313. data/ext/clipsruby/symbol.c +1961 -0
  314. data/ext/clipsruby/symbol.h +243 -0
  315. data/ext/clipsruby/sysdep.c +894 -0
  316. data/ext/clipsruby/sysdep.h +164 -0
  317. data/ext/clipsruby/textpro.c +1388 -0
  318. data/ext/clipsruby/textpro.h +77 -0
  319. data/ext/clipsruby/tmpltbin.c +609 -0
  320. data/ext/clipsruby/tmpltbin.h +108 -0
  321. data/ext/clipsruby/tmpltbsc.c +327 -0
  322. data/ext/clipsruby/tmpltbsc.h +87 -0
  323. data/ext/clipsruby/tmpltcmp.c +450 -0
  324. data/ext/clipsruby/tmpltcmp.h +57 -0
  325. data/ext/clipsruby/tmpltdef.c +584 -0
  326. data/ext/clipsruby/tmpltdef.h +155 -0
  327. data/ext/clipsruby/tmpltfun.c +2477 -0
  328. data/ext/clipsruby/tmpltfun.h +122 -0
  329. data/ext/clipsruby/tmpltlhs.c +379 -0
  330. data/ext/clipsruby/tmpltlhs.h +50 -0
  331. data/ext/clipsruby/tmpltpsr.c +819 -0
  332. data/ext/clipsruby/tmpltpsr.h +59 -0
  333. data/ext/clipsruby/tmpltrhs.c +595 -0
  334. data/ext/clipsruby/tmpltrhs.h +55 -0
  335. data/ext/clipsruby/tmpltutl.c +637 -0
  336. data/ext/clipsruby/tmpltutl.h +82 -0
  337. data/ext/clipsruby/userdata.c +156 -0
  338. data/ext/clipsruby/userdata.h +72 -0
  339. data/ext/clipsruby/userfunctions.c +70 -0
  340. data/ext/clipsruby/usrsetup.h +7 -0
  341. data/ext/clipsruby/utility.c +1594 -0
  342. data/ext/clipsruby/utility.h +250 -0
  343. data/ext/clipsruby/watch.c +865 -0
  344. data/ext/clipsruby/watch.h +124 -0
  345. data/lib/clipsruby.rb +1 -0
  346. 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
+ }