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,737 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 03/20/19 */
5
+ /* */
6
+ /* I/O ROUTER MODULE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Provides a centralized mechanism for handling */
11
+ /* input and output requests. */
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: Removed conversion of '\r' to '\n' from the */
22
+ /* EnvGetcRouter function. */
23
+ /* */
24
+ /* Renamed BOOLEAN macro type to intBool. */
25
+ /* */
26
+ /* Added support for passing context information */
27
+ /* to the router functions. */
28
+ /* */
29
+ /* 6.30: Fixed issues with passing context to routers. */
30
+ /* */
31
+ /* Added AwaitingInput flag. */
32
+ /* */
33
+ /* Added const qualifiers to remove C++ */
34
+ /* deprecation warnings. */
35
+ /* */
36
+ /* Converted API macros to function calls. */
37
+ /* */
38
+ /* 6.31: Fixed line count issue when using Windows */
39
+ /* line endings in Unix. */
40
+ /* */
41
+ /* 6.40: Added InputBufferCount function. */
42
+ /* */
43
+ /* Added check for reuse of existing router name. */
44
+ /* */
45
+ /* Added Env prefix to GetEvaluationError and */
46
+ /* SetEvaluationError functions. */
47
+ /* */
48
+ /* Pragma once and other inclusion changes. */
49
+ /* */
50
+ /* Added support for booleans with <stdbool.h>. */
51
+ /* */
52
+ /* Changed return values for router functions. */
53
+ /* */
54
+ /* Removed use of void pointers for specific */
55
+ /* data structures. */
56
+ /* */
57
+ /* ALLOW_ENVIRONMENT_GLOBALS no longer supported. */
58
+ /* */
59
+ /* Callbacks must be environment aware. */
60
+ /* */
61
+ /* UDF redesign. */
62
+ /* */
63
+ /*************************************************************/
64
+
65
+ #include <stdio.h>
66
+ #include <stdlib.h>
67
+ #include <string.h>
68
+
69
+ #include "setup.h"
70
+
71
+ #include "argacces.h"
72
+ #include "constant.h"
73
+ #include "envrnmnt.h"
74
+ #include "extnfunc.h"
75
+ #include "filertr.h"
76
+ #include "memalloc.h"
77
+ #include "prntutil.h"
78
+ #include "scanner.h"
79
+ #include "strngrtr.h"
80
+ #include "sysdep.h"
81
+
82
+ #include "router.h"
83
+
84
+ /**********************/
85
+ /* STRING DEFINITIONS */
86
+ /**********************/
87
+
88
+ const char *STDIN = "stdin";
89
+ const char *STDOUT = "stdout";
90
+ const char *STDERR = "stderr";
91
+ const char *STDWRN = "stdwrn";
92
+
93
+ /***************************************/
94
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
95
+ /***************************************/
96
+
97
+ static bool QueryRouter(Environment *,const char *,struct router *);
98
+ static void DeallocateRouterData(Environment *);
99
+
100
+ /*********************************************************/
101
+ /* InitializeDefaultRouters: Initializes output streams. */
102
+ /*********************************************************/
103
+ void InitializeDefaultRouters(
104
+ Environment *theEnv)
105
+ {
106
+ AllocateEnvironmentData(theEnv,ROUTER_DATA,sizeof(struct routerData),DeallocateRouterData);
107
+
108
+ RouterData(theEnv)->CommandBufferInputCount = 0;
109
+ RouterData(theEnv)->InputUngets = 0;
110
+ RouterData(theEnv)->AwaitingInput = true;
111
+
112
+ InitializeFileRouter(theEnv);
113
+ InitializeStringRouter(theEnv);
114
+ }
115
+
116
+ /*************************************************/
117
+ /* DeallocateRouterData: Deallocates environment */
118
+ /* data for I/O routers. */
119
+ /*************************************************/
120
+ static void DeallocateRouterData(
121
+ Environment *theEnv)
122
+ {
123
+ struct router *tmpPtr, *nextPtr;
124
+
125
+ tmpPtr = RouterData(theEnv)->ListOfRouters;
126
+ while (tmpPtr != NULL)
127
+ {
128
+ nextPtr = tmpPtr->next;
129
+ genfree(theEnv,(void *) tmpPtr->name,strlen(tmpPtr->name) + 1);
130
+ rtn_struct(theEnv,router,tmpPtr);
131
+ tmpPtr = nextPtr;
132
+ }
133
+ }
134
+
135
+ /*********************/
136
+ /* PrintRouterExists */
137
+ /*********************/
138
+ bool PrintRouterExists(
139
+ Environment *theEnv,
140
+ const char *logicalName)
141
+ {
142
+ struct router *currentPtr;
143
+
144
+ if (((char *) RouterData(theEnv)->FastSaveFilePtr) == logicalName)
145
+ { return true; }
146
+
147
+ currentPtr = RouterData(theEnv)->ListOfRouters;
148
+ while (currentPtr != NULL)
149
+ {
150
+ if ((currentPtr->writeCallback != NULL) ? QueryRouter(theEnv,logicalName,currentPtr) : false)
151
+ { return true; }
152
+ currentPtr = currentPtr->next;
153
+ }
154
+
155
+ return false;
156
+ }
157
+
158
+ /**********************************/
159
+ /* Write: Generic print function. */
160
+ /**********************************/
161
+ void Write(
162
+ Environment *theEnv,
163
+ const char *str)
164
+ {
165
+ WriteString(theEnv,STDOUT,str);
166
+ }
167
+
168
+ /************************************/
169
+ /* Writeln: Generic print function. */
170
+ /************************************/
171
+ void Writeln(
172
+ Environment *theEnv,
173
+ const char *str)
174
+ {
175
+ WriteString(theEnv,STDOUT,str);
176
+ WriteString(theEnv,STDOUT,"\n");
177
+ }
178
+
179
+ /****************************************/
180
+ /* WriteString: Generic print function. */
181
+ /****************************************/
182
+ void WriteString(
183
+ Environment *theEnv,
184
+ const char *logicalName,
185
+ const char *str)
186
+ {
187
+ struct router *currentPtr;
188
+
189
+ if (str == NULL) return;
190
+
191
+ /*===================================================*/
192
+ /* If the "fast save" option is being used, then the */
193
+ /* logical name is actually a pointer to a file and */
194
+ /* fprintf can be called directly to bypass querying */
195
+ /* all of the routers. */
196
+ /*===================================================*/
197
+
198
+ if (((char *) RouterData(theEnv)->FastSaveFilePtr) == logicalName)
199
+ {
200
+ fprintf(RouterData(theEnv)->FastSaveFilePtr,"%s",str);
201
+ return;
202
+ }
203
+
204
+ /*==============================================*/
205
+ /* Search through the list of routers until one */
206
+ /* is found that will handle the print request. */
207
+ /*==============================================*/
208
+
209
+ currentPtr = RouterData(theEnv)->ListOfRouters;
210
+ while (currentPtr != NULL)
211
+ {
212
+ if ((currentPtr->writeCallback != NULL) ? QueryRouter(theEnv,logicalName,currentPtr) : false)
213
+ {
214
+ (*currentPtr->writeCallback)(theEnv,logicalName,str,currentPtr->context);
215
+ return;
216
+ }
217
+ currentPtr = currentPtr->next;
218
+ }
219
+
220
+ /*=====================================================*/
221
+ /* The logical name was not recognized by any routers. */
222
+ /*=====================================================*/
223
+
224
+ if (strcmp(STDERR,logicalName) != 0)
225
+ { UnrecognizedRouterMessage(theEnv,logicalName); }
226
+ }
227
+
228
+ /***********************************************/
229
+ /* ReadRouter: Generic get character function. */
230
+ /***********************************************/
231
+ int ReadRouter(
232
+ Environment *theEnv,
233
+ const char *logicalName)
234
+ {
235
+ struct router *currentPtr;
236
+ int inchar;
237
+
238
+ /*===================================================*/
239
+ /* If the "fast load" option is being used, then the */
240
+ /* logical name is actually a pointer to a file and */
241
+ /* getc can be called directly to bypass querying */
242
+ /* all of the routers. */
243
+ /*===================================================*/
244
+
245
+ if (((char *) RouterData(theEnv)->FastLoadFilePtr) == logicalName)
246
+ {
247
+ inchar = getc(RouterData(theEnv)->FastLoadFilePtr);
248
+
249
+ if (inchar == '\n')
250
+ {
251
+ if (((char *) RouterData(theEnv)->FastLoadFilePtr) == RouterData(theEnv)->LineCountRouter)
252
+ { IncrementLineCount(theEnv); }
253
+ }
254
+
255
+ /* if (inchar == '\r') return('\n'); */
256
+
257
+ return(inchar);
258
+ }
259
+
260
+ /*===============================================*/
261
+ /* If the "fast string get" option is being used */
262
+ /* for the specified logical name, then bypass */
263
+ /* the router system and extract the character */
264
+ /* directly from the fast get string. */
265
+ /*===============================================*/
266
+
267
+ if (RouterData(theEnv)->FastCharGetRouter == logicalName)
268
+ {
269
+ inchar = (unsigned char) RouterData(theEnv)->FastCharGetString[RouterData(theEnv)->FastCharGetIndex];
270
+
271
+ RouterData(theEnv)->FastCharGetIndex++;
272
+
273
+ if (inchar == '\0') return(EOF);
274
+
275
+ if (inchar == '\n')
276
+ {
277
+ if (RouterData(theEnv)->FastCharGetRouter == RouterData(theEnv)->LineCountRouter)
278
+ { IncrementLineCount(theEnv); }
279
+ }
280
+
281
+ return(inchar);
282
+ }
283
+
284
+ /*==============================================*/
285
+ /* Search through the list of routers until one */
286
+ /* is found that will handle the getc request. */
287
+ /*==============================================*/
288
+
289
+ currentPtr = RouterData(theEnv)->ListOfRouters;
290
+ while (currentPtr != NULL)
291
+ {
292
+ if ((currentPtr->readCallback != NULL) ? QueryRouter(theEnv,logicalName,currentPtr) : false)
293
+ {
294
+ inchar = (*currentPtr->readCallback)(theEnv,logicalName,currentPtr->context);
295
+
296
+ if (inchar == '\n')
297
+ {
298
+ if ((RouterData(theEnv)->LineCountRouter != NULL) &&
299
+ (strcmp(logicalName,RouterData(theEnv)->LineCountRouter) == 0))
300
+ { IncrementLineCount(theEnv); }
301
+ }
302
+
303
+ return(inchar);
304
+ }
305
+ currentPtr = currentPtr->next;
306
+ }
307
+
308
+ /*=====================================================*/
309
+ /* The logical name was not recognized by any routers. */
310
+ /*=====================================================*/
311
+
312
+ UnrecognizedRouterMessage(theEnv,logicalName);
313
+ return(-1);
314
+ }
315
+
316
+ /***************************************************/
317
+ /* UnreadRouter: Generic unget character function. */
318
+ /***************************************************/
319
+ int UnreadRouter(
320
+ Environment *theEnv,
321
+ const char *logicalName,
322
+ int ch)
323
+ {
324
+ struct router *currentPtr;
325
+
326
+ /*===================================================*/
327
+ /* If the "fast load" option is being used, then the */
328
+ /* logical name is actually a pointer to a file and */
329
+ /* ungetc can be called directly to bypass querying */
330
+ /* all of the routers. */
331
+ /*===================================================*/
332
+
333
+ if (((char *) RouterData(theEnv)->FastLoadFilePtr) == logicalName)
334
+ {
335
+ if (ch == '\n')
336
+ {
337
+ if (((char *) RouterData(theEnv)->FastLoadFilePtr) == RouterData(theEnv)->LineCountRouter)
338
+ { DecrementLineCount(theEnv); }
339
+ }
340
+
341
+ return ungetc(ch,RouterData(theEnv)->FastLoadFilePtr);
342
+ }
343
+
344
+ /*===============================================*/
345
+ /* If the "fast string get" option is being used */
346
+ /* for the specified logical name, then bypass */
347
+ /* the router system and unget the character */
348
+ /* directly from the fast get string. */
349
+ /*===============================================*/
350
+
351
+ if (RouterData(theEnv)->FastCharGetRouter == logicalName)
352
+ {
353
+ if (ch == '\n')
354
+ {
355
+ if (RouterData(theEnv)->FastCharGetRouter == RouterData(theEnv)->LineCountRouter)
356
+ { DecrementLineCount(theEnv); }
357
+ }
358
+
359
+ if (RouterData(theEnv)->FastCharGetIndex > 0) RouterData(theEnv)->FastCharGetIndex--;
360
+ return ch;
361
+ }
362
+
363
+ /*===============================================*/
364
+ /* Search through the list of routers until one */
365
+ /* is found that will handle the ungetc request. */
366
+ /*===============================================*/
367
+
368
+ currentPtr = RouterData(theEnv)->ListOfRouters;
369
+ while (currentPtr != NULL)
370
+ {
371
+ if ((currentPtr->unreadCallback != NULL) ? QueryRouter(theEnv,logicalName,currentPtr) : false)
372
+ {
373
+ if (ch == '\n')
374
+ {
375
+ if ((RouterData(theEnv)->LineCountRouter != NULL) &&
376
+ (strcmp(logicalName,RouterData(theEnv)->LineCountRouter) == 0))
377
+ { DecrementLineCount(theEnv); }
378
+ }
379
+
380
+ return (*currentPtr->unreadCallback)(theEnv,logicalName,ch,currentPtr->context);
381
+ }
382
+
383
+ currentPtr = currentPtr->next;
384
+ }
385
+
386
+ /*=====================================================*/
387
+ /* The logical name was not recognized by any routers. */
388
+ /*=====================================================*/
389
+
390
+ UnrecognizedRouterMessage(theEnv,logicalName);
391
+ return -1;
392
+ }
393
+
394
+ /********************************************/
395
+ /* ExitRouter: Generic exit function. Calls */
396
+ /* all of the router exit functions. */
397
+ /********************************************/
398
+ void ExitRouter(
399
+ Environment *theEnv,
400
+ int num)
401
+ {
402
+ struct router *currentPtr, *nextPtr;
403
+
404
+ RouterData(theEnv)->Abort = false;
405
+ currentPtr = RouterData(theEnv)->ListOfRouters;
406
+ while (currentPtr != NULL)
407
+ {
408
+ nextPtr = currentPtr->next;
409
+ if (currentPtr->active == true)
410
+ {
411
+ if (currentPtr->exitCallback != NULL)
412
+ {
413
+ (*currentPtr->exitCallback)(theEnv,num,currentPtr->context);
414
+ }
415
+ }
416
+ currentPtr = nextPtr;
417
+ }
418
+
419
+ if (RouterData(theEnv)->Abort) return;
420
+ genexit(theEnv,num);
421
+ }
422
+
423
+ /********************************************/
424
+ /* AbortExit: Forces ExitRouter to terminate */
425
+ /* after calling all closing routers. */
426
+ /********************************************/
427
+ void AbortExit(
428
+ Environment *theEnv)
429
+ {
430
+ RouterData(theEnv)->Abort = true;
431
+ }
432
+
433
+ /*********************************************************/
434
+ /* AddRouter: Adds an I/O router to the list of routers. */
435
+ /*********************************************************/
436
+ bool AddRouter(
437
+ Environment *theEnv,
438
+ const char *routerName,
439
+ int priority,
440
+ RouterQueryFunction *queryFunction,
441
+ RouterWriteFunction *writeFunction,
442
+ RouterReadFunction *readFunction,
443
+ RouterUnreadFunction *unreadFunction,
444
+ RouterExitFunction *exitFunction,
445
+ void *context)
446
+ {
447
+ struct router *newPtr, *lastPtr, *currentPtr;
448
+ char *nameCopy;
449
+
450
+ /*==================================================*/
451
+ /* Reject the router if the name is already in use. */
452
+ /*==================================================*/
453
+
454
+ for (currentPtr = RouterData(theEnv)->ListOfRouters;
455
+ currentPtr != NULL;
456
+ currentPtr = currentPtr->next)
457
+ {
458
+ if (strcmp(currentPtr->name,routerName) == 0)
459
+ { return false; }
460
+ }
461
+
462
+ newPtr = get_struct(theEnv,router);
463
+
464
+ nameCopy = (char *) genalloc(theEnv,strlen(routerName) + 1);
465
+ genstrcpy(nameCopy,routerName);
466
+ newPtr->name = nameCopy;
467
+
468
+ newPtr->active = true;
469
+ newPtr->context = context;
470
+ newPtr->priority = priority;
471
+ newPtr->queryCallback = queryFunction;
472
+ newPtr->writeCallback = writeFunction;
473
+ newPtr->exitCallback = exitFunction;
474
+ newPtr->readCallback = readFunction;
475
+ newPtr->unreadCallback = unreadFunction;
476
+ newPtr->next = NULL;
477
+
478
+ if (RouterData(theEnv)->ListOfRouters == NULL)
479
+ {
480
+ RouterData(theEnv)->ListOfRouters = newPtr;
481
+ return true;
482
+ }
483
+
484
+ lastPtr = NULL;
485
+ currentPtr = RouterData(theEnv)->ListOfRouters;
486
+ while ((currentPtr != NULL) ? (priority < currentPtr->priority) : false)
487
+ {
488
+ lastPtr = currentPtr;
489
+ currentPtr = currentPtr->next;
490
+ }
491
+
492
+ if (lastPtr == NULL)
493
+ {
494
+ newPtr->next = RouterData(theEnv)->ListOfRouters;
495
+ RouterData(theEnv)->ListOfRouters = newPtr;
496
+ }
497
+ else
498
+ {
499
+ newPtr->next = currentPtr;
500
+ lastPtr->next = newPtr;
501
+ }
502
+
503
+ return true;
504
+ }
505
+
506
+ /*****************************************************************/
507
+ /* DeleteRouter: Removes an I/O router from the list of routers. */
508
+ /*****************************************************************/
509
+ bool DeleteRouter(
510
+ Environment *theEnv,
511
+ const char *routerName)
512
+ {
513
+ struct router *currentPtr, *lastPtr;
514
+
515
+ currentPtr = RouterData(theEnv)->ListOfRouters;
516
+ lastPtr = NULL;
517
+
518
+ while (currentPtr != NULL)
519
+ {
520
+ if (strcmp(currentPtr->name,routerName) == 0)
521
+ {
522
+ genfree(theEnv,(void *) currentPtr->name,strlen(currentPtr->name) + 1);
523
+ if (lastPtr == NULL)
524
+ {
525
+ RouterData(theEnv)->ListOfRouters = currentPtr->next;
526
+ rm(theEnv,currentPtr,sizeof(struct router));
527
+ return true;
528
+ }
529
+ lastPtr->next = currentPtr->next;
530
+ rm(theEnv,currentPtr,sizeof(struct router));
531
+ return true;
532
+ }
533
+ lastPtr = currentPtr;
534
+ currentPtr = currentPtr->next;
535
+ }
536
+
537
+ return false;
538
+ }
539
+
540
+ /*********************************************************************/
541
+ /* QueryRouters: Determines if any router recognizes a logical name. */
542
+ /*********************************************************************/
543
+ bool QueryRouters(
544
+ Environment *theEnv,
545
+ const char *logicalName)
546
+ {
547
+ struct router *currentPtr;
548
+
549
+ currentPtr = RouterData(theEnv)->ListOfRouters;
550
+ while (currentPtr != NULL)
551
+ {
552
+ if (QueryRouter(theEnv,logicalName,currentPtr) == true) return true;
553
+ currentPtr = currentPtr->next;
554
+ }
555
+
556
+ return false;
557
+ }
558
+
559
+ /************************************************/
560
+ /* QueryRouter: Determines if a specific router */
561
+ /* recognizes a logical name. */
562
+ /************************************************/
563
+ static bool QueryRouter(
564
+ Environment *theEnv,
565
+ const char *logicalName,
566
+ struct router *currentPtr)
567
+ {
568
+ /*===================================================*/
569
+ /* If the router is inactive, then it can't respond. */
570
+ /*===================================================*/
571
+
572
+ if (currentPtr->active == false)
573
+ { return false; }
574
+
575
+ /*=============================================================*/
576
+ /* If the router has no query function, then it can't respond. */
577
+ /*=============================================================*/
578
+
579
+ if (currentPtr->queryCallback == NULL) return false;
580
+
581
+ /*=========================================*/
582
+ /* Call the router's query function to see */
583
+ /* if it recognizes the logical name. */
584
+ /*=========================================*/
585
+
586
+ if ((*currentPtr->queryCallback)(theEnv,logicalName,currentPtr->context) == true)
587
+ { return true; }
588
+
589
+ return false;
590
+ }
591
+
592
+ /*******************************************************/
593
+ /* DeactivateRouter: Deactivates a specific router. */
594
+ /*******************************************************/
595
+ bool DeactivateRouter(
596
+ Environment *theEnv,
597
+ const char *routerName)
598
+ {
599
+ struct router *currentPtr;
600
+
601
+ currentPtr = RouterData(theEnv)->ListOfRouters;
602
+
603
+ while (currentPtr != NULL)
604
+ {
605
+ if (strcmp(currentPtr->name,routerName) == 0)
606
+ {
607
+ currentPtr->active = false;
608
+ return true;
609
+ }
610
+ currentPtr = currentPtr->next;
611
+ }
612
+
613
+ return false;
614
+ }
615
+
616
+ /************************************************/
617
+ /* ActivateRouter: Activates a specific router. */
618
+ /************************************************/
619
+ bool ActivateRouter(
620
+ Environment *theEnv,
621
+ const char *routerName)
622
+ {
623
+ struct router *currentPtr;
624
+
625
+ currentPtr = RouterData(theEnv)->ListOfRouters;
626
+
627
+ while (currentPtr != NULL)
628
+ {
629
+ if (strcmp(currentPtr->name,routerName) == 0)
630
+ {
631
+ currentPtr->active = true;
632
+ return true;
633
+ }
634
+ currentPtr = currentPtr->next;
635
+ }
636
+
637
+ return false;
638
+ }
639
+
640
+ /*****************************************/
641
+ /* FindRouter: Locates the named router. */
642
+ /*****************************************/
643
+ Router *FindRouter(
644
+ Environment *theEnv,
645
+ const char *routerName)
646
+ {
647
+ Router *currentPtr;
648
+
649
+ for (currentPtr = RouterData(theEnv)->ListOfRouters;
650
+ currentPtr != NULL;
651
+ currentPtr = currentPtr->next)
652
+ {
653
+ if (strcmp(currentPtr->name,routerName) == 0)
654
+ { return currentPtr; }
655
+ }
656
+
657
+ return NULL;
658
+ }
659
+
660
+ /********************************************************/
661
+ /* SetFastLoad: Used to bypass router system for loads. */
662
+ /********************************************************/
663
+ void SetFastLoad(
664
+ Environment *theEnv,
665
+ FILE *filePtr)
666
+ {
667
+ RouterData(theEnv)->FastLoadFilePtr = filePtr;
668
+ }
669
+
670
+ /********************************************************/
671
+ /* SetFastSave: Used to bypass router system for saves. */
672
+ /********************************************************/
673
+ void SetFastSave(
674
+ Environment *theEnv,
675
+ FILE *filePtr)
676
+ {
677
+ RouterData(theEnv)->FastSaveFilePtr = filePtr;
678
+ }
679
+
680
+ /******************************************************/
681
+ /* GetFastLoad: Returns the "fast load" file pointer. */
682
+ /******************************************************/
683
+ FILE *GetFastLoad(
684
+ Environment *theEnv)
685
+ {
686
+ return(RouterData(theEnv)->FastLoadFilePtr);
687
+ }
688
+
689
+ /******************************************************/
690
+ /* GetFastSave: Returns the "fast save" file pointer. */
691
+ /******************************************************/
692
+ FILE *GetFastSave(
693
+ Environment *theEnv)
694
+ {
695
+ return(RouterData(theEnv)->FastSaveFilePtr);
696
+ }
697
+
698
+ /*****************************************************/
699
+ /* UnrecognizedRouterMessage: Standard error message */
700
+ /* for an unrecognized router name. */
701
+ /*****************************************************/
702
+ void UnrecognizedRouterMessage(
703
+ Environment *theEnv,
704
+ const char *logicalName)
705
+ {
706
+ PrintErrorID(theEnv,"ROUTER",1,false);
707
+ WriteString(theEnv,STDERR,"Logical name '");
708
+ WriteString(theEnv,STDERR,logicalName);
709
+ WriteString(theEnv,STDERR,"' was not recognized by any routers.\n");
710
+ }
711
+
712
+ /*****************************************/
713
+ /* PrintNRouter: Generic print function. */
714
+ /*****************************************/
715
+ void PrintNRouter(
716
+ Environment *theEnv,
717
+ const char *logicalName,
718
+ const char *str,
719
+ unsigned long length)
720
+ {
721
+ char *tempStr;
722
+
723
+ tempStr = (char *) genalloc(theEnv,length+1);
724
+ genstrncpy(tempStr,str,length);
725
+ tempStr[length] = 0;
726
+ WriteString(theEnv,logicalName,tempStr);
727
+ genfree(theEnv,tempStr,length+1);
728
+ }
729
+
730
+ /*********************/
731
+ /* InputBufferCount: */
732
+ /*********************/
733
+ size_t InputBufferCount(
734
+ Environment *theEnv)
735
+ {
736
+ return RouterData(theEnv)->CommandBufferInputCount;
737
+ }