home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
World of A1200
/
World_Of_A1200.iso
/
programs
/
monitors
/
rsys
/
source.lha
/
src
/
rsysutils.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-01-09
|
24KB
|
1,075 lines
/*
***************************************************************************
*
* Datei:
* RSysUtils.c
*
* Inhalt:
* char *strncpy(char *dest, char const *src, unsigned long len);
* char *strcpy(char *dest, char const *src);
* void *MyAllocVec(unsigned long byteSize, unsigned long requirements, int kill);
* void MyFreeVec(void *memptr);
* long Command(struct Node *node, char *file);
* void ToggleFastMode(void);
* void ToggleAskingMode(void);
* void ToggleSortMode(void);
* void ToggleSpeakMode(void);
* void ToggleAutoFront(void);
* void ToggleMouseWindow(void);
* void ToggleTopazFont(void);
* void AddNodeSorted(struct List *list, struct Node *node);
* void AddNodeToList(int i, int sort_in);
* void CreateEntryList(int sorting);
* char *B2CStr(char *ret, long inp);
* void savestrcpy(char *str, struct Node *node, int cnt, int type);
* struct Node *GetNode(struct List *list, unsigned long offset);
* long SizeOfFile(char *Name);
* int SizeOfDir(long lock, long *Size, int *Dirs);
* struct SE *AllocScrollEntries(int count);
* long getdisktype(long lock);
* void FreeBytes(char *Vol, long *free, long *used, long *usedpercent, char *state, char *type);
* int exist(char *name);
* void quit(int askyou);
* int Question(struct Window *wind, char *ask, int def);
* void OpenLibs(void);
* void CloseLibs(void);
* void CloseAll(void);
*
* Bemerkungen:
* Utilities, die im ganzen Programm verwendet werden, z.B.
* Listen- und Stringverwaltungsroutinen.
*
* Erstellungsdatum:
* 07-Jan-93 Rolf Böhme
*
* Änderungen:
* 07-Jan-93 Rolf Böhme Erstellung
*
***************************************************************************
*/
#include "RSysDebug.h"
#include "RSysFunc.h"
extern struct Library *IconBase;
/*
* strncpy() ersetzt die Compiler-Routine. Im Gegensatz zur
* Orginalroutine wird der Zielstring korrekt terminiert
*/
char *
strncpy(char *dest, const char *src, size_t len)
{
register size_t i = len;
char *tmp = dest;
if (src)
while ((*(tmp++) = *(src++)) && --i) ;
*tmp = STRINGEND;
return (dest);
}
/*
* strcpy() ersetzt die Compiler-Routine. Im Gegensatz zur
* Orginalroutine wird überprüft, ob der Quellstring
* überhaupt existiert und kein NULL-Zeiger übergeben
* wurde
*/
char *
strcpy(char *dest, const char *src)
{
char *tmp = dest;
if (src)
while (*(tmp++) = *(src++)) ;
else
*tmp = STRINGEND;
return (dest);
}
/*
* MyAllocVec() ist eine Erweiterung der AllocVec()-Routine. In
* einem Fehlerfall wird eine Meldung ausgegeben und das
* Programm evtl korrekt beendet
*/
void *
MyAllocVec(unsigned long byteSize, unsigned long requirements, int kill)
{
void *memptr = NULL;
DPOS;
if (NOT(memptr = AllocVec(byteSize, requirements)))
ErrorHandle(MEMORY_ERR, ALLOC_FAIL, kill);
return (memptr);
}
/*
* MyFreeVec() prüft im Gegensatz zu Originalroutine, ob ein
* NULL-Zeiger übergeben wurde
*/
void
MyFreeVec(void *memptr)
{
DPOS;
if (memptr != NULL)
FreeVec(memptr);
memptr = NULL;
return;
}
extern UBYTE autocon[];
/*
* Command() führt einen Befehl in einem eigenen Prozeß aus.
* Als Aus- und Eingabekanal wird das Window verwendet, das im
* RSys-Icon festgelegt wurde
*/
LONG
Command(struct Node *node, char *file)
{
struct TagItem stags[5];
LONG result = -2;
BPTR fileptr;
struct _acts *Act = (struct _acts *) node;
UBYTE cmd[512];
DPOS;
if (node && strcmp(Act->act_command, field[NO_FIELD]) &&
(fileptr = Open(autocon, MODE_OLDFILE)))
{
stags[0].ti_Tag = SYS_Input;
stags[0].ti_Data = fileptr;
stags[1].ti_Tag = SYS_Output;
stags[1].ti_Data = NULL;
stags[2].ti_Tag = SYS_Asynch;
stags[2].ti_Data = FALSE;
stags[3].ti_Tag = SYS_UserShell;
stags[3].ti_Data = TRUE;
stags[4].ti_Tag = TAG_DONE;
sprintf((char *)cmd, "%s \"%s\"", Act->act_command, file);
result = System(cmd, stags);
if (result == -1L)
{
Close(fileptr);
ErrorHandle(TASK_ERR, CREATE_FAIL, NO_KILL);
}
}
return (result);
}
/*
* ToggleFastMode() schaltet zwischen der schnellen Anzeige (die
* Listenelemente werden während der Erzeugung nicht angezeigt)
* und der langsamen Anzeige (wenn ein Eintrag erzeugt wurde,
* wird er sofort angezeigt)
*/
void
ToggleFastMode(void)
{
DPOS;
Flags.fastmode = ~Flags.fastmode;
PrintInfo(Flags.fastmode ? "Fast mode on" : "Fast mode off", SPEAK, SEC);
PrintStatistics();
return;
}
/*
* ToggleAskingMode() schaltet die Sicherheits-
* abfrage bei kritischen Aktionen ein oder aus
*/
void
ToggleAskingMode(void)
{
DPOS;
Flags.saveasking = ~Flags.saveasking;
PrintInfo(Flags.saveasking ? "Save asking mode on" : "Save asking mode off", SPEAK, SEC);
PrintStatistics();
return;
}
/*
* ToggleSortMode() schaltet zwischen dem sortierten und
* direkten Einfügen von Listenelementen um
*/
void
ToggleSortMode(void)
{
DPOS;
Flags.sortmode = ~Flags.sortmode;
PrintInfo(Flags.sortmode ? "List sorting on" : "List sorting off", SPEAK, SEC);
RefreshList(LastID);
PrintStatistics();
return;
}
/*
* ToggleWorkingBar() schaltet die Anzeige des Working Bars
* (Anzeigestatus in Form eines Laufbalkens) um
*/
void
ToggleWorkingBar(void)
{
DPOS;
Flags.workingbar = ~Flags.workingbar;
PrintInfo(Flags.workingbar ? "Working bar on" : "Working bar off", SPEAK, SEC);
RefreshList(LastID);
PrintStatistics();
return;
}
/*
* ToggleSpeakMode() schaltet die Sprachausgabe ein oder aus.
* Alle Mitteilungen, die im Textgadget unten im Hauptwindow
* erscheinen, werden über das narrator.device ausgegeben, wenn
* der Modus eingeschaltet wurde
*/
void
ToggleSpeakMode(void)
{
DPOS;
Flags.speakmode = ~Flags.speakmode;
if (NOT(Flags.speakmode))
RemoveSpeech();
else if (NOT(InitSpeech()))
Flags.speakmode = ~Flags.speakmode;
PrintInfo(Flags.speakmode ? "Speak mode on" : "Speak mode off", SPEAK, SEC);
PrintStatistics();
return;
}
/*
* ToggleAutoFront() ermöglicht das Öffnen eines Fensters
* mit anschließendem Nach-Vorne-Bringen dieses Fensters
*/
void
ToggleAutoFront(void)
{
DPOS;
Flags.autofront = ~Flags.autofront;
PrintInfo(Flags.autofront ? "Auto front on" : "Auto front off", SPEAK, SEC);
PrintStatistics();
return;
}
/*
* ToggleMouseWindow() schaltet die Möglichkeit ein oder aus,
* alle Fenster von RSys unter dem Mauszeiger zu öffnen
*/
void
ToggleMouseWindow(void)
{
DPOS;
Flags.mousewindow = ~Flags.mousewindow;
PrintInfo(Flags.mousewindow ? "Mouse window on" : "Mouse window off", SPEAK, SEC);
PrintStatistics();
return;
}
/*
* ToggleTopazFont() schaltet zwischen der Verwendung des
* System-Fonts und dem Topaz-Font um. Wird als
* System-Workbench-Font ein proportionaler Zeichensatz
* gewählt, sehen die Listen etwas unformatiert aus. Topaz ist
* ein unproportionaler Font, der Listen korrekt formatiert
* darstellt
*/
void
ToggleTopazFont(void)
{
extern int ReopenWindow;
D(kprintf("----------------------------\n"));
DPOS;
Flags.sysfont = ~Flags.sysfont;
CloseASysWindow(&SysWnd, &SysGList, &SysMenus);
CloseDownScreen();
OpenMainWindow();
RefreshList(LastID);
PrintInfo(Flags.sysfont ? "Topaz font on" : "Topaz font off", SPEAK, SEC);
PrintStatistics();
ReopenWindow = TRUE;
DPOS;
D(kprintf("----------------------------\n"));
return;
}
/*
* StrICmp() ersetzt die Utility-Library- und Aztec-C-Routine.
* Beide liefern enforcer-Hits, falls man sie mit Leer- oder
* NULL-Strings aufruft
static int
StrICmp(const char *s1, char *s2)
{
int c1,
c2,
diff = 0;
while (s1 && *s1 && s2 && *s2 && (diff == 0))
{
c1 = toupper((int)(*s1));
c2 = toupper((int)(*s2));
diff = c1 - c2;
s1++;
s2++;
}
return (diff);
}
*/
/*
* AddNodeSorted() sortiert ein Listenelement in eine
* bestehende Liste ein. Da die hier betrachteten Listen
* ziemlich klein sind, wird hier ein einfaches Sortieren durch
* Einfügen verwendet
*/
void
AddNodeSorted(struct List *list, struct Node *node)
{
struct Node *head = list->lh_Head,
*loop_node;
BOOL ins = FALSE;
if (IsListEmpty(list))
AddHead(list, node);
else if (head->ln_Succ == NULL)
{
if (Stricmp((STRPTR)head->ln_Name, (STRPTR)node->ln_Name) <= 0L)
AddTail(list, node);
else
AddHead(list, node);
ins = TRUE;
}
else
{
if (Stricmp((STRPTR)head->ln_Name, (STRPTR)node->ln_Name) > 0L)
{
AddHead(list, node);
ins = TRUE;
}
for (loop_node = head;
loop_node->ln_Succ && loop_node->ln_Succ->ln_Succ && (ins == FALSE);
loop_node = loop_node->ln_Succ)
{
if ((Stricmp((STRPTR)loop_node->ln_Name, (STRPTR)node->ln_Name) <= 0L) &&
(Stricmp((STRPTR)node->ln_Name, (STRPTR)loop_node->ln_Succ->ln_Name) < 0L))
{
Insert(list, node, loop_node);
ins = TRUE;
}
}
if (ins == FALSE)
AddTail(list, node);
}
return;
}
static ULONG xmin,ymin,xmax,ymax, textx, texty;
/*
* InitBar() entfernt das Informationen-Text-Gadget; dabei
* bleibt der Rahmen stehen (dank Intuition). Dieser Rahmen
* wird dann als Begrenzung für den Statusbalken verwendet.
* Der Balkenbereich wird dann gelöscht und die Zeichenmodi
* eingestellt.
*/
static UWORD
InitBar(void)
{
extern long bpp;
extern int bpc, bgc;
UWORD pos = RemoveGadget(SysWnd,SysGadgets[18]);
struct RastPort *RP;
RP = SysWnd->RPort;
xmin = SysGadgets[18]->LeftEdge+1;
ymin = SysGadgets[18]->TopEdge+1;
xmax = SysGadgets[18]->LeftEdge + SysGadgets[18]->Width-4;
ymax = SysGadgets[18]->TopEdge + SysGadgets[18]->Height-2;
textx = xmin + 2 + (SysGadgets[18]->Width - 4 * (FontX + 1)) / 2;
texty = ymin + 1 + (SysGadgets[18]->Height - 2 - FontY) / 2 +
RP->TxBaseline;
EraseRect(RP,xmin,ymin,xmax,ymax);
SetDrMd(RP, JAM1);
SetAPen(RP,3);
SetBPen(RP,0);
return(pos);
}
/*
* RefreshBar() aktualisiert die Anzeige des Statusbalkens.
* Dazu wird wie folgt vorgegangen:
* 1. Neue Breite des Balkens und Prozentzahl berechnen
* 2. Den Bereich mit Farbe füllen
* 3. Falls es nicht der letzte Eintrag war, wird
* der Rest des Balkenbereichs (rechts) gelöscht
* 4. Die Prozentzahl wird entsprechend des Fonts in den
* Balken gesetzt.
*/
static void
RefreshBar(int curr)
{
ULONG percent = (100 * curr) / countentries,
xcurr = xmin + ((xmax-xmin) * curr) / countentries;
UBYTE percentstr[5] = " ";
RectFill(SysWnd->RPort, xmin, ymin, xcurr, ymax);
if(curr != countentries)
EraseRect(SysWnd->RPort, xcurr + 1, ymin, xmax, ymax);
/*
Move(SysWnd->RPort,textx, texty);
sprintf((char *)percentstr,"%3ld%%", percent);
SetAPen(SysWnd->RPort,2);
Text(SysWnd->RPort,percentstr, strlen((char *)percentstr));
SetAPen(SysWnd->RPort,3);
*/
if (Flags.fastmode)
WaitTOF();
return;
}
/*
* RemoveBar() löscht den Bereich des für den Statusbalkens
* entfernten Gadgets und hängt das Gadget wieder ein
*/
static void
RemoveBar(UWORD pos)
{
SetAPen(SysWnd->RPort,0);
EraseRect(SysWnd->RPort,xmin,ymin,xmax,ymax);
AddGadget(SysWnd,SysGadgets[18], (ULONG)pos);
RefreshGList(SysGadgets[18], SysWnd, NULL, 1);
GT_RefreshWindow( SysWnd, NULL );
return;
}
/*
* AddNodeToList() ist eine Schnittstelle zwischen den Routinen
* AddNodeSorted() und AddTail(). Je nachdem, ob ein Element in
* die Liste sortiert einfügt werden soll oder nicht, werden
* die entsprechenden Routinen aufgerufen
*/
void
AddNodeToList(int i, int sort_in)
{
struct List *list = &ListeLVList;
struct Node *head = list->lh_Head,
*node = &(Entries[i].se_Node);
BOOL ins = FALSE;
UWORD gadpos;
if(Flags.workingbar && (i == 0))
gadpos = InitBar();
if (Flags.sortmode && sort_in && head && node->ln_Name)
AddNodeSorted(list, node);
else
AddTail(list, node);
if (NOT(Flags.fastmode))
{
RefreshListView();
WaitTOF();
}
if(Flags.workingbar)
{
RefreshBar(i);
if(i == (countentries - 1))
{
RefreshBar(countentries);
RemoveBar(gadpos);
}
}
return;
}
/*
* CreateEntryList() fügt die Entries in die Anzeigeliste ein.
*/
void
CreateEntryList(int sorting)
{
register int i;
for (i = 0; i < countentries; i++)
AddNodeToList(i, sorting);
return;
}
/*
* B2CStr() wandelt einen BCPL-String in einen C-String um
*/
char *
B2CStr(char *ret, BSTR inp)
{
register int i;
char *help = (char *)BADDR(inp);
DPOS;
for (i = 0; i < *help; i++)
*(ret + i) = *(help + i + 1);
*(ret + i) = STRINGEND;
return (ret);
}
/*
* savestrcpy() kopiert eine Anzahl von Zeichen eines
* Node-Namens in einen Zielstring. Hierbei wird darauf
* geachtet, daß ein Node-Name überhaupt existiert
*/
void
savestrcpy(char *str, struct Node *node, int cnt, int type)
{
register int i = 0;
DPOS;
if(!node || !(node->ln_Name))
{
strcpy(str, field[NO_NODE]);
return;
}
if((type == NT_TASK) && (node->ln_Type == NT_PROCESS))
type = NT_PROCESS;
if((type == NT_SEMAPHORE) && (node->ln_Type == NT_SIGNALSEM))
type = NT_SIGNALSEM;
if(node->ln_Type == type)
strncpy(str, node->ln_Name, cnt);
else
sprintf(str, field[WRONG_TYPE_FMT], node->ln_Type);
return;
}
/*
* GetNode() ermittelt einen Eintrag, dessen Abstand vom
* Listenkopf in offset angegeben wird, also das offset'te
* Element
*/
struct Node *
GetNode(struct List *list, ULONG offset)
{
struct Node *Node;
LONG i;
DPOS;
Node = (struct Node *) list->lh_Head;
for (i = 0; i < offset; i++)
{
if (!Node->ln_Succ)
return (NULL);
Node = Node->ln_Succ;
}
return (Node);
}
/*
* SizeOfFile() ermittelt die Größe einer Datei
*/
long
SizeOfFile(char *Name)
{
struct FileInfoBlock *FileInfo;
LONG FileSize = 0L;
DPOS;
if (NOT(exist(Name)))
return (FileSize);
if (FileInfo = (struct FileInfoBlock *) AllocDosObject(DOS_FIB, TAG_DONE))
{
BPTR FileLock;
if (FileLock = Lock((UBYTE *) Name, ACCESS_READ))
{
if (Examine(FileLock, FileInfo))
FileSize = FileInfo->fib_Size;
UnLock(FileLock);
}
FreeDosObject(DOS_FIB, FileInfo);
}
return (FileSize);
}
/*
* SizeOfDir() ermittelt die Größe eines Directories, also die
* Größe aller in ihr enthaltenen Dateien
*/
int
SizeOfDir(BPTR lock, long *Size, int *Dirs)
{
struct ExAllControl *eac;
struct ExAllData *EAData,
*ead;
int cnt = 0,
more;
DPOS;
if (eac = AllocDosObject(DOS_EXALLCONTROL, NULL))
{
eac->eac_LastKey = 0;
EAData = MyAllocVec(513 * sizeof(struct ExAllData),
MEMF_ANY | MEMF_CLEAR, NO_KILL);
if(EAData)
{
do
{
more = ExAll(lock, EAData, 512 * sizeof(struct ExAllData),
ED_SIZE, eac);
if ((!more) && (IoErr()!= ERROR_NO_MORE_ENTRIES))
{
ErrorHandle(DOS_EXALL_ERR, EXALL_FAIL, NO_KILL);
break;
}
if (eac->eac_Entries == 0)
continue;
ead = EAData;
do
{
if (SetSignal(0L, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C)
{
more = FALSE;
break;
}
*Size += ead->ed_Size;
if (ead->ed_Type > 0)
(*Dirs)++;
else
cnt++;
ead = ead->ed_Next;
}
while (ead);
}
while (more);
}
MyFreeVec(EAData);
FreeDosObject(DOS_EXALLCONTROL, eac);
}
else
ErrorHandle(MEMORY_ERR, ALLOC_FAIL, KILL);
return (cnt);
}
/*
* AllocScrollEntries() reserviert Speicher für die
* Listeneinträge des Haupt-ListViews. Werden weniger Einträge
* angefordert, als zuvor alloziert sind, wird kein neuer
* Speicher angefordert, sondern ein Zeiger auf die
* Ursprungs-Liste zurückgegeben, damit die Daten dann
* überschrieben werden können
*/
ScrollEntry *
AllocScrollEntries(int count)
{
register int i;
static int memcounter = 0;
DPOS;
if (count > memcounter)
{
if (Entries != NULL)
{
MyFreeVec(Entries);
Entries = NULL;
}
if (Entries = (ScrollEntry *)MyAllocVec(count * sizeof(ScrollEntry),
MEMF_ANY | MEMF_CLEAR, KILL))
{
for (i = 0; i < count; i++)
Entries[i].se_Node.ln_Name = Entries[i].se_Entry;
memcounter = count;
return (Entries);
}
}
else
return (Entries);
return (NULL);
}
/*
* getdisktype() holt aus einem FileLock die Typ-Nummer des
* angemeldeten Devices heraus
*/
long
getdisktype(BPTR lock)
{
struct FileLock *fl = (struct FileLock *) BADDR(lock);
return (((struct DeviceList *)BADDR(fl->fl_Volume))->dl_DiskType);
}
/*
* FreeBytes() ermittelt die Daten eines Volumes
*/
void
FreeBytes(char *Vol, long *free, long *used, long *usedpercent,
char *state, char *type)
{
BPTR lock = NULL;
register int i;
register struct InfoData *ID = NULL;
union
{
LONG dostype;
char dostypestr[5];
} convert;
DPOS;
if (ID = (struct InfoData *) MyAllocVec(sizeof(struct InfoData),
MEMF_CLEAR, NO_KILL))
{
if (lock = Lock((UBYTE *) Vol, ACCESS_READ))
{
if (Info(lock, ID))
{
*free = (((ID->id_NumBlocks - ID->id_NumBlocksUsed) *
ID->id_BytesPerBlock) >> 10);
*used = ((ID->id_NumBlocksUsed * ID->id_BytesPerBlock) >> 10);
*usedpercent = (100 * ID->id_NumBlocksUsed) / ID->id_NumBlocks;
if((convert.dostype = getdisktype(lock)) == 0L)
convert.dostype = ID->id_DiskType;
if (convert.dostype != (long)(-1))
{
strncpy(type, convert.dostypestr,4);
for (i = 0; i < 4; i++)
{
type[i] += ((int)type[i] < 10 ? 0x30 : 0x20);
type[i] = ToUpper((int)type[i]);
}
}
else
strcpy(type, "NODI");
if (strstr(Vol, "AX") || strstr(Vol, "AMAX"))
strcpy(type, "AMAX");
switch (ID->id_DiskState)
{
case ID_WRITE_PROTECTED:
strcpy(state, "R/O");
break;
case ID_VALIDATING:
strcpy(state, "VAL");
break;
case ID_VALIDATED:
strcpy(state, "R/W");
break;
default:
strcpy(state, field[NO_FIELD]);
break;
}
}
else
{
*free = 0L;
*used = 0L;
*usedpercent = 0;
strcpy(state, "NST");
strcpy(type, "NINF");
}
UnLock(lock);
}
else
{
*free = 0L;
*used = 0L;
*usedpercent = 0;
strcpy(type, field[NO_FIELD]);
strcpy(state, "NOL");
}
MyFreeVec(ID);
}
return;
}
/*
* exist() prüft, ob ein File oder Directory angegebenen Namens
* existiert
*/
int
exist(char *name)
{
BPTR File;
DPOS;
if (NOT(name) || NOT(name[0]))
return (FALSE);
if (File = Lock((UBYTE *) name, ACCESS_READ))
{
UnLock(File);
return (TRUE);
}
return (FALSE);
}
/*
* quit() beendet nach einer Sicherheitsabfrage das Programm
*/
void
quit(int askyou)
{
WORD check = 1;
UBYTE *answer = (UBYTE *)(Flags.wb_start ? "Yes|Iconify|No" : "Yes|No");
DPOS;
if(Flags.saveasking && askyou)
check = MyEasyRequest(SysWnd, (UBYTE *) NAME " ask you",
answer, (UBYTE *) "Quit program?");
switch (check)
{
case 1:
PrintInfo("Bye bye", SPEAK, SEC);
CloseAll();
break;
case 2:
if (!appicon)
Iconify();
break;
default:
break;
}
return;
}
/*
* Question() bietet eine Ja-Nein-Abfrage in Form eines
* System-Requesters an. Ist das Flag saveasking ausgeschaltet,
* wird der Wert default automatisch an die aufrufende
* Prozedur zurückgegeben.
*/
int
Question(struct Window * wind, char *ask, int def)
{
UBYTE header[MAXSTRLEN];
DPOS;
if(Flags.saveasking)
{
sprintf((char *)header, "%s ask you", NAME);
if (Flags.speakmode)
Speak(ask);
return (MyEasyRequest(wind, header, (UBYTE *) "Yes|No", (UBYTE *) "%s",
(UBYTE *) ask));
}
else
return((WORD)def);
}
/*
* OpenLibs() öffnet alle notwendigen Libraries, installiert
* den Broker und liest die ActionList ein
*/
void
OpenLibs(void)
{
DPOS;
IntuitionBase = (struct IntuitionBase *)OpenLibrary((UBYTE *) "intuition.library", 36);
WorkbenchBase = (struct WorkbenchBase *)OpenLibrary((UBYTE *) "workbench.library", 36);
GfxBase = (struct GfxBase *)OpenLibrary((UBYTE *) "graphics.library", 36);
GadToolsBase = OpenLibrary((UBYTE *) "gadtools.library", 36);
UtilityBase = OpenLibrary((UBYTE *) "utility.library", 36);
DiskfontBase = OpenLibrary((UBYTE *) "diskfont.library", 36);
CxBase = OpenLibrary((UBYTE *) "commodities.library", 36);
IconBase = OpenLibrary((UBYTE *) "icon.library", 36);
if(!IntuitionBase || !WorkbenchBase || !GfxBase || !GadToolsBase ||
!UtilityBase || !DiskfontBase || !CxBase || !IconBase)
ErrorHandle(LIBRARY_ERR, OPEN_FAIL, KILL);
InstallBroker();
BuildActionList();
return;
}
/*
* CloseLibs() schließt alle geöffneten Resourcen
*/
void
CloseLibs(void)
{
DPOS;
MyFreeVec(Actions);
RemoveBroker();
CloseLibrary(IconBase);
CloseLibrary(CxBase);
CloseLibrary(DiskfontBase);
CloseLibrary(UtilityBase);
CloseLibrary(GadToolsBase);
CloseLibrary((struct Library *) GfxBase);
CloseLibrary((struct Library *) WorkbenchBase);
CloseLibrary((struct Library *) IntuitionBase);
return;
}
/*
* CloseAll() schließt alle geöffneten und initialisierten
* Intuitionobjekte und beendet das Programm
*/
void
CloseAll(void)
{
DPOS;
if (Flags.speakmode)
RemoveSpeech();
if (appicon)
RemoveAppIcon(appicon);
MyFreeVec(Entries);
KillList();
if (SysIdPort)
DeletePort(SysIdPort);
CloseASysWindow(&SysWnd, &SysGList, &SysMenus);
CloseDownScreen();
CloseLibs();
MyFreeVec(RSysName);
RemoveTrapHandlers();
exit(0);
}