home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Meeting Pearls 3
/
Meeting_Pearls_III.iso
/
Pearls
/
comm
/
Mail+News
/
UMS11
/
Developer
/
Oberon
/
ums.mod
Wrap
Text File
|
1995-04-04
|
28KB
|
662 lines
(*(* ------------------------------------------------------------------------
:Program. ums
:Contents. interface for ums.library
:Author. Martin Horneffer [mh]
:Address. Snail Mail: EMail:
:Address. Warmweiherstraße 18 UUCP: mh@umshq.adsp.sub.org
:Address. D-52066 Aachen FIDO: 2:242/7.9 MAUS: AC2
:Address. GERMANY INet: mh@umshq.dfv.rwth-aachen.de
:Remark. $Id: ums.mod,v 1.15 1995/04/04 19:07:56 mh Exp mh $
:Update. $Log: ums.mod,v $
:Update. Revision 1.15 1995/04/04 19:07:56 mh
:Update. new tags SelMaxCount, SelMaxSize.
:Update.
:Update. Revision 1.14 1995/03/24 22:33:17 mh
:Update. new error numbers.
:Update.
:Update. Revision 1.13 1995/02/24 18:25:30 mh
:Update. new tagSelSize.
:Update.
:Update. Revision 1.12 1994/09/01 10:10:49 mh
:Update. new tags for ReadConfig() WriteConfig()
:Update.
:Update. Revision 1.11 1994/04/30 14:05:13 mh
:Update. *** empty log message ***
:Update.
:Update. Revision 1.10 1994/04/30 14:03:28 mh
:Update. Tags for MatchConfig()
:Update.
:Update. Revision 1.9 1994/04/29 00:29:16 mh
:Update. tagCfgLockVar, tagCfgUnlockVar
:Update.
:Update. Revision 1.8 1994/04/24 19:58:40 mh
:Update. V11 (meeting)
:Update.
:Language. Oberon
:Translator. Amiga Oberon V3.11d
------------------------------------------------------------------------ *)*)
MODULE ums;
IMPORT Utility, Exec, Intuition, SYSTEM;
CONST
libName* = "ums.library";
libVersion* = 11;
VAR
base* : Exec.LibraryPtr;
TYPE
Account* = LONGINT;
MsgNum* = LONGINT;
Error* = INTEGER;
CONST
NumFields* = 128;
TYPE
APTR* = Exec.APTR;
STRPTR* = Exec.LSTRPTR;
MsgTextFields* = ARRAY NumFields OF STRPTR;
MessageInfo* = STRUCT
hdrLen- : LONGINT;
txtLen- : LONGINT;
date- : LONGINT;
up-, dn-,
lt-, rt- : MsgNum;
globalStat- : LONGSET;
userStat- : LONGSET;
loginStat- : LONGSET;
hardLink- : MsgNum;
softLink- : MsgNum;
(* V11 extension, only filled by tagRExtMsgInfo *)
cDate- : LONGINT;
reserved : ARRAY 3 OF LONGINT;
END;
CONST
(* actions for ServerControl() *)
CleanUp* = 1;
Flush* = 2;
Quit* = 3;
QuitForce* = 4;
Ping* = 5;
LockCfg* = 6;
UnlockCfg* = 7;
(* enumeration of fields in an UMS-message *)
msgText* = 0;
fromName* = 1;
fromAddr* = 2;
toName* = 3;
toAddr* = 4;
msgID* = 5;
creationDate* = 6;
receiveDate* = 7;
refID* = 8;
group* = 9;
subject* = 10;
attributes* = 11;
comments* = 12;
organization* = 13;
distribution* = 14;
folder* = 15;
fidoID* = 16;
mausID* = 17;
replyGroup* = 18;
replyName* = 19;
replyAddr* = 20;
logicalToName* = 21;
logicalToAddr* = 22;
fileName* = 23;
rfcMsgNum* = 24;
fidoText* = 32;
errorText* = 33;
newsreader* = 34;
rfcAttr* = 35;
ftnAttr* = 36;
zerAttr* = 37;
mausAttr* = 38;
tempFileName* = 127;
(* user status-bits *)
archive* = 4; (* msg should be archived, don't delete *)
junk* = 5; (* negative selection, inheritance suggested *)
postPoned* = 6; (* to be read again, (but not now) *)
selected* = 7; (* positive selection, inheritance suggested *)
filtered* = 15; (* msg has been processed by filter,
'selected' and 'junk' have been properly set *)
Old* = 8; (* user has already read this Message *)
Read* = Old;
WriteAccess* = 9; (* user may change or delete this message *)
ReadAccess* = 10; (* user may read this message *)
ViewAccess* = 11; (* user may read the header of this message *)
Owner* = 12; (* user 'owns' (wrote) this message *)
ProtectedUserFlags*= {WriteAccess, ReadAccess, ViewAccess, Owner};
(* global status-bits *)
Deleted* = 0; (* msg is really deleted *)
Expired* = 1; (* msg has expired and may be deleted *)
Exported* = 2; (* msg has been exported *)
Orphan* = 3; (* msg could not be exported *)
Link* = 4; (* within a ring of linked msgs *)
HardLink* = 5; (* link is hardLink *)
Parked* = 6; (* msg is "parked", i.e. must not (yet) be exported *)
HasFile* = 7; (* msg has an attached file (tempFilename) *)
ProtectedGlobalFlags*= {Deleted, Exported, Orphan, Link, HardLink, HasFile};
(*** Errors** *)
CONST
ok* = 0;
unknown* = 1;
noSubject* = 100;
forbiddenCode* = 101;
noWriteAccess* = 102;
noReader* = 103;
noExporter* = 104;
badLink* = 105;
noWork* = 106;
noSysop* = 107;
badChange* = 108;
groupForm* = 109;
tooBig* = 110;
notRunning* = 111;
noImportAcc* = 112;
noFromName* = 113;
noToName* = 114;
cfgLocked* = 115;
noHardlinks* = 116;
dupe* = 200;
noReadAccess* = 201;
noViewAccess* = 202;
msgCorrupted* = 203;
noHdrSpace* = 204;
noSuchMsg* = 205;
badName* = 206;
badTag* = 207;
missingTag* = 208;
noSuchUser* = 209;
notFound* = 210;
autoBounce* = 211;
msgDeleted* = 212;
noNetAccess* = 213;
badPattern* = 214;
badVarname* = 215;
fsFull* = 216;
noMsgMem* = 217;
missingIndex* = 218;
mxTags* = 219;
userExists* = 220;
noSuchAlias* = 221;
suicide* = 222;
exeErr* = 223;
serverTerminated* = 300;
cantWrite* = 301;
cantRead* = 302;
wrongMsgPtr* = 303;
serverNotFree* = 304;
idCountProb* = 305;
noLogin* = 306;
wrongServer* = 307;
noMem* = 308;
wrongTask* = 309;
tcpError* = 400;
(* tag-values *)
typeSTRPTR = 2000H;
typeVARPAR = 4000H;
(** tags for WriteMsg()* *)
(* add 'typeVARPAR' for ReadMsg() *)
(* no 'typeVARPAR' for WriteMsg() *)
tagMsgNum* = 1 + Utility.user;
tagMsgDate* = 4 + Utility.user;
(* don't usually use when writing! *)
(* Using tagMsgDate with WriteMsg() *)
(* has a very special meaning. *)
tagChainUp* = 7 + Utility.user;
tagHardLink* = 14 + Utility.user;
tagSoftLink* = 15 + Utility.user;
tagMsgCDate* = 16 + Utility.user;
tagAutoBounce* = 65 + Utility.user;
(* when writing: *)
(* data # 0: server returns error 'autoBounce', *)
(* but still keeps the Msg and sends *)
(* it to the sysops. *)
tagHdrFill* = 66 + Utility.user;
(* when writing: how much bytes to be reserved *)
tagTxtFill* = 67 + Utility.user;
(* for header and text *)
tagNoUpdate* = 69 + Utility.user;
(* data = 0: (default) set 'Old'-Flag when *)
(* reading or writing *)
(* data = 1: don't touch 'Old'-Flag *)
tagHide* = 70 + Utility.user;
(* for writing: *)
(* data = 0: default *)
(* data = 1: msg only accessible by exporters *)
(* data = 2: msg only accessible by users *)
tagCheckHeader* = 71 + Utility.user;
(* data = 0: default *)
(* data = 1: don't write msg, only check access *)
tagMsgText* = 256 + typeSTRPTR + Utility.user;
tagFromName* = tagMsgText + fromName;
tagFromAddr* = tagMsgText + fromAddr;
tagToName* = tagMsgText + toName;
tagToAddr* = tagMsgText + toAddr;
tagMsgID* = tagMsgText + msgID;
tagCreationDate* = tagMsgText + creationDate;
tagReceiveDate* = tagMsgText + receiveDate;
tagRefID* = tagMsgText + refID;
tagGroup* = tagMsgText + group;
tagSubject* = tagMsgText + subject;
tagAttributes* = tagMsgText + attributes;
tagComments* = tagMsgText + comments;
tagOrganization* = tagMsgText + organization;
tagDistribution* = tagMsgText + distribution;
tagFolder* = tagMsgText + folder;
tagFidoID* = tagMsgText + fidoID;
tagMausID* = tagMsgText + mausID;
tagReplyGroup* = tagMsgText + replyGroup;
tagReplyName* = tagMsgText + replyName;
tagReplyAddr* = tagMsgText + replyAddr;
tagLogicalToName* = tagMsgText + logicalToName;
tagLogicalToAddr* = tagMsgText + logicalToAddr;
tagFileName* = tagMsgText + fileName;
tagRFCMsgNum* = tagMsgText + rfcMsgNum;
tagFidoText* = tagMsgText + fidoText;
tagErrorText* = tagMsgText + errorText;
tagNewsreader* = tagMsgText + newsreader;
tagRfcAttr* = tagMsgText + rfcAttr;
tagFtnAttr* = tagMsgText + ftnAttr;
tagZerAttr* = tagMsgText + zerAttr;
tagMausAttr* = tagMsgText + mausAttr;
tagTempFileName* = tagMsgText + tempFileName;
tagTextFields* = 513 + Utility.user;
(* datatype: POINTER TO MsgTextFields *)
(** tags for ReadMsg()* *)
(* add 'typeVARPAR' for ReadMsg() *)
(* no 'typeVARPAR' for WriteMsg() *)
tagRMsgNum* = 1 + Utility.user;
tagRHdrLength* = 2 + Utility.user + typeVARPAR;
tagRTxtLength* = 3 + Utility.user + typeVARPAR;
tagRMsgDate* = 4 + Utility.user + typeVARPAR;
tagRChainUp* = 7 + Utility.user + typeVARPAR;
tagRChainDn* = 8 + Utility.user + typeVARPAR;
tagRChainLt* = 9 + Utility.user + typeVARPAR;
tagRChainRt* = 10 + Utility.user + typeVARPAR;
tagRGlobalFlags* = 11 + Utility.user + typeVARPAR;
tagRUserFlags* = 12 + Utility.user + typeVARPAR;
tagRLoginFlags* = 13 + Utility.user + typeVARPAR;
tagRHardLink* = 14 + Utility.user + typeVARPAR;
tagRSoftLink* = 15 + Utility.user + typeVARPAR;
tagRMsgCDate* = 16 + Utility.user + typeVARPAR;
tagRDateStyle* = 64 + Utility.user;
(* style for receiveDate when reading: *)
(* data = 0: no receiveDate *)
(* data = 1: emulate old-style receiveDate *)
tagRIDStyle* = 68 + Utility.user;
(* style for Message-ID *)
(* data = 0: real Message-ID *)
(* data = 1: old style dec-number *)
tagRNoUpdate* = 69 + Utility.user;
(* data = 0: (default) set 'Old'-Flag when *)
(* reading or writing *)
(* data = 1: don't touch 'Old'-Flag *)
tagRMsgText* = 256 + typeSTRPTR + typeVARPAR + Utility.user;
tagRFromName* = tagRMsgText + fromName;
tagRFromAddr* = tagRMsgText + fromAddr;
tagRToName* = tagRMsgText + toName;
tagRToAddr* = tagRMsgText + toAddr;
tagRMsgID* = tagRMsgText + msgID;
tagRCreationDate* = tagRMsgText + creationDate;
tagRReceiveDate* = tagRMsgText + receiveDate;
tagRRefID* = tagRMsgText + refID;
tagRGroup* = tagRMsgText + group;
tagRSubject* = tagRMsgText + subject;
tagRAttributes* = tagRMsgText + attributes;
tagRComments* = tagRMsgText + comments;
tagROrganization* = tagRMsgText + organization;
tagRDistribution* = tagRMsgText + distribution;
tagRFolder* = tagRMsgText + folder;
tagRFidoID* = tagRMsgText + fidoID;
tagRMausID* = tagRMsgText + mausID;
tagRReplyGroup* = tagRMsgText + replyGroup;
tagRReplyName* = tagRMsgText + replyName;
tagRReplyAddr* = tagRMsgText + replyAddr;
tagRLogicalToName* = tagRMsgText + logicalToName;
tagRLogicalToAddr* = tagRMsgText + logicalToAddr;
tagRFileName* = tagRMsgText + fileName;
tagRRFCMsgNum* = tagRMsgText + rfcMsgNum;
tagRFidoText* = tagRMsgText + fidoText;
tagRErrorText* = tagRMsgText + errorText;
tagRNewsreader* = tagRMsgText + newsreader;
tagRRfcAttr* = tagRMsgText + rfcAttr;
tagRFtnAttr* = tagRMsgText + ftnAttr;
tagRZerAttr* = tagRMsgText + zerAttr;
tagRMausAttr* = tagRMsgText + mausAttr;
tagRTempFileName* = tagRMsgText + tempFileName;
tagRMsgInfo* = 512 + Utility.user;
(* datatype: POINTER TO MessageInfo (excludes cDate) *)
tagRTextFields* = tagRMsgInfo + 1;
(* datatype: POINTER TO MsgTextFields *)
tagRReadHeader* = tagRMsgInfo + 2;
(* read all header-fields *)
tagRReadAll* = tagRMsgInfo + 3;
(* read all text-fields *)
tagRExtMsgInfo* = tagRMsgInfo + 4;
(* datatype: POINTER TO MessageInfo *)
(** tags for Select()* *)
tagSelSet* = 1024 + Utility.user;
(* flags to set on selected msgs *)
tagSelUnset* = tagSelSet + 1;
(* flags to clear *)
tagSelWriteGlobal* = tagSelSet + 2;
(* change global flags, not user-flags *)
tagSelWriteLocal* = tagSelSet + 3;
(* change login-local flags, not user-flags *)
tagSelWriteUser* = tagSelSet + 4 + typeSTRPTR;
(* change other user's flags *)
tagSelStart* = tagSelSet + 8;
(* first msg to process *)
tagSelStop* = tagSelSet + 9;
(* msg to processing before *)
(* the following are mutual-exclusiv *)
(* use only one of the following operations, *)
(* otherwise unpredictable things may happen! *)
tagSelReadGlobal* = tagSelSet + 10;
(* examine global flags, not user-flags *)
tagSelReadLocal* = tagSelSet + 11;
(* examine login-local flags, not user-flags *)
tagSelReadUser* = tagSelSet + 12 + typeSTRPTR;
(* examine other user's flags *)
tagSelMask* = tagSelSet + 16;
(* select msgs, that's flags *)
tagSelMatch* = tagSelSet + 17;
(* ANDed with mask equal match *)
tagSelParent* = tagSelSet + 18;
(* examine parent's flags *)
tagSelDate* = tagSelSet + 19;
(* select msgs younger than this date *)
tagSelTree* = tagSelSet + 20;
(* select whole tree this msg is in *)
tagSelSubTree* = tagSelSet + 21;
(* select sub-tree this msg is root of *)
tagSelMsg* = tagSelSet + 22;
(* select a msg specified by number *)
tagSelQuick* = tagSelSet + 23;
(* quick select enabled *)
tagSelLink* = tagSelSet + 24;
(* 0 don't select links *)
(* 1 also select hard links *)
tagSelCDate* = tagSelSet + 25;
(* select msgs younger than this cDate *)
tagSelSize* = tagSelSet + 26;
(* select msgs with more bytes *)
(* more modifiers for status-selects *)
tagSelMaxCount* = tagSelSet + 27;
(* select at most N msgs *)
(* (backwards) *)
tagSelMaxSize* = tagSelSet + 28;
(* sum up msgs' sizes and stop *)
(* before the sum exceeds N bytes *)
(* (backwards) *)
(** tags for Search()* *)
tagSearchLast* = 2048 + Utility.user;
(* number of LAST msg not to search *)
tagSearchQuick* = tagSearchLast + 1;
(* quick searches enabled *)
tagSearchGlobal* = tagSearchLast + 2;
(* examine global flags instead of user-flags*)
tagSearchLocal* = tagSearchLast + 3;
(* examine login-local flags, not user-flags *)
tagSearchUser* = tagSearchLast + 4 + typeSTRPTR;
(* examine other user's flags *)
tagSearchDirection* = tagSearchLast + 5;
(* set search direction *)
(* 0 = default *)
(* 1 = forward *)
(* -1 = backward *)
tagSearchPattern* = tagSearchLast + 6;
(* string in tagMsgText .. tagMsgText+127 is: *)
(* 0: no pattern, just a plain string *)
(* 1: an AmigaDOS style pattern *)
(* 2: a pattern, only if it contains *)
(* wildcards ('auto-detect patterns') *)
tagSearchMask* = tagSearchLast + 16;
(* search a msg, that's flags *)
tagSearchMatch* = tagSearchLast + 17;
(* ANDed with mask equal match *)
(** tags for ReadConfig(), WriteConfig()* *)
tagCfgGlobalOnly* = 3072 + Utility.user;
(* read or write only global config, *)
(* thus must not be combined with tagCfgUser *)
tagCfgName* = tagCfgGlobalOnly + 1 + typeSTRPTR;
(* name of config var to read or write *)
tagCfgUser* = tagCfgGlobalOnly + 2 + typeSTRPTR;
(* name of user to read/write locals from/to *)
(** tags for ReadConfig()* *)
tagCfgUserName* = tagCfgGlobalOnly + 3 + typeSTRPTR;
(* alias to get realname from *)
tagCfgNextVar* = tagCfgGlobalOnly + 4 + typeSTRPTR;
(* get name of next var *)
tagCfgNextAlias* = tagCfgGlobalOnly + 5 + typeSTRPTR;
(* get name of next alias *)
tagCfgNextUser* = tagCfgGlobalOnly + 6 + typeSTRPTR;
(* get name of next user *)
tagCfgNextExporter* = tagCfgGlobalOnly + 7 + typeSTRPTR;
(* get name of next exporter *)
tagCfgNextNetGroup* = tagCfgGlobalOnly + 8 + typeSTRPTR;
(* get name of next netgroup *)
tagCfgNextNetGroupMember* = tagCfgGlobalOnly + 9 + typeSTRPTR;
(* get name of next groupmember *)
tagCfgLockVar* = tagCfgGlobalOnly +10;
(* 0: no locking *)
(* 1: lock and read config var *)
(** tags for ReadConfig(), WriteConfig() **)
tagCfgQuoted* = tagCfgGlobalOnly +11;
(* 0: no quoting *)
(* 1: read/write var in quoted format *)
(* (as used in "ums.config") *)
(** tags for WriteConfig()* *)
tagCfgDump* = tagCfgGlobalOnly + 16 + typeSTRPTR;
(* write current settings to a file *)
tagCfgData* = tagCfgGlobalOnly + 17 + typeSTRPTR;
(* data to write to specified var *)
tagCfgCreateUser* = tagCfgGlobalOnly + 18 + typeSTRPTR;
(* create a new user *)
tagCfgDeleteUser* = tagCfgGlobalOnly + 19 + typeSTRPTR;
(* delete a user *)
tagCfgCreateAlias* = tagCfgGlobalOnly + 20 + typeSTRPTR;
(* add an alias to a user *)
tagCfgDeleteAlias* = tagCfgGlobalOnly + 21 + typeSTRPTR;
(* delete an alias *)
tagCfgNetGroup* = tagCfgGlobalOnly + 22 + typeSTRPTR;
tagCfgAddNetGroup* = tagCfgGlobalOnly + 23 + typeSTRPTR;
(* create/add netgroups *)
tagCfgDeleteNetGroup* = tagCfgGlobalOnly + 24 + typeSTRPTR;
(* delete a new netgroup *)
tagCfgUnlockVar* = tagCfgGlobalOnly + 25;
(* 0: no locking *)
(* 1: unlock and write config var *)
(* 2: unlock but don't write *)
tagCfgLocal* = tagCfgGlobalOnly + 26;
(* create/delete login-local variable *)
tagCfgCreateSysop* = tagCfgGlobalOnly + 27 + typeSTRPTR;
(* create a new sysop *)
tagCfgCreateExporter* = tagCfgGlobalOnly + 28 + typeSTRPTR;
(* create a new exporter *)
(** tags for MatchConfig() **)
tagMatchGlobalOnly * = 4096 + Utility.user;
tagMatchVarname * = tagMatchGlobalOnly+ 1 + typeSTRPTR;
tagMatchUser * = tagMatchGlobalOnly+ 2 + typeSTRPTR;
tagMatchString * = tagMatchGlobalOnly+ 3 + typeSTRPTR;
tagMatchDefault * = tagMatchGlobalOnly+ 4;
(*** functions ***)
PROCEDURE Login* {base, -30} (user{2} : ARRAY OF CHAR;
passwd{3} : ARRAY OF CHAR): Account;
PROCEDURE Logout* {base, -36} (account{2}: Account);
PROCEDURE ErrNum* {base,-120} (account{2}: Account): Error;
PROCEDURE ErrTxt* {base,-126} (account{2}: Account): STRPTR;
PROCEDURE DeleteMsg* {base,-132} (account{2}: Account;
MsgNum{3} : MsgNum): BOOLEAN;
(*** V9:** *)
PROCEDURE ExportedMsg* {base,-234} (acc{2}: Account;
num{3}: MsgNum);
PROCEDURE CannotExport* {base,-240} (acc{2} : Account;
num{3} : MsgNum;
error{4}: ARRAY OF CHAR): BOOLEAN;
PROCEDURE VLog* {base,-246} (acc{2} : Account;
level{4} : LONGINT;
format{5}: ARRAY OF CHAR;
args{6} : ARRAY OF SYSTEM.BYTE);
PROCEDURE Log* {base,-246} (acc{2} : Account;
level{4} : LONGINT;
format{5}: ARRAY OF CHAR;
args{6}..: SYSTEM.ADDRESS);
PROCEDURE RLogin* {base,-252} (server{2}: ARRAY OF CHAR;
user{3} : ARRAY OF CHAR;
passwd{4}: ARRAY OF CHAR): Account;
PROCEDURE WriteMsg* {base,-258} (acc{2} : Account;
tagItems{3}: ARRAY OF Utility.TagItem): MsgNum;
PROCEDURE WriteMsgTags* {base,-258} (acc{2} : Account;
tagItems{3}..: Utility.Tag): MsgNum;
PROCEDURE ReadMsg* {base,-264} (acc{2} : Account;
tagItems{3}: ARRAY OF Utility.TagItem): BOOLEAN;
PROCEDURE ReadMsgTags* {base,-264} (acc{2} : Account;
tagItems{3}..: Utility.Tag): BOOLEAN;
PROCEDURE FreeMsg* {base,-270} (acc{2} : Account;
msgNum{3}: MsgNum);
PROCEDURE Select* {base,-276} (acc{2} : Account;
tagItems{3}: ARRAY OF Utility.TagItem): LONGINT;
PROCEDURE SelectTags* {base,-276} (acc{2} : Account;
tagItems{3}..: Utility.Tag): LONGINT;
PROCEDURE Search* {base,-282} (acc{2} : Account;
tagItems{3}: ARRAY OF Utility.TagItem): MsgNum;
PROCEDURE SearchTags* {base,-282} (acc{2} : Account;
tagItems{3}..: Utility.Tag): MsgNum;
PROCEDURE ReadConfig* {base,-288} (acc{2} : Account;
tagItems{3}: ARRAY OF Utility.TagItem): STRPTR;
PROCEDURE ReadConfigTags* {base,-288} (acc{2} : Account;
tagItems{3}..: Utility.Tag): STRPTR;
PROCEDURE FreeConfig* {base,-294} (acc{2}: Account;
str{3}: STRPTR);
PROCEDURE WriteConfig* {base,-300} (acc{2} : Account;
tagItems{3}: ARRAY OF Utility.TagItem): BOOLEAN;
PROCEDURE WriteConfigTags* {base,-300} (acc{2} : Account;
tagItems{3}..: Utility.Tag): BOOLEAN;
(* V11 *)
PROCEDURE ServerControl* {base,-312} (server{2}: ARRAY OF CHAR;
action{3}: LONGINT): Error;
PROCEDURE MatchConfig* {base,-318} (acc{2} : Account;
tagItems{3}: ARRAY OF Utility.TagItem): BOOLEAN;
PROCEDURE MatchConfigTags* {base,-318} (acc{2} : Account;
tagItems{3}..: Utility.Tag): BOOLEAN;
PROCEDURE ErrTxtFromNum* {base,-324} (err{2}: Error): STRPTR;
PROCEDURE DupAccount* {base,-330} (acc{2}: Account): Account;
BEGIN
base := Exec.OpenLibrary (libName, libVersion);
IF base = NIL THEN
SYSTEM.SETREG (0, Intuition.DisplayAlert (0, "\x00\x64\x14missing ums.library\o\o", 50));
HALT (20)
END;
CLOSE
IF base # NIL THEN Exec.CloseLibrary (base); base := NIL END;
END ums.