RTS.cs 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399
  1. /** This is the body of the GPCP runtime support.
  2. *
  3. * Written November 1998, John Gough. (for jdk version)
  4. * This version for Lightning, May 2000, John Gough.
  5. * Support for uplevel addressing RTS.XHR, Aug-2001.
  6. * Merged version for N2CPS, gpcp etc. SYChan, KJGough. 19-Aug-2001.
  7. */
  8. #if !BETA1
  9. #define BETA2
  10. #endif
  11. public class RTS
  12. // Known in ILASM as [RTS]RTS
  13. {
  14. /** This is part of the body of the GPCP runtime support.
  15. *
  16. * Written November 1998, John Gough.
  17. * This version for Lightning, May 2000, John Gough.
  18. */
  19. /* ------------------------------------------------------------ */
  20. /* Support for RTS.cp */
  21. /* ------------------------------------------------------------ */
  22. public static char[] defaultTarget = {'n','e','t','\0'};
  23. public static char[] eol = NativeStrings.mkArr(System.Environment.NewLine);
  24. public static double dblPosInfinity = System.Double.PositiveInfinity;
  25. public static double dblNegInfinity = System.Double.NegativeInfinity;
  26. public static float fltPosInfinity = System.Single.PositiveInfinity;
  27. public static float fltNegInfinity = System.Single.NegativeInfinity;
  28. private static char[] ChrNaN = {'N','a','N','\0'};
  29. private static char[] ChrPosInf = {'I','n','f','i','n','i','t','y','\0'};
  30. private static char[] ChrNegInf = {'-','I','n','f','i','n','i','t','y','\0'};
  31. private static System.String StrNaN = new System.String(ChrNaN);
  32. private static System.String StrPosInf = new System.String(ChrPosInf);
  33. private static System.String StrNegInf = new System.String(ChrNegInf);
  34. private static System.Type typDouble = System.Type.GetType("System.Double");
  35. private static System.Type typSingle = System.Type.GetType("System.Single");
  36. private static System.IFormatProvider invarCulture =
  37. (System.IFormatProvider) new System.Globalization.CultureInfo("");
  38. private static System.IFormatProvider currentCulture =
  39. (System.IFormatProvider) System.Globalization.CultureInfo.CurrentCulture;
  40. /* -------------------------------------------------------------------- */
  41. // PROCEDURE getStr*(x : NativeException) : RTS.CharOpen; END getStr;
  42. //
  43. // Known in ILASM as [RTS]RTS::getStr
  44. public static char[] getStr(System.Exception inp)
  45. {
  46. return CP_rts.strToChO(inp.ToString());
  47. }
  48. /* ------------------------------------------------------------ */
  49. // PROCEDURE StrToBool(IN str : ARRAY OF CHAR;
  50. // OUT b : BOOLEAN;
  51. // OUT ok : BOOLEAN);
  52. //
  53. // Known in ILASM as [RTS]RTS::StrToBool
  54. public static void StrToBool(char[] str,
  55. out bool o, // OUT param
  56. out bool r) // OUT param
  57. {
  58. System.String bstr = new System.String(str);
  59. try {
  60. o = System.Boolean.Parse(bstr);
  61. r = true;
  62. } catch {
  63. o = false;
  64. r = false;
  65. }
  66. }
  67. /* ------------------------------------------------------------ */
  68. // PROCEDURE StrToByte(IN str : ARRAY OF CHAR;
  69. // OUT b : BYTE;
  70. // OUT ok : BOOLEAN);
  71. //
  72. // Known in ILASM as [RTS]RTS::StrToByte
  73. public static void StrToByte(char[] str,
  74. out sbyte o, // OUT param
  75. out bool r) // OUT param
  76. {
  77. System.String bstr = new System.String(str);
  78. try {
  79. o = System.SByte.Parse(bstr);
  80. r = true;
  81. } catch {
  82. o = 0;
  83. r = false;
  84. }
  85. }
  86. /* ------------------------------------------------------------ */
  87. // PROCEDURE StrToUByte(IN str : ARRAY OF CHAR;
  88. // OUT b : BYTE;
  89. // OUT ok : BOOLEAN);
  90. //
  91. // Known in ILASM as [RTS]RTS::StrToUByte
  92. public static void StrToUByte(char[] str,
  93. out sbyte o, // OUT param
  94. out bool r) // OUT param
  95. {
  96. System.String bstr = new System.String(str);
  97. try {
  98. o = (sbyte)System.Byte.Parse(bstr);
  99. r = true;
  100. } catch {
  101. o = (sbyte)0;
  102. r = false;
  103. }
  104. }
  105. /* ------------------------------------------------------------ */
  106. // PROCEDURE HexStrToUByte(IN s : ARRAY OF CHAR; OUT b : BYTE; OUT ok : BOOLEAN);
  107. //
  108. // Known in ILASM as [RTS]RTS::HexStrToUByte
  109. public static void HexStrToUByte(char[] str,
  110. out sbyte o, // OUT param
  111. out bool r) // OUT param
  112. {
  113. System.String bstr = new System.String(str);
  114. try {
  115. o = (sbyte)System.Byte.Parse
  116. (bstr, System.Globalization.NumberStyles.HexNumber);
  117. r = true;
  118. } catch {
  119. o = (sbyte)0;
  120. r = false;
  121. }
  122. }
  123. /* ------------------------------------------------------------ */
  124. // PROCEDURE StrToShort(IN str : ARRAY OF CHAR;
  125. // OUT i : SHORTINT;
  126. // OUT ok : BOOLEAN);
  127. //
  128. // Known in ILASM as [RTS]RTS::StrToShort
  129. public static void StrToShort(char[] str,
  130. out short o, // OUT param
  131. out bool r) // OUT param
  132. {
  133. System.String sstr = new System.String(str);
  134. try {
  135. o = System.Int16.Parse(sstr);
  136. r = true;
  137. } catch {
  138. o = (short) 0;
  139. r = false;
  140. }
  141. }
  142. /* ------------------------------------------------------------ */
  143. // PROCEDURE StrToUShort(IN str : ARRAY OF CHAR;
  144. // OUT i : SHORTINT;
  145. // OUT ok : BOOLEAN);
  146. //
  147. // Known in ILASM as [RTS]RTS::StrToUShort
  148. public static void StrToUShort(char[] str,
  149. out short o, // OUT param
  150. out bool r) // OUT param
  151. {
  152. System.String sstr = new System.String(str);
  153. try {
  154. o = (short)System.UInt16.Parse(sstr);
  155. r = true;
  156. } catch {
  157. o = (short) 0;
  158. r = false;
  159. }
  160. }
  161. /* ------------------------------------------------------------ */
  162. // PROCEDURE StrToInt(IN str : ARRAY OF CHAR;
  163. // OUT i : INTEGER;
  164. // OUT ok : BOOLEAN);
  165. //
  166. // Known in ILASM as [RTS]RTS::StrToInt
  167. public static void StrToInt(char[] str,
  168. out int o, // OUT param
  169. out bool r) // OUT param
  170. {
  171. System.String lstr = new System.String(str);
  172. try {
  173. o = System.Int32.Parse(lstr);
  174. r = true;
  175. } catch {
  176. o = 0;
  177. r = false;
  178. }
  179. }
  180. /* ------------------------------------------------------------ */
  181. // PROCEDURE StrToUInt(IN str : ARRAY OF CHAR;
  182. // OUT i : INTEGER;
  183. // OUT ok : BOOLEAN);
  184. //
  185. // Known in ILASM as [RTS]RTS::StrToUInt
  186. public static void StrToUInt(char[] str,
  187. out int o, // OUT param
  188. out bool r) // OUT param
  189. {
  190. System.String lstr = new System.String(str);
  191. try {
  192. o = (int)System.UInt32.Parse(lstr);
  193. r = true;
  194. } catch {
  195. o = (int)0;
  196. r = false;
  197. }
  198. }
  199. /* ------------------------------------------------------------ */
  200. // PROCEDURE StrToLong(IN str : ARRAY OF CHAR;
  201. // OUT l : LONGINT;
  202. // OUT ok : BOOLEAN);
  203. //
  204. // Known in ILASM as [RTS]RTS::StrToLong
  205. public static void StrToLong(char[] str,
  206. out long o, // OUT param
  207. out bool r) // OUT param
  208. {
  209. System.String lstr = new System.String(str);
  210. try {
  211. o = System.Int64.Parse(lstr);
  212. r = true;
  213. } catch {
  214. o = (long) 0;
  215. r = false;
  216. }
  217. }
  218. /* ------------------------------------------------------------ */
  219. // PROCEDURE StrToULong(IN str : ARRAY OF CHAR;
  220. // OUT l : LONGINT;
  221. // OUT ok : BOOLEAN);
  222. //
  223. // Known in ILASM as [RTS]RTS::StrToULong
  224. public static void StrToULong(char[] str,
  225. out long o, // OUT param
  226. out bool r) // OUT param
  227. {
  228. System.String lstr = new System.String(str);
  229. try {
  230. o = (long)System.UInt64.Parse(lstr);
  231. r = true;
  232. } catch {
  233. o = (long) 0;
  234. r = false;
  235. }
  236. }
  237. /* ------------------------------------------------------------ */
  238. // PROCEDURE StrToSReal(IN str : ARRAY OF CHAR;
  239. // OUT r : SHORTREAL;
  240. // OUT ok : BOOLEAN);
  241. //
  242. // Known in ILASM as [RTS]RTS::StrToSReal
  243. public static void StrToSReal(char[] str,
  244. out float o, // OUT param
  245. out bool r) // OUT param
  246. {
  247. System.String rstr = new System.String(str);
  248. try {
  249. o = System.Single.Parse(rstr);
  250. r = true;
  251. } catch {
  252. if (System.String.Compare(rstr, StrPosInf) == 0) {
  253. o = System.Single.PositiveInfinity;
  254. r = true;
  255. }
  256. else if (System.String.Compare(rstr, StrNegInf) == 0) {
  257. o = System.Single.NegativeInfinity;
  258. r = true;
  259. }
  260. else if (System.String.Compare(rstr, StrNaN) == 0) {
  261. o = System.Single.NaN;
  262. r = true;
  263. }
  264. else {
  265. o = 0;
  266. r = false;
  267. }
  268. }
  269. }
  270. /* ------------------------------------------------------------ */
  271. // PROCEDURE StrToReal(IN str : ARRAY OF CHAR;
  272. // OUT r : REAL;
  273. // OUT ok : BOOLEAN);
  274. //
  275. // Known in ILASM as [RTS]RTS::StrToReal
  276. public static void StrToReal(char[] str,
  277. out double o, // OUT param
  278. out bool r) // OUT param
  279. {
  280. System.String rstr = new System.String(str);
  281. try {
  282. o = System.Double.Parse(rstr);
  283. r = true;
  284. } catch {
  285. if (System.String.Compare(rstr, StrPosInf) == 0) {
  286. o = System.Double.PositiveInfinity;
  287. r = true;
  288. }
  289. else if (System.String.Compare(rstr, StrNegInf) == 0) {
  290. o = System.Double.NegativeInfinity;
  291. r = true;
  292. }
  293. else if (System.String.Compare(rstr, StrNaN) == 0) {
  294. o = System.Double.NaN;
  295. r = true;
  296. }
  297. else {
  298. o = 0.0;
  299. r = false;
  300. }
  301. }
  302. }
  303. /* ------------------------------------------------------------ */
  304. // PROCEDURE StrToRealInvar(IN str : ARRAY OF CHAR;
  305. // OUT r : REAL;
  306. // OUT ok : BOOLEAN);
  307. //
  308. // Known in ILASM as [RTS]RTS::StrToReal
  309. public static void StrToRealInvar(char[] str,
  310. out double o, // OUT param
  311. out bool r) // OUT param
  312. {
  313. System.String rstr = new System.String(str);
  314. try {
  315. o = System.Double.Parse(rstr, invarCulture);
  316. r = true;
  317. } catch {
  318. if (System.String.Compare(rstr, StrPosInf) == 0) {
  319. o = System.Double.PositiveInfinity;
  320. r = true;
  321. }
  322. else if (System.String.Compare(rstr, StrNegInf) == 0) {
  323. o = System.Double.NegativeInfinity;
  324. r = true;
  325. }
  326. else if (System.String.Compare(rstr, StrNaN) == 0) {
  327. o = System.Double.NaN;
  328. r = true;
  329. }
  330. else {
  331. o = 0.0;
  332. r = false;
  333. }
  334. }
  335. }
  336. /* ------------------------------------------------------------ */
  337. // PROCEDURE StrToRealLocal(IN str : ARRAY OF CHAR;
  338. // OUT r : REAL;
  339. // OUT ok : BOOLEAN);
  340. //
  341. // Known in ILASM as [RTS]RTS::StrToReal
  342. public static void StrToRealLocal(char[] str,
  343. out double o, // OUT param
  344. out bool r) // OUT param
  345. {
  346. System.String rstr = new System.String(str);
  347. try {
  348. o = System.Double.Parse(rstr, currentCulture);
  349. r = true;
  350. } catch {
  351. if (System.String.Compare(rstr, StrPosInf) == 0) {
  352. o = System.Double.PositiveInfinity;
  353. r = true;
  354. }
  355. else if (System.String.Compare(rstr, StrNegInf) == 0) {
  356. o = System.Double.NegativeInfinity;
  357. r = true;
  358. }
  359. else if (System.String.Compare(rstr, StrNaN) == 0) {
  360. o = System.Double.NaN;
  361. r = true;
  362. }
  363. else {
  364. o = 0.0;
  365. r = false;
  366. }
  367. }
  368. }
  369. /* ------------------------------------------------------------ */
  370. // PROCEDURE ByteToStr*(i : BYTE; OUT s : ARRAY OF CHAR);
  371. // (** Decode a CP BYTE into an array *)
  372. // BEGIN END ByteToStr;
  373. //
  374. // Known in ILASM as [RTS]RTS::ByteToStr
  375. public static void ByteToStr(sbyte num,
  376. char[] str)
  377. {
  378. System.String lls = System.Convert.ToString(num);
  379. int len = lls.Length;
  380. if (len >= str.Length)
  381. len = str.Length - 1;
  382. lls.CopyTo(0, str, 0, len);
  383. str[len] = '\0';
  384. }
  385. /* ------------------------------------------------------------ */
  386. // PROCEDURE ShortToStr*(i : SHORTINT; OUT s : ARRAY OF CHAR);
  387. // (** Decode a CP SHORTINT into an array *)
  388. // BEGIN END ShortToStr;
  389. //
  390. // Known in ILASM as [RTS]RTS::ShortToStr
  391. public static void ShortToStr(short num,
  392. char[] str)
  393. {
  394. System.String lls = System.Convert.ToString(num);
  395. int len = lls.Length;
  396. if (len >= str.Length)
  397. len = str.Length - 1;
  398. lls.CopyTo(0, str, 0, len);
  399. str[len] = '\0';
  400. }
  401. /* ------------------------------------------------------------ */
  402. // PROCEDURE IntToStr*(i : INTEGER; OUT s : ARRAY OF CHAR);
  403. // (** Decode a CP INTEGER into an array *)
  404. // BEGIN END IntToStr;
  405. //
  406. // Known in ILASM as [RTS]RTS::IntToStr
  407. public static void IntToStr(int num,
  408. char[] str)
  409. {
  410. System.String lls = System.Convert.ToString(num);
  411. int len = lls.Length;
  412. if (len >= str.Length)
  413. len = str.Length - 1;
  414. lls.CopyTo(0, str, 0, len);
  415. str[len] = '\0';
  416. }
  417. /* ------------------------------------------------------------ */
  418. // PROCEDURE ObjToStr(obj: mscorlib_System.Object; OUT str: ARRAY OF CHAR);
  419. // (** Decode an .NET object into an array of CHAR *)
  420. // BEGIN END ObjToStr;
  421. //
  422. // Known in ILASM as [RTS]RTS::ObjToStr
  423. public static void ObjToStr(System.Object obj, char[] str)
  424. {
  425. System.String lls;
  426. if (obj.GetType().IsEnum) {
  427. #if BETA1
  428. lls = obj.ToString();
  429. #else //BETA2
  430. lls = System.Convert.ToString(System.Convert.ToInt64(obj));
  431. #endif
  432. }
  433. else {
  434. if (obj.GetType().Equals(typDouble)) {
  435. #if BETA1
  436. lls = System.Convert.ToDouble(obj).ToString();
  437. #else //BETA2
  438. lls = System.Convert.ToDouble(obj).ToString("R");
  439. #endif
  440. }
  441. else if (obj.GetType().Equals(typSingle)) {
  442. #if BETA1
  443. lls = System.Convert.ToSingle(obj).ToString();
  444. #else //BETA2
  445. lls = System.Convert.ToSingle(obj).ToString("R");
  446. #endif
  447. }
  448. else {
  449. lls = System.Convert.ToString(obj);
  450. }
  451. }
  452. int len = lls.Length;
  453. if (len >= str.Length)
  454. len = str.Length - 1;
  455. lls.CopyTo(0, str, 0, len);
  456. str[len] = '\0';
  457. }
  458. /* ------------------------------------------------------------ */
  459. // PROCEDURE LongToStr*(i : LONGINT; OUT s : ARRAY OF CHAR);
  460. // (** Decode a CP LONGINT into an array *)
  461. // BEGIN END LongToStr;
  462. //
  463. // Known in ILASM as [RTS]RTS::LongToStr
  464. public static void LongToStr(long num,
  465. char[] str)
  466. {
  467. System.String lls = System.Convert.ToString(num);
  468. int len = lls.Length;
  469. if (len >= str.Length)
  470. len = str.Length - 1;
  471. lls.CopyTo(0, str, 0, len);
  472. str[len] = '\0';
  473. }
  474. /* ------------------------------------------------------------ */
  475. // PROCEDURE SRealToStr*(r : SHORTREAL; OUT s : ARRAY OF CHAR);
  476. // (** Decode a CP REAL into an array *)
  477. // BEGIN END SRealToStr;
  478. //
  479. // Known in ILASM as [RTS]RTS::SRealToStr
  480. public static void SRealToStr(float num,
  481. char[] str)
  482. {
  483. // System.String lls = System.Convert.ToString(num);
  484. #if BETA1
  485. System.String lls = ((System.Single) num).ToString();
  486. #else //BETA2
  487. System.String lls = ((System.Single) num).ToString("R");
  488. #endif
  489. int len = lls.Length;
  490. lls.CopyTo(0, str, 0, len);
  491. str[len] = '\0';
  492. }
  493. /* ------------------------------------------------------------ */
  494. // PROCEDURE RealToStr*(r : REAL; OUT s : ARRAY OF CHAR);
  495. // (** Decode a CP REAL into an array *)
  496. // BEGIN END RealToStr;
  497. //
  498. // Known in ILASM as [RTS]RTS::RealToStr
  499. public static void RealToStr(double num,
  500. char[] str)
  501. {
  502. #if BETA1
  503. System.String lls = System.Convert.ToString(num);
  504. #else //BETA2
  505. System.String lls = ((System.Double) num).ToString("R");
  506. #endif
  507. int len = lls.Length;
  508. lls.CopyTo(0, str, 0, len);
  509. str[len] = '\0';
  510. }
  511. /* ------------------------------------------------------------ */
  512. // PROCEDURE RealToStrInvar*(r : REAL; OUT s : ARRAY OF CHAR);
  513. // (** Decode a CP REAL into an array *)
  514. // BEGIN END RealToStrInvar;
  515. //
  516. // Known in ILASM as [RTS]RTS::RealToStrInvar
  517. public static void RealToStrInvar(double num,
  518. char[] str)
  519. {
  520. #if BETA1
  521. System.String lls = System.Convert.ToString(num);
  522. #else //BETA2
  523. System.String lls =
  524. ((System.Double) num).ToString("R", invarCulture);
  525. #endif
  526. int len = lls.Length;
  527. lls.CopyTo(0, str, 0, len);
  528. str[len] = '\0';
  529. }
  530. /* ------------------------------------------------------------ */
  531. // PROCEDURE RealToStrLocal*(r : REAL; OUT s : ARRAY OF CHAR);
  532. // (** Decode a CP REAL into an array *)
  533. // BEGIN END RealToStrInvar;
  534. //
  535. // Known in ILASM as [RTS]RTS::RealToStrLocal
  536. public static void RealToStrLocal(double num,
  537. char[] str)
  538. {
  539. #if BETA1
  540. System.String lls = System.Convert.ToString(num);
  541. #else //BETA2
  542. System.String lls =
  543. ((System.Double) num).ToString("R", currentCulture);
  544. #endif
  545. int len = lls.Length;
  546. lls.CopyTo(0, str, 0, len);
  547. str[len] = '\0';
  548. }
  549. /* ------------------------------------------------------------ */
  550. //
  551. // PROCEDURE realToLongBits(r : REAL) : LONGINT;
  552. // (** Convert an ieee double into a longint with same bit pattern *)
  553. //
  554. public static long realToLongBits(double r)
  555. {
  556. byte[] tmp = System.BitConverter.GetBytes(r);
  557. return System.BitConverter.ToInt64(tmp,0);
  558. }
  559. //
  560. // PROCEDURE longBitsToReal(l : LONGINT) : REAL;
  561. // (** Convert a longint into an ieee double with same bit pattern *)
  562. //
  563. public static double longBitsToReal(long l)
  564. {
  565. byte[] tmp = System.BitConverter.GetBytes(l);
  566. return System.BitConverter.ToDouble(tmp,0);
  567. }
  568. /* ------------------------------------------------------------ */
  569. //
  570. // PROCEDURE shortRealToIntBits(r : SHORTREAL) : INTEGER;
  571. // (** Convert an ieee double into a longint with same bit pattern *)
  572. //
  573. public static int shortRealToIntBits(float r)
  574. {
  575. byte[] tmp = System.BitConverter.GetBytes(r);
  576. return System.BitConverter.ToInt32(tmp,0);
  577. }
  578. //
  579. // PROCEDURE intBitsToShortReal(l : INTEGER) : SHORTREAL;
  580. // (** Convert an int into an ieee float with same bit pattern *)
  581. //
  582. public static double intBitsToShortReal(int l)
  583. {
  584. byte[] tmp = System.BitConverter.GetBytes(l);
  585. return System.BitConverter.ToSingle(tmp,0);
  586. }
  587. /* ------------------------------------------------------------ */
  588. //
  589. // PROCEDURE hiByte(l : SHORTINT) : BYTE;
  590. // (** Get hi-significant byte of short *)
  591. //
  592. // Known in ILASM as [RTS]RTS::hiByte
  593. public static sbyte hiByte(short i)
  594. {
  595. return (sbyte) (i >> 8);
  596. }
  597. //
  598. // PROCEDURE loByte(l : SHORTINT) : BYTE;
  599. // (** Get lo-significant byte of short *)
  600. //
  601. // Known in ILASM as [RTS]RTS::loByte
  602. public static sbyte loByte(short i)
  603. {
  604. return (sbyte) i;
  605. }
  606. //
  607. // PROCEDURE hiShort(l : INTEGER) : SHORTINT;
  608. // (** Get hi-significant word of integer *)
  609. //
  610. // Known in ILASM as [RTS]RTS::hiShort
  611. public static short hiShort(int i)
  612. {
  613. return (short) (i >> 16);
  614. }
  615. //
  616. // PROCEDURE loShort(l : INTEGER) : SHORTINT;
  617. // (** Get lo-significant word of integer *)
  618. //
  619. // Known in ILASM as [RTS]RTS::loShort
  620. public static short loShort(int i)
  621. {
  622. return (short) i;
  623. }
  624. //
  625. // PROCEDURE hiInt(l : LONGINT) : INTEGER;
  626. // (** Get hi-significant word of long integer *)
  627. //
  628. // Known in ILASM as [RTS]RTS::hiInt
  629. public static int hiInt(long l)
  630. {
  631. return (int) (l >> 32);
  632. }
  633. //
  634. // PROCEDURE loInt(l : LONGINT) : INTEGER;
  635. // (** Get lo-significant word of long integer *)
  636. //
  637. // Known in ILASM as [RTS]RTS::loInt
  638. public static int loInt(long l)
  639. {
  640. return (int) l;
  641. }
  642. //
  643. // PROCEDURE Throw(IN s : ARRAY OF CHAR);
  644. // (** Abort execution with an error *)
  645. //
  646. // Known in ILASM as [RTS]RTS::Throw
  647. public static void Throw(char[] s)
  648. {
  649. throw new System.Exception(new System.String(s));
  650. }
  651. //
  652. // PROCEDURE GetMillis() : LONGINT;
  653. //
  654. // Known in ILASM as [RTS]RTS::GetMillis
  655. public static long GetMillis()
  656. {
  657. return (System.DateTime.Now.Ticks / 10000);
  658. }
  659. //
  660. // PROCEDURE GetDateString(OUT str : ARRAY OF CHAR);
  661. //
  662. // Known in ILASM as [RTS]RTS::GetDateString
  663. public static void GetDateString(char[] arr)
  664. {
  665. System.String str = System.DateTime.Now.ToString();
  666. int len = str.Length;
  667. if (len >= arr.Length)
  668. len = arr.Length - 1;
  669. str.CopyTo(0, arr, 0, len);
  670. arr[len] = '\0';
  671. }
  672. public static void ClassMarker(System.Object o)
  673. {
  674. System.Console.Write(o.GetType().ToString());
  675. }
  676. }
  677. /* ------------------------------------------------------------ */
  678. /* ------------------------------------------------------------ */
  679. /* ------------------------------------------------------------ */
  680. public class ProgArgs
  681. // Known in ILASM as [RTS]ProgArgs
  682. /*
  683. * Library module for GP Component Pascal.
  684. * This module allows access to the arguments in programs which
  685. * import CPmain. It is accessible from modules which do NOT
  686. * import CPmain.
  687. *
  688. * Original : kjg December 1999
  689. */
  690. {
  691. public static System.String[] argList = null;
  692. // Known in ILASM as [RTS]ProgArgs::ArgNumber
  693. // PROCEDURE ArgNumber*() : INTEGER
  694. public static int ArgNumber()
  695. {
  696. if (ProgArgs.argList == null)
  697. return 0;
  698. else
  699. return argList.Length;
  700. }
  701. // Known in ILASM as [RTS]ProgArgs::GetArg
  702. // PROCEDURE GetArg*(num : INTEGER; OUT arg : ARRAY OF CHAR)
  703. public static void GetArg(int num, char[] arr)
  704. {
  705. int i;
  706. if (argList == null) {
  707. arr[0] = '\0';
  708. } else {
  709. for (i = 0;
  710. i < arr.Length && i < argList[num].Length;
  711. i++) {
  712. System.String str = argList[num];
  713. arr[i] = str[i];
  714. }
  715. if (i == arr.Length)
  716. i--;
  717. arr[i] = '\0';
  718. }
  719. }
  720. public static void GetEnvVar(char[] name, char[] valu) {
  721. System.String nam = CP_rts.mkStr(name);
  722. System.String val = System.Environment.GetEnvironmentVariable(nam);
  723. CP_rts.StrToChF(valu, val);
  724. }
  725. } // end of public class ProgArgs
  726. /* ------------------------------------------------------------ */
  727. /* ------------------------------------------------------------ */
  728. /* ------------------------------------------------------------ */
  729. public class CP_rts
  730. // Known in ILASM as [RTS]CP_rts
  731. /*
  732. * It is a fundamental principle that the facilities of CP_rts
  733. * are known to the particular compiler backend, but are
  734. * not accessible to the Programmer. The programmer-accessible
  735. * parts of the runtime are known via the module RTS.
  736. */
  737. {
  738. /* ==================================================================== *
  739. * MOD and DIV helpers. With correction factors *
  740. * ==================================================================== */
  741. // Known in ILASM as [RTS]CP_rts::CpModI
  742. public static int CpModI(int lVal, int rVal)
  743. {
  744. // A correction is required if the signs of
  745. // the two operands are different, but the
  746. // remainder is non-zero. Inc rem by rVal.
  747. int rslt = lVal % rVal;
  748. if ((lVal < 0 != rVal < 0) && (rslt != 0))
  749. rslt += rVal;
  750. return rslt;
  751. }
  752. // Known in ILASM as [RTS]CP_rts::CpDivI
  753. public static int CpDivI(int lVal, int rVal)
  754. {
  755. // A correction is required if the signs of
  756. // the two operands are different, but the
  757. // remainder is non-zero. Dec quo by 1.
  758. int rslt = lVal / rVal;
  759. int remV = lVal % rVal;
  760. if ((lVal < 0 != rVal < 0) && (remV != 0))
  761. rslt--;
  762. return rslt;
  763. }
  764. // Known in ILASM as [RTS]CP_rts::CpModL
  765. public static long CpModL(long lVal, long rVal)
  766. {
  767. // A correction is required if the signs of
  768. // the two operands are different, but the
  769. // remainder is non-zero. Inc rem by rVal.
  770. long rslt = lVal % rVal;
  771. if ((lVal < 0 != rVal < 0) && (rslt != 0))
  772. rslt += rVal;
  773. return rslt;
  774. }
  775. // Known in ILASM as [RTS]CP_rts::CpDivL
  776. public static long CpDivL(long lVal, long rVal)
  777. {
  778. // A correction is required if the signs of
  779. // the two operands are different, but the
  780. // remainder is non-zero. Dec quo by 1.
  781. long rslt = lVal / rVal;
  782. long remV = lVal % rVal;
  783. if ((lVal < 0 != rVal < 0) && (remV != 0))
  784. rslt--;
  785. return rslt;
  786. }
  787. /* ==================================================================== *
  788. * Various string and char-array helpers *
  789. * ==================================================================== */
  790. // Known in ILASM as [RTS]CP_rts::mkStr
  791. public static System.String mkStr(char[] arr) {
  792. int len = chrArrLength(arr);
  793. return new System.String(arr,0,len);
  794. }
  795. /* -------------------------------------------------------------------- */
  796. // Known in ILASM as [RTS]CP_rts::caseMesg
  797. public static System.String caseMesg(int i)
  798. {
  799. System.String s = "CASE-trap: selector = " + i;
  800. return s;
  801. }
  802. /* -------------------------------------------------------------------- */
  803. // Known in ILASM as [RTS]CP_rts::withMesg
  804. public static System.String withMesg(System.Object o)
  805. {
  806. // System.String c = o.getClass().getName();
  807. // c = c.substring(c.lastIndexOf('.') + 1);
  808. // c = "WITH else-trap: type = " + c;
  809. // NEEDS TO USE LIGHTNING REFLECTION SERVICES HERE
  810. string c = "WITH else-trap: type = " + o.ToString();
  811. return c;
  812. }
  813. /* -------------------------------------------------------------------- */
  814. // Known in ILASM as [RTS]CP_rts::chrArrLength
  815. public static int chrArrLength(char[] src)
  816. {
  817. int ix = 0;
  818. char ch;
  819. do {
  820. ch = src[ix];
  821. ix++;
  822. } while (ch != '\0');
  823. // System.Console.Write(ix-1);
  824. // System.Console.Write(' ');
  825. // System.Console.WriteLine(src);
  826. return ix-1;
  827. }
  828. /* -------------------------------------------------------------------- */
  829. // Known in ILASM as [RTS]CP_rts::chrArrLplus1
  830. public static int chrArrLplus1(char[] src)
  831. {
  832. int ix = 0;
  833. char ch;
  834. do {
  835. ch = src[ix];
  836. ix++;
  837. } while (ch != '\0');
  838. return ix;
  839. }
  840. /* -------------------------------------------------------------------- */
  841. // Known in ILASM as [RTS]CP_rts::strToChO
  842. public static char[] strToChO(System.String input)
  843. {
  844. if (input == null) return null;
  845. int len = input.Length;
  846. char[] arr = new char[len+1];
  847. input.CopyTo(0, arr, 0, len);
  848. arr[len] = '\0';
  849. return arr;
  850. // return input.ToCharArray();
  851. }
  852. /* -------------------------------------------------------------------- */
  853. // Known in ILASM as [RTS]CP_rts::StrToChF
  854. public static void StrToChF(char[] res, System.String inp)
  855. {
  856. if (inp == null) {
  857. res[0] = '\0'; return;
  858. }
  859. int len = inp.Length;
  860. inp.CopyTo(0, res, 0, len);
  861. res[len] = '\0';
  862. }
  863. /* -------------------------------------------------------------------- */
  864. // Known in ILASM as [RTS]CP_rts::Stringify
  865. public static void Stringify(char[] dst, char[] src)
  866. {
  867. int ix = 0;
  868. char ch;
  869. do {
  870. ch = src[ix];
  871. dst[ix] = ch;
  872. ix++;
  873. } while (ch != '\0');
  874. }
  875. /* -------------------------------------------------------------------- */
  876. // Known in ILASM as [RTS]CP_rts::ChrArrCheck
  877. public static void ChrArrCheck(char[] src)
  878. {
  879. int ix = 0;
  880. char ch;
  881. do {
  882. ch = src[ix];
  883. if (ch > 0xFF) throw new
  884. System.Exception("error applying SHORT to array");
  885. ix++;
  886. } while (ch != '\0');
  887. }
  888. /* -------------------------------------------------------------------- */
  889. // Known in ILASM as [RTS]CP_rts::strCmp
  890. public static int strCmp(char[] l, char[] r)
  891. {
  892. int minL;
  893. int lLen = chrArrLength(l);
  894. int rLen = chrArrLength(r);
  895. if (lLen < rLen) minL = lLen; else minL = rLen;
  896. // System.Console.WriteLine();
  897. for (int ix = 0; ix < minL; ix++) {
  898. char lCh = l[ix];
  899. char rCh = r[ix];
  900. if (lCh < rCh) return -1;
  901. else if (lCh > rCh) return 1;
  902. }
  903. if (lLen < rLen) return -1;
  904. else if (lLen > rLen) return 1;
  905. else return 0;
  906. }
  907. /* ==================================================================== *
  908. * String concatenation helper methods *
  909. * ==================================================================== */
  910. // Known in ILASM as [RTS]CP_rts::aaToStr
  911. public static System.String aaToStr(char[] l, char[] r)
  912. {
  913. int llen = chrArrLength(l);
  914. int rlen = chrArrLength(r);
  915. System.Text.StringBuilder buff =
  916. new System.Text.StringBuilder(llen + rlen);
  917. return buff.Append(l,0,llen).Append(r,0,rlen).ToString();
  918. }
  919. // Known in ILASM as [RTS]CP_rts::asToStr
  920. public static System.String asToStr(char[] l, System.String r)
  921. {
  922. int llen = chrArrLength(l);
  923. System.Text.StringBuilder buff =
  924. new System.Text.StringBuilder(3 * llen);
  925. return buff.Append(l,0,llen).Append(r).ToString();
  926. }
  927. // Known in ILASM as [RTS]CP_rts::saToStr
  928. public static System.String saToStr(System.String l, char[] r)
  929. {
  930. int rlen = chrArrLength(r);
  931. System.Text.StringBuilder buff =
  932. new System.Text.StringBuilder(3 * rlen);
  933. return buff.Append(l).Append(r,0,rlen).ToString();
  934. }
  935. // Known in ILASM as [RTS]CP_rts::ssToStr
  936. public static System.String ssToStr(System.String l, System.String r)
  937. {
  938. System.Text.StringBuilder buff =
  939. new System.Text.StringBuilder(l);
  940. return buff.Append(r).ToString();
  941. }
  942. }
  943. /* ==================================================================== */
  944. /* ==================================================================== */
  945. /* ==================================================================== */
  946. /* ==================================================================== */
  947. public class NativeStrings
  948. // Known in ILASM as [RTS]NativeStrings
  949. {
  950. /* -------------------------------------------------------------------- */
  951. //
  952. // PROCEDURE mkStr*(IN s : ARRAY OF CHAR) : String; BEGIN RETURN NIL END mkStr;
  953. //
  954. /* -------------------------------------------------------------------- */
  955. // Known in ILASM as [RTS]NativeStrings::mkStr
  956. public static System.String mkStr(char[] arr) {
  957. int len = CP_rts.chrArrLength(arr);
  958. return new System.String(arr,0,len);
  959. }
  960. /* -------------------------------------------------------------------- */
  961. //
  962. // PROCEDURE mkArr*(s : String) : RTS.CharOpen); END mkArr;
  963. //
  964. /* -------------------------------------------------------------------- */
  965. // Known in ILASM as [RTS]NativeStrings::mkArr
  966. public static char[] mkArr(System.String inp)
  967. {
  968. if (inp == null) return null;
  969. int len = inp.Length;
  970. char[] res = new char[len+1];
  971. inp.CopyTo(0, res, 0, len);
  972. res[len] = '\0';
  973. return res;
  974. }
  975. }
  976. /* ==================================================================== */
  977. /* ==================================================================== */
  978. //
  979. // Body of Console interface.
  980. // This file implements the code of the Console.cp file.
  981. // kjg May 2000.
  982. //
  983. public class Console
  984. // Known in ILASM as [RTS]Console
  985. {
  986. public static void WriteLn()
  987. {
  988. System.Console.WriteLine();
  989. }
  990. public static void Write(char ch)
  991. {
  992. System.Console.Write(ch);
  993. }
  994. private static char[] strRep(int val)
  995. {
  996. if (val < 0) { // ==> must be minInt
  997. char[] min = {' ',' ','2','1','4','7','4','8','3','6','4','8'};
  998. return min;
  999. }
  1000. char[] str = {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};
  1001. str[11] = (char) (val % 10 + (int) '0'); val = val / 10;
  1002. for (int i = 10; val != 0; i--) {
  1003. str[i] = (char) (val % 10 + (int) '0'); val = val / 10;
  1004. }
  1005. return str;
  1006. }
  1007. public static void WriteInt(int val, int fwd)
  1008. {
  1009. char[] str = (val >= 0 ? strRep(val) : strRep(-val));
  1010. int blank;
  1011. for (blank = 0; str[blank] == ' '; blank++)
  1012. ;
  1013. if (val < 0) {
  1014. str[blank-1] = '-'; blank--;
  1015. }
  1016. // format ...
  1017. // 01...............901
  1018. // _________xxxxxxxxxxx
  1019. // <-blank->< 12-blank>
  1020. // <-----fwd------>
  1021. if (fwd == 0) // magic case, put out exactly one blank
  1022. System.Console.Write(str, blank-1, 13-blank);
  1023. else if (fwd < (12-blank))
  1024. System.Console.Write(str, blank, 12-blank);
  1025. else if (fwd <= 12)
  1026. System.Console.Write(str, 12-fwd, fwd);
  1027. else { // fwd > 12
  1028. for (int i = fwd-12; i > 0; i--)
  1029. System.Console.Write(" ");
  1030. System.Console.Write(str);
  1031. }
  1032. }
  1033. public static void WriteHex(int val, int wid)
  1034. {
  1035. char[] str = new char[9];
  1036. int j; // index of last blank
  1037. int i = 8;
  1038. do {
  1039. int dig = val & 0xF;
  1040. val = (int)((uint) val >> 4);
  1041. if (dig >= 10)
  1042. str[i] = (char) (dig + ((int) 'A' - 10));
  1043. else
  1044. str[i] = (char) (dig + (int) '0');
  1045. i--;
  1046. } while (val != 0);
  1047. j = i;
  1048. while (i >= 0) {
  1049. str[i] = ' '; i--;
  1050. }
  1051. if (wid == 0) // special case, exactly one blank
  1052. System.Console.Write(str, j, 9-j);
  1053. else if (wid < (8-j))
  1054. System.Console.Write(str, j+1, 8-j);
  1055. else if (wid <= 9)
  1056. System.Console.Write(str, 9-wid, wid);
  1057. else {
  1058. for (i = wid-9; i > 0; i--)
  1059. System.Console.Write(" ");
  1060. System.Console.Write(str);
  1061. }
  1062. }
  1063. public static void WriteString(char[] str)
  1064. {
  1065. int len = str.Length;
  1066. for (int i = 0; i < len && str[i] != '\0'; i++)
  1067. System.Console.Write(str[i]);
  1068. }
  1069. } // end of public class Console
  1070. /* ==================================================================== */
  1071. /* ==================================================================== */
  1072. //
  1073. // Body of StdIn module.
  1074. // This file implements the code of the StdIn.cp file.
  1075. // kjg Sep 2004.
  1076. //
  1077. // Known in ILASM as [RTS]StdIn
  1078. //
  1079. public class StdIn
  1080. {
  1081. public static void Read(ref char c) {
  1082. int chr = System.Console.Read();
  1083. if (chr == -1) {
  1084. c = '\0';
  1085. } else {
  1086. c = (char) chr;
  1087. }
  1088. }
  1089. public static void ReadLn(char[] arr) {
  1090. string str = System.Console.ReadLine();
  1091. if (str == null) {
  1092. arr[0] = '\0'; return;
  1093. }
  1094. int dLen = arr.Length;
  1095. int sLen = str.Length;
  1096. int cLen = (sLen < dLen ? sLen : dLen-1);
  1097. str.CopyTo(0, arr, 0, cLen);
  1098. arr[cLen] = '\0';
  1099. }
  1100. public static void SkipLn() {
  1101. string str = System.Console.ReadLine();
  1102. }
  1103. public static bool More() {
  1104. return true; // temporary, until we figure out how to get the same
  1105. } // semantics on .NET and the JVM (kjg Sep. 2004
  1106. } // end of public class StdIn
  1107. /* ==================================================================== */
  1108. /* ==================================================================== */
  1109. //
  1110. // Body of Error interface.
  1111. // This file implements the code of the Error.cp file.
  1112. // kjg May 2000.
  1113. //
  1114. public class Error
  1115. // Known in ILASM as [RTS]Error
  1116. {
  1117. public static void WriteLn()
  1118. {
  1119. System.Console.Error.Write(System.Environment.NewLine);
  1120. }
  1121. public static void Write(char ch)
  1122. {
  1123. System.Console.Error.Write(ch);
  1124. }
  1125. private static char[] strRep(int val)
  1126. {
  1127. if (val < 0) { // ==> must be minInt
  1128. char[] min = {' ',' ','2','1','4','7','4','8','3','6','4','8'};
  1129. return min;
  1130. }
  1131. char[] str = {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};
  1132. str[11] = (char) (val % 10 + (int) '0'); val = val / 10;
  1133. for (int i = 10; val != 0; i--) {
  1134. str[i] = (char) (val % 10 + (int) '0'); val = val / 10;
  1135. }
  1136. return str;
  1137. }
  1138. public static void WriteInt(int val, int fwd)
  1139. {
  1140. char[] str = (val >= 0 ? strRep(val) : strRep(-val));
  1141. int blank;
  1142. for (blank = 0; str[blank] == ' '; blank++)
  1143. ;
  1144. if (val < 0) {
  1145. str[blank-1] = '-'; blank--;
  1146. }
  1147. // format ...
  1148. // 01...............901
  1149. // _________xxxxxxxxxxx
  1150. // <-blank->< 12-blank>
  1151. // <-----fwd------>
  1152. if (fwd == 0) // magic case, put out exactly one blank
  1153. System.Console.Error.Write(str, blank-1, 13-blank);
  1154. else if (fwd < (12-blank))
  1155. System.Console.Error.Write(str, blank, 12-blank);
  1156. else if (fwd <= 12)
  1157. System.Console.Error.Write(str, 12-fwd, fwd);
  1158. else { // fwd > 12
  1159. for (int i = fwd-12; i > 0; i--)
  1160. System.Console.Error.Write(" ");
  1161. System.Console.Error.Write(str);
  1162. }
  1163. }
  1164. public static void WriteHex(int val, int wid)
  1165. {
  1166. char[] str = new char[9];
  1167. int j; // index of last blank
  1168. int i = 8;
  1169. do {
  1170. int dig = val & 0xF;
  1171. val = (int)((uint) val >> 4);
  1172. if (dig >= 10)
  1173. str[i] = (char) (dig + ((int) 'A' - 10));
  1174. else
  1175. str[i] = (char) (dig + (int) '0');
  1176. i--;
  1177. } while (val != 0);
  1178. j = i;
  1179. while (i >= 0) {
  1180. str[i] = ' '; i--;
  1181. }
  1182. if (wid == 0) // special case, exactly one blank
  1183. System.Console.Error.Write(str, j, 9-j);
  1184. else if (wid < (8-j))
  1185. System.Console.Error.Write(str, j+1, 8-j);
  1186. else if (wid <= 9)
  1187. System.Console.Error.Write(str, 9-wid, wid);
  1188. else {
  1189. for (i = wid-9; i > 0; i--)
  1190. System.Console.Error.Write(" ");
  1191. System.Console.Error.Write(str);
  1192. }
  1193. }
  1194. public static void WriteString(char[] str)
  1195. {
  1196. int len = str.Length;
  1197. for (int i = 0; i < len && str[i] != '\0'; i++)
  1198. System.Console.Error.Write(str[i]);
  1199. }
  1200. } // end of public class Error
  1201. /* ==================================================================== */
  1202. abstract public class XHR
  1203. // Known in ILASM as [RTS]XHR
  1204. {
  1205. /* ==================================================================== *
  1206. * eXplicit Heap-allocated activation Record *
  1207. * ==================================================================== */
  1208. public XHR prev;
  1209. }
  1210. /* ==================================================================== */
  1211. namespace Vectors {
  1212. public abstract class VecBase {
  1213. public int tide;
  1214. public abstract void expand();
  1215. }
  1216. public class VecChr : VecBase {
  1217. public char[] elms;
  1218. public override void expand() {
  1219. char[] tmp = new char[this.elms.Length * 2];
  1220. for (int i = 0; i < this.tide; i++) {
  1221. tmp[i] = this.elms[i];
  1222. }
  1223. this.elms = tmp;
  1224. }
  1225. }
  1226. public class VecI32 : VecBase {
  1227. public int[] elms;
  1228. public override void expand() {
  1229. int[] tmp = new int[this.elms.Length * 2];
  1230. for (int i = 0; i < this.tide; i++) {
  1231. tmp[i] = this.elms[i];
  1232. }
  1233. this.elms = tmp;
  1234. }
  1235. }
  1236. public class VecI64 : VecBase {
  1237. public long[] elms;
  1238. public override void expand() {
  1239. long[] tmp = new long[this.elms.Length * 2];
  1240. for (int i = 0; i < this.tide; i++) {
  1241. tmp[i] = this.elms[i];
  1242. }
  1243. this.elms = tmp;
  1244. }
  1245. }
  1246. public class VecR32 : VecBase {
  1247. public float[] elms;
  1248. public override void expand() {
  1249. float[] tmp = new float[this.elms.Length * 2];
  1250. for (int i = 0; i < this.tide; i++) {
  1251. tmp[i] = this.elms[i];
  1252. }
  1253. this.elms = tmp;
  1254. }
  1255. }
  1256. public class VecR64 : VecBase {
  1257. public double[] elms;
  1258. public override void expand() {
  1259. double[] tmp = new double[this.elms.Length * 2];
  1260. for (int i = 0; i < this.tide; i++) {
  1261. tmp[i] = this.elms[i];
  1262. }
  1263. this.elms = tmp;
  1264. }
  1265. }
  1266. public class VecRef : VecBase {
  1267. public object[] elms;
  1268. public override void expand() {
  1269. object[] tmp = new object[this.elms.Length * 2];
  1270. for (int i = 0; i < this.tide; i++) {
  1271. tmp[i] = this.elms[i];
  1272. }
  1273. this.elms = tmp;
  1274. }
  1275. }
  1276. }
  1277. /* ==================================================================== */
  1278. /* ==================================================================== */