SystemNamesImpl.mesa
Copyright Ó 1987, 1989, 1991, 1992, 1993 by Xerox Corporation. All rights reserved.
Doug Wyatt, January 24, 1987 7:03:35 pm PST
Willie-sue, August 19, 1991 2:12 pm PDT
JKF December 20, 1988 11:01:09 am PST
Carl Hauser, December 9, 1988 5:41:01 pm PST
Michael Plass, May 11, 1989 5:45:31 pm PDT
Christian Jacobi, March 31, 1993 3:20 pm PST
This impl of SystemNames simply gets the needed info from the environment string instead of going through YellowPages
DIRECTORY
EnvironmentVariables USING [Get],
IO,
RefText,
Rope,
SystemNames USING [Release, ReleaseOption],
SystemVersion USING [release],
ThisMachine USING [Name];
SystemNamesImpl:
CEDAR
MONITOR
IMPORTS EnvironmentVariables, IO, RefText, Rope, SystemVersion, ThisMachine
EXPORTS SystemNames ~ {
Release: TYPE ~ SystemNames.Release;
ReleaseOption:
TYPE ~ SystemNames.ReleaseOption;
ReleaseArray: TYPE ~ ARRAY Release OF ROPE;
releaseNames:
REF ReleaseArray ~
NEW[ReleaseArray ¬
ALL[
NIL]];
defaultDir: ROPE ~ "Cedar";
machineLocalDir:
ROPE ~ "tmp";
Initialize:
PROC ~ {
Version: TYPE ~ RECORD [major, minor: INT];
current: Version ~ [major: SystemVersion.release.major, minor: SystemVersion.release.minor];
previous: Version ~ IF current.minor>0 THEN [major: current.major, minor: current.minor-1]
ELSE [major: 0, minor: 0]; -- must edit this by hand each major release
next: Version ~ [major: current.major, minor: current.minor+1];
versions: ARRAY Release OF Version ¬ [previous: previous, current: current, next: next];
FOR r: Release
IN Release
DO
v: Version ~ versions[r];
releaseNames[r] ¬ Rope.Flatten[IO.PutFR["%g.%g", IO.int[v.major], IO.int[v.minor]]];
ENDLOOP;
};
ReleaseName:
PUBLIC
PROC [release: Release ¬ current]
RETURNS [
ROPE] ~ {
RETURN [releaseNames[release]];
};
userName: ROPE ¬ NIL;
UserName:
PUBLIC
ENTRY
PROC
RETURNS [name:
ROPE] ~ {
IF userName = NIL THEN userName ¬ EnvironmentVariables.Get["USER"];
name ¬ userName;
};
homeDirectory: ROPE ¬ NIL;
SimpleHomeDirectory:
PUBLIC
ENTRY
PROC
RETURNS [wdir: Rope.
ROPE] ~ {
IF homeDirectory =
NIL
THEN {
temp: ROPE ¬ EnvironmentVariables.Get["HOME"];
IF temp.Fetch[temp.Length[]-1] # '/ THEN temp ¬ temp.Concat["/"];
homeDirectory ¬ temp;
};
wdir ¬ homeDirectory;
};
MachineName:
PUBLIC
PROC
RETURNS [machine:
ROPE ¬
NIL] ~ {
machine ¬ ThisMachine.Name[];
IF machine=NIL THEN machine ¬ "AnonymousMachine";
};
ReleaseDir:
PUBLIC
PROC [dir:
ROPE, release: Release]
RETURNS [
ROPE] ~ {
releaseName: ROPE ~ releaseNames[release];
IF dir = NIL THEN dir ¬ defaultDir;
RETURN[Rope.Flatten[Rope.Concat[dir, releaseName]]];
ReleaseSubDir:
PUBLIC
PROC [subDirs:
ROPE, release: Release]
RETURNS [
ROPE] ~ {
releaseName: ROPE ~ releaseNames[release];
IF Rope.IsEmpty[subDirs] THEN RETURN[releaseName]
ELSE RETURN[Rope.Flatten[Rope.Cat[releaseName, "/", subDirs]]];
};
MachineLocalDir:
PUBLIC
PROC [subDirs:
ROPE, option: ReleaseOption,
release: Release ¬ current]
RETURNS [
ROPE] ~ {
RETURN[ConstructDir[machineLocalDir, subDirs, option, release]];
};
CedarDir:
PUBLIC
PROC [subDirs:
ROPE, release: Release, dir:
ROPE]
RETURNS [
ROPE] ~ {
IF dir=NIL THEN dir ¬ defaultDir;
RETURN[ConstructDir[dir, subDirs, $releaseDir, release]];
};
UserCedarDir:
PUBLIC
PROC [subDirs:
ROPE, option: ReleaseOption, release: Release]
RETURNS [
ROPE] ~ {
dir: ROPE ¬ NIL;
SELECT option
FROM
releaseDir => dir ¬ ReleaseDir[dir, release];
releaseOmitted => NULL;
ENDCASE => ERROR;
RETURN[ConstructName[dir, subDirs, TRUE]];
};
ConstructDir:
PROC [ dir, subDirs:
ROPE, option: ReleaseOption, release: Release]
RETURNS [
ROPE] ~ {
SELECT option
FROM
releaseDir => dir ¬ ReleaseDir[dir, release];
releaseSubDir => subDirs ¬ ReleaseSubDir[subDirs, release];
releaseOmitted => NULL;
ENDCASE => ERROR;
RETURN[ConstructName[dir: dir, subDirs: subDirs]];
};
ConstructName:
PROC [dir, subDirs:
ROPE ¬
NIL, userRelative:
BOOL ¬
FALSE]
RETURNS [fName:
ROPE] = {
GetTildeRope:
PROC
RETURNS [r: Rope.
ROPE] = {
ie return something like: "/palain/wyatt/Cedar"
r ¬ SimpleHomeDirectory[];
IF r = NIL THEN ERROR -- can't happen. presumably the user logged on.
ELSE RETURN[Rope.Concat[r, ".cedar"]];
};
scratch: REF TEXT ~ RefText.ObtainScratch[120];
text: REF TEXT ¬ scratch;
IF userRelative THEN text ¬ RefText.AppendRope[text, GetTildeRope[]];
text ¬ RefText.AppendChar[text, '/ ];
IF
NOT Rope.IsEmpty[dir]
THEN {
text ¬ RefText.AppendRope[text, dir];
text ¬ RefText.AppendChar[text, '/ ];
};
IF
NOT Rope.IsEmpty[subDirs]
THEN {
text ¬ RefText.AppendRope[text, subDirs];
text ¬ RefText.AppendChar[text, '/ ];
};
fName ¬ Rope.FromRefText[text];
RefText.ReleaseScratch[scratch];
};
Initialize[];
}.