DIRECTORY AMBridge, AMTypes, Basics, Convert, IntStuff, IO, PrintTV, Rope, RuntimeError; IntStuffImpl: CEDAR PROGRAM IMPORTS AMBridge, AMTypes, Convert, IntStuff, IO, PrintTV, Rope, RuntimeError EXPORTS IntStuff = BEGIN OPEN IntStuff; ROPE: TYPE ~ Rope.ROPE; TV: TYPE ~ AMTypes.TV; Type: TYPE ~ AMTypes.Type; PrintEINT: PROC [tv: TV, data: REF ANY, stream: IO.STREAM, depth: INT _ 4, width: INT _ 32, verbose: BOOL _ FALSE] RETURNS [useOld: BOOL _ FALSE] --PrintTV.TVPrintProc-- ~ TRUSTED { refEINT: REF EINT ~ NEW [EINT]; refTV: TV ~ AMBridge.TVForReferent[refEINT]; AMTypes.Assign[lhs: refTV, rhs: tv]; stream.PutRope[ToRope[refEINT^]]; RETURN}; ToRope: PUBLIC PROC [t: EINT, base: [2..36] _ 10] RETURNS [rope: ROPE] ~ TRUSTED { neg: BOOL ~ t.Negative; tweak: BOOL _ neg; IF neg THEN t _ negOne.Sub[t]; rope _ NIL; WHILE t#zero DO {quot: EINT; rem: CARDINAL; [quot, rem] _ TDivMod[t, base]; IF tweak THEN { rem _ rem+1; IF rem=base THEN rem _ 0 ELSE tweak _ FALSE}; rope _ Rope.FromChar[IF rem<10 THEN '0 + rem ELSE 'A + (rem-10)].Concat[rope]; t _ quot; }ENDLOOP; IF tweak THEN rope _ Rope.Concat["1", rope] ELSE IF rope=NIL THEN rope _ "0"; IF neg THEN rope _ Rope.Concat["-", rope]; RETURN}; TDivMod: PROC [num: EINT, den: CARDINAL] RETURNS [quot: EINT, rem: CARDINAL] ~ TRUSTED { h: DM ~ DivMod[num.hi, den]; n2: INT ~ INT[num.lo] + INT[b1]*h.rem; l: DM ~ DivMod[n2, den]; quot _ IE[l.quot].Add[[loShort[lo: 0, hi: h.quot]]]; rem _ l.rem; RETURN}; DM: TYPE ~ RECORD [quot: INT, rem: CARDINAL]; DivMod: PROC [num: INT, den: CARDINAL] RETURNS [dm: DM] ~ { dm.quot _ num/den; num _ num - dm.quot*den; IF num<0 THEN {num _ num + den; dm.quot _ dm.quot-1}; IF num NOT IN [0 .. den) THEN ERROR; dm.rem _ num; RETURN}; FromRope: PUBLIC PROC [r: ROPE, base: [2..36] _ 10] RETURNS [t: EINT] ~ TRUSTED { rlen: INT ~ r.Length; pos: BOOL ~ r.Fetch[0] # '-; lim: EINT ~ TDivMod[firstEINT, base].quot; i: INT _ IF pos THEN 0 ELSE 1; t _ zero; FOR i _ i, i+1 WHILE i < rlen DO c: CHAR ~ r.Fetch[i]; d: CARDINAL; IF c IN ['0 .. '9] THEN d _ c - '0 ELSE IF c IN ['A .. 'Z] THEN d _ (c-'A) + 10 ELSE IF c IN ['a .. 'z] THEN d _ (c-'a) + 10 ELSE d _ 37; IF d >= base THEN Convert.Error[syntax, i]; IF t.Compare[lim] = less THEN Convert.Error[overflow, i]; t _ MulSC[t, base].SubI[d]; IF t.Positive THEN Convert.Error[overflow, i]; ENDLOOP; IF pos THEN {IF t#firstEINT THEN t _ t.Neg ELSE Convert.Error[overflow, i-1]}; RETURN}; Mul: PUBLIC PROC [a, b: EINT] RETURNS [DEINT] ~ TRUSTED { Ans: TYPE ~ RECORD [variant: SELECT OVERLAID * FROM unsigned => [cards: ARRAY [0 .. 5] OF CARDINAL], pair => [d: DEINT], ENDCASE]; ans: Ans _ [unsigned[ALL[0]]]; FOR i: [0 .. 2] IN [0 .. 2] DO FOR j: [0 .. 2] IN [0 .. 2] DO ij: [0 .. 5] ~ i+j; sum: CARD _ CARD[a.cards[i]]*b.cards[j] + ans.cards[ij]; ans.cards[ij] _ Basics.LowHalf[sum]; FOR k: [0 .. 5] IN (ij .. 5] WHILE Basics.HighHalf[sum] # 0 DO sum _ ans.cards[k] + CARD[Basics.HighHalf[sum]]; ans.cards[k] _ Basics.LowHalf[sum]; ENDLOOP; ENDLOOP ENDLOOP; IF a.Negative THEN IF b.Negative THEN ans.d.hi _ ans.d.hi.Add[a.Add[b]] ELSE ans.d.hi _ ans.d.hi.Sub[a] ELSE IF b.Negative THEN ans.d.hi _ ans.d.hi.Sub[b] ELSE NULL; IF ans.d.lo.Negative THEN ans.d.hi _ ans.d.hi.Succ; RETURN [ans.d]}; MulI: PUBLIC PROC [a: EINT, b: INT] RETURNS [EINT] ~ { l: EINT ~ MulSC[a, Basics.LowHalf[b]]; h: EINT ~ MulSI[a, LOOPHOLE[Basics.HighHalf[b]]]; hi: INT ~ h.EI; RETURN l.Add[[loShort[lo: 0, hi: hi]]]}; MulSI: PROC [a: EINT, b: INTEGER] RETURNS [c: EINT] ~ { m: INT ~ INT[a.lo]*INT[b]; RETURN [[loShort[lo: Basics.LowHalf[m], hi: HighInt[m] + a.hi*b]]]}; MulSC: PROC [a: EINT, b: CARDINAL] RETURNS [c: EINT] ~ { m: CARD ~ a.lo.LONG*b; RETURN [[loShort[lo: Basics.LowHalf[m], hi: INT[Basics.HighHalf[m]] + a.hi*b]]]}; ShiftInterval: PUBLIC PROC [i: Interval, d: EINT] RETURNS [o: Interval] ~ { o.min _ d.AddI[i.min].EI; o.max _ d.AddI[i.max].EI; }; ClipShiftInterval: PUBLIC PROC [i: Interval, d: EINT] RETURNS [o: Interval] ~ { o.min _ d.AddI[i.min].ClipI; o.max _ d.AddI[i.max].ClipI; }; NCN: PROC [c: CARD] RETURNS [n: LNAT] ~ {n _ c}; NIE: PROC [i: INT] RETURNS [EINT] ~ {RETURN IE[i]}; NCE: PROC [c: CARD] RETURNS [EINT] ~ {RETURN CE[c]}; NEI: PROC [t: EINT] RETURNS [INT] ~ {RETURN t.EI}; NEC: PROC [t: EINT] RETURNS [CARD] ~ {RETURN t.EC}; NEN: PROC [t: EINT] RETURNS [LNAT] ~ {RETURN t.EN}; NIsInt: PROC [t: EINT] RETURNS [BOOL] ~ {RETURN t.IsInt}; NIsNat: PROC [t: EINT] RETURNS [BOOL] ~ {RETURN t.IsNat}; NClipI: PROC [t: EINT] RETURNS [INT] ~ {RETURN t.ClipI}; NAdd: PROC [a, b: EINT] RETURNS [EINT] ~ {RETURN a.Add[b]}; NCompare: PROC [a, b: EINT] RETURNS [c: Basics.Comparison] ~ {c _ a.Compare[b]}; NAddI: PROC [a: EINT, b: INT] RETURNS [EINT] ~ {RETURN a.AddI[b]}; NISub: PROC [a, b: INT] RETURNS [EINT] ~ {RETURN ISub[a, b]}; NSucc: PROC [t: EINT] RETURNS [EINT] ~ {RETURN t.Succ}; Start: PROC ~ { PrintTV.RegisterTVPrintProc[CODE[EINT], PrintEINT]; }; Start[]; END. \IntStuffImpl.Mesa Last tweaked by Mike Spreitzer on November 17, 1987 7:23:07 pm PST Κ―˜code™KšœB™B—K˜KšΟk œ/œ˜XK˜šœœ˜Kšœ'œ˜MKšœ ˜K˜—K˜Kšœœ ˜K˜Kšœœœ˜Kšœœ œ˜Kšœœ˜K˜š Οn œœœœœ œœ œ œœœœ œœΟcœœ˜΅Kš œ œœœœ˜Kšœœ#˜,K•StartOfExpansion[lhs: TV, rhs: TV]˜$K˜!Kšœ˜—K˜šžœœœœœœœ˜RKšœœ˜Kšœœ˜Kšœœ˜Kšœœ˜ šœ˜Kšœœ˜ Kšœœ˜Kšœ˜šœœ˜Kšœ ˜ Kšœ œ œ œ˜-—Kšœœœ œ˜NKšœ ˜ Kšœœ˜ —Kš œœœœœœ ˜MKšœœ˜*Kšœ˜—K˜šžœœœœœœœœ˜XKšœœ˜Kšœœœ œ ˜&Kšœœ˜Kšœœ+˜4K˜ Kšœ˜—K˜Kš œœœœœ˜-K˜š žœœœœœœ˜;K˜K˜Kšœœ(˜5Kš œœœ œœ˜$K˜ Kšœ˜—K˜šžœœœœœœœ˜QKšœœ ˜Kšœœ˜Kšœœ!˜*Kš œœœœœ˜K˜ šœ œ ˜ Kšœœ˜Kšœœ˜ Kšœœ œ ˜"Kšœœœ œ˜,Kšœœœ œ˜,Kšœ˜ Kšœ œ˜+Kšœœ˜9K˜Kšœ œ˜.Kšœ˜—Kš œœœ œ œ˜NKšœ˜—K˜šžœœœœœœœ˜9š œœœ œœ˜3Kšœœ œœ˜0Kšœ œ˜Kšœ˜ —Kšœœ˜š œ œ œœ œ ˜=K˜Kšœœœ(˜8Kšœ$˜$šœ œ œ˜>Kšœœ˜0K˜#Kšœ˜—Kšœœ˜—šœ ˜ šœœ ˜Kšœ"˜&Kšœ˜—šœœ ˜Kšœ˜Kšœœ˜ ——Kšœœ˜3Kšœ ˜—K˜šžœœœœœœœ˜6Kšœœ˜&Kšœœ œ˜1Kšœœœ˜Kšœ"˜(—K˜š žœœœœœœ˜7Kšœœœœ˜Kšœ>˜D—K˜š žœœœœœœ˜8Kšœœœ˜Kšœ&œ"˜Q—K˜š ž œœœΟgœœœ˜KKšœ œ œ˜Kšœ œ œ˜K˜—K˜š žœœœ œœœ˜OKšœ œ˜Kšœ œ˜K˜—K˜Kš œœœœœ ˜0Kšœœœœœœœ˜3Kšœœœœœœœ˜4Kšœœœœœœœ˜2Kšœœœœœœœ˜3Kšœœœœœœœ˜3Kš žœœœœœœ ˜9Kš žœœœœœœ ˜9Kš žœœœœœœ ˜8Kš žœœœœœœ ˜;Kšžœœœœ-˜PKšžœœœœœœœ ˜BKš žœœœœœœ ˜=Kš žœœœœœœ ˜7K˜šžœœ˜Kšœœœ˜3K˜—K˜K˜K˜Kšœ˜—…—:E