DIRECTORY IO USING [STREAM], PFSNames USING [Component, PATH, Version], Rope USING [ROPE]; PFSCanonicalNames: CEDAR DEFINITIONS SHARES PFSNames ~ BEGIN OPEN PFSNames; ROPE: TYPE = Rope.ROPE; UnparseName: PROC[name: PATH] RETURNS [fullFName: ROPE]; UnparseComponent: PROC [component: Component] RETURNS [ROPE]; UnparseVersion: PUBLIC PROC [version: Version] RETURNS [ROPE]; ParseName: PROC [name: ROPE] RETURNS [parsedName: PATH]; ParseComponent: PROC [name: ROPE, first: NAT _ 0] RETURNS [component: Component, next: NAT]; ParseVersion: PROC [v: ROPE, first: NAT _ 0] RETURNS [version: Version, next: NAT]; ParseNameFromStream: PROC [s: IO.STREAM] RETURNS [name: PATH]; END. .PFSCanonicalNames.mesa Carl Hauser, August 9, 1988 5:54:24 pm PDT Canonical unparsing: [/]component0/component1/.../componentComponentCount-1[/] The first / is included if name.absolute; the last if name.directory. Canonical unparsing: Rope.Cat[name, Unparse[version]] bug: name unparsing should insert escape characters on /, ! (and, of course, the escape character). Canonical unparsing: NIL, !H, !L, !*, !num as appropriate. Parsing names in canonical form. parses a component beginning at name[first] and returns that component; next = first + length of the parsed component. bug: should interpret escape sequences. parses a version beginning at name[first] and returns that version; next = first + length of the parsed version. A convenient way to read a whitespace-delimited name from a stream. ʽ˜šœ™Icode™*—J™K˜šÏk ˜ Kšœœœ˜Kšœ œ œ ˜*Kšœœœ˜K˜—KšÏnœœ ˜$Kšœ ˜šœ œ ˜K˜Kšœœœ˜K˜š ž œœœœ œ˜9™Kšœ Ïdœ ŸœŸœ™9KšœG™G—K˜šžœœœœ˜=™K™ K™c——K˜š žœœœœœ˜>™K™%———K™š ž œœœœœ˜8K™ K™š žœœœ œœœ˜\K™vK™'—K˜š ž œœœ œœœ˜SK™p——K˜š žœœ œœœ˜>K™E——K˜Kšœ˜—…—®™