UXIOTestImpl.mesa
Copyright Ó 1994 by Xerox Corporation. All rights reserved.
Willie-s, March 16, 1994 1:03 pm PST
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];
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𡤏Stat"
};
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
];
Structure filled in by stat/fstat.
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.