johnson 2.0.0.pre1 → 2.0.0.pre2

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 (311) hide show
  1. data/CHANGELOG.rdoc +12 -0
  2. data/Manifest.txt +4 -285
  3. data/Rakefile +13 -20
  4. data/ext/tracemonkey/global.cc +4 -1
  5. data/ext/tracemonkey/js.cc +30 -33
  6. data/ext/tracemonkey/runtime.cc +96 -6
  7. data/ext/tracemonkey/split_global.cc +0 -5
  8. data/ext/tracemonkey/tracemonkey.h +2 -2
  9. data/lib/johnson.rb +2 -2
  10. data/lib/johnson/runtime.rb +25 -15
  11. data/lib/johnson/tracemonkey/runtime.rb +6 -3
  12. data/vendor/tracemonkey/config/system-headers +1 -3
  13. data/vendor/tracemonkey/jscntxt.h +5 -2
  14. data/vendor/tracemonkey/jsdbgapi.cpp +9 -1
  15. data/vendor/tracemonkey/jsdbgapi.h +4 -0
  16. data/vendor/tracemonkey/tests/ecma/NativeObjects/browser.js +0 -0
  17. data/vendor/tracemonkey/tests/ecma/NativeObjects/jstests.list +0 -0
  18. data/vendor/tracemonkey/tests/ecma_3_1/Object/jstests.list +1 -1
  19. data/vendor/tracemonkey/tests/js1_3/misc/browser.js +0 -0
  20. data/vendor/tracemonkey/tests/js1_3/misc/jstests.list +0 -0
  21. data/vendor/tracemonkey/tests/js1_5/Regress/jstests.list +4 -4
  22. data/vendor/tracemonkey/tests/js1_5/Scope/jstests.list +1 -1
  23. data/vendor/tracemonkey/tests/js1_5/decompilation/jstests.list +2 -2
  24. data/vendor/tracemonkey/tests/js1_7/decompilation/jstests.list +1 -1
  25. data/vendor/tracemonkey/tests/shell.js +2 -1
  26. metadata +51 -309
  27. data/ext/spidermonkey/context.c +0 -116
  28. data/ext/spidermonkey/context.h +0 -19
  29. data/ext/spidermonkey/conversions.c +0 -361
  30. data/ext/spidermonkey/conversions.h +0 -31
  31. data/ext/spidermonkey/debugger.c +0 -234
  32. data/ext/spidermonkey/debugger.h +0 -10
  33. data/ext/spidermonkey/extconf.rb +0 -32
  34. data/ext/spidermonkey/extensions.c +0 -37
  35. data/ext/spidermonkey/extensions.h +0 -12
  36. data/ext/spidermonkey/global.c +0 -40
  37. data/ext/spidermonkey/global.h +0 -11
  38. data/ext/spidermonkey/idhash.c +0 -16
  39. data/ext/spidermonkey/idhash.h +0 -8
  40. data/ext/spidermonkey/immutable_node.c +0 -1153
  41. data/ext/spidermonkey/immutable_node.c.erb +0 -523
  42. data/ext/spidermonkey/immutable_node.h +0 -22
  43. data/ext/spidermonkey/jroot.h +0 -197
  44. data/ext/spidermonkey/js_land_proxy.c +0 -620
  45. data/ext/spidermonkey/js_land_proxy.h +0 -20
  46. data/ext/spidermonkey/ruby_land_proxy.c +0 -618
  47. data/ext/spidermonkey/ruby_land_proxy.h +0 -38
  48. data/ext/spidermonkey/runtime.c +0 -396
  49. data/ext/spidermonkey/runtime.h +0 -27
  50. data/ext/spidermonkey/spidermonkey.c +0 -22
  51. data/ext/spidermonkey/spidermonkey.h +0 -29
  52. data/lib/johnson/spidermonkey.rb +0 -12
  53. data/lib/johnson/spidermonkey/context.rb +0 -10
  54. data/lib/johnson/spidermonkey/debugger.rb +0 -67
  55. data/lib/johnson/spidermonkey/immutable_node.rb +0 -282
  56. data/lib/johnson/spidermonkey/js_land_proxy.rb +0 -64
  57. data/lib/johnson/spidermonkey/mutable_tree_visitor.rb +0 -242
  58. data/lib/johnson/spidermonkey/ruby_land_proxy.rb +0 -17
  59. data/lib/johnson/spidermonkey/runtime.rb +0 -74
  60. data/test/johnson/spidermonkey/context_test.rb +0 -21
  61. data/test/johnson/spidermonkey/immutable_node_test.rb +0 -34
  62. data/test/johnson/spidermonkey/js_land_proxy_test.rb +0 -273
  63. data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +0 -274
  64. data/test/johnson/spidermonkey/runtime_test.rb +0 -41
  65. data/vendor/spidermonkey/.cvsignore +0 -9
  66. data/vendor/spidermonkey/Makefile.in +0 -449
  67. data/vendor/spidermonkey/Makefile.ref +0 -365
  68. data/vendor/spidermonkey/README.html +0 -820
  69. data/vendor/spidermonkey/SpiderMonkey.rsp +0 -12
  70. data/vendor/spidermonkey/Y.js +0 -19
  71. data/vendor/spidermonkey/build.mk +0 -43
  72. data/vendor/spidermonkey/config.mk +0 -192
  73. data/vendor/spidermonkey/config/AIX4.1.mk +0 -65
  74. data/vendor/spidermonkey/config/AIX4.2.mk +0 -64
  75. data/vendor/spidermonkey/config/AIX4.3.mk +0 -65
  76. data/vendor/spidermonkey/config/Darwin.mk +0 -83
  77. data/vendor/spidermonkey/config/Darwin1.3.mk +0 -81
  78. data/vendor/spidermonkey/config/Darwin1.4.mk +0 -41
  79. data/vendor/spidermonkey/config/Darwin5.2.mk +0 -81
  80. data/vendor/spidermonkey/config/Darwin5.3.mk +0 -81
  81. data/vendor/spidermonkey/config/HP-UXB.10.10.mk +0 -77
  82. data/vendor/spidermonkey/config/HP-UXB.10.20.mk +0 -77
  83. data/vendor/spidermonkey/config/HP-UXB.11.00.mk +0 -80
  84. data/vendor/spidermonkey/config/IRIX.mk +0 -87
  85. data/vendor/spidermonkey/config/IRIX5.3.mk +0 -44
  86. data/vendor/spidermonkey/config/IRIX6.1.mk +0 -44
  87. data/vendor/spidermonkey/config/IRIX6.2.mk +0 -44
  88. data/vendor/spidermonkey/config/IRIX6.3.mk +0 -44
  89. data/vendor/spidermonkey/config/IRIX6.5.mk +0 -44
  90. data/vendor/spidermonkey/config/Linux_All.mk +0 -103
  91. data/vendor/spidermonkey/config/Mac_OS10.0.mk +0 -82
  92. data/vendor/spidermonkey/config/OSF1V4.0.mk +0 -72
  93. data/vendor/spidermonkey/config/OSF1V5.0.mk +0 -69
  94. data/vendor/spidermonkey/config/SunOS4.1.4.mk +0 -101
  95. data/vendor/spidermonkey/config/SunOS5.10.mk +0 -50
  96. data/vendor/spidermonkey/config/SunOS5.3.mk +0 -91
  97. data/vendor/spidermonkey/config/SunOS5.4.mk +0 -92
  98. data/vendor/spidermonkey/config/SunOS5.5.1.mk +0 -44
  99. data/vendor/spidermonkey/config/SunOS5.5.mk +0 -87
  100. data/vendor/spidermonkey/config/SunOS5.6.mk +0 -89
  101. data/vendor/spidermonkey/config/SunOS5.7.mk +0 -44
  102. data/vendor/spidermonkey/config/SunOS5.8.mk +0 -44
  103. data/vendor/spidermonkey/config/SunOS5.9.mk +0 -44
  104. data/vendor/spidermonkey/config/WINNT4.0.mk +0 -117
  105. data/vendor/spidermonkey/config/WINNT5.0.mk +0 -117
  106. data/vendor/spidermonkey/config/WINNT5.1.mk +0 -117
  107. data/vendor/spidermonkey/config/WINNT5.2.mk +0 -117
  108. data/vendor/spidermonkey/config/WINNT6.0.mk +0 -117
  109. data/vendor/spidermonkey/config/dgux.mk +0 -64
  110. data/vendor/spidermonkey/editline/Makefile.ref +0 -144
  111. data/vendor/spidermonkey/editline/README +0 -83
  112. data/vendor/spidermonkey/editline/editline.3 +0 -175
  113. data/vendor/spidermonkey/editline/editline.c +0 -1369
  114. data/vendor/spidermonkey/editline/editline.h +0 -135
  115. data/vendor/spidermonkey/editline/sysunix.c +0 -182
  116. data/vendor/spidermonkey/editline/unix.h +0 -82
  117. data/vendor/spidermonkey/fdlibm/.cvsignore +0 -7
  118. data/vendor/spidermonkey/fdlibm/Makefile.in +0 -127
  119. data/vendor/spidermonkey/fdlibm/Makefile.ref +0 -192
  120. data/vendor/spidermonkey/fdlibm/e_acos.c +0 -147
  121. data/vendor/spidermonkey/fdlibm/e_acosh.c +0 -105
  122. data/vendor/spidermonkey/fdlibm/e_asin.c +0 -156
  123. data/vendor/spidermonkey/fdlibm/e_atan2.c +0 -165
  124. data/vendor/spidermonkey/fdlibm/e_atanh.c +0 -110
  125. data/vendor/spidermonkey/fdlibm/e_cosh.c +0 -133
  126. data/vendor/spidermonkey/fdlibm/e_exp.c +0 -202
  127. data/vendor/spidermonkey/fdlibm/e_fmod.c +0 -184
  128. data/vendor/spidermonkey/fdlibm/e_gamma.c +0 -71
  129. data/vendor/spidermonkey/fdlibm/e_gamma_r.c +0 -70
  130. data/vendor/spidermonkey/fdlibm/e_hypot.c +0 -173
  131. data/vendor/spidermonkey/fdlibm/e_j0.c +0 -524
  132. data/vendor/spidermonkey/fdlibm/e_j1.c +0 -523
  133. data/vendor/spidermonkey/fdlibm/e_jn.c +0 -315
  134. data/vendor/spidermonkey/fdlibm/e_lgamma.c +0 -71
  135. data/vendor/spidermonkey/fdlibm/e_lgamma_r.c +0 -347
  136. data/vendor/spidermonkey/fdlibm/e_log.c +0 -184
  137. data/vendor/spidermonkey/fdlibm/e_log10.c +0 -134
  138. data/vendor/spidermonkey/fdlibm/e_pow.c +0 -386
  139. data/vendor/spidermonkey/fdlibm/e_rem_pio2.c +0 -222
  140. data/vendor/spidermonkey/fdlibm/e_remainder.c +0 -120
  141. data/vendor/spidermonkey/fdlibm/e_scalb.c +0 -89
  142. data/vendor/spidermonkey/fdlibm/e_sinh.c +0 -122
  143. data/vendor/spidermonkey/fdlibm/e_sqrt.c +0 -497
  144. data/vendor/spidermonkey/fdlibm/fdlibm.h +0 -273
  145. data/vendor/spidermonkey/fdlibm/fdlibm.mak +0 -1453
  146. data/vendor/spidermonkey/fdlibm/fdlibm.mdp +0 -0
  147. data/vendor/spidermonkey/fdlibm/k_cos.c +0 -135
  148. data/vendor/spidermonkey/fdlibm/k_rem_pio2.c +0 -354
  149. data/vendor/spidermonkey/fdlibm/k_sin.c +0 -114
  150. data/vendor/spidermonkey/fdlibm/k_standard.c +0 -785
  151. data/vendor/spidermonkey/fdlibm/k_tan.c +0 -170
  152. data/vendor/spidermonkey/fdlibm/s_asinh.c +0 -101
  153. data/vendor/spidermonkey/fdlibm/s_atan.c +0 -175
  154. data/vendor/spidermonkey/fdlibm/s_cbrt.c +0 -133
  155. data/vendor/spidermonkey/fdlibm/s_ceil.c +0 -120
  156. data/vendor/spidermonkey/fdlibm/s_copysign.c +0 -72
  157. data/vendor/spidermonkey/fdlibm/s_cos.c +0 -118
  158. data/vendor/spidermonkey/fdlibm/s_erf.c +0 -356
  159. data/vendor/spidermonkey/fdlibm/s_expm1.c +0 -267
  160. data/vendor/spidermonkey/fdlibm/s_fabs.c +0 -70
  161. data/vendor/spidermonkey/fdlibm/s_finite.c +0 -71
  162. data/vendor/spidermonkey/fdlibm/s_floor.c +0 -121
  163. data/vendor/spidermonkey/fdlibm/s_frexp.c +0 -99
  164. data/vendor/spidermonkey/fdlibm/s_ilogb.c +0 -85
  165. data/vendor/spidermonkey/fdlibm/s_isnan.c +0 -74
  166. data/vendor/spidermonkey/fdlibm/s_ldexp.c +0 -66
  167. data/vendor/spidermonkey/fdlibm/s_lib_version.c +0 -73
  168. data/vendor/spidermonkey/fdlibm/s_log1p.c +0 -211
  169. data/vendor/spidermonkey/fdlibm/s_logb.c +0 -79
  170. data/vendor/spidermonkey/fdlibm/s_matherr.c +0 -64
  171. data/vendor/spidermonkey/fdlibm/s_modf.c +0 -132
  172. data/vendor/spidermonkey/fdlibm/s_nextafter.c +0 -124
  173. data/vendor/spidermonkey/fdlibm/s_rint.c +0 -131
  174. data/vendor/spidermonkey/fdlibm/s_scalbn.c +0 -107
  175. data/vendor/spidermonkey/fdlibm/s_signgam.c +0 -40
  176. data/vendor/spidermonkey/fdlibm/s_significand.c +0 -68
  177. data/vendor/spidermonkey/fdlibm/s_sin.c +0 -118
  178. data/vendor/spidermonkey/fdlibm/s_tan.c +0 -112
  179. data/vendor/spidermonkey/fdlibm/s_tanh.c +0 -122
  180. data/vendor/spidermonkey/fdlibm/w_acos.c +0 -78
  181. data/vendor/spidermonkey/fdlibm/w_acosh.c +0 -78
  182. data/vendor/spidermonkey/fdlibm/w_asin.c +0 -80
  183. data/vendor/spidermonkey/fdlibm/w_atan2.c +0 -79
  184. data/vendor/spidermonkey/fdlibm/w_atanh.c +0 -81
  185. data/vendor/spidermonkey/fdlibm/w_cosh.c +0 -77
  186. data/vendor/spidermonkey/fdlibm/w_exp.c +0 -88
  187. data/vendor/spidermonkey/fdlibm/w_fmod.c +0 -78
  188. data/vendor/spidermonkey/fdlibm/w_gamma.c +0 -85
  189. data/vendor/spidermonkey/fdlibm/w_gamma_r.c +0 -81
  190. data/vendor/spidermonkey/fdlibm/w_hypot.c +0 -78
  191. data/vendor/spidermonkey/fdlibm/w_j0.c +0 -105
  192. data/vendor/spidermonkey/fdlibm/w_j1.c +0 -106
  193. data/vendor/spidermonkey/fdlibm/w_jn.c +0 -128
  194. data/vendor/spidermonkey/fdlibm/w_lgamma.c +0 -85
  195. data/vendor/spidermonkey/fdlibm/w_lgamma_r.c +0 -81
  196. data/vendor/spidermonkey/fdlibm/w_log.c +0 -78
  197. data/vendor/spidermonkey/fdlibm/w_log10.c +0 -81
  198. data/vendor/spidermonkey/fdlibm/w_pow.c +0 -99
  199. data/vendor/spidermonkey/fdlibm/w_remainder.c +0 -77
  200. data/vendor/spidermonkey/fdlibm/w_scalb.c +0 -95
  201. data/vendor/spidermonkey/fdlibm/w_sinh.c +0 -77
  202. data/vendor/spidermonkey/fdlibm/w_sqrt.c +0 -77
  203. data/vendor/spidermonkey/javascript-trace.d +0 -73
  204. data/vendor/spidermonkey/js.c +0 -3951
  205. data/vendor/spidermonkey/js.mdp +0 -0
  206. data/vendor/spidermonkey/js.msg +0 -308
  207. data/vendor/spidermonkey/js.pkg +0 -2
  208. data/vendor/spidermonkey/js3240.rc +0 -79
  209. data/vendor/spidermonkey/jsOS240.def +0 -654
  210. data/vendor/spidermonkey/jsapi.c +0 -5836
  211. data/vendor/spidermonkey/jsapi.h +0 -2624
  212. data/vendor/spidermonkey/jsarena.c +0 -450
  213. data/vendor/spidermonkey/jsarena.h +0 -318
  214. data/vendor/spidermonkey/jsarray.c +0 -2996
  215. data/vendor/spidermonkey/jsarray.h +0 -127
  216. data/vendor/spidermonkey/jsatom.c +0 -1045
  217. data/vendor/spidermonkey/jsatom.h +0 -442
  218. data/vendor/spidermonkey/jsbit.h +0 -253
  219. data/vendor/spidermonkey/jsbool.c +0 -176
  220. data/vendor/spidermonkey/jsbool.h +0 -73
  221. data/vendor/spidermonkey/jsclist.h +0 -139
  222. data/vendor/spidermonkey/jscntxt.c +0 -1348
  223. data/vendor/spidermonkey/jscntxt.h +0 -1120
  224. data/vendor/spidermonkey/jscompat.h +0 -57
  225. data/vendor/spidermonkey/jsconfig.h +0 -248
  226. data/vendor/spidermonkey/jsconfig.mk +0 -181
  227. data/vendor/spidermonkey/jscpucfg.c +0 -396
  228. data/vendor/spidermonkey/jscpucfg.h +0 -212
  229. data/vendor/spidermonkey/jsdate.c +0 -2390
  230. data/vendor/spidermonkey/jsdate.h +0 -124
  231. data/vendor/spidermonkey/jsdbgapi.c +0 -1802
  232. data/vendor/spidermonkey/jsdbgapi.h +0 -464
  233. data/vendor/spidermonkey/jsdhash.c +0 -868
  234. data/vendor/spidermonkey/jsdhash.h +0 -592
  235. data/vendor/spidermonkey/jsdtoa.c +0 -3167
  236. data/vendor/spidermonkey/jsdtoa.h +0 -130
  237. data/vendor/spidermonkey/jsdtracef.c +0 -317
  238. data/vendor/spidermonkey/jsdtracef.h +0 -77
  239. data/vendor/spidermonkey/jsemit.c +0 -6909
  240. data/vendor/spidermonkey/jsemit.h +0 -741
  241. data/vendor/spidermonkey/jsexn.c +0 -1371
  242. data/vendor/spidermonkey/jsexn.h +0 -96
  243. data/vendor/spidermonkey/jsfile.c +0 -2736
  244. data/vendor/spidermonkey/jsfile.h +0 -56
  245. data/vendor/spidermonkey/jsfile.msg +0 -90
  246. data/vendor/spidermonkey/jsfun.c +0 -2634
  247. data/vendor/spidermonkey/jsfun.h +0 -254
  248. data/vendor/spidermonkey/jsgc.c +0 -3562
  249. data/vendor/spidermonkey/jsgc.h +0 -403
  250. data/vendor/spidermonkey/jshash.c +0 -476
  251. data/vendor/spidermonkey/jshash.h +0 -151
  252. data/vendor/spidermonkey/jsify.pl +0 -485
  253. data/vendor/spidermonkey/jsinterp.c +0 -7007
  254. data/vendor/spidermonkey/jsinterp.h +0 -525
  255. data/vendor/spidermonkey/jsinvoke.c +0 -43
  256. data/vendor/spidermonkey/jsiter.c +0 -1067
  257. data/vendor/spidermonkey/jsiter.h +0 -122
  258. data/vendor/spidermonkey/jskeyword.tbl +0 -124
  259. data/vendor/spidermonkey/jskwgen.c +0 -460
  260. data/vendor/spidermonkey/jslibmath.h +0 -266
  261. data/vendor/spidermonkey/jslock.c +0 -1309
  262. data/vendor/spidermonkey/jslock.h +0 -313
  263. data/vendor/spidermonkey/jslocko.asm +0 -60
  264. data/vendor/spidermonkey/jslog2.c +0 -94
  265. data/vendor/spidermonkey/jslong.c +0 -264
  266. data/vendor/spidermonkey/jslong.h +0 -412
  267. data/vendor/spidermonkey/jsmath.c +0 -567
  268. data/vendor/spidermonkey/jsmath.h +0 -57
  269. data/vendor/spidermonkey/jsnum.c +0 -1239
  270. data/vendor/spidermonkey/jsnum.h +0 -283
  271. data/vendor/spidermonkey/jsobj.c +0 -5282
  272. data/vendor/spidermonkey/jsobj.h +0 -709
  273. data/vendor/spidermonkey/jsopcode.c +0 -5245
  274. data/vendor/spidermonkey/jsopcode.h +0 -394
  275. data/vendor/spidermonkey/jsopcode.tbl +0 -523
  276. data/vendor/spidermonkey/jsotypes.h +0 -202
  277. data/vendor/spidermonkey/jsparse.c +0 -6704
  278. data/vendor/spidermonkey/jsparse.h +0 -511
  279. data/vendor/spidermonkey/jsprf.c +0 -1264
  280. data/vendor/spidermonkey/jsprf.h +0 -150
  281. data/vendor/spidermonkey/jsproto.tbl +0 -128
  282. data/vendor/spidermonkey/jsprvtd.h +0 -267
  283. data/vendor/spidermonkey/jspubtd.h +0 -744
  284. data/vendor/spidermonkey/jsregexp.c +0 -4364
  285. data/vendor/spidermonkey/jsregexp.h +0 -183
  286. data/vendor/spidermonkey/jsreops.tbl +0 -145
  287. data/vendor/spidermonkey/jsscan.c +0 -2012
  288. data/vendor/spidermonkey/jsscan.h +0 -387
  289. data/vendor/spidermonkey/jsscope.c +0 -1957
  290. data/vendor/spidermonkey/jsscope.h +0 -418
  291. data/vendor/spidermonkey/jsscript.c +0 -1832
  292. data/vendor/spidermonkey/jsscript.h +0 -287
  293. data/vendor/spidermonkey/jsshell.msg +0 -50
  294. data/vendor/spidermonkey/jsstddef.h +0 -83
  295. data/vendor/spidermonkey/jsstr.c +0 -5005
  296. data/vendor/spidermonkey/jsstr.h +0 -641
  297. data/vendor/spidermonkey/jstypes.h +0 -475
  298. data/vendor/spidermonkey/jsutil.c +0 -345
  299. data/vendor/spidermonkey/jsutil.h +0 -157
  300. data/vendor/spidermonkey/jsxdrapi.c +0 -800
  301. data/vendor/spidermonkey/jsxdrapi.h +0 -218
  302. data/vendor/spidermonkey/jsxml.c +0 -8476
  303. data/vendor/spidermonkey/jsxml.h +0 -349
  304. data/vendor/spidermonkey/lock_SunOS.s +0 -119
  305. data/vendor/spidermonkey/perfect.js +0 -39
  306. data/vendor/spidermonkey/plify_jsdhash.sed +0 -36
  307. data/vendor/spidermonkey/prmjtime.c +0 -846
  308. data/vendor/spidermonkey/prmjtime.h +0 -103
  309. data/vendor/spidermonkey/resource.h +0 -15
  310. data/vendor/spidermonkey/rules.mk +0 -197
  311. data/vendor/spidermonkey/win32.order +0 -384
@@ -1,1369 +0,0 @@
1
- /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2
- *
3
- * ***** BEGIN LICENSE BLOCK *****
4
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5
- *
6
- * The contents of this file are subject to the Mozilla Public License Version
7
- * 1.1 (the "License"); you may not use this file except in compliance with
8
- * the License. You may obtain a copy of the License at
9
- * http://www.mozilla.org/MPL/
10
- *
11
- * Software distributed under the License is distributed on an "AS IS" basis,
12
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13
- * for the specific language governing rights and limitations under the
14
- * License.
15
- *
16
- * The Original Code is Mozilla Communicator client code, released
17
- * March 31, 1998.
18
- *
19
- * The Initial Developer of the Original Code is
20
- * Simmule Turner and Rich Salz.
21
- * Portions created by the Initial Developer are Copyright (C) 1998
22
- * the Initial Developer. All Rights Reserved.
23
- *
24
- * Contributor(s):
25
- *
26
- * Alternatively, the contents of this file may be used under the terms of
27
- * either the GNU General Public License Version 2 or later (the "GPL"), or
28
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29
- * in which case the provisions of the GPL or the LGPL are applicable instead
30
- * of those above. If you wish to allow use of your version of this file only
31
- * under the terms of either the GPL or the LGPL, and not to allow others to
32
- * use your version of this file under the terms of the MPL, indicate your
33
- * decision by deleting the provisions above and replace them with the notice
34
- * and other provisions required by the GPL or the LGPL. If you do not delete
35
- * the provisions above, a recipient may use your version of this file under
36
- * the terms of any one of the MPL, the GPL or the LGPL.
37
- *
38
- * ***** END LICENSE BLOCK ***** */
39
-
40
- /*
41
- * Copyright 1992,1993 Simmule Turner and Rich Salz. All rights reserved.
42
- *
43
- * This software is not subject to any license of the American Telephone
44
- * and Telegraph Company or of the Regents of the University of California.
45
- *
46
- * Permission is granted to anyone to use this software for any purpose on
47
- * any computer system, and to alter it and redistribute it freely, subject
48
- * to the following restrictions:
49
- * 1. The authors are not responsible for the consequences of use of this
50
- * software, no matter how awful, even if they arise from flaws in it.
51
- * 2. The origin of this software must not be misrepresented, either by
52
- * explicit claim or by omission. Since few users ever read sources,
53
- * credits must appear in the documentation.
54
- * 3. Altered versions must be plainly marked as such, and must not be
55
- * misrepresented as being the original software. Since few users
56
- * ever read sources, credits must appear in the documentation.
57
- * 4. This notice may not be removed or altered.
58
- */
59
-
60
-
61
- /*
62
- ** Main editing routines for editline library.
63
- */
64
- #include "editline.h"
65
- #include <signal.h>
66
- #include <ctype.h>
67
-
68
- /*
69
- ** Manifest constants.
70
- */
71
- #define SCREEN_WIDTH 80
72
- #define SCREEN_ROWS 24
73
- #define NO_ARG (-1)
74
- #define DEL 127
75
- #define CTL(x) ((x) & 0x1F)
76
- #define ISCTL(x) ((x) && (x) < ' ')
77
- #define UNCTL(x) ((x) + 64)
78
- #define META(x) ((x) | 0x80)
79
- #define ISMETA(x) ((x) & 0x80)
80
- #define UNMETA(x) ((x) & 0x7F)
81
- #if !defined(HIST_SIZE)
82
- #define HIST_SIZE 20
83
- #endif /* !defined(HIST_SIZE) */
84
-
85
- /*
86
- ** Command status codes.
87
- */
88
- typedef enum _STATUS {
89
- CSdone, CSeof, CSmove, CSdispatch, CSstay, CSsignal
90
- } STATUS;
91
-
92
- /*
93
- ** The type of case-changing to perform.
94
- */
95
- typedef enum _CASE {
96
- TOupper, TOlower
97
- } CASE;
98
-
99
- /*
100
- ** Key to command mapping.
101
- */
102
- typedef struct _KEYMAP {
103
- CHAR Key;
104
- STATUS (*Function)();
105
- } KEYMAP;
106
-
107
- /*
108
- ** Command history structure.
109
- */
110
- typedef struct _HISTORY {
111
- int Size;
112
- int Pos;
113
- CHAR *Lines[HIST_SIZE];
114
- } HISTORY;
115
-
116
- /*
117
- ** Globals.
118
- */
119
- int rl_eof;
120
- int rl_erase;
121
- int rl_intr;
122
- int rl_kill;
123
- int rl_quit;
124
-
125
- STATIC CHAR NIL[] = "";
126
- STATIC CONST CHAR *Input = NIL;
127
- STATIC CHAR *Line;
128
- STATIC CONST char *Prompt;
129
- STATIC CHAR *Yanked;
130
- STATIC char *Screen;
131
- STATIC char NEWLINE[]= CRLF;
132
- STATIC HISTORY H;
133
- STATIC int Repeat;
134
- STATIC int End;
135
- STATIC int Mark;
136
- STATIC int OldPoint;
137
- STATIC int Point;
138
- STATIC int PushBack;
139
- STATIC int Pushed;
140
- STATIC int Signal;
141
- FORWARD KEYMAP Map[32];
142
- FORWARD KEYMAP MetaMap[16];
143
- STATIC SIZE_T Length;
144
- STATIC SIZE_T ScreenCount;
145
- STATIC SIZE_T ScreenSize;
146
- STATIC char *backspace;
147
- STATIC int TTYwidth;
148
- STATIC int TTYrows;
149
-
150
- /* Display print 8-bit chars as `M-x' or as the actual 8-bit char? */
151
- int rl_meta_chars = 0;
152
-
153
- /*
154
- ** Declarations.
155
- */
156
- STATIC CHAR *editinput();
157
- extern int read();
158
- extern int write();
159
- #if defined(USE_TERMCAP)
160
- extern char *getenv();
161
- extern char *tgetstr();
162
- extern int tgetent();
163
- #endif /* defined(USE_TERMCAP) */
164
-
165
- /*
166
- ** TTY input/output functions.
167
- */
168
-
169
- STATIC void
170
- TTYflush()
171
- {
172
- if (ScreenCount) {
173
- (void)write(1, Screen, ScreenCount);
174
- ScreenCount = 0;
175
- }
176
- }
177
-
178
- STATIC void
179
- TTYput(c)
180
- CHAR c;
181
- {
182
- Screen[ScreenCount] = c;
183
- if (++ScreenCount >= ScreenSize - 1) {
184
- ScreenSize += SCREEN_INC;
185
- RENEW(Screen, char, ScreenSize);
186
- }
187
- }
188
-
189
- STATIC void
190
- TTYputs(p)
191
- CHAR *p;
192
- {
193
- while (*p)
194
- TTYput(*p++);
195
- }
196
-
197
- STATIC void
198
- TTYshow(c)
199
- CHAR c;
200
- {
201
- if (c == DEL) {
202
- TTYput('^');
203
- TTYput('?');
204
- }
205
- else if (ISCTL(c)) {
206
- TTYput('^');
207
- TTYput(UNCTL(c));
208
- }
209
- else if (rl_meta_chars && ISMETA(c)) {
210
- TTYput('M');
211
- TTYput('-');
212
- TTYput(UNMETA(c));
213
- }
214
- else
215
- TTYput(c);
216
- }
217
-
218
- STATIC void
219
- TTYstring(p)
220
- CHAR *p;
221
- {
222
- while (*p)
223
- TTYshow(*p++);
224
- }
225
-
226
- STATIC unsigned int
227
- TTYget()
228
- {
229
- CHAR c;
230
-
231
- TTYflush();
232
- if (Pushed) {
233
- Pushed = 0;
234
- return PushBack;
235
- }
236
- if (*Input)
237
- return *Input++;
238
- return read(0, &c, (SIZE_T)1) == 1 ? c : EOF;
239
- }
240
-
241
- #define TTYback() (backspace ? TTYputs((CHAR *)backspace) : TTYput('\b'))
242
-
243
- STATIC void
244
- TTYbackn(n)
245
- int n;
246
- {
247
- while (--n >= 0)
248
- TTYback();
249
- }
250
-
251
- STATIC void
252
- TTYinfo()
253
- {
254
- static int init;
255
- #if defined(USE_TERMCAP)
256
- char *term;
257
- char buff[2048];
258
- char *bp, *p;
259
- #endif /* defined(USE_TERMCAP) */
260
- #if defined(TIOCGWINSZ)
261
- struct winsize W;
262
- #endif /* defined(TIOCGWINSZ) */
263
-
264
- if (init) {
265
- #if defined(TIOCGWINSZ)
266
- /* Perhaps we got resized. */
267
- if (ioctl(0, TIOCGWINSZ, &W) >= 0
268
- && W.ws_col > 0 && W.ws_row > 0) {
269
- TTYwidth = (int)W.ws_col;
270
- TTYrows = (int)W.ws_row;
271
- }
272
- #endif /* defined(TIOCGWINSZ) */
273
- return;
274
- }
275
- init++;
276
-
277
- TTYwidth = TTYrows = 0;
278
- #if defined(USE_TERMCAP)
279
- bp = &buff[0];
280
- if ((term = getenv("TERM")) == NULL)
281
- term = "dumb";
282
- if (tgetent(buff, term) < 0) {
283
- TTYwidth = SCREEN_WIDTH;
284
- TTYrows = SCREEN_ROWS;
285
- return;
286
- }
287
- p = tgetstr("le", &bp);
288
- backspace = p ? strdup(p) : NULL;
289
- TTYwidth = tgetnum("co");
290
- TTYrows = tgetnum("li");
291
- #endif /* defined(USE_TERMCAP) */
292
-
293
- #if defined(TIOCGWINSZ)
294
- if (ioctl(0, TIOCGWINSZ, &W) >= 0) {
295
- TTYwidth = (int)W.ws_col;
296
- TTYrows = (int)W.ws_row;
297
- }
298
- #endif /* defined(TIOCGWINSZ) */
299
-
300
- if (TTYwidth <= 0 || TTYrows <= 0) {
301
- TTYwidth = SCREEN_WIDTH;
302
- TTYrows = SCREEN_ROWS;
303
- }
304
- }
305
-
306
-
307
- STATIC void
308
- reposition()
309
- {
310
- int i;
311
- CHAR *p;
312
-
313
- TTYput('\r');
314
- TTYputs((CONST CHAR *)Prompt);
315
- for (i = Point, p = Line; --i >= 0; p++)
316
- TTYshow(*p);
317
- }
318
-
319
- STATIC void
320
- left(Change)
321
- STATUS Change;
322
- {
323
- TTYback();
324
- if (Point) {
325
- if (ISCTL(Line[Point - 1]))
326
- TTYback();
327
- else if (rl_meta_chars && ISMETA(Line[Point - 1])) {
328
- TTYback();
329
- TTYback();
330
- }
331
- }
332
- if (Change == CSmove)
333
- Point--;
334
- }
335
-
336
- STATIC void
337
- right(Change)
338
- STATUS Change;
339
- {
340
- TTYshow(Line[Point]);
341
- if (Change == CSmove)
342
- Point++;
343
- }
344
-
345
- STATIC STATUS
346
- ring_bell()
347
- {
348
- TTYput('\07');
349
- TTYflush();
350
- return CSstay;
351
- }
352
-
353
- STATIC STATUS
354
- do_macro(c)
355
- unsigned int c;
356
- {
357
- CHAR name[4];
358
-
359
- name[0] = '_';
360
- name[1] = c;
361
- name[2] = '_';
362
- name[3] = '\0';
363
-
364
- if ((Input = (CHAR *)getenv((char *)name)) == NULL) {
365
- Input = NIL;
366
- return ring_bell();
367
- }
368
- return CSstay;
369
- }
370
-
371
- STATIC STATUS
372
- do_forward(move)
373
- STATUS move;
374
- {
375
- int i;
376
- CHAR *p;
377
-
378
- i = 0;
379
- do {
380
- p = &Line[Point];
381
- for ( ; Point < End && (*p == ' ' || !isalnum(*p)); Point++, p++)
382
- if (move == CSmove)
383
- right(CSstay);
384
-
385
- for (; Point < End && isalnum(*p); Point++, p++)
386
- if (move == CSmove)
387
- right(CSstay);
388
-
389
- if (Point == End)
390
- break;
391
- } while (++i < Repeat);
392
-
393
- return CSstay;
394
- }
395
-
396
- STATIC STATUS
397
- do_case(type)
398
- CASE type;
399
- {
400
- int i;
401
- int end;
402
- int count;
403
- CHAR *p;
404
-
405
- (void)do_forward(CSstay);
406
- if (OldPoint != Point) {
407
- if ((count = Point - OldPoint) < 0)
408
- count = -count;
409
- Point = OldPoint;
410
- if ((end = Point + count) > End)
411
- end = End;
412
- for (i = Point, p = &Line[i]; i < end; i++, p++) {
413
- if (type == TOupper) {
414
- if (islower(*p))
415
- *p = toupper(*p);
416
- }
417
- else if (isupper(*p))
418
- *p = tolower(*p);
419
- right(CSmove);
420
- }
421
- }
422
- return CSstay;
423
- }
424
-
425
- STATIC STATUS
426
- case_down_word()
427
- {
428
- return do_case(TOlower);
429
- }
430
-
431
- STATIC STATUS
432
- case_up_word()
433
- {
434
- return do_case(TOupper);
435
- }
436
-
437
- STATIC void
438
- ceol()
439
- {
440
- int extras;
441
- int i;
442
- CHAR *p;
443
-
444
- for (extras = 0, i = Point, p = &Line[i]; i <= End; i++, p++) {
445
- TTYput(' ');
446
- if (ISCTL(*p)) {
447
- TTYput(' ');
448
- extras++;
449
- }
450
- else if (rl_meta_chars && ISMETA(*p)) {
451
- TTYput(' ');
452
- TTYput(' ');
453
- extras += 2;
454
- }
455
- }
456
-
457
- for (i += extras; i > Point; i--)
458
- TTYback();
459
- }
460
-
461
- STATIC void
462
- clear_line()
463
- {
464
- Point = -strlen(Prompt);
465
- TTYput('\r');
466
- ceol();
467
- Point = 0;
468
- End = 0;
469
- Line[0] = '\0';
470
- }
471
-
472
- STATIC STATUS
473
- insert_string(p)
474
- CHAR *p;
475
- {
476
- SIZE_T len;
477
- int i;
478
- CHAR *new;
479
- CHAR *q;
480
-
481
- len = strlen((char *)p);
482
- if (End + len >= Length) {
483
- if ((new = NEW(CHAR, Length + len + MEM_INC)) == NULL)
484
- return CSstay;
485
- if (Length) {
486
- COPYFROMTO(new, Line, Length);
487
- DISPOSE(Line);
488
- }
489
- Line = new;
490
- Length += len + MEM_INC;
491
- }
492
-
493
- for (q = &Line[Point], i = End - Point; --i >= 0; )
494
- q[len + i] = q[i];
495
- COPYFROMTO(&Line[Point], p, len);
496
- End += len;
497
- Line[End] = '\0';
498
- TTYstring(&Line[Point]);
499
- Point += len;
500
-
501
- return Point == End ? CSstay : CSmove;
502
- }
503
-
504
- STATIC STATUS
505
- redisplay()
506
- {
507
- TTYputs((CONST CHAR *)NEWLINE);
508
- TTYputs((CONST CHAR *)Prompt);
509
- TTYstring(Line);
510
- return CSmove;
511
- }
512
-
513
- STATIC STATUS
514
- toggle_meta_mode()
515
- {
516
- rl_meta_chars = ! rl_meta_chars;
517
- return redisplay();
518
- }
519
-
520
-
521
- STATIC CHAR *
522
- next_hist()
523
- {
524
- return H.Pos >= H.Size - 1 ? NULL : H.Lines[++H.Pos];
525
- }
526
-
527
- STATIC CHAR *
528
- prev_hist()
529
- {
530
- return H.Pos == 0 ? NULL : H.Lines[--H.Pos];
531
- }
532
-
533
- STATIC STATUS
534
- do_insert_hist(p)
535
- CHAR *p;
536
- {
537
- if (p == NULL)
538
- return ring_bell();
539
- Point = 0;
540
- reposition();
541
- ceol();
542
- End = 0;
543
- return insert_string(p);
544
- }
545
-
546
- STATIC STATUS
547
- do_hist(move)
548
- CHAR *(*move)();
549
- {
550
- CHAR *p;
551
- int i;
552
-
553
- i = 0;
554
- do {
555
- if ((p = (*move)()) == NULL)
556
- return ring_bell();
557
- } while (++i < Repeat);
558
- return do_insert_hist(p);
559
- }
560
-
561
- STATIC STATUS
562
- h_next()
563
- {
564
- return do_hist(next_hist);
565
- }
566
-
567
- STATIC STATUS
568
- h_prev()
569
- {
570
- return do_hist(prev_hist);
571
- }
572
-
573
- STATIC STATUS
574
- h_first()
575
- {
576
- return do_insert_hist(H.Lines[H.Pos = 0]);
577
- }
578
-
579
- STATIC STATUS
580
- h_last()
581
- {
582
- return do_insert_hist(H.Lines[H.Pos = H.Size - 1]);
583
- }
584
-
585
- /*
586
- ** Return zero if pat appears as a substring in text.
587
- */
588
- STATIC int
589
- substrcmp(text, pat, len)
590
- char *text;
591
- char *pat;
592
- int len;
593
- {
594
- char c;
595
-
596
- if ((c = *pat) == '\0')
597
- return *text == '\0';
598
- for ( ; *text; text++)
599
- if (*text == c && strncmp(text, pat, len) == 0)
600
- return 0;
601
- return 1;
602
- }
603
-
604
- STATIC CHAR *
605
- search_hist(search, move)
606
- CHAR *search;
607
- CHAR *(*move)();
608
- {
609
- static CHAR *old_search;
610
- int len;
611
- int pos;
612
- int (*match)();
613
- char *pat;
614
-
615
- /* Save or get remembered search pattern. */
616
- if (search && *search) {
617
- if (old_search)
618
- DISPOSE(old_search);
619
- old_search = (CHAR *)strdup((char *)search);
620
- }
621
- else {
622
- if (old_search == NULL || *old_search == '\0')
623
- return NULL;
624
- search = old_search;
625
- }
626
-
627
- /* Set up pattern-finder. */
628
- if (*search == '^') {
629
- match = strncmp;
630
- pat = (char *)(search + 1);
631
- }
632
- else {
633
- match = substrcmp;
634
- pat = (char *)search;
635
- }
636
- len = strlen(pat);
637
-
638
- for (pos = H.Pos; (*move)() != NULL; )
639
- if ((*match)((char *)H.Lines[H.Pos], pat, len) == 0)
640
- return H.Lines[H.Pos];
641
- H.Pos = pos;
642
- return NULL;
643
- }
644
-
645
- STATIC STATUS
646
- h_search()
647
- {
648
- static int Searching;
649
- CONST char *old_prompt;
650
- CHAR *(*move)();
651
- CHAR *p;
652
-
653
- if (Searching)
654
- return ring_bell();
655
- Searching = 1;
656
-
657
- clear_line();
658
- old_prompt = Prompt;
659
- Prompt = "Search: ";
660
- TTYputs((CONST CHAR *)Prompt);
661
- move = Repeat == NO_ARG ? prev_hist : next_hist;
662
- p = editinput();
663
- Prompt = old_prompt;
664
- Searching = 0;
665
- TTYputs((CONST CHAR *)Prompt);
666
- if (p == NULL && Signal > 0) {
667
- Signal = 0;
668
- clear_line();
669
- return redisplay();
670
- }
671
- p = search_hist(p, move);
672
- clear_line();
673
- if (p == NULL) {
674
- (void)ring_bell();
675
- return redisplay();
676
- }
677
- return do_insert_hist(p);
678
- }
679
-
680
- STATIC STATUS
681
- fd_char()
682
- {
683
- int i;
684
-
685
- i = 0;
686
- do {
687
- if (Point >= End)
688
- break;
689
- right(CSmove);
690
- } while (++i < Repeat);
691
- return CSstay;
692
- }
693
-
694
- STATIC void
695
- save_yank(begin, i)
696
- int begin;
697
- int i;
698
- {
699
- if (Yanked) {
700
- DISPOSE(Yanked);
701
- Yanked = NULL;
702
- }
703
-
704
- if (i < 1)
705
- return;
706
-
707
- if ((Yanked = NEW(CHAR, (SIZE_T)i + 1)) != NULL) {
708
- COPYFROMTO(Yanked, &Line[begin], i);
709
- Yanked[i] = '\0';
710
- }
711
- }
712
-
713
- STATIC STATUS
714
- delete_string(count)
715
- int count;
716
- {
717
- int i;
718
- CHAR *p;
719
-
720
- if (count <= 0 || End == Point)
721
- return ring_bell();
722
-
723
- if (count == 1 && Point == End - 1) {
724
- /* Optimize common case of delete at end of line. */
725
- End--;
726
- p = &Line[Point];
727
- i = 1;
728
- TTYput(' ');
729
- if (ISCTL(*p)) {
730
- i = 2;
731
- TTYput(' ');
732
- }
733
- else if (rl_meta_chars && ISMETA(*p)) {
734
- i = 3;
735
- TTYput(' ');
736
- TTYput(' ');
737
- }
738
- TTYbackn(i);
739
- *p = '\0';
740
- return CSmove;
741
- }
742
- if (Point + count > End && (count = End - Point) <= 0)
743
- return CSstay;
744
-
745
- if (count > 1)
746
- save_yank(Point, count);
747
-
748
- for (p = &Line[Point], i = End - (Point + count) + 1; --i >= 0; p++)
749
- p[0] = p[count];
750
- ceol();
751
- End -= count;
752
- TTYstring(&Line[Point]);
753
- return CSmove;
754
- }
755
-
756
- STATIC STATUS
757
- bk_char()
758
- {
759
- int i;
760
-
761
- i = 0;
762
- do {
763
- if (Point == 0)
764
- break;
765
- left(CSmove);
766
- } while (++i < Repeat);
767
-
768
- return CSstay;
769
- }
770
-
771
- STATIC STATUS
772
- bk_del_char()
773
- {
774
- int i;
775
-
776
- i = 0;
777
- do {
778
- if (Point == 0)
779
- break;
780
- left(CSmove);
781
- } while (++i < Repeat);
782
-
783
- return delete_string(i);
784
- }
785
-
786
- STATIC STATUS
787
- kill_line()
788
- {
789
- int i;
790
-
791
- if (Repeat != NO_ARG) {
792
- if (Repeat < Point) {
793
- i = Point;
794
- Point = Repeat;
795
- reposition();
796
- (void)delete_string(i - Point);
797
- }
798
- else if (Repeat > Point) {
799
- right(CSmove);
800
- (void)delete_string(Repeat - Point - 1);
801
- }
802
- return CSmove;
803
- }
804
-
805
- save_yank(Point, End - Point);
806
- Line[Point] = '\0';
807
- ceol();
808
- End = Point;
809
- return CSstay;
810
- }
811
-
812
- STATIC STATUS
813
- insert_char(c)
814
- int c;
815
- {
816
- STATUS s;
817
- CHAR buff[2];
818
- CHAR *p;
819
- CHAR *q;
820
- int i;
821
-
822
- if (Repeat == NO_ARG || Repeat < 2) {
823
- buff[0] = c;
824
- buff[1] = '\0';
825
- return insert_string(buff);
826
- }
827
-
828
- if ((p = NEW(CHAR, Repeat + 1)) == NULL)
829
- return CSstay;
830
- for (i = Repeat, q = p; --i >= 0; )
831
- *q++ = c;
832
- *q = '\0';
833
- Repeat = 0;
834
- s = insert_string(p);
835
- DISPOSE(p);
836
- return s;
837
- }
838
-
839
- STATIC STATUS
840
- meta()
841
- {
842
- unsigned int c;
843
- KEYMAP *kp;
844
-
845
- if ((c = TTYget()) == EOF)
846
- return CSeof;
847
- #if defined(ANSI_ARROWS)
848
- /* Also include VT-100 arrows. */
849
- if (c == '[' || c == 'O')
850
- switch (c = TTYget()) {
851
- default: return ring_bell();
852
- case EOF: return CSeof;
853
- case 'A': return h_prev();
854
- case 'B': return h_next();
855
- case 'C': return fd_char();
856
- case 'D': return bk_char();
857
- }
858
- #endif /* defined(ANSI_ARROWS) */
859
-
860
- if (isdigit(c)) {
861
- for (Repeat = c - '0'; (c = TTYget()) != EOF && isdigit(c); )
862
- Repeat = Repeat * 10 + c - '0';
863
- Pushed = 1;
864
- PushBack = c;
865
- return CSstay;
866
- }
867
-
868
- if (isupper(c))
869
- return do_macro(c);
870
- for (OldPoint = Point, kp = MetaMap; kp->Function; kp++)
871
- if (kp->Key == c)
872
- return (*kp->Function)();
873
-
874
- return ring_bell();
875
- }
876
-
877
- STATIC STATUS
878
- emacs(c)
879
- unsigned int c;
880
- {
881
- STATUS s;
882
- KEYMAP *kp;
883
-
884
- if (rl_meta_chars && ISMETA(c)) {
885
- Pushed = 1;
886
- PushBack = UNMETA(c);
887
- return meta();
888
- }
889
- for (kp = Map; kp->Function; kp++)
890
- if (kp->Key == c)
891
- break;
892
- s = kp->Function ? (*kp->Function)() : insert_char((int)c);
893
- if (!Pushed)
894
- /* No pushback means no repeat count; hacky, but true. */
895
- Repeat = NO_ARG;
896
- return s;
897
- }
898
-
899
- STATIC STATUS
900
- TTYspecial(c)
901
- unsigned int c;
902
- {
903
- if (ISMETA(c))
904
- return CSdispatch;
905
-
906
- if (c == rl_erase || c == DEL)
907
- return bk_del_char();
908
- if (c == rl_kill) {
909
- if (Point != 0) {
910
- Point = 0;
911
- reposition();
912
- }
913
- Repeat = NO_ARG;
914
- return kill_line();
915
- }
916
- if (c == rl_eof && Point == 0 && End == 0)
917
- return CSeof;
918
- if (c == rl_intr) {
919
- Signal = SIGINT;
920
- return CSsignal;
921
- }
922
- if (c == rl_quit) {
923
- Signal = SIGQUIT;
924
- return CSeof;
925
- }
926
-
927
- return CSdispatch;
928
- }
929
-
930
- STATIC CHAR *
931
- editinput()
932
- {
933
- unsigned int c;
934
-
935
- Repeat = NO_ARG;
936
- OldPoint = Point = Mark = End = 0;
937
- Line[0] = '\0';
938
-
939
- Signal = -1;
940
- while ((c = TTYget()) != EOF)
941
- switch (TTYspecial(c)) {
942
- case CSdone:
943
- return Line;
944
- case CSeof:
945
- return NULL;
946
- case CSsignal:
947
- return (CHAR *)"";
948
- case CSmove:
949
- reposition();
950
- break;
951
- case CSdispatch:
952
- switch (emacs(c)) {
953
- case CSdone:
954
- return Line;
955
- case CSeof:
956
- return NULL;
957
- case CSsignal:
958
- return (CHAR *)"";
959
- case CSmove:
960
- reposition();
961
- break;
962
- case CSdispatch:
963
- case CSstay:
964
- break;
965
- }
966
- break;
967
- case CSstay:
968
- break;
969
- }
970
- return NULL;
971
- }
972
-
973
- STATIC void
974
- hist_add(p)
975
- CHAR *p;
976
- {
977
- int i;
978
-
979
- if ((p = (CHAR *)strdup((char *)p)) == NULL)
980
- return;
981
- if (H.Size < HIST_SIZE)
982
- H.Lines[H.Size++] = p;
983
- else {
984
- DISPOSE(H.Lines[0]);
985
- for (i = 0; i < HIST_SIZE - 1; i++)
986
- H.Lines[i] = H.Lines[i + 1];
987
- H.Lines[i] = p;
988
- }
989
- H.Pos = H.Size - 1;
990
- }
991
-
992
- /*
993
- ** For compatibility with FSF readline.
994
- */
995
- /* ARGSUSED0 */
996
- void
997
- rl_reset_terminal(p)
998
- char *p;
999
- {
1000
- }
1001
-
1002
- void
1003
- rl_initialize()
1004
- {
1005
- }
1006
-
1007
- char *
1008
- readline(prompt)
1009
- CONST char *prompt;
1010
- {
1011
- CHAR *line;
1012
- int s;
1013
-
1014
- if (Line == NULL) {
1015
- Length = MEM_INC;
1016
- if ((Line = NEW(CHAR, Length)) == NULL)
1017
- return NULL;
1018
- }
1019
-
1020
- TTYinfo();
1021
- rl_ttyset(0);
1022
- hist_add(NIL);
1023
- ScreenSize = SCREEN_INC;
1024
- Screen = NEW(char, ScreenSize);
1025
- Prompt = prompt ? prompt : (char *)NIL;
1026
- TTYputs((CONST CHAR *)Prompt);
1027
- if ((line = editinput()) != NULL) {
1028
- line = (CHAR *)strdup((char *)line);
1029
- TTYputs((CHAR *)NEWLINE);
1030
- TTYflush();
1031
- }
1032
- rl_ttyset(1);
1033
- DISPOSE(Screen);
1034
- DISPOSE(H.Lines[--H.Size]);
1035
- if (Signal > 0) {
1036
- s = Signal;
1037
- Signal = 0;
1038
- (void)kill(getpid(), s);
1039
- }
1040
- return (char *)line;
1041
- }
1042
-
1043
- void
1044
- add_history(p)
1045
- char *p;
1046
- {
1047
- if (p == NULL || *p == '\0')
1048
- return;
1049
-
1050
- #if defined(UNIQUE_HISTORY)
1051
- if (H.Size && strcmp(p, H.Lines[H.Size - 1]) == 0)
1052
- return;
1053
- #endif /* defined(UNIQUE_HISTORY) */
1054
- hist_add((CHAR *)p);
1055
- }
1056
-
1057
-
1058
- STATIC STATUS
1059
- beg_line()
1060
- {
1061
- if (Point) {
1062
- Point = 0;
1063
- return CSmove;
1064
- }
1065
- return CSstay;
1066
- }
1067
-
1068
- STATIC STATUS
1069
- del_char()
1070
- {
1071
- return delete_string(Repeat == NO_ARG ? 1 : Repeat);
1072
- }
1073
-
1074
- STATIC STATUS
1075
- end_line()
1076
- {
1077
- if (Point != End) {
1078
- Point = End;
1079
- return CSmove;
1080
- }
1081
- return CSstay;
1082
- }
1083
-
1084
- STATIC STATUS
1085
- accept_line()
1086
- {
1087
- Line[End] = '\0';
1088
- return CSdone;
1089
- }
1090
-
1091
- STATIC STATUS
1092
- transpose()
1093
- {
1094
- CHAR c;
1095
-
1096
- if (Point) {
1097
- if (Point == End)
1098
- left(CSmove);
1099
- c = Line[Point - 1];
1100
- left(CSstay);
1101
- Line[Point - 1] = Line[Point];
1102
- TTYshow(Line[Point - 1]);
1103
- Line[Point++] = c;
1104
- TTYshow(c);
1105
- }
1106
- return CSstay;
1107
- }
1108
-
1109
- STATIC STATUS
1110
- quote()
1111
- {
1112
- unsigned int c;
1113
-
1114
- return (c = TTYget()) == EOF ? CSeof : insert_char((int)c);
1115
- }
1116
-
1117
- STATIC STATUS
1118
- wipe()
1119
- {
1120
- int i;
1121
-
1122
- if (Mark > End)
1123
- return ring_bell();
1124
-
1125
- if (Point > Mark) {
1126
- i = Point;
1127
- Point = Mark;
1128
- Mark = i;
1129
- reposition();
1130
- }
1131
-
1132
- return delete_string(Mark - Point);
1133
- }
1134
-
1135
- STATIC STATUS
1136
- mk_set()
1137
- {
1138
- Mark = Point;
1139
- return CSstay;
1140
- }
1141
-
1142
- STATIC STATUS
1143
- exchange()
1144
- {
1145
- unsigned int c;
1146
-
1147
- if ((c = TTYget()) != CTL('X'))
1148
- return c == EOF ? CSeof : ring_bell();
1149
-
1150
- if ((c = Mark) <= End) {
1151
- Mark = Point;
1152
- Point = c;
1153
- return CSmove;
1154
- }
1155
- return CSstay;
1156
- }
1157
-
1158
- STATIC STATUS
1159
- yank()
1160
- {
1161
- if (Yanked && *Yanked)
1162
- return insert_string(Yanked);
1163
- return CSstay;
1164
- }
1165
-
1166
- STATIC STATUS
1167
- copy_region()
1168
- {
1169
- if (Mark > End)
1170
- return ring_bell();
1171
-
1172
- if (Point > Mark)
1173
- save_yank(Mark, Point - Mark);
1174
- else
1175
- save_yank(Point, Mark - Point);
1176
-
1177
- return CSstay;
1178
- }
1179
-
1180
- STATIC STATUS
1181
- move_to_char()
1182
- {
1183
- unsigned int c;
1184
- int i;
1185
- CHAR *p;
1186
-
1187
- if ((c = TTYget()) == EOF)
1188
- return CSeof;
1189
- for (i = Point + 1, p = &Line[i]; i < End; i++, p++)
1190
- if (*p == c) {
1191
- Point = i;
1192
- return CSmove;
1193
- }
1194
- return CSstay;
1195
- }
1196
-
1197
- STATIC STATUS
1198
- fd_word()
1199
- {
1200
- return do_forward(CSmove);
1201
- }
1202
-
1203
- STATIC STATUS
1204
- fd_kill_word()
1205
- {
1206
- int i;
1207
-
1208
- (void)do_forward(CSstay);
1209
- if (OldPoint != Point) {
1210
- i = Point - OldPoint;
1211
- Point = OldPoint;
1212
- return delete_string(i);
1213
- }
1214
- return CSstay;
1215
- }
1216
-
1217
- STATIC STATUS
1218
- bk_word()
1219
- {
1220
- int i;
1221
- CHAR *p;
1222
-
1223
- i = 0;
1224
- do {
1225
- for (p = &Line[Point]; p > Line && !isalnum(p[-1]); p--)
1226
- left(CSmove);
1227
-
1228
- for (; p > Line && p[-1] != ' ' && isalnum(p[-1]); p--)
1229
- left(CSmove);
1230
-
1231
- if (Point == 0)
1232
- break;
1233
- } while (++i < Repeat);
1234
-
1235
- return CSstay;
1236
- }
1237
-
1238
- STATIC STATUS
1239
- bk_kill_word()
1240
- {
1241
- (void)bk_word();
1242
- if (OldPoint != Point)
1243
- return delete_string(OldPoint - Point);
1244
- return CSstay;
1245
- }
1246
-
1247
- STATIC int
1248
- argify(line, avp)
1249
- CHAR *line;
1250
- CHAR ***avp;
1251
- {
1252
- CHAR *c;
1253
- CHAR **p;
1254
- CHAR **new;
1255
- int ac;
1256
- int i;
1257
-
1258
- i = MEM_INC;
1259
- if ((*avp = p = NEW(CHAR*, i))== NULL)
1260
- return 0;
1261
-
1262
- for (c = line; isspace(*c); c++)
1263
- continue;
1264
- if (*c == '\n' || *c == '\0')
1265
- return 0;
1266
-
1267
- for (ac = 0, p[ac++] = c; *c && *c != '\n'; ) {
1268
- if (isspace(*c)) {
1269
- *c++ = '\0';
1270
- if (*c && *c != '\n') {
1271
- if (ac + 1 == i) {
1272
- new = NEW(CHAR*, i + MEM_INC);
1273
- if (new == NULL) {
1274
- p[ac] = NULL;
1275
- return ac;
1276
- }
1277
- COPYFROMTO(new, p, i * sizeof (char **));
1278
- i += MEM_INC;
1279
- DISPOSE(p);
1280
- *avp = p = new;
1281
- }
1282
- p[ac++] = c;
1283
- }
1284
- }
1285
- else
1286
- c++;
1287
- }
1288
- *c = '\0';
1289
- p[ac] = NULL;
1290
- return ac;
1291
- }
1292
-
1293
- STATIC STATUS
1294
- last_argument()
1295
- {
1296
- CHAR **av;
1297
- CHAR *p;
1298
- STATUS s;
1299
- int ac;
1300
-
1301
- if (H.Size == 1 || (p = H.Lines[H.Size - 2]) == NULL)
1302
- return ring_bell();
1303
-
1304
- if ((p = (CHAR *)strdup((char *)p)) == NULL)
1305
- return CSstay;
1306
- ac = argify(p, &av);
1307
-
1308
- if (Repeat != NO_ARG)
1309
- s = Repeat < ac ? insert_string(av[Repeat]) : ring_bell();
1310
- else
1311
- s = ac ? insert_string(av[ac - 1]) : CSstay;
1312
-
1313
- if (ac)
1314
- DISPOSE(av);
1315
- DISPOSE(p);
1316
- return s;
1317
- }
1318
-
1319
- STATIC KEYMAP Map[32] = {
1320
- { CTL('@'), ring_bell },
1321
- { CTL('A'), beg_line },
1322
- { CTL('B'), bk_char },
1323
- { CTL('D'), del_char },
1324
- { CTL('E'), end_line },
1325
- { CTL('F'), fd_char },
1326
- { CTL('G'), ring_bell },
1327
- { CTL('H'), bk_del_char },
1328
- { CTL('J'), accept_line },
1329
- { CTL('K'), kill_line },
1330
- { CTL('L'), redisplay },
1331
- { CTL('M'), accept_line },
1332
- { CTL('N'), h_next },
1333
- { CTL('O'), ring_bell },
1334
- { CTL('P'), h_prev },
1335
- { CTL('Q'), ring_bell },
1336
- { CTL('R'), h_search },
1337
- { CTL('S'), ring_bell },
1338
- { CTL('T'), transpose },
1339
- { CTL('U'), ring_bell },
1340
- { CTL('V'), quote },
1341
- { CTL('W'), wipe },
1342
- { CTL('X'), exchange },
1343
- { CTL('Y'), yank },
1344
- { CTL('Z'), ring_bell },
1345
- { CTL('['), meta },
1346
- { CTL(']'), move_to_char },
1347
- { CTL('^'), ring_bell },
1348
- { CTL('_'), ring_bell },
1349
- { 0, NULL }
1350
- };
1351
-
1352
- STATIC KEYMAP MetaMap[16]= {
1353
- { CTL('H'), bk_kill_word },
1354
- { DEL, bk_kill_word },
1355
- { ' ', mk_set },
1356
- { '.', last_argument },
1357
- { '<', h_first },
1358
- { '>', h_last },
1359
- { 'b', bk_word },
1360
- { 'd', fd_kill_word },
1361
- { 'f', fd_word },
1362
- { 'l', case_down_word },
1363
- { 'm', toggle_meta_mode },
1364
- { 'u', case_up_word },
1365
- { 'y', yank },
1366
- { 'w', copy_region },
1367
- { 0, NULL }
1368
- };
1369
-