PACKET cluster DEFINES (* Copyright (C) 1986 *)
(* Frank Klapper *)
(* 19.03.86 *)
CLUSTER,
:=,
text,
text 32, (* typical dir entry *)
write text,
write text 32,
reduce cluster buffer:
LET max cluster size = 8192; (* 8192 * 8 = 64 KB *)
TYPE CLUSTER = BOUND STRUCT (ALIGN dummy,
ROW max cluster size REAL cluster row);
TEXT VAR string;
INT VAR string length;
INT VAR sector no, eight byte pos, index;
reduce cluster buffer;
.reals per sector: sector size DIV 8.
.reals per std eu sector: 512 DIV 8.
PROC reduce cluster buffer:
string := 32 * "*";
string length := 32.
END PROC reduce cluster buffer;
OP := (CLUSTER VAR cluster, DATASPACE VAR ds):
CONCR (cluster) := ds
END OP :=;
TEXT PROC text (CLUSTER CONST cluster, INT CONST from, to):
init string;
FOR sector no FROM 0 UPTO sectors per cluster - 1 REP
get text of sector
PER;
subtext (string, from, to).
init string:
IF string length < cluster size
THEN string := cluster size * "*";
string length := cluster size
FI.
get text of sector:
FOR eight byte pos FROM 1 UPTO reals per sector REP
replace (string, string index, cluster.cluster row [row index])
PER.
string index:
reals per sector * sector no + eight byte pos.
row index:
reals per std eu sector * sector no + eight byte pos.
END PROC text;
TEXT PROC text 32 (CLUSTER CONST cluster, INT CONST part):
FOR index FROM 1 UPTO 4 REP
replace (string, index, cluster.cluster row [index + 4 * part])
PER;
subtext (string, 1, 32).
END PROC text 32;
PROC write text (CLUSTER VAR cluster,
TEXT CONST string):
IF LENGTH string < cluster size
THEN execute write text (cluster, text (string, cluster size))
ELSE execute write text (cluster, string)
FI.
END PROC write text;
PROC execute write text (CLUSTER VAR cluster,
TEXT CONST string):
FOR sector no FROM 0 UPTO sectors per cluster - 1 REP
write text of sector
PER.
write text of sector:
FOR eight byte pos FROM 1 UPTO reals per sector REP
cluster.cluster row [row index] := string RSUB (string index)
PER.
row index:
reals per std eu sector * sector no + eight byte pos.
string index:
reals per sector * sector no + eight byte pos.
END PROC execute write text;
PROC write text 32 (CLUSTER VAR cluster, TEXT CONST string, INT CONST part):
FOR index FROM 1 UPTO 4 REP
cluster.cluster row [index + 4 * part] := string RSUB (index)
PER;
END PROC write text 32;
END PACKET cluster;