FSTimeImpl.mesa
Copyright © 1984 by Xerox Corporation. All rights reserved.
Russ Atkinson, August 16, 1984 12:29:09 pm PDT
HGM, February 9, 1984 1:29:59 am PST
Schroeder, December 7, 1983 10:48 am
Levin, August 9, 1983 11:36 am
Doesn't implement numeric time zones
DIRECTORY
BasicTime USING [GMT, Now, nullGMT, Pack, Unpack, Unpacked],
FSRemoteFile USING [],
Rope USING [Fetch, Length, ROPE],
RuntimeError USING [UNCAUGHT];
FSTimeImpl: CEDAR MONITOR
IMPORTS BasicTime, Rope, RuntimeError
EXPORTS FSRemoteFile
= BEGIN
Time format is DD-MMM-YYbHH:MM:SSbZZT
Note that the leading digit in DD and HH may be replaced with a b
Exported to FSRemoteFile
FTPTimeToGMT: PUBLIC PROC
[t: Rope.ROPE] RETURNS [time: BasicTime.GMT ← BasicTime.nullGMT] = {
Digit: PROC [index: INT] RETURNS [CARDINAL] = {
c: CHAR = Rope.Fetch[t, index];
SELECT c FROM
' => RETURN [0];
IN ['0..'9] => RETURN [c-'0];
ENDCASE => ERROR BadTime;
};
DoubleDigit: PROC [index: INT] RETURNS [CARDINAL] = {
RETURN [Digit[index]*10 + Digit[index+1]];
};
Char: PROC [index: INT] RETURNS [CHAR] = {
c: CHAR = Rope.Fetch[t, index];
SELECT c FROM
'-, '+, ' , IN ['a..'z], IN ['0..'9] => RETURN [c];
IN ['A..'Z] => RETURN [c + ('a-'A)];
ENDCASE => ERROR BadTime;
};
Inner: PROC = {
uT: BasicTime.Unpacked;
yr: CARDINAL = DoubleDigit[7];
SELECT yr FROM
< 50 => uT.year ← yr + 2000;
ENDCASE => uT.year ← yr + 1900;
uT.day ← DoubleDigit[0];
uT.hour ← DoubleDigit[10];
uT.minute ← DoubleDigit[13];
uT.second ← DoubleDigit[16];
uT.month ← SELECT Char[3] FROM
'j => IF Char[4] = 'a THEN January
ELSE IF Char[5] = 'n THEN June ELSE July,
'f => February,
'm => IF Char[5] = 'r THEN March ELSE May,
'a => IF Char[4] = 'p THEN April ELSE August,
's => September,
'o => October,
'n => November,
'd => December,
ENDCASE => ERROR BadTime;
IF t.Length[] < 19
THEN {
Yetch, FTPServer on AltoGateway does this. Use local zone info.
temp: BasicTime.Unpacked ← BasicTime.Unpack[BasicTime.Now[]];
uT.zone ← temp.zone;
uT.dst ← temp.dst;
}
ELSE {
uT.zone ← 60 * ( SELECT Char[19] FROM
'g => 0,
'e => 5,
'c => 6,
'm => 7,
'p => 8,
'+ => Digit[20],
'- => - Digit[20],
ENDCASE => ERROR BadTime) ;
uT.dst ← IF (Char[20] = 'd) THEN yes ELSE no;
};
time ← BasicTime.Pack[uT];
};
Inner[ ! RuntimeError.UNCAUGHT => CONTINUE];
};
BadTime: ERROR = CODE;
END.