DIRECTORY MessageWindow USING [Append, Blink], Rope USING [ROPE], RuntimeError USING [UNCAUGHT], TiogaAccess USING [Buffer, BufferSize, CharWithLooks, CopyNode, Create, DoneWith, EndOf, Fetch, FromFile, FromSelection, Get, GetBuffer, GetNodeInfo, NodeInfo, ObtainBuffer, PeekRope, Put, PutBuffer, PutNodeInfo, Reader, ReleaseBuffer, Store, WriteFile, Writer, WriteSelection], TiogaOps USING [CallWithLocks, Ref]; TiogaAccessExample: CEDAR PROGRAM IMPORTS MessageWindow, RuntimeError, TiogaAccess, TiogaOps ~ BEGIN ROPE: TYPE ~ Rope.ROPE; SaveSelection: PROC [fileName: ROPE] ~ { out: TiogaAccess.Writer _ TiogaAccess.Create[]; in: TiogaAccess.Reader _ TiogaAccess.FromSelection[]; UNTIL TiogaAccess.EndOf[in] DO nodeInfo: TiogaAccess.NodeInfo _ TiogaAccess.GetNodeInfo[in]; TiogaAccess.PutNodeInfo[out, nodeInfo]; DO candl: TiogaAccess.CharWithLooks _ TiogaAccess.Get[in]; TiogaAccess.Put[out, candl]; IF candl.endOfNode THEN EXIT; ENDLOOP; ENDLOOP; TiogaAccess.DoneWith[in]; TiogaAccess.WriteFile[out, fileName]; }; GetSelection: PROC ~ { selection: TiogaAccess.Reader _ TiogaAccess.FromSelection[]; fileName: ROPE _ TiogaAccess.PeekRope[selection]; buffer: TiogaAccess.Buffer _ TiogaAccess.ObtainBuffer[]; out: TiogaAccess.Writer _ TiogaAccess.Create[]; in: TiogaAccess.Reader _ TiogaAccess.FromFile[fileName]; TiogaAccess.DoneWith[selection]; IF NOT TiogaAccess.EndOf[in] THEN [] _ TiogaAccess.Get[in]; UNTIL TiogaAccess.EndOf[in] DO [] _ TiogaAccess.CopyNode[out, in] ENDLOOP; TiogaAccess.ReleaseBuffer[buffer]; TiogaAccess.DoneWith[in]; TiogaAccess.WriteSelection[out]; }; ReverseBuffer: PROC [buffer: TiogaAccess.Buffer] ~ { size: INT _ buffer.BufferSize-1; FOR i: INT IN [0..size/2) DO t: TiogaAccess.CharWithLooks _ buffer.Fetch[i]; buffer.Store[i, buffer.Fetch[size-1-i]]; buffer.Store[size-1-i, t] ENDLOOP; }; ReverseSelection: PROC ~ { buffer: TiogaAccess.Buffer _ TiogaAccess.ObtainBuffer[]; out: TiogaAccess.Writer _ TiogaAccess.Create[]; in: TiogaAccess.Reader _ TiogaAccess.FromSelection[]; UNTIL TiogaAccess.EndOf[in] DO nodeInfo: TiogaAccess.NodeInfo _ TiogaAccess.GetNodeInfo[in]; nodeEnd: BOOLEAN _ TiogaAccess.GetBuffer[in, buffer]; IF NOT nodeEnd THEN ERROR; TiogaAccess.PutNodeInfo[out, nodeInfo]; ReverseBuffer[buffer]; TiogaAccess.PutBuffer[out, buffer]; ENDLOOP; TiogaAccess.ReleaseBuffer[buffer]; TiogaAccess.DoneWith[in]; TiogaAccess.WriteSelection[out]; }; LockedReverseSelection: PROC ~ { action: PROC [ref: TiogaOps.Ref] ~ {ReverseSelection[]}; TiogaOps.CallWithLocks[action ! RuntimeError.UNCAUGHT => { MessageWindow.Append["Unknown error in ReverseSelection", TRUE]; MessageWindow.Blink[]; CONTINUE }]; }; END. CreateButton S _ TiogaAccessExample.SaveSelection["Save"] CreateButton G _ TiogaAccessExample.GetSelection[] CreateButton R _ TiogaAccessExample.ReverseSelection[] CreateButton L _ TiogaAccessExample.LockedReverseSelection[] CreateButton P _ TiogaAccess.GetPosition[TiogaAccess.FromSelection[]] .TiogaAccessExample.mesa Copyright (C) 1984, Xerox Corporation. All rights reserved. Michael Plass, March 5, 1985 10:09:21 am PST Could catch FS.Error here for bad name or missing file. Discard root; failure to do this will cause the WriteSelection to fail. Do not include the end-of-node mark. Κ=˜J™J™<™,J˜—šΟk ˜ Jšœœœ˜$Jšœœœ˜Jšœ œœ˜Jšœ œ…˜–Jšœ œ˜$J˜—šœ ˜!Jšœ3˜:Jšœ˜J˜šœœœ˜J˜—šΟn œœ œ˜(Jšœ/˜/Jšœ5˜5šœ˜Jšœ=˜=Jšœ'˜'š˜Jšœ7˜7Jšœ˜Jšœœœ˜Jšœ˜—Jšœ˜—Jšœ˜Jšœ%˜%Jšœ˜J˜—šž œœ˜Jšœ<˜