blob: a9a378e3451fafef8fe5f88cddf1b17642b08c7f [file] [log] [blame]
Sjoerd Mullenderc4315491992-09-23 14:53:00 +00001/***********************************************************
Guido van Rossume5372401993-03-16 12:15:04 +00002Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
3Amsterdam, The Netherlands.
Sjoerd Mullenderc4315491992-09-23 14:53:00 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25
26/* Cl objects */
27
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +000028#define CLDEBUG
29
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000030#include <stdarg.h>
Sjoerd Mullenderc4315491992-09-23 14:53:00 +000031#include <cl.h>
32#include "allobjects.h"
33#include "modsupport.h" /* For getargs() etc. */
34#include "ceval.h" /* For call_object() */
35
36typedef struct {
37 OB_HEAD
38 int ob_isCompressor; /* Compressor or Decompressor */
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +000039 CL_Handle ob_compressorHdl;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +000040 int *ob_paramtypes;
41 int ob_nparams;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +000042} clobject;
43
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000044static object *ClError; /* exception cl.error */
45
46static int error_handler_called = 0;
47
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +000048/*
49 * We want to use the function prototypes that are available in the C
50 * compiler on the SGI. Because of that, we need to declare the first
51 * argument of the compressor and decompressor methods as "object *",
52 * even though they are really "clobject *". Therefore we cast the
53 * argument to the proper type using this macro.
54 */
55#define SELF ((clobject *) self)
56
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +000057/********************************************************************
58 Utility routines.
59********************************************************************/
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000060static void
Sjoerd Mullender3a997271993-02-04 16:43:28 +000061cl_ErrorHandler(CL_Handle handle, int code, const char *fmt, ...)
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000062{
63 va_list ap;
64 char errbuf[BUFSIZ]; /* hopefully big enough */
Sjoerd Mullender384f2481992-09-29 16:43:43 +000065 char *p;
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000066
Sjoerd Mullender384f2481992-09-29 16:43:43 +000067 if (err_occurred()) /* don't change existing error */
68 return;
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000069 error_handler_called = 1;
70 va_start(ap, fmt);
71 vsprintf(errbuf, fmt, ap);
72 va_end(ap);
Sjoerd Mullender384f2481992-09-29 16:43:43 +000073 p = &errbuf[strlen(errbuf) - 1]; /* swat the line feed */
74 if (*p == '\n')
75 *p = 0;
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000076 err_setstr(ClError, errbuf);
77}
78
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +000079/*
80 * This assumes that params are always in the range 0 to some maximum.
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +000081 */
82static int
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +000083param_type_is_float(clobject *self, int param)
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +000084{
Sjoerd Mullender3a997271993-02-04 16:43:28 +000085 int bufferlength;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +000086 int ret;
87
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +000088 if (self->ob_paramtypes == NULL) {
89 error_handler_called = 0;
90 bufferlength = clQueryParams(self->ob_compressorHdl, 0, 0);
91 if (error_handler_called)
92 return -1;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +000093
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +000094 self->ob_paramtypes = NEW(int, bufferlength);
95 if (self->ob_paramtypes == NULL)
96 return -1;
97 self->ob_nparams = bufferlength / 2;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +000098
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +000099 (void) clQueryParams(self->ob_compressorHdl, self->ob_paramtypes, bufferlength);
100 if (error_handler_called) {
101 DEL(self->ob_paramtypes);
102 self->ob_paramtypes = NULL;
103 return -1;
104 }
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000105 }
106
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000107 if (param < 0 || param >= self->ob_nparams)
108 return -1;
109
110 if (self->ob_paramtypes[param*2 + 1] == CL_FLOATING_ENUM_VALUE ||
111 self->ob_paramtypes[param*2 + 1] == CL_FLOATING_RANGE_VALUE)
112 return 1;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000113 else
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000114 return 0;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000115}
116
117/********************************************************************
118 Single image compression/decompression.
119********************************************************************/
120static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000121cl_CompressImage(object *self, object *args)
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000122{
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000123 int compressionScheme, width, height, originalFormat;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000124 float compressionRatio;
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000125 int frameBufferSize, compressedBufferSize;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000126 char *frameBuffer;
127 object *compressedBuffer;
128
129 if (!getargs(args, "(iiiifs#)", &compressionScheme, &width, &height,
130 &originalFormat, &compressionRatio, &frameBuffer,
131 &frameBufferSize))
132 return NULL;
133
134 retry:
135 compressedBuffer = newsizedstringobject(NULL, frameBufferSize);
136 if (compressedBuffer == NULL)
137 return NULL;
138
139 compressedBufferSize = frameBufferSize;
140 error_handler_called = 0;
141 if (clCompressImage(compressionScheme, width, height, originalFormat,
142 compressionRatio, (void *) frameBuffer,
143 &compressedBufferSize,
144 (void *) getstringvalue(compressedBuffer))
145 == FAILURE) {
146 DECREF(compressedBuffer);
147 if (!error_handler_called)
148 err_setstr(ClError, "clCompressImage failed");
149 return NULL;
150 }
151
152 if (compressedBufferSize > frameBufferSize) {
153 frameBufferSize = compressedBufferSize;
154 DECREF(compressedBuffer);
155 goto retry;
156 }
157
158 if (compressedBufferSize < frameBufferSize)
159 if (resizestring(&compressedBuffer, compressedBufferSize))
160 return NULL;
161
162 return compressedBuffer;
163}
164
165static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000166cl_DecompressImage(object *self, object *args)
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000167{
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000168 int compressionScheme, width, height, originalFormat;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000169 char *compressedBuffer;
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000170 int compressedBufferSize, frameBufferSize;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000171 object *frameBuffer;
172
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000173 if (!getargs(args, "(iiiis#)", &compressionScheme, &width, &height,
174 &originalFormat, &compressedBuffer,
175 &compressedBufferSize))
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000176 return NULL;
177
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000178 frameBufferSize = width * height * CL_BytesPerPixel(originalFormat);
179
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000180 frameBuffer = newsizedstringobject(NULL, frameBufferSize);
181 if (frameBuffer == NULL)
182 return NULL;
183
184 error_handler_called = 0;
185 if (clDecompressImage(compressionScheme, width, height, originalFormat,
186 compressedBufferSize, compressedBuffer,
187 (void *) getstringvalue(frameBuffer)) == FAILURE) {
188 DECREF(frameBuffer);
189 if (!error_handler_called)
190 err_setstr(ClError, "clDecompressImage failed");
191 return NULL;
192 }
193
194 return frameBuffer;
195}
196
197/********************************************************************
198 Sequential compression/decompression.
199********************************************************************/
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000200#define CheckCompressor(self) if ((self)->ob_compressorHdl == NULL) { \
201 err_setstr(RuntimeError, "(de)compressor not active"); \
202 return NULL; \
203 }
204
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000205static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000206doClose(clobject *self, object *args, int (*close_func)(CL_Handle))
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000207{
208 CheckCompressor(self);
209
210 if (!getnoarg(args))
211 return NULL;
212
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000213 error_handler_called = 0;
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000214 if ((*close_func)(self->ob_compressorHdl) == FAILURE) {
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000215 if (!error_handler_called)
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000216 err_setstr(ClError, "close failed");
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000217 return NULL;
218 }
219
220 self->ob_compressorHdl = NULL;
221
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000222 if (self->ob_paramtypes)
223 DEL(self->ob_paramtypes);
224 self->ob_paramtypes = NULL;
225
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000226 INCREF(None);
227 return None;
228}
229
230static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000231clm_CloseCompressor(object *self, object *args)
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000232{
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000233 return doClose(SELF, args, clCloseCompressor);
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000234}
235
236static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000237clm_CloseDecompressor(object *self, object *args)
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000238{
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000239 return doClose(SELF, args, clCloseDecompressor);
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000240}
241
242static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000243clm_Compress(object *self, object *args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000244{
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000245 int numberOfFrames;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000246 int frameBufferSize, compressedBufferSize, size;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000247 char *frameBuffer;
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000248 object *data;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000249
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000250 CheckCompressor(SELF);
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000251
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000252 if (!getargs(args, "(is#)", &numberOfFrames, &frameBuffer, &frameBufferSize))
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000253 return NULL;
254
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000255 error_handler_called = 0;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000256 size = clGetParam(SELF->ob_compressorHdl, CL_COMPRESSED_BUFFER_SIZE);
257 compressedBufferSize = size;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000258 if (error_handler_called)
259 return NULL;
260
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000261 data = newsizedstringobject(NULL, size);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000262 if (data == NULL)
263 return NULL;
264
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000265 error_handler_called = 0;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000266 if (clCompress(SELF->ob_compressorHdl, numberOfFrames,
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000267 (void *) frameBuffer, &compressedBufferSize,
268 (void *) getstringvalue(data)) == FAILURE) {
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000269 DECREF(data);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000270 if (!error_handler_called)
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000271 err_setstr(ClError, "compress failed");
272 return NULL;
273 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000274
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000275 if (compressedBufferSize < size)
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000276 if (resizestring(&data, compressedBufferSize))
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000277 return NULL;
278
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000279 if (compressedBufferSize > size) {
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000280 /* we didn't get all "compressed" data */
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000281 DECREF(data);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000282 err_setstr(ClError, "compressed data is more than fitted");
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000283 return NULL;
284 }
285
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000286 return data;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000287}
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000288
289static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000290clm_Decompress(object *self, object *args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000291{
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000292 object *data;
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000293 int numberOfFrames;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000294 char *compressedData;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000295 int compressedDataSize, dataSize;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000296
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000297 CheckCompressor(SELF);
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000298
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000299 if (!getargs(args, "(is#)", &numberOfFrames, &compressedData,
300 &compressedDataSize))
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000301 return NULL;
302
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000303 error_handler_called = 0;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000304 dataSize = clGetParam(SELF->ob_compressorHdl, CL_FRAME_BUFFER_SIZE);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000305 if (error_handler_called)
306 return NULL;
307
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000308 data = newsizedstringobject(NULL, dataSize);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000309 if (data == NULL)
310 return NULL;
311
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000312 error_handler_called = 0;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000313 if (clDecompress(SELF->ob_compressorHdl, numberOfFrames,
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000314 compressedDataSize, (void *) compressedData,
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000315 (void *) getstringvalue(data)) == FAILURE) {
316 DECREF(data);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000317 if (!error_handler_called)
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000318 err_setstr(ClError, "decompress failed");
319 return NULL;
320 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000321
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000322 return data;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000323}
324
325static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000326doParams(clobject *self, object *args, int (*func)(CL_Handle, int *, int),
327 int modified)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000328{
329 object *list, *v;
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000330 int *PVbuffer;
331 int length;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000332 int i;
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000333 float number;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000334
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000335 CheckCompressor(self);
336
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000337 if (!getargs(args, "O", &list))
338 return NULL;
339 if (!is_listobject(list)) {
340 err_badarg();
341 return NULL;
342 }
343 length = getlistsize(list);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000344 PVbuffer = NEW(int, length);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000345 if (PVbuffer == NULL)
346 return err_nomem();
347 for (i = 0; i < length; i++) {
348 v = getlistitem(list, i);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000349 if (is_floatobject(v)) {
350 number = getfloatvalue(v);
351 PVbuffer[i] = CL_TypeIsInt(number);
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000352 } else if (is_intobject(v)) {
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000353 PVbuffer[i] = getintvalue(v);
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000354 if ((i & 1) &&
355 param_type_is_float(self, PVbuffer[i-1]) > 0) {
356 number = PVbuffer[i];
357 PVbuffer[i] = CL_TypeIsInt(number);
358 }
359 } else {
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000360 DEL(PVbuffer);
361 err_badarg();
362 return NULL;
363 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000364 }
365
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000366 error_handler_called = 0;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000367 (*func)(self->ob_compressorHdl, PVbuffer, length);
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000368 if (error_handler_called)
369 return NULL;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000370
371 if (modified) {
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000372 for (i = 0; i < length; i++) {
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000373 if ((i & 1) &&
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000374 param_type_is_float(self, PVbuffer[i-1]) > 0) {
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000375 number = CL_TypeIsFloat(PVbuffer[i]);
376 v = newfloatobject(number);
377 } else
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000378 v = newintobject(PVbuffer[i]);
379 setlistitem(list, i, v);
380 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000381 }
382
383 DEL(PVbuffer);
384
385 INCREF(None);
386 return None;
387}
388
389static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000390clm_GetParams(object *self, object *args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000391{
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000392 return doParams(SELF, args, clGetParams, 1);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000393}
394
395static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000396clm_SetParams(object *self, object *args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000397{
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000398 return doParams(SELF, args, clSetParams, 0);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000399}
400
401static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000402do_get(clobject *self, object *args, int (*func)(CL_Handle, int))
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000403{
404 int paramID, value;
405 float fvalue;
406
407 CheckCompressor(self);
408
409 if (!getargs(args, "i", &paramID))
410 return NULL;
411
412 error_handler_called = 0;
413 value = (*func)(self->ob_compressorHdl, paramID);
414 if (error_handler_called)
415 return NULL;
416
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000417 if (param_type_is_float(self, paramID) > 0) {
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000418 fvalue = CL_TypeIsFloat(value);
419 return newfloatobject(fvalue);
420 }
421
422 return newintobject(value);
423}
424
425static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000426clm_GetParam(object *self, object *args)
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000427{
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000428 return do_get(SELF, args, clGetParam);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000429}
430
431static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000432clm_GetDefault(object *self, object *args)
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000433{
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000434 return do_get(SELF, args, clGetDefault);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000435}
436
437static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000438clm_SetParam(object *self, object *args)
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000439{
440 int paramID, value;
441 float fvalue;
442
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000443 CheckCompressor(SELF);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000444
445 if (!getargs(args, "(ii)", &paramID, &value)) {
446 err_clear();
447 if (!getargs(args, "(if)", &paramID, &fvalue)) {
448 err_clear();
449 err_setstr(TypeError, "bad argument list (format '(ii)' or '(if)')");
450 return NULL;
451 }
452 value = CL_TypeIsInt(fvalue);
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000453 } else {
454 if (param_type_is_float(SELF, paramID) > 0) {
455 fvalue = value;
456 value = CL_TypeIsInt(fvalue);
457 }
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000458 }
459
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000460 error_handler_called = 0;
461 value = clSetParam(SELF->ob_compressorHdl, paramID, value);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000462 if (error_handler_called)
463 return NULL;
464
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000465 if (param_type_is_float(SELF, paramID) > 0)
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000466 return newfloatobject(CL_TypeIsFloat(value));
467 else
468 return newintobject(value);
469}
470
471static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000472clm_GetParamID(object *self, object *args)
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000473{
474 char *name;
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000475 int value;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000476
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000477 CheckCompressor(SELF);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000478
479 if (!getargs(args, "s", &name))
480 return NULL;
481
482 error_handler_called = 0;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000483 value = clGetParamID(SELF->ob_compressorHdl, name);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000484 if (value == FAILURE) {
485 if (!error_handler_called)
486 err_setstr(ClError, "getparamid failed");
487 return NULL;
488 }
489
490 return newintobject(value);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000491}
492
493static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000494clm_QueryParams(object *self, object *args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000495{
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000496 int bufferlength;
497 int *PVbuffer;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000498 object *list;
499 int i;
500
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000501 CheckCompressor(SELF);
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000502
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000503 if (!getnoarg(args))
504 return NULL;
505
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000506 error_handler_called = 0;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000507 bufferlength = clQueryParams(SELF->ob_compressorHdl, 0, 0);
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000508 if (error_handler_called)
509 return NULL;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000510
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000511 PVbuffer = NEW(int, bufferlength);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000512 if (PVbuffer == NULL)
513 return err_nomem();
514
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000515 bufferlength = clQueryParams(SELF->ob_compressorHdl, PVbuffer,
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000516 bufferlength);
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000517 if (error_handler_called) {
518 DEL(PVbuffer);
519 return NULL;
520 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000521
522 list = newlistobject(bufferlength);
523 if (list == NULL) {
524 DEL(PVbuffer);
525 return NULL;
526 }
527
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000528 for (i = 0; i < bufferlength; i++) {
529 if (i & 1)
530 setlistitem(list, i, newintobject(PVbuffer[i]));
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000531 else if (PVbuffer[i] == 0) {
532 INCREF(None);
533 setlistitem(list, i, None);
534 } else
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000535 setlistitem(list, i, newstringobject((char *) PVbuffer[i]));
536 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000537
538 DEL(PVbuffer);
539
540 return list;
541}
542
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000543static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000544clm_GetMinMax(object *self, object *args)
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000545{
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000546 int param, min, max;
547 float fmin, fmax;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000548
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000549 CheckCompressor(SELF);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000550
551 if (!getargs(args, "i", &param))
552 return NULL;
553
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000554 clGetMinMax(SELF->ob_compressorHdl, param, &min, &max);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000555
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000556 if (param_type_is_float(SELF, param) > 0) {
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000557 fmin = CL_TypeIsFloat(min);
558 fmax = CL_TypeIsFloat(max);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000559 return mkvalue("(ff)", fmin, fmax);
560 }
561
562 return mkvalue("(ii)", min, max);
563}
564
565static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000566clm_GetName(object *self, object *args)
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000567{
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000568 int param;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000569 char *name;
570
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000571 CheckCompressor(SELF);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000572
573 if (!getargs(args, "i", &param))
574 return NULL;
575
576 error_handler_called = 0;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000577 name = clGetName(SELF->ob_compressorHdl, param);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000578 if (name == NULL || error_handler_called) {
579 if (!error_handler_called)
580 err_setstr(ClError, "getname failed");
581 return NULL;
582 }
583
584 return newstringobject(name);
585}
586
587static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000588clm_QuerySchemeFromHandle(object *self, object *args)
589{
590 CheckCompressor(SELF);
591
592 if (!getnoarg(args))
593 return NULL;
594
595 return newintobject(clQuerySchemeFromHandle(SELF->ob_compressorHdl));
596}
597
598static object *
599clm_ReadHeader(object *self, object *args)
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000600{
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000601 char *header;
602 int headerSize;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000603
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000604 CheckCompressor(SELF);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000605
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000606 if (!getargs(args, "s#", &header, &headerSize))
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000607 return NULL;
608
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000609 return newintobject(clReadHeader(SELF->ob_compressorHdl,
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000610 headerSize, header));
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000611}
612
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000613static struct methodlist compressor_methods[] = {
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000614 {"close", clm_CloseCompressor}, /* alias */
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000615 {"CloseCompressor", clm_CloseCompressor},
616 {"Compress", clm_Compress},
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000617 {"GetDefault", clm_GetDefault},
618 {"GetMinMax", clm_GetMinMax},
619 {"GetName", clm_GetName},
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000620 {"GetParam", clm_GetParam},
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000621 {"GetParamID", clm_GetParamID},
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000622 {"GetParams", clm_GetParams},
623 {"QueryParams", clm_QueryParams},
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000624 {"QuerySchemeFromHandle",clm_QuerySchemeFromHandle},
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000625 {"SetParam", clm_SetParam},
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000626 {"SetParams", clm_SetParams},
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000627 {NULL, NULL} /* sentinel */
628};
629
630static struct methodlist decompressor_methods[] = {
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000631 {"close", clm_CloseDecompressor}, /* alias */
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000632 {"CloseDecompressor", clm_CloseDecompressor},
633 {"Decompress", clm_Decompress},
634 {"GetDefault", clm_GetDefault},
635 {"GetMinMax", clm_GetMinMax},
636 {"GetName", clm_GetName},
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000637 {"GetParam", clm_GetParam},
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000638 {"GetParamID", clm_GetParamID},
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000639 {"GetParams", clm_GetParams},
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000640 {"ReadHeader", clm_ReadHeader},
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000641 {"QueryParams", clm_QueryParams},
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000642 {"QuerySchemeFromHandle",clm_QuerySchemeFromHandle},
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000643 {"SetParam", clm_SetParam},
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000644 {"SetParams", clm_SetParams},
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000645 {NULL, NULL} /* sentinel */
646};
647
648static void
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000649cl_dealloc(object *self)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000650{
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000651 if (SELF->ob_compressorHdl) {
652 if (SELF->ob_isCompressor)
653 clCloseCompressor(SELF->ob_compressorHdl);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000654 else
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000655 clCloseDecompressor(SELF->ob_compressorHdl);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000656 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000657 DEL(self);
658}
659
660static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000661cl_getattr(object *self, char *name)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000662{
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000663 if (SELF->ob_isCompressor)
664 return findmethod(compressor_methods, self, name);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000665 else
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000666 return findmethod(decompressor_methods, self, name);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000667}
668
669static typeobject Cltype = {
670 OB_HEAD_INIT(&Typetype)
671 0, /*ob_size*/
672 "cl", /*tp_name*/
673 sizeof(clobject), /*tp_size*/
674 0, /*tp_itemsize*/
675 /* methods */
676 cl_dealloc, /*tp_dealloc*/
677 0, /*tp_print*/
678 cl_getattr, /*tp_getattr*/
679 0, /*tp_setattr*/
680 0, /*tp_compare*/
681 0, /*tp_repr*/
682 0, /*tp_as_number*/
683 0, /*tp_as_sequence*/
684 0, /*tp_as_mapping*/
685};
686
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000687static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000688doOpen(object *self, object *args, int (*open_func)(int, CL_Handle *),
689 int iscompressor)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000690{
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000691 int scheme;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000692 clobject *new;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000693
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000694 if (!getargs(args, "i", &scheme))
695 return NULL;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000696
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000697 new = NEWOBJ(clobject, &Cltype);
698 if (new == NULL)
699 return NULL;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000700
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000701 new->ob_compressorHdl = NULL;
702 new->ob_isCompressor = iscompressor;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000703 new->ob_paramtypes = NULL;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000704
705 error_handler_called = 0;
706 if ((*open_func)(scheme, &new->ob_compressorHdl) == FAILURE) {
707 DECREF(new);
708 if (!error_handler_called)
709 err_setstr(ClError, "Open(De)Compressor failed");
710 return NULL;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000711 }
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000712 return new;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000713}
714
715static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000716cl_OpenCompressor(object *self, object *args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000717{
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000718 return doOpen(self, args, clOpenCompressor, 1);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000719}
720
721static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000722cl_OpenDecompressor(object *self, object *args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000723{
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000724 return doOpen(self, args, clOpenDecompressor, 0);
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000725}
726
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000727static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000728cl_QueryScheme(object *self, object *args)
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000729{
730 char *header;
731 int headerlen;
732 int scheme;
733
734 if (!getargs(args, "s#", &header, &headerlen))
735 return NULL;
736
737 scheme = clQueryScheme(header);
738 if (scheme < 0) {
739 err_setstr(ClError, "unknown compression scheme");
740 return NULL;
741 }
742
743 return newintobject(scheme);
744}
745
746static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000747cl_QueryMaxHeaderSize(object *self, object *args)
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000748{
749 int scheme;
750
751 if (!getargs(args, "i", &scheme))
752 return NULL;
753
754 return newintobject(clQueryMaxHeaderSize(scheme));
755}
756
757static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000758cl_QueryAlgorithms(object *self, object *args)
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000759{
760 int algorithmMediaType;
761 int bufferlength;
762 int *PVbuffer;
763 object *list;
764 int i;
765
766 if (!getargs(args, "i", &algorithmMediaType))
767 return NULL;
768
769 error_handler_called = 0;
770 bufferlength = clQueryAlgorithms(algorithmMediaType, 0, 0);
771 if (error_handler_called)
772 return NULL;
773
774 PVbuffer = NEW(int, bufferlength);
775 if (PVbuffer == NULL)
776 return err_nomem();
777
778 bufferlength = clQueryAlgorithms(algorithmMediaType, PVbuffer,
779 bufferlength);
780 if (error_handler_called) {
781 DEL(PVbuffer);
782 return NULL;
783 }
784
785 list = newlistobject(bufferlength);
786 if (list == NULL) {
787 DEL(PVbuffer);
788 return NULL;
789 }
790
791 for (i = 0; i < bufferlength; i++) {
792 if (i & 1)
793 setlistitem(list, i, newintobject(PVbuffer[i]));
794 else if (PVbuffer[i] == 0) {
795 INCREF(None);
796 setlistitem(list, i, None);
797 } else
798 setlistitem(list, i, newstringobject((char *) PVbuffer[i]));
799 }
800
801 DEL(PVbuffer);
802
803 return list;
804}
805
806static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000807cl_QuerySchemeFromName(object *self, object *args)
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000808{
809 int algorithmMediaType;
810 char *name;
811 int scheme;
812
813 if (!getargs(args, "(is)", &algorithmMediaType, &name))
814 return NULL;
815
816 error_handler_called = 0;
817 scheme = clQuerySchemeFromName(algorithmMediaType, name);
818 if (error_handler_called) {
819 err_setstr(ClError, "unknown compression scheme");
820 return NULL;
821 }
822
823 return newintobject(scheme);
824}
825
826static object *
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000827cl_GetAlgorithmName(object *self, object *args)
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000828{
829 int scheme;
830 char *name;
831
832 if (!getargs(args, "i", &scheme))
833 return NULL;
834
835 name = clGetAlgorithmName(scheme);
836 if (name == 0) {
837 err_setstr(ClError, "unknown compression scheme");
838 return NULL;
839 }
840
841 return newstringobject(name);
842}
843
Sjoerd Mullender22e44cd1993-02-17 09:11:14 +0000844static object *
845do_set(object *self, object *args, int (*func)(int, int, int))
846{
847 int scheme, paramID, value;
848 float fvalue;
849 int is_float = 0;
850
851 if (!getargs(args, "(iii)", &scheme, &paramID, &value)) {
852 err_clear();
853 if (!getargs(args, "(iif)", &scheme, &paramID, &fvalue)) {
854 err_clear();
855 err_setstr(TypeError, "bad argument list (format '(iii)' or '(iif)')");
856 return NULL;
857 }
858 value = CL_TypeIsInt(fvalue);
859 is_float = 1;
860 } else {
861 /* check some parameters which we know to be floats */
862 switch (scheme) {
863 case CL_COMPRESSION_RATIO:
864 case CL_SPEED:
865 fvalue = value;
866 value = CL_TypeIsInt(fvalue);
867 is_float = 1;
868 break;
869 }
870 }
871
872 error_handler_called = 0;
873 value = (*func)(scheme, paramID, value);
874 if (error_handler_called)
875 return NULL;
876
877 if (is_float)
878 return newfloatobject(CL_TypeIsFloat(value));
879 else
880 return newintobject(value);
881}
882
883static object *
884cl_SetDefault(object *self, object *args)
885{
886 return do_set(self, args, clSetDefault);
887}
888
889static object *
890cl_SetMin(object *self, object *args)
891{
892 return do_set(self, args, clSetMin);
893}
894
895static object *
896cl_SetMax(object *self, object *args)
897{
898 return do_set(self, args, clSetMax);
899}
900
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000901#ifdef CLDEBUG
902static object *
903cvt_type(object *self, object *args)
904{
905 int number;
906 float fnumber;
907
908 if (getargs(args, "i", &number))
909 return newfloatobject(CL_TypeIsFloat(number));
910 else {
911 err_clear();
912 if (getargs(args, "f", &fnumber))
913 return newintobject(CL_TypeIsInt(fnumber));
914 return NULL;
915 }
916}
917#endif
918
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000919static struct methodlist cl_methods[] = {
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000920 {"CompressImage", cl_CompressImage},
921 {"DecompressImage", cl_DecompressImage},
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000922 {"GetAlgorithmName", cl_GetAlgorithmName},
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000923 {"OpenCompressor", cl_OpenCompressor},
924 {"OpenDecompressor", cl_OpenDecompressor},
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000925 {"QueryAlgorithms", cl_QueryAlgorithms},
926 {"QueryMaxHeaderSize", cl_QueryMaxHeaderSize},
927 {"QueryScheme", cl_QueryScheme},
928 {"QuerySchemeFromName", cl_QuerySchemeFromName},
Sjoerd Mullender22e44cd1993-02-17 09:11:14 +0000929 {"SetDefault", cl_SetDefault},
930 {"SetMax", cl_SetMax},
931 {"SetMin", cl_SetMin},
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000932#ifdef CLDEBUG
933 {"cvt_type", cvt_type},
934#endif
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000935 {NULL, NULL} /* Sentinel */
936};
937
938void
939initcl()
940{
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000941 object *m, *d;
942
943 m = initmodule("cl", cl_methods);
944 d = getmoduledict(m);
945
946 ClError = newstringobject("cl.error");
947 if (ClError == NULL || dictinsert(d, "error", ClError) != 0)
948 fatal("can't define cl.error");
949
950 (void) clSetErrorHandler(cl_ErrorHandler);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000951}