-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathfix_rsc.c
246 lines (227 loc) · 8.09 KB
/
fix_rsc.c
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
/*
* COPS (c) 1995 - 2003 Sven & Wilfried Behne
* 2004 F.Naumann & O.Skancke
*
* A XCONTROL compatible CPX manager.
*
* This file is part of COPS.
*
* COPS is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* COPS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with XaAES; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "fix_rsc.h"
struct foobar
{
short dummy; /* ist wahrscheinlich vorhanden, weil irgendein Kretin
zwei Bytes zuviel rausgeschrieben hat */
_WORD *image; /* Zeiger auf Image */
};
static void fix_trindex(short num_tree, OBJECT **rs_trindex, OBJECT *rs_object);
static void fix_objects(short num_objs, OBJECT *obj, TEDINFO *ted, char *str[],
ICONBLK *icon, BITBLK *bblk, struct foobar *rs_imdope);
static void fix_str(char **where, char *str[]);
static void fix_img(_WORD **where, struct foobar *rs_imdope);
static void fix_frstr(short num_frstr, long *rs_frstr, char *str[]);
static void fix_frimg(short num_frimg, BITBLK **rs_frimg, BITBLK *bblk,
struct foobar *rs_imdope);
/*----------------------------------------------------------------------------------------*/
/* Indizes in OBJECT-Strukturen in Zeiger umwandeln */
/* Funktionsresultat: - */
/* num_objs: Anzahl aller Objekte in rs_object */
/* num_frstr: Anzahl der freien Strings in rs_frstr */
/* num_frimg: Anzahl der freien BITBLKs in rs_frimg */
/* num_tree: Anzahl der Baeume in rs_trindex */
/* rs_object: Feld mit saemtlichen Resource-OBJECTs */
/* rs_tedinfo: Feld mit den von OBJECTs angesprochenen TEDINFOs */
/* rs_string: Feld mit Strings */
/* rs_iconblk: Feld mit ICONBLKs fuer OBJECTs */
/* rs_bitblk: Feld mit BITBLKs fuer OBJECTs */
/* rs_frstr: Feld mit Indizes/Zeigern auf freie Strings */
/* rs_frimg: Feld mit Indizes/Zeigern auf freie Images */
/* rs_trindex: Feld mit Indizes/Zeigern auf Objektbaeume */
/* rs_imdope: Feld mit Zeigern auf Images fr ICONBLKs */
/*----------------------------------------------------------------------------------------*/
void
fix_rsc(short num_objs, short num_frstr, short num_frimg, short num_tree,
OBJECT *rs_object, TEDINFO *rs_tedinfo, char *rs_string[], ICONBLK *rs_iconblk, BITBLK *rs_bitblk,
long *rs_frstr, long *rs_frimg, long *rs_trindex, struct foobar *rs_imdope)
{
fix_trindex(num_tree, (OBJECT **) rs_trindex, rs_object);
fix_objects(num_objs, rs_object, rs_tedinfo, rs_string, rs_iconblk, rs_bitblk, rs_imdope);
fix_frstr(num_frstr, rs_frstr, rs_string);
fix_frimg(num_frimg, (BITBLK **) rs_frimg, rs_bitblk, rs_imdope);
}
/*----------------------------------------------------------------------------------------*/
/* Indizes rs_trindex durch Zeiger auf die Objektbaeume ersetzen */
/* Funktionsresultat: - */
/* num_tree: Anzahl der Baeume in rs_trindex */
/* rs_trindex: Feld mit Indizes/Zeigern auf Objektbaeume */
/* rs_object: Feld mit saemtlichen Resource-OBJECTs */
/*----------------------------------------------------------------------------------------*/
static void
fix_trindex(short num_tree, OBJECT **rs_trindex, OBJECT *rs_object)
{
while (num_tree > 0)
{
long index;
index = (long) *rs_trindex; /* Wurzelobjektnummer */
*rs_trindex = &rs_object[index]; /* Zeiger auf das Wurzelobjekt */
rs_trindex++;
num_tree--;
}
}
/*----------------------------------------------------------------------------------------*/
/* Fr alle OBJECTs ob_spec und dessen Referenzen initialisieren */
/* Funktionsresultat: - */
/* num_objs: Anzahl aller Objekte in rs_object */
/* obj: Feld mit saemtlichen Resource-OBJECTs */
/* ted: Feld mit den von OBJECTs angesprochenen TEDINFOs */
/* str: Feld mit Strings */
/* icon: Feld mit ICONBLKs fuer OBJECTs */
/* bblk: Feld mit BITBLKs fuer OBJECTs */
/* rs_imdope: Feld mit Zeigern auf Images fuer ICONBLKs */
/*----------------------------------------------------------------------------------------*/
static void
fix_objects(short num_objs, OBJECT *obj, TEDINFO *ted, char *str[],
ICONBLK *icon, BITBLK *bblk, struct foobar *rs_imdope)
{
while (num_objs > 0)
{
long index = obj->ob_spec.index;
switch (obj->ob_type & 0xff)
{
case G_TITLE:
case G_STRING:
case G_BUTTON:
{
fix_str(&obj->ob_spec.free_string, str); /* Zeiger auf String */
break;
}
case G_TEXT:
case G_BOXTEXT:
case G_FTEXT:
case G_FBOXTEXT:
{
if (index != -1L) /* TEDINFO besetzen? */
{
obj->ob_spec.tedinfo = &ted[index];
fix_str(&ted[index].te_ptext, str); /* Zeiger auf String */
fix_str(&ted[index].te_ptmplt, str); /* Zeiger auf String */
fix_str(&ted[index].te_pvalid, str); /* Zeiger auf String */
}
else
obj->ob_spec.tedinfo = 0L;
break;
}
case G_ICON:
{
if (index != -1L) /* ICONBLK besetzen? */
{
obj->ob_spec.iconblk = &icon[index]; /* Zeiger auf ICONBLK */
fix_img(&icon[index].ib_pmask, rs_imdope); /* Zeiger auf die Maske */
fix_img(&icon[index].ib_pdata, rs_imdope); /* Zeiger auf den Vordergrund */
fix_str(&icon[index].ib_ptext, str); /* Zeiger auf String */
}
else
obj->ob_spec.iconblk = 0L;
break;
}
case G_IMAGE:
{
if (index != -1L) /* BITBLK besetzen? */
{
obj->ob_spec.bitblk = &bblk[index];
fix_img(&bblk[index].bi_pdata, rs_imdope);
}
else
obj->ob_spec.bitblk = 0L;
break;
}
}
obj++;
num_objs--;
}
}
/*----------------------------------------------------------------------------------------*/
/* Stringadresse eintragen */
/* Funktionsresultat: - */
/* where: Adresse des Index/Zeigers */
/* str: Feld mit Strings */
/*----------------------------------------------------------------------------------------*/
static void
fix_str(char **where, char *str[])
{
long index = (long) *where;
if (index != -1L) /* String vorhanden? */
*where = str[index];
else
*where = 0L;
}
/*----------------------------------------------------------------------------------------*/
/* Zeiger auf Image eintragen */
/* Funktionsresultat: - */
/* where: Adresse des Index/Zeigers */
/* rs_imdope: Feld mit Zeigern auf Images fuer ICONBLKs */
/*----------------------------------------------------------------------------------------*/
static void
fix_img(_WORD **where, struct foobar *rs_imdope)
{
long index = (long) *where;
if (index != -1L) /* Image vorhanden? */
*where = rs_imdope[index].image;
else
*where = 0L;
}
/*----------------------------------------------------------------------------------------*/
/* freie Strings verzeigern */
/* Funktionsresultat: - */
/* num_frstr: Anzahl der freien Strings in rs_frstr */
/* rs_frstr: Feld mit Indizes/Zeigern auf freie Strings */
/* str: Feld mit Strings */
/*----------------------------------------------------------------------------------------*/
static void
fix_frstr(short num_frstr, long *rs_frstr, char *str[])
{
while (num_frstr > 0)
{
fix_str((char **)rs_frstr, str);
rs_frstr++;
num_frstr--;
}
}
/*----------------------------------------------------------------------------------------*/
/* freie BITBLKs verzeigern */
/* Funktionsresultat: - */
/* num_frimg: Anzahl der freien BITBLKs in rs_frimg */
/* rs_frimg: Feld mit Indizes/Zeigern auf freie Images */
/* bblk: Feld mit BITBLKs fuer OBJECTs */
/* rs_imdope: Feld mit Zeigern auf Images fuer ICONBLKs */
/*----------------------------------------------------------------------------------------*/
static void
fix_frimg(short num_frimg, BITBLK **rs_frimg, BITBLK *bblk, struct foobar *rs_imdope)
{
while (num_frimg > 0)
{
long index = (long) *rs_frimg;
if (index != -1L) /* BITBLK vorhanden? */
{
*rs_frimg = &bblk[index];
fix_img(&bblk[index].bi_pdata, rs_imdope);
}
else
*rs_frimg = 0L;
rs_frimg++;
num_frimg--;
}
}