Trailing-Edge
-
PDP-10 Archives
-
decuslib20-03
-
decus/20-0078/libsim/puttim.sim
There is 1 other file named puttim.sim in the archive. Click here to see a list.
OPTIONS(/E/C/-A/-I/-D);
EXTERNAL TEXT PROCEDURE putfloat;
TEXT PROCEDURE puttime(field,time,unit,secdec);
TEXT field; REAL time;
CHARACTER unit; INTEGER secdec;
!
Puttime edits a REAL variable representing a TIME value
left justified into the text fIELD in
seconds if UNIT = 'S'
minutes if UNIT = 'M'
hours if UNIT = 'H'
days if UNIT = 'D'
Else Putreal editing will be used.
The FIELD must have a minimum length of
12 if secdec < 0
15 if secdec = 0
16+secdec if secdec > 0
Format:
[-]dddD hh:mm[.ss[.xxx...]]
where
ddd is number of days (Blanked if day < 1)
hh is number of hours
mm is number of minutes
ss is number of seconds (only if SECDEC >= 0)
xxx is fraction of second with SECDEC digits
PUTTIME also returns a reference to parameter FIELD.
Thus it can be used as parameter to Outtext -
i.e. Outtext(puttime(field,Time,'H',-1)
or editing Image directly -
puttime(Image.Sub(Pos,17),Time,'H',-1)
C.f. procedure OUTTIME.
;
IF field.Length >=
(IF secdec < 0 THEN 12 ELSE IF secdec = 0 THEN 15 ELSE secdec+16)
THEN
BEGIN INTEGER days,hours,m,powersec; REAL seconds;
PROCEDURE fixedit(x,w); REAL x; INTEGER w;
BEGIN
field.Sub(field.Pos,w).Putfix(x,secdec);
field.Setpos(field.Pos+w);
END of fixedit;
PROCEDURE intedit(i,w); INTEGER i,w;
BEGIN
field.Sub(field.Pos,w).Putint(i);
IF field.Getchar = ' ' THEN
BEGIN field.Setpos(field.Pos-1);
field.Putchar('0');
END;
field.Setpos(field.Pos-1+w);
END of intedit;
BOOLEAN PROCEDURE adjusted;
BEGIN
IF m = 60 THEN
BEGIN adjusted:= TRUE;
hours:= hours + 1; m:= 0;
IF hours = 24 THEN
BEGIN days:= days + 1; hours:= 0 END
END;
field.Sub(2,6):= " D ";
field.Setpos(5);
IF days < 1 THEN
field.Putchar(' ') ELSE
IF days < 10 THEN
BEGIN
field.Setpos(4);
field.Putchar(Char(days+Rank('0')));
END ELSE
IF days < 100 THEN
BEGIN field.Setpos(3); intedit(days,2) END ELSE
IF days < 1000 THEN
BEGIN field.Setpos(2); intedit(days,3) END ELSE
IF days <= 9999 AND days >= -999 THEN
BEGIN field.Setpos(1); intedit(days,4) END ELSE
field.Sub(1,4):= "****";
field.Setpos(8);
intedit(hours,2); field.Putchar(':');
END of adjust;
powersec:= 1;
FOR m:= 1 step 1 UNTIL secdec DO powersec:= powersec*10;
IF unit = 'D' THEN time:= 1440*time ELSE
IF unit = 'H' THEN time:= 60*time ELSE
IF unit = 'M' THEN ELSE
IF unit = 'S' THEN time:= time/60 ELSE
BEGIN putfloat(field,time);
GO TO stop
END;
field.Setpos(1);
field.Putchar(IF time < 0 THEN '-' ELSE ' ');
time:= Abs(time);
IF time > 34 359 738 367 THEN GO TO error;
m:= Entier(time);
seconds:= 60*(time - m);
hours:= m//60;
m:= Mod(m,60);
days:= hours//24;
hours:= Mod(hours,24);
IF secdec >= 0 THEN
BEGIN
IF Entier(seconds*powersec+0.5) = 60*powersec THEN
BEGIN m:= m + 1; seconds:= 0 END;
adjusted;
intedit(m,2); field.Putchar('.');
IF seconds < 9.5 THEN
BEGIN field.Putchar('0');
fixedit(seconds,IF secdec = 0 THEN 1 ELSE secdec+2)
END ELSE
fixedit(seconds,IF secdec = 0 THEN 2 ELSE secdec+3);
END ELSE
BEGIN time:= m + seconds/60;
m:= time;
IF adjusted THEN time:= 0;
IF time < 9.5 THEN field.Putchar('0');
secdec:= 0;
fixedit(time,IF time < 9.5 THEN 1 ELSE 2)
END;
stop:
field.Setpos(1); puttime:- field
END of puttime OK ELSE
error:
BEGIN field.Setpos(1);
puttime:- putfloat(field,time);
END of puttime error;