DIRECTORY Commander USING [Register, CommandProc], CommanderOps USING [<> NextArgument], Convert USING [Error, IntFromRope], IO USING [PutF1, PutRope, rope], Rope USING [ROPE, Cat, Concat, Substr], PrintEnglish; PrintEnglishImpl: CEDAR PROGRAM IMPORTS Commander, CommanderOps, Convert, IO, Rope EXPORTS PrintEnglish ~ BEGIN ROPE: TYPE ~ Rope.ROPE; largestMajor: INT = 3; -- the largest INT is in the billions majors: ARRAY [0..21] OF ROPE = [ -- most of these are not currently used, but are included for completeness "", " thousand", " million", " billion", " trillion", " quadrillion", " quintillion", " sextillion", " septillion", " octillion", " nonillion", " decillion", " undecillion", " duodecillion", " tredecillion", " quattuordecillion", " quindecillion", " sexdecillion", " septendecillion", " octodecillion", " novemdecillion", " vigintillion" ]; ones: ARRAY [0..9] OF ROPE = [ " zero", " one", " two", " three", " four", " five", " six", " seven", " eight", " nine" ]; teens: ARRAY [0..9] OF ROPE = [ " ten", " eleven", " twelve", " thirteen", " fourteen", " fifteen", " sixteen", " seventeen", " eighteen", " nineteen" ]; tens: ARRAY [0..9] OF ROPE = [ " zero", " ten", " twenty", " thirty", " forty", " fifty", " sixty", " seventy", " eighty", " ninety" ]; Power: PROC [i: INT, power: INT] RETURNS [INT] ~ { result: INT ¬ 1; THROUGH [1..power] DO result ¬ result * i; ENDLOOP; RETURN[result]; }; SmallIntToEnglish: PROC [i: INT] RETURNS [r: ROPE] ~ { digit: INT; r ¬ NIL; digit ¬ i/100; IF digit # 0 THEN r ¬ Rope.Cat[r, ones[digit], " hundred"]; i ¬ i MOD 100; IF i IN [10..19] THEN { r ¬ Rope.Concat[r, teens[i-10]]; RETURN; }; digit ¬ i/10; IF digit # 0 THEN r ¬ Rope.Concat[r, tens[digit]]; i ¬ i MOD 10; IF i # 0 THEN r ¬ Rope.Concat[r, ones[i]]; }; IntToEnglish: PUBLIC PROC [i: INT] RETURNS [r: ROPE] ~ { high: INT; mIndex: INT ¬ largestMajor; mValue: INT; r ¬ NIL; WHILE mIndex >= 0 DO mValue ¬ Power[1000, mIndex]; high ¬ i / mValue; IF high # 0 THEN { r ¬ Rope.Cat[r, SmallIntToEnglish[high], majors[mIndex]]; i ¬ i MOD mValue; }; mIndex ¬ mIndex -1; ENDLOOP; IF r = NIL THEN r ¬ " zero"; r ¬ Rope.Substr[base: r, start: 1]; -- to remove initial blank space }; Number: Commander.CommandProc = { i: INT; i ¬ Convert.IntFromRope[CommanderOps.NextArgument[cmd] ! Convert.Error => GOTO SyntaxError]; IO.PutF1[cmd.out, "%g\n", IO.rope[IntToEnglish[i]]]; EXITS SyntaxError => IO.PutRope[cmd.err, "Integer not specified.\n"]; }; Commander.Register[key: "Number", proc: Number, doc: "Print out the english equivalent of an integer"]; END. κ PrintEnglishImpl.mesa Copyright Σ 1985, 1992 by Xerox Corporation. All rights reserved. Doug Terry July 8, 1985 2:06:25 pm PDT Doug Terry, March 4, 1986 2:52:29 pm PST Brian Oki November 15, 1989 4:50:51 pm PST Willie-s, April 23, 1992 1:54 pm PDT Converts integer numbers to their English equivalents. [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL] argv: CommanderOps.ArgumentVector _ CommanderOps.Parse[cmd: cmd ! CommanderOps.Failed => GOTO SyntaxError]; IF argv.argc < 2 THEN GOTO SyntaxError; i _ Convert.IntFromRope[argv[1] ! Convert.Error => GOTO SyntaxError]; Doug Terry, February 27, 1986 1:06:05 pm PST changes to: DIRECTORY, PrintEnglishImpl, IMPORTS, EXPORTS, ~, Power, SmallIntToEnglish, IntToEnglish, Number, END Doug Terry, February 27, 1986 1:10:18 pm PST changes to: DIRECTORY, IMPORTS, Number Doug Terry, February 28, 1986 4:27:28 pm PST changes to: IntToEnglish, DIRECTORY Doug Terry, March 4, 1986 2:52:29 pm PST changes to: DIRECTORY, Number Κo–(cedarcode) style•NewlineDelimiter ™codešœ™Kšœ Οeœ6™BK™&K™(K™*K™$K™K™—šΟk ˜ Kšœ žœ˜(Kšœ žœ3˜EKšœžœ˜#Kšžœžœ˜ Kšœžœžœ˜'Kšœ ˜ —K˜KšΠblœžœž˜Kšžœ#žœ˜2Kšžœ ˜šœž˜K˜Kšžœžœžœ˜K˜KšœžœΟc%˜=K˜Kš œžœ žœžœ KœΤ˜ΑK˜Kšœžœžœžœ`˜zK˜Kšœžœžœžœ~˜™K˜Kšœžœžœžœm˜‡K˜š Οnœžœžœ žœžœžœ˜2Kšœžœ˜šžœ ž˜K˜Kšžœ˜—Kšžœ ˜K˜—K˜š ‘œžœžœžœžœ˜6Kšœžœ˜ Kšœžœ˜K˜šžœ ž˜K˜)—Kšœžœ˜šžœžœ žœ˜K˜ Kšžœ˜K˜—K˜ šžœ ž˜K˜ —Kšœžœ˜šžœž˜ K˜—K˜—K˜š ‘ œžœžœžœžœžœ˜8K™6Kšœžœ˜ Kšœžœ˜Kšœžœ˜ Kšœžœ˜šžœ ž˜K˜K˜šžœ žœ˜K˜9Kšœžœ˜K˜—K˜Kšžœ˜—Kšžœžœžœ ˜K•StartOfExpansion9[base: ROPE, start: INT _ 0, len: INT _ 2147483647]šœ%  ˜EK˜—K˜–L -- [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL]šΟbœ˜!JšΠckH™HKšœžœ˜KšœYžœ™kJšžœž œ ž™'Jšœ3žœ™EKšœJžœ˜\Kšžœžœ˜4šž˜Kšœžœ.˜?—K˜—K˜šœh˜hK™——Kšžœ˜™,Kšœ Οre™q—™,Kšœ €™&—™,Kšœ €™#—K™™(Kšœ €™—K™—…— ,