DIRECTORY BlackBerry USING [PrintEntry, SetCountLimit], Commander USING [CommandProc, Register], Convert USING [Error, IntFromRope], IO USING [atom, BreakProc, EndOfStream, GetTokenRope, IDProc, PutF, TokenProc, RIS, rope, STREAM], LoganBerry USING [AttributeType, Entry, Error, Open, OpenDB, SchemaInfo, nullDB], LoganBerryBrowser USING [CreateTool, DBInfoRec, Tool, ToolBody], Rope USING [Concat, Equal, Fetch, Find, Length, ROPE, SkipTo, Substr]; LoganBerryViewerCommandsImpl: CEDAR PROGRAM IMPORTS BlackBerry, Commander, Convert, IO, LoganBerry, LoganBerryBrowser, Rope ~ BEGIN ROPE: TYPE ~ Rope.ROPE; STREAM: TYPE ~ IO.STREAM; currentName: ROPE ฌ "#"; currentDB: LoganBerry.OpenDB ฌ LoganBerry.nullDB; -- cache of most recently used db MakeBrowserTool: Commander.CommandProc = { ENABLE LoganBerry.Error => { IO.PutF[cmd.err, "Error: %g - %g\n", IO.atom[ec], IO.rope[explanation]]; GOTO End; }; ParseSwitch: PROC [arg: ROPE] RETURNS [found: BOOLEAN ฌ FALSE] ~ { IF Rope.Fetch[dbname, 0] = '- THEN { -- parse switch found ฌ TRUE; SELECT Rope.Fetch[dbname, 1] FROM 'T, 't => limit ฌ Convert.IntFromRope[Rope.Substr[dbname, 2] ! Convert.Error => GOTO BadSwitch]; ENDCASE => GOTO BadSwitch; }; EXITS BadSwitch => msg ฌ "Invalid switch.\n"; }; dbname: ROPE; tool: LoganBerryBrowser.Tool ฌ NEW[LoganBerryBrowser.ToolBody]; argStream: IO.STREAM ฌ IO.RIS[cmd.commandLine]; limit: INT ฌ 0; DO dbname ฌ IO.GetTokenRope[argStream, IO.IDProc ! IO.EndOfStream => EXIT].token; IF ParseSwitch[dbname] THEN LOOP; tool.databases ฌ CONS[NEW[LoganBerryBrowser.DBInfoRec ฌ [db: Open[dbname]]], tool.databases]; ENDLOOP; IF tool.databases = NIL THEN RETURN[result: NIL, msg: "No database name supplied.\n"]; IF limit#0 THEN { BlackBerry.SetCountLimit[limit]; tool.display ฌ BlackBerry.PrintEntry; }; LoganBerryBrowser.CreateTool[tool: tool]; EXITS End => RETURN; }; Open: PROC [dbname: ROPE] RETURNS [db: LoganBerry.OpenDB] ~ { prev, loc: INT ฌ 0; IF Rope.Equal[dbname, currentName] THEN RETURN[currentDB]; WHILE loc < Rope.Length[dbname] DO prev ฌ loc; loc ฌ Rope.SkipTo[s: dbname, pos: prev+1, skip: "/>]"]; ENDLOOP; IF Rope.Find[dbname, "!", prev] = -1 AND Rope.Find[dbname, ".", prev] = -1 THEN { dbname ฌ Rope.Concat[dbname, ".df"]; }; db ฌ currentDB ฌ LoganBerry.Open[dbName: dbname]; }; Commander.Register[key: "LoganBerryBrowser", proc: MakeBrowserTool, doc: "Create a LoganBerry browser.\n usage: LoganBerryBrowser ..." ]; Commander.Register[key: "LBBrowser", proc: MakeBrowserTool, doc: "Create a LoganBerry browser.\n usage: LBBrowser ..." ]; END. "LoganBerryViewerCommandsImpl.mesa Copyright ำ 1986, 1992 by Xerox Corporation. All rights reserved. Doug Terry, May 9, 1991 9:16 am PDT Brian Oki, May 29, 1990 9:43 am PDT Registers the LoganBerry commands that must be executed in a viewers world. Currently, there is only one: LoganBerryBrowser. The rest of the LoganBerry commands are implemented in LoganBerryCommandsImpl.mesa. LoganBerry commands [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL] Opens the database with the given name; a distinquished name "#" indicates that the most recently opened database should be used. A cache of opened databases could be maintained, but we don't bother for now. If the name is missing an explicit extension and version then ".df!H" is assumed. Command registrations สฉ–(cedarcode) style•NewlineDelimiter ˜codešœ!™!Kšœ ฯeœ6™BK™#K™#K™Kšœา™าK™—šฯk ˜ Kšœ žœ˜-Kšœ žœ˜(Kšœžœ˜#KšžœžœGžœžœ˜bKšœ žœA˜QKšœžœ)˜@Kšœžœ'žœ˜GK˜—K˜Kšัblnœžœž˜+Kšžœ!žœ%˜Ošœž˜K˜Kšžœžœžœ˜Kšžœžœžœžœ˜K˜Kšœ žœ˜Kšœ2ฯc!˜S—head™šะbnœ˜*KšะckH™Hšžœ˜Kšžœ#žœ žœ˜HKšžœ˜ K˜—š ฯn œžœžœžœ žœžœ˜B•StartOfExpansion [base: ROPE, index: INT _ 0]šžœžœ ˜4Kšœžœ˜ šžœž˜!KšœPžœ ˜`Kšžœžœ ˜—Kšœ˜—šž˜K˜'—K˜—Kšœžœ˜ Kšœžœ˜?Kš œ žœžœžœžœ˜/Kšœžœ˜šž˜Kš œ žœžœ žœžœ˜NKšžœžœžœ˜!KšœžœžœD˜]Kšžœ˜—Kš žœžœžœžœ žœ'˜Všžœ žœ˜K˜ K˜%K˜—Kšœ)˜)šž˜Kšœžœ˜—K˜K˜—šฃœžœ žœžœ˜=Kšœฃ™ฃKšœ žœ˜Kšžœ!žœžœ ˜:šžœž˜"K˜ K˜7Kšžœ˜—šžœ$žœ$žœ˜SK˜$K˜—K˜1K˜K˜——™šœC˜CKšœW˜W—šœ;˜;KšœO˜O——K˜Kšžœ˜K™K™—…— ้