diff options
Diffstat (limited to '')
-rw-r--r-- | command_line/CmdLine/Src/CLPrefs.c | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/command_line/CmdLine/Src/CLPrefs.c b/command_line/CmdLine/Src/CLPrefs.c index e69de29..7aaa28a 100644 --- a/command_line/CmdLine/Src/CLPrefs.c +++ b/command_line/CmdLine/Src/CLPrefs.c @@ -0,0 +1,123 @@ +#include "cmdline.h" + +struct PrefPanel { + char *name; + Handle data; + Handle workHandle; + PrefPanel *next; +}; + +static PrefPanel *panellist; + +PrefPanel *PrefPanel_New(const char *name, void *initdata, SInt32 initdatasize) { + PrefPanel *pnl; + pnl = xmalloc(NULL, sizeof(PrefPanel)); + if (!pnl) + return pnl; + + pnl->name = xstrdup(name); + pnl->data = NewHandle(initdatasize); + if (!pnl->data) { + fprintf(stderr, "\n*** Out of memory\n"); + exit(-23); + } + + pnl->workHandle = NULL; + + HLock(pnl->data); + if (initdata) + memcpy(*pnl->data, initdata, initdatasize); + else + memset(*pnl->data, 0, initdatasize); + HUnlock(pnl->data); + + pnl->next = NULL; + return pnl; +} + +Handle PrefPanel_GetHandle(PrefPanel *panel) { + UInt32 len = GetHandleSize(panel->data); + if (!panel->workHandle || !*panel->workHandle) + panel->workHandle = NewHandle(len); + else + SetHandleSize(panel->workHandle, len); + +#line 60 + OPTION_ASSERT(MemError()==noErr); + + HLock(panel->data); + HLock(panel->workHandle); + memcpy(*panel->workHandle, *panel->data, len); + HUnlock(panel->workHandle); + HUnlock(panel->data); + return panel->workHandle; +} + +int PrefPanel_PutHandle(PrefPanel *panel, Handle data) { + UInt32 len = GetHandleSize(data); + if (data != panel->workHandle) { + if (!panel->workHandle) + panel->workHandle = NewHandle(len); + else + SetHandleSize(panel->workHandle, len); + if (MemError() != noErr) + return 0; + + HLock(panel->workHandle); + HLock(data); + memcpy(*panel->workHandle, *data, len); + HUnlock(data); + HUnlock(panel->workHandle); + } + + HLock(panel->data); + HLock(panel->workHandle); + memcpy(*panel->data, *panel->workHandle, len); + HUnlock(panel->workHandle); + HUnlock(panel->data); + return 1; +} + +void Prefs_Initialize() { + panellist = NULL; +} + +void Prefs_Terminate() { + PrefPanel *scan; + PrefPanel *next; + + for (scan = panellist; scan; scan = next) { + xfree(scan->name); + DisposeHandle(scan->data); + next = scan->next; + xfree(scan); + } +} + +Boolean Prefs_AddPanel(PrefPanel *panel) { + PrefPanel **scan; + + for (scan = &panellist; *scan; scan = &(*scan)->next) { + if (!strcmp((*scan)->name, panel->name)) { + CLReportError(90, panel->name); + return 0; + } + } + + if (clState.pluginDebug) + CLPrint("Defining/adding pref panel '%s'\n", panel->name); + + *scan = panel; + return 1; +} + +PrefPanel *Prefs_FindPanel(const char *name) { + PrefPanel *scan; + + for (scan = panellist; scan; scan = scan->next) { + if (!ustrcmp(scan->name, name)) + break; + } + + return scan; +} |