DIRECTORY IO, Rope, TextNode, TiogaFileOps; TiogaStreams: CEDAR DEFINITIONS = BEGIN ROPE: TYPE = Rope.ROPE; CreateInput: PROC [from: TextNode.Ref, commentHandling: CommentHandling _ discard, levelPrefix: ROPE _ NIL] RETURNS [in: IO.STREAM]; CommentHandling: TYPE = {discard, useDirectly, prefixWithDashDash}; CurInLoc: PROC [s: IO.STREAM] RETURNS [loc: TextNode.Location]; SkipChildren: PROC [s: IO.STREAM]; CreateOutput: PROC [to: TiogaFileOps.Ref, breakAtNewline: BOOL _ FALSE, levelPrefix, defaultFormat: ROPE _ NIL, flexilevel: BOOL _ FALSE, spacesPerTab, normalNestIndent: INT _ 0] RETURNS [out: IO.STREAM]; CurOutNode: PROC [s: IO.STREAM] RETURNS [n: TiogaFileOps.Ref]; EndNode: PROC [s: IO.STREAM, depthOp: DepthOp _ reset, idempotently: BOOLEAN _ FALSE]; DepthOp: TYPE = {same, reset}; SetFormat: PROC [of: IO.STREAM, format: ROPE]; ChangeDepth: PROC [s: IO.STREAM, deltaDepth: INTEGER _ 0, autoEndNode: BOOL _ TRUE, idempotently: BOOL _ FALSE]; NotNow: ERROR [s: IO.STREAM]; BadDepth: ERROR [s: IO.STREAM, depth: INT]; CallerBug: ERROR [s: IO.STREAM, message: ROPE]; IsATS: PROC [s: IO.STREAM] RETURNS [is: BOOLEAN]; CopyChildren: PROC [from: TextNode.Ref, to: TiogaFileOps.Ref]; END. ˜TiogaStreams.Mesa Mike Spreitzer April 24, 1990 6:47 am PDT Input Create a Tioga Input Stream on descendents of from. Each subnode's chars are prefixed by levelPrefix * (-1 + its depth realtive to from), then maybe "--" for comment nodes. What to do about comment nodes. Where the "carat" is. This is a position between characters, or index of next character. Phony prefixes and postfixes get "squeezed" out. Skips children of CurInNode[s]. Output Creates children of to. IF breakAtNewline, THEN s.PutChar['\n] gets translated to s.EndNode[reset, FALSE]. IF (NOT flexilevel) AND levelPrefix # NIL, THEN every node that begins with N repetitions of levelPrefix will be indented N levels deeper than it otherwise would be. IF flexilevel, THEN the depth of each node is 1 more than the depth of the most recent node with less leading whitespace. Spaces are white; tabs are white iff spacesPerTab>0; nothing else is white. Each child node will have format=defaultFormat, unless explicitly overridden by SetFormat. IF flexilevel AND normalNestIndent>0, THEN each node whose amout of leading white space exceeds its parent's by an amout different than normalNestIndent gets a Postfix property adjusting its appearance to match the amount of leading white space. Returns the one just before the "carat", which is, of course, between characters. depthOp says whether new node should have same depth as previous, or revert to initial (direct child of CreateOutput's to). May be further modified by ChangeDepth or receiving levelPrefixes. Applies to CurOutNode only. IF autoEndNode, THEN first EndNode[same, idempotently]. Must be called "between" nodes (autoEndNode trivializes that). Changes depth of following node from what it would otherwise be. Can't be called on flexilevel streams. Raised by ChangeDepth when called before node ended. Raised when depth (relative to CreateOutput's to) goes negative --- usually from IO operations (like PutChar) that put the first character on a node. When depth jumps deeper than Tioga will (i.e., more than one level per jump), the difference is made up by prefixing with copies of levelPrefix. General escape. Other Accepts either input or output streams. Κη˜™Icode™)—J˜KšΟk œœ˜+K˜KšΠbx œœ œ˜!K˜Kš˜K˜Kšœœœ˜head™šΟn œœOœœœœœ˜„Kšœ.Οeœ™3KšœO œ%™x—K˜šœœ.˜CK™—K˜š Ÿœœœœœ˜?K™‹—K˜šŸ œœœœ˜"K™——™šŸ œœ(œœœœœœ"œœœœ˜ΜKšœ œ™KšœR™RKšœ₯™₯KšœΖ™ΖKšœZ™ZKšœυ™υ—K˜š Ÿ œœœœœ˜>Kšœ> œ ™Q—K˜š Ÿœœœœ*œœ˜VKšœw œE™Ύ—K˜Kšœ œ˜K˜š Ÿ œœœœ œ˜.Kšœ™—K˜šŸ œœœœœœœœœ˜pKšœ7™7Kšœ>™>K™@K™&—K˜šΠblœœœœ˜Kšœ4™4—K˜š ‘œœœœ œ˜+Kšœ. œe™•K™—K˜š Ρbln œœœœ œ˜/K™——™š Ÿœœœœœœ˜1K™'—K˜KšŸ œœ,˜>—K˜Kšœ˜—…—Ό;