AbbrevExpand.mesa; written by Bill Paxton, August 1981
edited by McGregor, February 8, 1983 10:01 am
edited by Bill Paxton, June 1, 1983 9:44 am
This is the interface for abbreviation expansion in Tioga
DIRECTORY
Rope,
TiogaNode,
RopeReader,
UndoEvent;
AbbrevExpand: CEDAR DEFINITIONS =
BEGIN
RefTextNode: TYPE = TiogaNode.RefTextNode;
RefBranchNode: TYPE = TiogaNode.RefBranchNode;
Ref: TYPE = TiogaNode.Ref;
Offset: TYPE = TiogaNode.Offset;
MaxLen: Offset = TiogaNode.MaxLen;
ROPE: TYPE = Rope.ROPE;
Event: TYPE = UndoEvent.Ref;
the following take an atom as the name of the dictionary to operate on
will automatically try to load file with extension "Abbreviations"
only tries this once per session
must explicitly load it
Load:
PROC
[fileName, dictName:
ROPE,
start: Offset ← 0, len: Offset ← MaxLen,
okToMapFile: BOOLEAN ← FALSE]
RETURNS [count: NAT];
reads the file and adds the abbreviations to the specified dictionary
returns number of abbreviations
Clear:
PROC [dictName:
ROPE];
removes all entries from the dictionary
IllFormedDef:
ERROR;
if when try to Expand, definition not of form <key>=<text>, then get error
key must be 1 or more alphadigits
optionally can have blanks (spaces/tabs/cr's) between key and "="
Expand:
PROC
[keyNode: RefTextNode, keyEnd: Offset, dict: ROPE, event: Event ← NIL]
RETURNS [foundIt:
BOOLEAN, keyDeterminesDict:
BOOLEAN, keyStart, keyLen, resultLen: Offset,
commands: LIST OF REF ANY];
looks in dictionary for entry with matching key
match ignores capitalization of keys
unless key is of form <dictName>.<keyName>
in which case it only looks in the specified dictionary
and returns with keyDeterminesDict=TRUE
if finds a matching entry, then
replace key text by text from entry
if key in entry is followed by blanks before "=",
then skip one blank in text after the "="
if key text was all upper case, force new text uppercase also
if key text not all upper but had initial cap,
make new text have an initial cap
otherwise, don't change capitalization of new text
if first character of key had looks, add those looks to new text
if entry node has a nonnull type name, set key node type name
if entry node has children, insert copies of them as children of key node
return start and len of new text
can optionally have command list enclosed in ( )'s between key name and '=
***** Initialization
Start: PROC; -- for initialization only
END.