summaryrefslogtreecommitdiff
path: root/command_line/CmdLine/Src/CLPrefs.c
blob: 05ca045e128c1a41b56f9b2fd17b12059a69fee4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#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);

    OS_ASSERT(60, 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(void) {
    panellist = NULL;
}

void Prefs_Terminate(void) {
    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(CLStr90, 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;
}