1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414 |
- /** This is the body of the GPCP runtime support.
- *
- * Written November 1998, John Gough. (for jdk version)
- * This version for Lightning, May 2000, John Gough.
- * Support for uplevel addressing RTS.XHR, Aug-2001.
- * Merged version for N2CPS, gpcp etc. SYChan, KJGough. 19-Aug-2001.
- */
- #if !BETA1
- #define BETA2
- #endif
- public class RTS
- // Known in ILASM as [RTS]RTS
- {
- /** This is part of the body of the GPCP runtime support.
- *
- * Written November 1998, John Gough.
- * This version for Lightning, May 2000, John Gough.
- */
- /* ------------------------------------------------------------ */
- /* Support for RTS.cp */
- /* ------------------------------------------------------------ */
- public static char[] defaultTarget = {'n','e','t','\0'};
- public static char[] eol = NativeStrings.mkArr(System.Environment.NewLine);
- public static double dblPosInfinity = System.Double.PositiveInfinity;
- public static double dblNegInfinity = System.Double.NegativeInfinity;
- public static float fltPosInfinity = System.Single.PositiveInfinity;
- public static float fltNegInfinity = System.Single.NegativeInfinity;
- private static char[] ChrNaN = {'N','a','N','\0'};
- private static char[] ChrPosInf = {'I','n','f','i','n','i','t','y','\0'};
- private static char[] ChrNegInf = {'-','I','n','f','i','n','i','t','y','\0'};
- private static System.String StrNaN = new System.String(ChrNaN);
- private static System.String StrPosInf = new System.String(ChrPosInf);
- private static System.String StrNegInf = new System.String(ChrNegInf);
- private static System.Type typDouble = System.Type.GetType("System.Double");
- private static System.Type typSingle = System.Type.GetType("System.Single");
- private static System.IFormatProvider invarCulture =
- (System.IFormatProvider) new System.Globalization.CultureInfo("");
- private static System.IFormatProvider currentCulture =
- (System.IFormatProvider) System.Globalization.CultureInfo.CurrentCulture;
- /* -------------------------------------------------------------------- */
- // PROCEDURE getStr*(x : NativeException) : RTS.CharOpen; END getStr;
- //
- // Known in ILASM as [RTS]RTS::getStr
- public static char[] getStr(System.Exception inp)
- {
- return CP_rts.strToChO(inp.ToString());
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE StrToBool(IN str : ARRAY OF CHAR;
- // OUT b : BOOLEAN;
- // OUT ok : BOOLEAN);
- //
- // Known in ILASM as [RTS]RTS::StrToBool
- public static void StrToBool(char[] str,
- out bool o, // OUT param
- out bool r) // OUT param
- {
- System.String bstr = new System.String(str);
- try {
- o = System.Boolean.Parse(bstr);
- r = true;
- } catch {
- o = false;
- r = false;
- }
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE TypeName(typ : NativeType) : CharOpen
- // (* Get the name of the argument type *)
- //
- public static char[] TypeName(System.Type t) {
- return NativeStrings.mkArr(t.FullName);
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE CharAtIndex(str : NativeString; idx : INTEGER) : CHAR;
- // (* Get the character at zero-based index idx *)
- //
- public static char CharAtIndex( string s, int i ) { return s[i]; }
- /* ------------------------------------------------------------ */
- // PROCEDURE Length(str : NativeString) : INTEGER;
- // (* Get the length of the native string *)
- //
- public static int Length( string s ) { return s.Length; }
- /* ------------------------------------------------------------ */
- // PROCEDURE StrToByte(IN str : ARRAY OF CHAR;
- // OUT b : BYTE;
- // OUT ok : BOOLEAN);
- //
- // Known in ILASM as [RTS]RTS::StrToByte
- public static void StrToByte(char[] str,
- out sbyte o, // OUT param
- out bool r) // OUT param
- {
- System.String bstr = new System.String(str);
- try {
- o = System.SByte.Parse(bstr);
- r = true;
- } catch {
- o = 0;
- r = false;
- }
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE StrToUByte(IN str : ARRAY OF CHAR;
- // OUT b : BYTE;
- // OUT ok : BOOLEAN);
- //
- // Known in ILASM as [RTS]RTS::StrToUByte
- public static void StrToUByte(char[] str,
- out sbyte o, // OUT param
- out bool r) // OUT param
- {
- System.String bstr = new System.String(str);
- try {
- o = (sbyte)System.Byte.Parse(bstr);
- r = true;
- } catch {
- o = (sbyte)0;
- r = false;
- }
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE HexStrToUByte(IN s : ARRAY OF CHAR; OUT b : BYTE; OUT ok : BOOLEAN);
- //
- // Known in ILASM as [RTS]RTS::HexStrToUByte
- public static void HexStrToUByte(char[] str,
- out sbyte o, // OUT param
- out bool r) // OUT param
- {
- System.String bstr = new System.String(str);
- try {
- o = (sbyte)System.Byte.Parse
- (bstr, System.Globalization.NumberStyles.HexNumber);
- r = true;
- } catch {
- o = (sbyte)0;
- r = false;
- }
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE StrToShort(IN str : ARRAY OF CHAR;
- // OUT i : SHORTINT;
- // OUT ok : BOOLEAN);
- //
- // Known in ILASM as [RTS]RTS::StrToShort
- public static void StrToShort(char[] str,
- out short o, // OUT param
- out bool r) // OUT param
- {
- System.String sstr = new System.String(str);
- try {
- o = System.Int16.Parse(sstr);
- r = true;
- } catch {
- o = (short) 0;
- r = false;
- }
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE StrToUShort(IN str : ARRAY OF CHAR;
- // OUT i : SHORTINT;
- // OUT ok : BOOLEAN);
- //
- // Known in ILASM as [RTS]RTS::StrToUShort
- public static void StrToUShort(char[] str,
- out short o, // OUT param
- out bool r) // OUT param
- {
- System.String sstr = new System.String(str);
- try {
- o = (short)System.UInt16.Parse(sstr);
- r = true;
- } catch {
- o = (short) 0;
- r = false;
- }
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE StrToInt(IN str : ARRAY OF CHAR;
- // OUT i : INTEGER;
- // OUT ok : BOOLEAN);
- //
- // Known in ILASM as [RTS]RTS::StrToInt
- public static void StrToInt(char[] str,
- out int o, // OUT param
- out bool r) // OUT param
- {
- System.String lstr = new System.String(str);
- try {
- o = System.Int32.Parse(lstr);
- r = true;
- } catch {
- o = 0;
- r = false;
- }
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE StrToUInt(IN str : ARRAY OF CHAR;
- // OUT i : INTEGER;
- // OUT ok : BOOLEAN);
- //
- // Known in ILASM as [RTS]RTS::StrToUInt
- public static void StrToUInt(char[] str,
- out int o, // OUT param
- out bool r) // OUT param
- {
- System.String lstr = new System.String(str);
- try {
- o = (int)System.UInt32.Parse(lstr);
- r = true;
- } catch {
- o = (int)0;
- r = false;
- }
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE StrToLong(IN str : ARRAY OF CHAR;
- // OUT l : LONGINT;
- // OUT ok : BOOLEAN);
- //
- // Known in ILASM as [RTS]RTS::StrToLong
- public static void StrToLong(char[] str,
- out long o, // OUT param
- out bool r) // OUT param
- {
- System.String lstr = new System.String(str);
- try {
- o = System.Int64.Parse(lstr);
- r = true;
- } catch {
- o = (long) 0;
- r = false;
- }
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE StrToULong(IN str : ARRAY OF CHAR;
- // OUT l : LONGINT;
- // OUT ok : BOOLEAN);
- //
- // Known in ILASM as [RTS]RTS::StrToULong
- public static void StrToULong(char[] str,
- out long o, // OUT param
- out bool r) // OUT param
- {
- System.String lstr = new System.String(str);
- try {
- o = (long)System.UInt64.Parse(lstr);
- r = true;
- } catch {
- o = (long) 0;
- r = false;
- }
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE StrToSReal(IN str : ARRAY OF CHAR;
- // OUT r : SHORTREAL;
- // OUT ok : BOOLEAN);
- //
- // Known in ILASM as [RTS]RTS::StrToSReal
- public static void StrToSReal(char[] str,
- out float o, // OUT param
- out bool r) // OUT param
- {
- System.String rstr = new System.String(str);
- try {
- o = System.Single.Parse(rstr);
- r = true;
- } catch {
- if (System.String.Compare(rstr, StrPosInf) == 0) {
- o = System.Single.PositiveInfinity;
- r = true;
- }
- else if (System.String.Compare(rstr, StrNegInf) == 0) {
- o = System.Single.NegativeInfinity;
- r = true;
- }
- else if (System.String.Compare(rstr, StrNaN) == 0) {
- o = System.Single.NaN;
- r = true;
- }
- else {
- o = 0;
- r = false;
- }
- }
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE StrToReal(IN str : ARRAY OF CHAR;
- // OUT r : REAL;
- // OUT ok : BOOLEAN);
- //
- // Known in ILASM as [RTS]RTS::StrToReal
- public static void StrToReal(char[] str,
- out double o, // OUT param
- out bool r) // OUT param
- {
- System.String rstr = new System.String(str);
- try {
- o = System.Double.Parse(rstr);
- r = true;
- } catch {
- if (System.String.Compare(rstr, StrPosInf) == 0) {
- o = System.Double.PositiveInfinity;
- r = true;
- }
- else if (System.String.Compare(rstr, StrNegInf) == 0) {
- o = System.Double.NegativeInfinity;
- r = true;
- }
- else if (System.String.Compare(rstr, StrNaN) == 0) {
- o = System.Double.NaN;
- r = true;
- }
- else {
- o = 0.0;
- r = false;
- }
- }
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE StrToRealInvar(IN str : ARRAY OF CHAR;
- // OUT r : REAL;
- // OUT ok : BOOLEAN);
- //
- // Known in ILASM as [RTS]RTS::StrToReal
- public static void StrToRealInvar(char[] str,
- out double o, // OUT param
- out bool r) // OUT param
- {
- System.String rstr = new System.String(str);
- try {
- o = System.Double.Parse(rstr, invarCulture);
- r = true;
- } catch {
- if (System.String.Compare(rstr, StrPosInf) == 0) {
- o = System.Double.PositiveInfinity;
- r = true;
- }
- else if (System.String.Compare(rstr, StrNegInf) == 0) {
- o = System.Double.NegativeInfinity;
- r = true;
- }
- else if (System.String.Compare(rstr, StrNaN) == 0) {
- o = System.Double.NaN;
- r = true;
- }
- else {
- o = 0.0;
- r = false;
- }
- }
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE StrToRealLocal(IN str : ARRAY OF CHAR;
- // OUT r : REAL;
- // OUT ok : BOOLEAN);
- //
- // Known in ILASM as [RTS]RTS::StrToReal
- public static void StrToRealLocal(char[] str,
- out double o, // OUT param
- out bool r) // OUT param
- {
- System.String rstr = new System.String(str);
- try {
- o = System.Double.Parse(rstr, currentCulture);
- r = true;
- } catch {
- if (System.String.Compare(rstr, StrPosInf) == 0) {
- o = System.Double.PositiveInfinity;
- r = true;
- }
- else if (System.String.Compare(rstr, StrNegInf) == 0) {
- o = System.Double.NegativeInfinity;
- r = true;
- }
- else if (System.String.Compare(rstr, StrNaN) == 0) {
- o = System.Double.NaN;
- r = true;
- }
- else {
- o = 0.0;
- r = false;
- }
- }
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE ByteToStr*(i : BYTE; OUT s : ARRAY OF CHAR);
- // (** Decode a CP BYTE into an array *)
- // BEGIN END ByteToStr;
- //
- // Known in ILASM as [RTS]RTS::ByteToStr
- public static void ByteToStr(sbyte num,
- char[] str)
- {
- System.String lls = System.Convert.ToString(num);
- int len = lls.Length;
- if (len >= str.Length)
- len = str.Length - 1;
- lls.CopyTo(0, str, 0, len);
- str[len] = '\0';
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE ShortToStr*(i : SHORTINT; OUT s : ARRAY OF CHAR);
- // (** Decode a CP SHORTINT into an array *)
- // BEGIN END ShortToStr;
- //
- // Known in ILASM as [RTS]RTS::ShortToStr
- public static void ShortToStr(short num,
- char[] str)
- {
- System.String lls = System.Convert.ToString(num);
- int len = lls.Length;
- if (len >= str.Length)
- len = str.Length - 1;
- lls.CopyTo(0, str, 0, len);
- str[len] = '\0';
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE IntToStr*(i : INTEGER; OUT s : ARRAY OF CHAR);
- // (** Decode a CP INTEGER into an array *)
- // BEGIN END IntToStr;
- //
- // Known in ILASM as [RTS]RTS::IntToStr
- public static void IntToStr(int num,
- char[] str)
- {
- System.String lls = System.Convert.ToString(num);
- int len = lls.Length;
- if (len >= str.Length)
- len = str.Length - 1;
- lls.CopyTo(0, str, 0, len);
- str[len] = '\0';
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE ObjToStr(obj: mscorlib_System.Object; OUT str: ARRAY OF CHAR);
- // (** Decode an .NET object into an array of CHAR *)
- // BEGIN END ObjToStr;
- //
- // Known in ILASM as [RTS]RTS::ObjToStr
- public static void ObjToStr(System.Object obj, char[] str)
- {
- System.String lls;
- if (obj.GetType().IsEnum) {
- #if BETA1
- lls = obj.ToString();
- #else //BETA2
- lls = System.Convert.ToString(System.Convert.ToInt64(obj));
- #endif
- }
- else {
- if (obj.GetType().Equals(typDouble)) {
- #if BETA1
- lls = System.Convert.ToDouble(obj).ToString();
- #else //BETA2
- lls = System.Convert.ToDouble(obj).ToString("R");
- #endif
- }
- else if (obj.GetType().Equals(typSingle)) {
- #if BETA1
- lls = System.Convert.ToSingle(obj).ToString();
- #else //BETA2
- lls = System.Convert.ToSingle(obj).ToString("R");
- #endif
- }
- else {
- lls = System.Convert.ToString(obj);
- }
- }
- int len = lls.Length;
- if (len >= str.Length)
- len = str.Length - 1;
- lls.CopyTo(0, str, 0, len);
- str[len] = '\0';
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE LongToStr*(i : LONGINT; OUT s : ARRAY OF CHAR);
- // (** Decode a CP LONGINT into an array *)
- // BEGIN END LongToStr;
- //
- // Known in ILASM as [RTS]RTS::LongToStr
- public static void LongToStr(long num,
- char[] str)
- {
- System.String lls = System.Convert.ToString(num);
- int len = lls.Length;
- if (len >= str.Length)
- len = str.Length - 1;
- lls.CopyTo(0, str, 0, len);
- str[len] = '\0';
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE SRealToStr*(r : SHORTREAL; OUT s : ARRAY OF CHAR);
- // (** Decode a CP REAL into an array *)
- // BEGIN END SRealToStr;
- //
- // Known in ILASM as [RTS]RTS::SRealToStr
- public static void SRealToStr(float num,
- char[] str)
- {
- // System.String lls = System.Convert.ToString(num);
- #if BETA1
- System.String lls = ((System.Single) num).ToString();
- #else //BETA2
- System.String lls = ((System.Single) num).ToString("R");
- #endif
- int len = lls.Length;
- lls.CopyTo(0, str, 0, len);
- str[len] = '\0';
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE RealToStr*(r : REAL; OUT s : ARRAY OF CHAR);
- // (** Decode a CP REAL into an array *)
- // BEGIN END RealToStr;
- //
- // Known in ILASM as [RTS]RTS::RealToStr
- public static void RealToStr(double num,
- char[] str)
- {
- #if BETA1
- System.String lls = System.Convert.ToString(num);
- #else //BETA2
- System.String lls = ((System.Double) num).ToString("R");
- #endif
- int len = lls.Length;
- lls.CopyTo(0, str, 0, len);
- str[len] = '\0';
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE RealToStrInvar*(r : REAL; OUT s : ARRAY OF CHAR);
- // (** Decode a CP REAL into an array *)
- // BEGIN END RealToStrInvar;
- //
- // Known in ILASM as [RTS]RTS::RealToStrInvar
- public static void RealToStrInvar(double num,
- char[] str)
- {
- #if BETA1
- System.String lls = System.Convert.ToString(num);
- #else //BETA2
- System.String lls =
- ((System.Double) num).ToString("R", invarCulture);
- #endif
- int len = lls.Length;
- lls.CopyTo(0, str, 0, len);
- str[len] = '\0';
- }
- /* ------------------------------------------------------------ */
- // PROCEDURE RealToStrLocal*(r : REAL; OUT s : ARRAY OF CHAR);
- // (** Decode a CP REAL into an array *)
- // BEGIN END RealToStrInvar;
- //
- // Known in ILASM as [RTS]RTS::RealToStrLocal
- public static void RealToStrLocal(double num,
- char[] str)
- {
- #if BETA1
- System.String lls = System.Convert.ToString(num);
- #else //BETA2
- System.String lls =
- ((System.Double) num).ToString("R", currentCulture);
- #endif
- int len = lls.Length;
- lls.CopyTo(0, str, 0, len);
- str[len] = '\0';
- }
- /* ------------------------------------------------------------ */
- //
- // PROCEDURE realToLongBits(r : REAL) : LONGINT;
- // (** Convert an ieee double into a longint with same bit pattern *)
- //
- public static long realToLongBits(double r)
- {
- byte[] tmp = System.BitConverter.GetBytes(r);
- return System.BitConverter.ToInt64(tmp,0);
- }
- //
- // PROCEDURE longBitsToReal(l : LONGINT) : REAL;
- // (** Convert a longint into an ieee double with same bit pattern *)
- //
- public static double longBitsToReal(long l)
- {
- byte[] tmp = System.BitConverter.GetBytes(l);
- return System.BitConverter.ToDouble(tmp,0);
- }
- /* ------------------------------------------------------------ */
- //
- // PROCEDURE shortRealToIntBits(r : SHORTREAL) : INTEGER;
- // (** Convert an ieee double into a longint with same bit pattern *)
- //
- public static int shortRealToIntBits(float r)
- {
- byte[] tmp = System.BitConverter.GetBytes(r);
- return System.BitConverter.ToInt32(tmp,0);
- }
- //
- // PROCEDURE intBitsToShortReal(l : INTEGER) : SHORTREAL;
- // (** Convert an int into an ieee float with same bit pattern *)
- //
- public static double intBitsToShortReal(int l)
- {
- byte[] tmp = System.BitConverter.GetBytes(l);
- return System.BitConverter.ToSingle(tmp,0);
- }
- /* ------------------------------------------------------------ */
- //
- // PROCEDURE hiByte(l : SHORTINT) : BYTE;
- // (** Get hi-significant byte of short *)
- //
- // Known in ILASM as [RTS]RTS::hiByte
- public static sbyte hiByte(short i)
- {
- return (sbyte) (i >> 8);
- }
- //
- // PROCEDURE loByte(l : SHORTINT) : BYTE;
- // (** Get lo-significant byte of short *)
- //
- // Known in ILASM as [RTS]RTS::loByte
- public static sbyte loByte(short i)
- {
- return (sbyte) i;
- }
- //
- // PROCEDURE hiShort(l : INTEGER) : SHORTINT;
- // (** Get hi-significant word of integer *)
- //
- // Known in ILASM as [RTS]RTS::hiShort
- public static short hiShort(int i)
- {
- return (short) (i >> 16);
- }
- //
- // PROCEDURE loShort(l : INTEGER) : SHORTINT;
- // (** Get lo-significant word of integer *)
- //
- // Known in ILASM as [RTS]RTS::loShort
- public static short loShort(int i)
- {
- return (short) i;
- }
- //
- // PROCEDURE hiInt(l : LONGINT) : INTEGER;
- // (** Get hi-significant word of long integer *)
- //
- // Known in ILASM as [RTS]RTS::hiInt
- public static int hiInt(long l)
- {
- return (int) (l >> 32);
- }
- //
- // PROCEDURE loInt(l : LONGINT) : INTEGER;
- // (** Get lo-significant word of long integer *)
- //
- // Known in ILASM as [RTS]RTS::loInt
- public static int loInt(long l)
- {
- return (int) l;
- }
- //
- // PROCEDURE Throw(IN s : ARRAY OF CHAR);
- // (** Abort execution with an error *)
- //
- // Known in ILASM as [RTS]RTS::Throw
- public static void Throw(char[] s)
- {
- throw new System.Exception(new System.String(s));
- }
- //
- // PROCEDURE GetMillis() : LONGINT;
- //
- // Known in ILASM as [RTS]RTS::GetMillis
- public static long GetMillis()
- {
- return (System.DateTime.Now.Ticks / 10000);
- }
- //
- // PROCEDURE GetDateString(OUT str : ARRAY OF CHAR);
- //
- // Known in ILASM as [RTS]RTS::GetDateString
- public static void GetDateString(char[] arr)
- {
- System.String str = System.DateTime.Now.ToString();
- int len = str.Length;
- if (len >= arr.Length)
- len = arr.Length - 1;
- str.CopyTo(0, arr, 0, len);
- arr[len] = '\0';
- }
- public static void ClassMarker(System.Object o)
- {
- System.Console.Write(o.GetType().ToString());
- }
- }
- /* ------------------------------------------------------------ */
- /* ------------------------------------------------------------ */
- /* ------------------------------------------------------------ */
- public class ProgArgs
- // Known in ILASM as [RTS]ProgArgs
- /*
- * Library module for GP Component Pascal.
- * This module allows access to the arguments in programs which
- * import CPmain. It is accessible from modules which do NOT
- * import CPmain.
- *
- * Original : kjg December 1999
- */
- {
- public static System.String[] argList = null;
- // Known in ILASM as [RTS]ProgArgs::ArgNumber
- // PROCEDURE ArgNumber*() : INTEGER
- public static int ArgNumber()
- {
- if (ProgArgs.argList == null)
- return 0;
- else
- return argList.Length;
- }
- // Known in ILASM as [RTS]ProgArgs::GetArg
- // PROCEDURE GetArg*(num : INTEGER; OUT arg : ARRAY OF CHAR)
- public static void GetArg(int num, char[] arr)
- {
- int i;
- if (argList == null && num < argList.Length) {
- arr[0] = '\0';
- } else {
- System.String str = argList[num];
- for (i = 0;
- i < arr.Length && i < argList[num].Length;
- i++) {
- arr[i] = str[i];
- }
- if (i == arr.Length)
- i--;
- arr[i] = '\0';
- }
- }
- public static void GetEnvVar(char[] name, char[] valu) {
- System.String nam = CP_rts.mkStr(name);
- System.String val = System.Environment.GetEnvironmentVariable(nam, System.EnvironmentVariableTarget.User);
- CP_rts.StrToChF(valu, val);
- }
- } // end of public class ProgArgs
- /* ------------------------------------------------------------ */
- /* ------------------------------------------------------------ */
- /* ------------------------------------------------------------ */
- public class CP_rts
- // Known in ILASM as [RTS]CP_rts
- /*
- * It is a fundamental principle that the facilities of CP_rts
- * are known to the particular compiler backend, but are
- * not accessible to the Programmer. The programmer-accessible
- * parts of the runtime are known via the module RTS.
- */
- {
- /* ==================================================================== *
- * MOD and DIV helpers. With correction factors *
- * ==================================================================== */
- // Known in ILASM as [RTS]CP_rts::CpModI
- public static int CpModI(int lVal, int rVal)
- {
- // A correction is required if the signs of
- // the two operands are different, but the
- // remainder is non-zero. Inc rem by rVal.
- int rslt = lVal % rVal;
- if ((lVal < 0 != rVal < 0) && (rslt != 0))
- rslt += rVal;
- return rslt;
- }
- // Known in ILASM as [RTS]CP_rts::CpDivI
- public static int CpDivI(int lVal, int rVal)
- {
- // A correction is required if the signs of
- // the two operands are different, but the
- // remainder is non-zero. Dec quo by 1.
- int rslt = lVal / rVal;
- int remV = lVal % rVal;
- if ((lVal < 0 != rVal < 0) && (remV != 0))
- rslt--;
- return rslt;
- }
- // Known in ILASM as [RTS]CP_rts::CpModL
- public static long CpModL(long lVal, long rVal)
- {
- // A correction is required if the signs of
- // the two operands are different, but the
- // remainder is non-zero. Inc rem by rVal.
- long rslt = lVal % rVal;
- if ((lVal < 0 != rVal < 0) && (rslt != 0))
- rslt += rVal;
- return rslt;
- }
- // Known in ILASM as [RTS]CP_rts::CpDivL
- public static long CpDivL(long lVal, long rVal)
- {
- // A correction is required if the signs of
- // the two operands are different, but the
- // remainder is non-zero. Dec quo by 1.
- long rslt = lVal / rVal;
- long remV = lVal % rVal;
- if ((lVal < 0 != rVal < 0) && (remV != 0))
- rslt--;
- return rslt;
- }
- /* ==================================================================== *
- * Various string and char-array helpers *
- * ==================================================================== */
- // Known in ILASM as [RTS]CP_rts::mkStr
- public static System.String mkStr(char[] arr) {
- int len = chrArrLength(arr);
- return new System.String(arr,0,len);
- }
- /* -------------------------------------------------------------------- */
- // Known in ILASM as [RTS]CP_rts::caseMesg
- public static System.String caseMesg(int i)
- {
- System.String s = "CASE-trap: selector = " + i;
- return s;
- }
- /* -------------------------------------------------------------------- */
- // Known in ILASM as [RTS]CP_rts::withMesg
- public static System.String withMesg(System.Object o)
- {
- // System.String c = o.getClass().getName();
- // c = c.substring(c.lastIndexOf('.') + 1);
- // c = "WITH else-trap: type = " + c;
- // NEEDS TO USE LIGHTNING REFLECTION SERVICES HERE
- string c = "WITH else-trap: type = " + o.ToString();
- return c;
- }
- /* -------------------------------------------------------------------- */
- // Known in ILASM as [RTS]CP_rts::chrArrLength
- public static int chrArrLength(char[] src)
- {
- int len = src.Length;
- for (int ix = 0; ix < len; ix++)
- if (src[ix] == '\0')
- return ix;
- return len;
- }
- /* -------------------------------------------------------------------- */
- // Known in ILASM as [RTS]CP_rts::chrArrLplus1
- public static int chrArrLplus1(char[] src)
- {
- int ix = 0;
- char ch;
- do {
- ch = src[ix];
- ix++;
- } while (ch != '\0');
- return ix;
- }
- /* -------------------------------------------------------------------- */
- // Known in ILASM as [RTS]CP_rts::strToChO
- public static char[] strToChO(System.String input)
- {
- if (input == null) return null;
- int len = input.Length;
- char[] arr = new char[len+1];
- input.CopyTo(0, arr, 0, len);
- arr[len] = '\0';
- return arr;
- // return input.ToCharArray();
- }
- /* -------------------------------------------------------------------- */
- // Known in ILASM as [RTS]CP_rts::StrToChF
- public static void StrToChF(char[] res, System.String inp)
- {
- if (inp == null) {
- res[0] = '\0'; return;
- }
- int len = inp.Length;
- inp.CopyTo(0, res, 0, len);
- res[len] = '\0';
- }
- /* -------------------------------------------------------------------- */
- // Known in ILASM as [RTS]CP_rts::Stringify
- public static void Stringify(char[] dst, char[] src)
- {
- int ix = 0;
- char ch;
- do {
- ch = src[ix];
- dst[ix] = ch;
- ix++;
- } while (ch != '\0');
- }
- /* -------------------------------------------------------------------- */
- // Known in ILASM as [RTS]CP_rts::ChrArrCheck
- public static void ChrArrCheck(char[] src)
- {
- int ix = 0;
- char ch;
- do {
- ch = src[ix];
- if (ch > 0xFF) throw new
- System.Exception("error applying SHORT to array");
- ix++;
- } while (ch != '\0');
- }
- /* -------------------------------------------------------------------- */
- // Known in ILASM as [RTS]CP_rts::strCmp
- public static int strCmp(char[] l, char[] r)
- {
- int minL;
- int lLen = chrArrLength(l);
- int rLen = chrArrLength(r);
- if (lLen < rLen) minL = lLen; else minL = rLen;
- // System.Console.WriteLine();
- for (int ix = 0; ix < minL; ix++) {
- char lCh = l[ix];
- char rCh = r[ix];
- if (lCh < rCh) return -1;
- else if (lCh > rCh) return 1;
- }
- if (lLen < rLen) return -1;
- else if (lLen > rLen) return 1;
- else return 0;
- }
- /* ==================================================================== *
- * String concatenation helper methods *
- * ==================================================================== */
- // Known in ILASM as [RTS]CP_rts::aaToStr
- public static System.String aaToStr(char[] l, char[] r)
- {
- int llen = chrArrLength(l);
- int rlen = chrArrLength(r);
- System.Text.StringBuilder buff =
- new System.Text.StringBuilder(llen + rlen);
- return buff.Append(l,0,llen).Append(r,0,rlen).ToString();
- }
- // Known in ILASM as [RTS]CP_rts::asToStr
- public static System.String asToStr(char[] l, System.String r)
- {
- int llen = chrArrLength(l);
- System.Text.StringBuilder buff =
- new System.Text.StringBuilder(3 * llen);
- return buff.Append(l,0,llen).Append(r).ToString();
- }
- // Known in ILASM as [RTS]CP_rts::saToStr
- public static System.String saToStr(System.String l, char[] r)
- {
- int rlen = chrArrLength(r);
- System.Text.StringBuilder buff =
- new System.Text.StringBuilder(3 * rlen);
- return buff.Append(l).Append(r,0,rlen).ToString();
- }
- // Known in ILASM as [RTS]CP_rts::ssToStr
- public static System.String ssToStr(System.String l, System.String r)
- {
- System.Text.StringBuilder buff =
- new System.Text.StringBuilder(l);
- return buff.Append(r).ToString();
- }
- }
- /* ==================================================================== */
- /* ==================================================================== */
- /* ==================================================================== */
- /* ==================================================================== */
- public class NativeStrings
- // Known in ILASM as [RTS]NativeStrings
- {
- /* -------------------------------------------------------------------- */
- //
- // PROCEDURE mkStr*(IN s : ARRAY OF CHAR) : String; BEGIN RETURN NIL END mkStr;
- //
- /* -------------------------------------------------------------------- */
- // Known in ILASM as [RTS]NativeStrings::mkStr
- public static System.String mkStr(char[] arr) {
- int len = CP_rts.chrArrLength(arr);
- return new System.String(arr,0,len);
- }
- /* -------------------------------------------------------------------- */
- //
- // PROCEDURE mkArr*(s : String) : RTS.CharOpen); END mkArr;
- //
- /* -------------------------------------------------------------------- */
- // Known in ILASM as [RTS]NativeStrings::mkArr
- public static char[] mkArr(System.String inp)
- {
- if (inp == null) return null;
- int len = inp.Length;
- char[] res = new char[len+1];
- inp.CopyTo(0, res, 0, len);
- res[len] = '\0';
- return res;
- }
- }
- /* ==================================================================== */
- /* ==================================================================== */
- //
- // Body of Console interface.
- // This file implements the code of the Console.cp file.
- // kjg May 2000.
- //
- public class Console
- // Known in ILASM as [RTS]Console
- {
- public static void WriteLn()
- {
- System.Console.WriteLine();
- }
- public static void Write(char ch)
- {
- System.Console.Write(ch);
- }
- private static char[] strRep(int val)
- {
- if (val < 0) { // ==> must be minInt
- char[] min = {' ',' ','2','1','4','7','4','8','3','6','4','8'};
- return min;
- }
- char[] str = {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};
- str[11] = (char) (val % 10 + (int) '0'); val = val / 10;
- for (int i = 10; val != 0; i--) {
- str[i] = (char) (val % 10 + (int) '0'); val = val / 10;
- }
- return str;
- }
- public static void WriteInt(int val, int fwd)
- {
- char[] str = (val >= 0 ? strRep(val) : strRep(-val));
- int blank;
- for (blank = 0; str[blank] == ' '; blank++)
- ;
- if (val < 0) {
- str[blank-1] = '-'; blank--;
- }
- // format ...
- // 01...............901
- // _________xxxxxxxxxxx
- // <-blank->< 12-blank>
- // <-----fwd------>
- if (fwd == 0) // magic case, put out exactly one blank
- System.Console.Write(str, blank-1, 13-blank);
- else if (fwd < (12-blank))
- System.Console.Write(str, blank, 12-blank);
- else if (fwd <= 12)
- System.Console.Write(str, 12-fwd, fwd);
- else { // fwd > 12
- for (int i = fwd-12; i > 0; i--)
- System.Console.Write(" ");
- System.Console.Write(str);
- }
- }
- public static void WriteHex(int val, int wid)
- {
- char[] str = new char[9];
- int j; // index of last blank
- int i = 8;
- do {
- int dig = val & 0xF;
- val = (int)((uint) val >> 4);
- if (dig >= 10)
- str[i] = (char) (dig + ((int) 'A' - 10));
- else
- str[i] = (char) (dig + (int) '0');
- i--;
- } while (val != 0);
- j = i;
- while (i >= 0) {
- str[i] = ' '; i--;
- }
- if (wid == 0) // special case, exactly one blank
- System.Console.Write(str, j, 9-j);
- else if (wid < (8-j))
- System.Console.Write(str, j+1, 8-j);
- else if (wid <= 9)
- System.Console.Write(str, 9-wid, wid);
- else {
- for (i = wid-9; i > 0; i--)
- System.Console.Write(" ");
- System.Console.Write(str);
- }
- }
- public static void WriteString(char[] str)
- {
- int len = str.Length;
- for (int i = 0; i < len && str[i] != '\0'; i++)
- System.Console.Write(str[i]);
- }
- } // end of public class Console
- /* ==================================================================== */
- /* ==================================================================== */
- //
- // Body of StdIn module.
- // This file implements the code of the StdIn.cp file.
- // kjg Sep 2004.
- //
- // Known in ILASM as [RTS]StdIn
- //
- public class StdIn
- {
- public static void Read(ref char c) {
- int chr = System.Console.Read();
- if (chr == -1) {
- c = '\0';
- } else {
- c = (char) chr;
- }
- }
- public static void ReadLn(char[] arr) {
- string str = System.Console.ReadLine();
- if (str == null) {
- arr[0] = '\0'; return;
- }
- int dLen = arr.Length;
- int sLen = str.Length;
- int cLen = (sLen < dLen ? sLen : dLen-1);
- str.CopyTo(0, arr, 0, cLen);
- arr[cLen] = '\0';
- }
- public static void SkipLn() {
- string str = System.Console.ReadLine();
- }
- public static bool More() {
- return true; // temporary, until we figure out how to get the same
- } // semantics on .NET and the JVM (kjg Sep. 2004
- } // end of public class StdIn
- /* ==================================================================== */
- /* ==================================================================== */
- //
- // Body of Error interface.
- // This file implements the code of the Error.cp file.
- // kjg May 2000.
- //
- public class Error
- // Known in ILASM as [RTS]Error
- {
- public static void WriteLn()
- {
- System.Console.Error.Write(System.Environment.NewLine);
- }
- public static void Write(char ch)
- {
- System.Console.Error.Write(ch);
- }
- private static char[] strRep(int val)
- {
- if (val < 0) { // ==> must be minInt
- char[] min = {' ',' ','2','1','4','7','4','8','3','6','4','8'};
- return min;
- }
- char[] str = {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};
- str[11] = (char) (val % 10 + (int) '0'); val = val / 10;
- for (int i = 10; val != 0; i--) {
- str[i] = (char) (val % 10 + (int) '0'); val = val / 10;
- }
- return str;
- }
- public static void WriteInt(int val, int fwd)
- {
- char[] str = (val >= 0 ? strRep(val) : strRep(-val));
- int blank;
- for (blank = 0; str[blank] == ' '; blank++)
- ;
- if (val < 0) {
- str[blank-1] = '-'; blank--;
- }
- // format ...
- // 01...............901
- // _________xxxxxxxxxxx
- // <-blank->< 12-blank>
- // <-----fwd------>
- if (fwd == 0) // magic case, put out exactly one blank
- System.Console.Error.Write(str, blank-1, 13-blank);
- else if (fwd < (12-blank))
- System.Console.Error.Write(str, blank, 12-blank);
- else if (fwd <= 12)
- System.Console.Error.Write(str, 12-fwd, fwd);
- else { // fwd > 12
- for (int i = fwd-12; i > 0; i--)
- System.Console.Error.Write(" ");
- System.Console.Error.Write(str);
- }
- }
- public static void WriteHex(int val, int wid)
- {
- char[] str = new char[9];
- int j; // index of last blank
- int i = 8;
- do {
- int dig = val & 0xF;
- val = (int)((uint) val >> 4);
- if (dig >= 10)
- str[i] = (char) (dig + ((int) 'A' - 10));
- else
- str[i] = (char) (dig + (int) '0');
- i--;
- } while (val != 0);
- j = i;
- while (i >= 0) {
- str[i] = ' '; i--;
- }
- if (wid == 0) // special case, exactly one blank
- System.Console.Error.Write(str, j, 9-j);
- else if (wid < (8-j))
- System.Console.Error.Write(str, j+1, 8-j);
- else if (wid <= 9)
- System.Console.Error.Write(str, 9-wid, wid);
- else {
- for (i = wid-9; i > 0; i--)
- System.Console.Error.Write(" ");
- System.Console.Error.Write(str);
- }
- }
- public static void WriteString(char[] str)
- {
- int len = str.Length;
- for (int i = 0; i < len && str[i] != '\0'; i++)
- System.Console.Error.Write(str[i]);
- }
- } // end of public class Error
- /* ==================================================================== */
- abstract public class XHR
- // Known in ILASM as [RTS]XHR
- {
- /* ==================================================================== *
- * eXplicit Heap-allocated activation Record *
- * ==================================================================== */
- public XHR prev;
- }
- /* ==================================================================== */
- namespace Vectors {
- public abstract class VecBase {
- public int tide;
- public abstract void expand();
- }
- public class VecChr : VecBase {
- public char[] elms;
- public override void expand() {
- char[] tmp = new char[this.elms.Length * 2];
- for (int i = 0; i < this.tide; i++) {
- tmp[i] = this.elms[i];
- }
- this.elms = tmp;
- }
- }
- public class VecI32 : VecBase {
- public int[] elms;
- public override void expand() {
- int[] tmp = new int[this.elms.Length * 2];
- for (int i = 0; i < this.tide; i++) {
- tmp[i] = this.elms[i];
- }
- this.elms = tmp;
- }
- }
- public class VecI64 : VecBase {
- public long[] elms;
- public override void expand() {
- long[] tmp = new long[this.elms.Length * 2];
- for (int i = 0; i < this.tide; i++) {
- tmp[i] = this.elms[i];
- }
- this.elms = tmp;
- }
- }
- public class VecR32 : VecBase {
- public float[] elms;
- public override void expand() {
- float[] tmp = new float[this.elms.Length * 2];
- for (int i = 0; i < this.tide; i++) {
- tmp[i] = this.elms[i];
- }
- this.elms = tmp;
- }
- }
- public class VecR64 : VecBase {
- public double[] elms;
- public override void expand() {
- double[] tmp = new double[this.elms.Length * 2];
- for (int i = 0; i < this.tide; i++) {
- tmp[i] = this.elms[i];
- }
- this.elms = tmp;
- }
- }
- public class VecRef : VecBase {
- public object[] elms;
- public override void expand() {
- object[] tmp = new object[this.elms.Length * 2];
- for (int i = 0; i < this.tide; i++) {
- tmp[i] = this.elms[i];
- }
- this.elms = tmp;
- }
- }
- }
- /* ==================================================================== */
- /* ==================================================================== */
|