<<>> <> <> <> <<>> DIRECTORY Commander, CStrings, IO, UXIO, Rope, UnixSysCalls, UnixTypes, UXStrings; UXIOTestImpl: CEDAR PROGRAM IMPORTS Commander, IO, UnixSysCalls, UXIO, UXStrings ~ BEGIN OPEN UnixTypes; where: ARRAY[0..6) OF INT ¬ [446, 50264, 243144, 55468, 234330, 158217]; debug: BOOL ¬ FALSE; DoInternalSetIndex: Commander.CommandProc ~ { o: IO.STREAM ¬ UXIO.CreateStandardStream[output]; s: IO.STREAM ¬ NIL; infile: Rope.ROPE ~ "/project/bonsai2.0/testlib/BlackWalnut.mailLog"; s ¬ UXIO.CreateFileStream[infile, read]; FOR i: INT IN [0..6) DO s.SetIndex[where[i]]; o.PutF["GetIndex: %g, SetIndex was: %g\n", [integer[s.GetIndex[]]], [integer[where[i]]] ]; o.PutRope[s.GetLineRope[]]; o.PutChar['\n]; ENDLOOP; IO.Close[o]; IO.Close[s]; }; DoGetTokenTest: Commander.CommandProc ~ { o: IO.STREAM ¬ cmd.out; s: IO.STREAM ¬ NIL; pos: INT ¬ 0; infile: Rope.ROPE ~ "/project/bonsai2.0/testlib/BlackWalnut.mailLog"; MyTokenProc: IO.BreakProc = { cc: IO.CharClass; what: Rope.ROPE; SELECT char FROM '[, '], '(, '), '{, '}, '", '+, '-, '*, '/, '@, '_ => { cc ¬ break; what ¬ "break"}; IN [IO.NUL .. IO.SP] => { cc ¬ sepr; what ¬ "sepr" }; ',, ':, '; => { cc ¬ sepr; what ¬ "sepr" }; ENDCASE => { cc ¬ other; what ¬ "other"}; IF debug THEN o.PutF[" <<%g, %g>> ", [character[char]], [rope[what]] ]; RETURN[cc]; }; s ¬ UXIO.CreateFileStream[infile, read]; o.PutF["GetIndex: %g, EndOf: %g\n", [integer[s.GetIndex[]]], [boolean[s.EndOf[]]] ]; FOR i: INT IN [0..5) DO o.PutF["(%g) %g\n", [integer[i]], [rope[s.GetTokenRope[MyTokenProc].token] ]]; ENDLOOP; pos ¬ s.GetIndex[]; o.PutF["GetIndex: %g, EndOf: %g\n", [integer[s.GetIndex[]]], [boolean[s.EndOf[]]] ]; FOR i: INT IN [6..9) DO o.PutF["(%g) %g\n", [integer[i]], [rope[s.GetTokenRope[MyTokenProc].token] ]]; ENDLOOP; o.PutF["GetIndex: %g, EndOf: %g\n", [integer[s.GetIndex[]]], [boolean[s.EndOf[]]] ]; o.PutF1["Now do SetIndex back to %g\n", [integer[pos]] ]; s.SetIndex[pos]; FOR i: INT IN [6..9) DO o.PutF["(%g) %g\n", [integer[i]], [rope[s.GetTokenRope[MyTokenProc].token] ]]; ENDLOOP; o.PutF["GetIndex: %g, EndOf: %g\n", [integer[s.GetIndex[]]], [boolean[s.EndOf[]]] ]; IO.Close[s]; }; mode: UnixTypes.Mode ¬ UXIO.defaultMode; DoStat: Commander.CommandProc ~ { o: IO.STREAM ¬ cmd.out; infile: Rope.ROPE ~ "/project/bonsai2.0/testlib/BlackWalnut.mailLog"; stat: UnixTypes.Stat; cName: CStrings.CString ~ UXStrings.Create[infile]; res: RES; fd: UnixTypes.FD ¬ UnixSysCalls.Open[cName, [access: RDONLY], mode]; IF fd = error THEN { o.PutRope["UnixSysCalls.Open failed\n"]; RETURN }; TRUSTED { res ¬ UnixSysCalls.FStat[fd, @stat] }; IF res # success THEN { o.PutRope["FStat failed\n"]; RETURN }; o.PutFL["[ino: %g, mode: %g, uid: %g, gid: %g, size: %g]\n", LIST[[integer[stat.ino]], [integer[LOOPHOLE[stat.mode]]], [integer[stat.uid]], [integer[stat.gid]], [integer[stat.size]] ]]; [] ¬ UnixSysCalls.Close[fd]; }; MyFStat: PUBLIC UNSAFE PROC [fd: FD, buf: StatPtr] RETURNS [RES] ~ UNCHECKED { fstat: UNSAFE PROC [fd: FD, buf: SolarisStatPtr] RETURNS [RES] ~ UNCHECKED MACHINE CODE { "XR_FStat" }; bufSolaris: SolarisStat; res: RES ¬ fstat[fd, @bufSolaris]; AssignStat[buf, @bufSolaris]; RETURN[res]; }; SolarisMode: TYPE ~ MACHINE DEPENDENT RECORD [ pad: [0..0FFFFh] ¬ 0, fmt: Fmt ¬ LOOPHOLE[0], -- type of file suid: Flag ¬ false, -- set user id on execution sgid: Flag ¬ false, -- set group id on execution svtx: Flag ¬ false, -- save swapped text even after use owner: Permission ¬ [false, false, false], group: Permission ¬ [false, false, false], others: Permission ¬ [false, false, false] ]; SolarisStatPtr: TYPE = POINTER TO SolarisStat; SolarisStat: TYPE ~ MACHINE DEPENDENT RECORD [ dev: INT, -- device inode resides on pad1: ARRAY [0..3) OF CARD, ino: INum, -- this inode's number mode: SolarisMode, -- protection nlink: CARD, -- number of hard links to the file uid: INT, -- user ID of owner gid: INT, -- group ID of owner rdev: INT, -- the device type, for inode that is device pad2: ARRAY [0..2) OF CARD, size: INT, -- total size of file, in bytes pad3: CARD, -- reserve pad for future off_t expansion atime: TimeVal, -- file last access time mtime: TimeVal, -- file last modify time ctime: TimeVal, -- file last status change time blksize: CARD, -- optimal blocksize for file system i/o ops blocks: CARD, -- actual number of blocks allocated fstype: ARRAY [0..16) OF CHAR, pad4: ARRAY [0..8) OF CARD -- expansion area ]; <> <<>> TimeVal: TYPE = MACHINE DEPENDENT RECORD [ sec: CARD, -- seconds since Jan 1, 1970 msec: CARD -- plus this many microseconds ]; AssignStat: PRIVATE UNSAFE PROC [s4: StatPtr, ssp: SolarisStatPtr] ~ UNCHECKED { s4.dev ¬ ssp.dev; s4.ino ¬ ssp.ino; s4.mode.fmt ¬ ssp.mode.fmt; s4.mode.suid ¬ ssp.mode.suid; s4.mode.sgid ¬ ssp.mode.sgid; s4.mode.svtx ¬ ssp.mode.svtx; s4.mode.owner ¬ ssp.mode.owner; s4.mode.group ¬ ssp.mode.group; s4.mode.others ¬ ssp.mode.others; s4.nlink ¬ ssp.nlink; s4.uid ¬ ssp.uid; s4.gid ¬ ssp.gid; s4.rdev ¬ ssp.rdev; s4.size ¬ ssp.size; s4.atime ¬ ssp.atime.sec; s4.spare1 ¬ ssp.atime.msec; s4.mtime ¬ ssp.mtime.sec; s4.spare2 ¬ ssp.mtime.msec; s4.ctime ¬ ssp.ctime.sec; s4.spare3 ¬ ssp.ctime.msec; s4.blksize ¬ 4096; -- hack s4.blocks ¬ s4.size / s4.blksize; -- hack }; Commander.Register["UXIODoStat", DoStat]; Commander.Register["UXIODoInternalSetIndex", DoInternalSetIndex]; Commander.Register["UXIODoGetTokenTest", DoGetTokenTest]; END.