RTS.cs 44 KB

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