source: libcaca/trunk/caca-php/php_caca.c @ 3127

Last change on this file since 3127 was 3127, checked in by nico, 11 years ago
  • Add php binding for functions: caca_file_write, caca_file_read
File size: 51.6 KB
Line 
1/*
2 *  php-caca      Php binding for Libcaca
3 *  Copyright (c) 2008 Vion Nicolas <nico@picapo.net>
4 *
5 *
6 *  This library is free software. It comes without any warranty, to
7 *  the extent permitted by applicable law. You can redistribute it
8 *  and/or modify it under the terms of the Do What The Fuck You Want
9 *  To Public License, Version 2, as published by Sam Hocevar. See
10 *  http://sam.zoy.org/wtfpl/COPYING for more details.
11 */
12
13#ifdef HAVE_CONFIG_H
14#include "config.h"
15#endif
16
17#include "php.h"
18#include "php_caca.h"
19#include <gd.h>
20
21static function_entry caca_functions[] = {
22        PHP_FE(caca_create_event, NULL)
23        PHP_FE(caca_create_canvas, NULL)
24        PHP_FE(caca_set_canvas_size, NULL)
25        PHP_FE(caca_get_canvas_width, NULL)
26        PHP_FE(caca_get_canvas_height, NULL)
27        PHP_FE(caca_get_canvas_chars, NULL)
28        PHP_FE(caca_get_canvas_attrs, NULL)
29        PHP_FE(caca_rand, NULL)
30        PHP_FE(caca_get_version, NULL)
31        PHP_FE(caca_gotoxy, NULL)
32        PHP_FE(caca_get_cursor_x, NULL)
33        PHP_FE(caca_get_cursor_y, NULL)
34        PHP_FE(caca_put_char, NULL)
35        PHP_FE(caca_get_char, NULL)
36        PHP_FE(caca_put_str, NULL)
37        PHP_FE(caca_clear_canvas, NULL)
38        PHP_FE(caca_set_canvas_handle, NULL)
39        PHP_FE(caca_get_canvas_handle_x, NULL)
40        PHP_FE(caca_get_canvas_handle_y, NULL)
41        PHP_FE(caca_blit, NULL)
42        PHP_FE(caca_set_canvas_boundaries, NULL)
43        PHP_FE(caca_invert, NULL)
44        PHP_FE(caca_flip, NULL)
45        PHP_FE(caca_flop, NULL)
46        PHP_FE(caca_rotate_180, NULL)
47        PHP_FE(caca_rotate_left, NULL)
48        PHP_FE(caca_rotate_right, NULL)
49        PHP_FE(caca_stretch_left, NULL)
50        PHP_FE(caca_stretch_right, NULL)
51        PHP_FE(caca_get_attr, NULL)
52        PHP_FE(caca_set_attr, NULL)
53        PHP_FE(caca_put_attr, NULL)
54        PHP_FE(caca_set_color_ansi, NULL)
55        PHP_FE(caca_set_color_argb, NULL)
56        PHP_FE(caca_attr_to_ansi, NULL)
57        PHP_FE(caca_attr_to_ansi_fg, NULL)
58        PHP_FE(caca_attr_to_ansi_bg, NULL)
59        PHP_FE(caca_attr_to_rgb12_fg, NULL)
60        PHP_FE(caca_attr_to_rgb12_bg, NULL)
61        PHP_FE(caca_attr_to_argb64, NULL)
62        PHP_FE(caca_utf8_to_utf32, NULL)
63        PHP_FE(caca_utf32_to_utf8, NULL)
64        PHP_FE(caca_utf32_to_cp437, NULL)
65        PHP_FE(caca_cp437_to_utf32, NULL)
66        PHP_FE(caca_utf32_to_ascii, NULL)
67        PHP_FE(caca_utf32_is_fullwidth, NULL)
68        PHP_FE(caca_draw_line, NULL)
69        PHP_FE(caca_draw_polyline, NULL)
70        PHP_FE(caca_draw_thin_line, NULL)
71        PHP_FE(caca_draw_thin_polyline, NULL)
72        PHP_FE(caca_draw_circle, NULL)
73        PHP_FE(caca_draw_ellipse, NULL)
74        PHP_FE(caca_draw_thin_ellipse, NULL)
75        PHP_FE(caca_fill_ellipse, NULL)
76        PHP_FE(caca_draw_box, NULL)
77        PHP_FE(caca_draw_thin_box, NULL)
78        PHP_FE(caca_draw_cp437_box, NULL)
79        PHP_FE(caca_fill_box, NULL)
80        PHP_FE(caca_draw_triangle, NULL)
81        PHP_FE(caca_draw_thin_triangle, NULL)
82        PHP_FE(caca_fill_triangle, NULL)
83        PHP_FE(caca_get_frame_count, NULL)
84        PHP_FE(caca_set_frame, NULL)
85        PHP_FE(caca_set_frame_name, NULL)
86        PHP_FE(caca_create_frame, NULL)
87        PHP_FE(caca_free_frame, NULL)
88        PHP_FE(caca_create_dither, NULL)
89        PHP_FE(caca_create_dither_gd, NULL)
90        PHP_FE(caca_set_dither_palette, NULL)
91        PHP_FE(caca_set_dither_brightness, NULL)
92        PHP_FE(caca_get_dither_brightness, NULL)
93        PHP_FE(caca_set_dither_gamma, NULL)
94        PHP_FE(caca_get_dither_gamma, NULL)
95        PHP_FE(caca_set_dither_contrast, NULL)
96        PHP_FE(caca_get_dither_contrast, NULL)
97        PHP_FE(caca_set_dither_antialias, NULL)
98        PHP_FE(caca_get_dither_antialias_list, NULL)
99        PHP_FE(caca_get_dither_antialias, NULL)
100        PHP_FE(caca_set_dither_color, NULL)
101        PHP_FE(caca_get_dither_color_list, NULL)
102        PHP_FE(caca_get_dither_color, NULL)
103        PHP_FE(caca_set_dither_charset, NULL)
104        PHP_FE(caca_get_dither_charset_list, NULL)
105        PHP_FE(caca_get_dither_charset, NULL)
106        PHP_FE(caca_set_dither_algorithm, NULL)
107        PHP_FE(caca_get_dither_algorithm_list, NULL)
108        PHP_FE(caca_get_dither_algorithm, NULL)
109        PHP_FE(caca_dither_bitmap_gd, NULL)
110        PHP_FE(caca_load_font, NULL)
111        PHP_FE(caca_get_font_list, NULL)
112        PHP_FE(caca_get_font_width, NULL)
113        PHP_FE(caca_get_font_height, NULL)
114        PHP_FE(caca_get_font_bloc, NULL)
115        PHP_FE(caca_render_canvas, NULL)
116        PHP_FE(caca_canvas_set_figfont, NULL)
117        PHP_FE(caca_put_figchar, NULL)
118        PHP_FE(caca_flush_figlet, NULL)
119        PHP_FE(caca_file_open, NULL)
120        PHP_FE(caca_file_close, NULL)
121        PHP_FE(caca_file_tell, NULL)
122        PHP_FE(caca_file_read, NULL)
123        PHP_FE(caca_file_write, NULL)
124        PHP_FE(caca_file_gets, NULL)
125        PHP_FE(caca_file_eof, NULL)
126        PHP_FE(caca_import_string, NULL)
127        PHP_FE(caca_import_file, NULL)
128        PHP_FE(caca_get_import_list, NULL)
129        PHP_FE(caca_export_string, NULL)
130        PHP_FE(caca_get_export_list, NULL)
131        PHP_FE(caca_create_display, NULL)
132        PHP_FE(caca_create_display_with_driver, NULL)
133        PHP_FE(caca_get_display_driver_list, NULL)
134        PHP_FE(caca_get_display_driver, NULL)
135        PHP_FE(caca_set_display_driver, NULL)
136        PHP_FE(caca_get_canvas, NULL)
137        PHP_FE(caca_refresh_display, NULL)
138        PHP_FE(caca_set_display_time, NULL)
139        PHP_FE(caca_get_display_time, NULL)
140        PHP_FE(caca_get_display_width, NULL)
141        PHP_FE(caca_get_display_height, NULL)
142        PHP_FE(caca_set_display_title, NULL)
143        PHP_FE(caca_set_mouse, NULL)
144        PHP_FE(caca_set_cursor, NULL)
145        PHP_FE(caca_get_event, NULL)
146        PHP_FE(caca_get_mouse_x, NULL)
147        PHP_FE(caca_get_mouse_y, NULL)
148        PHP_FE(caca_get_event_type, NULL)
149        PHP_FE(caca_get_event_key_ch, NULL)
150        PHP_FE(caca_get_event_mouse_button, NULL)
151        PHP_FE(caca_get_event_mouse_x, NULL)
152        PHP_FE(caca_get_event_mouse_y, NULL)
153        PHP_FE(caca_get_event_resize_width, NULL)
154        PHP_FE(caca_get_event_resize_height, NULL)
155
156        {NULL, NULL, NULL}
157};
158
159zend_module_entry caca_module_entry = {
160#if ZEND_MODULE_API_NO >= 20010901
161        STANDARD_MODULE_HEADER,
162#endif
163        PHP_CACA_EXTNAME,
164        caca_functions,
165        PHP_MINIT(caca),
166        NULL,
167        NULL,
168        NULL,
169        PHP_MINFO(caca),
170#if ZEND_MODULE_API_NO >= 20010901
171        PHP_CACA_VERSION,
172#endif
173        STANDARD_MODULE_PROPERTIES
174};
175
176#ifdef COMPILE_DL_CACA
177ZEND_GET_MODULE(caca)
178#endif
179
180PHP_MINFO_FUNCTION(caca) {
181        php_info_print_table_start();
182        php_info_print_table_row(2, "Caca library version", caca_get_version());
183        php_info_print_table_end();
184}
185
186//-------- Caca's ressources destructors -----------//
187
188static void php_caca_canvas_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
189        caca_free_canvas(rsrc->ptr);
190}
191
192static void php_caca_dither_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
193        caca_free_dither(rsrc->ptr);
194}
195
196static void php_caca_font_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
197        caca_free_font(rsrc->ptr);
198}
199
200static void php_caca_file_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
201}
202
203static void php_caca_display_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
204        caca_free_display(rsrc->ptr);
205}
206
207static void php_caca_event_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
208        efree((caca_event_t *) rsrc->ptr);
209}
210
211//-------- Initialization ---------//
212
213PHP_MINIT_FUNCTION(caca) {
214
215        le_caca_canvas = zend_register_list_destructors_ex(php_caca_canvas_dtor, NULL, PHP_CACA_CANVAS_RES_NAME, module_number);
216        le_caca_dither = zend_register_list_destructors_ex(php_caca_dither_dtor, NULL, PHP_CACA_DITHER_RES_NAME, module_number);
217        le_caca_font = zend_register_list_destructors_ex(php_caca_font_dtor, NULL, PHP_CACA_FONT_RES_NAME, module_number);
218        le_caca_file = zend_register_list_destructors_ex(php_caca_file_dtor, NULL, PHP_CACA_FILE_RES_NAME, module_number);
219        le_caca_display = zend_register_list_destructors_ex(php_caca_display_dtor, NULL, PHP_CACA_DISPLAY_RES_NAME, module_number);
220        le_caca_event = zend_register_list_destructors_ex(php_caca_event_dtor, NULL, PHP_CACA_EVENT_RES_NAME, module_number);
221       
222        REGISTER_LONG_CONSTANT("CACA_BLACK", CACA_BLACK, CONST_CS | CONST_PERSISTENT);
223        REGISTER_LONG_CONSTANT("CACA_BLUE", CACA_BLUE, CONST_CS | CONST_PERSISTENT);
224        REGISTER_LONG_CONSTANT("CACA_GREEN", CACA_GREEN, CONST_CS | CONST_PERSISTENT);
225        REGISTER_LONG_CONSTANT("CACA_CYAN", CACA_CYAN, CONST_CS | CONST_PERSISTENT);
226        REGISTER_LONG_CONSTANT("CACA_RED", CACA_RED, CONST_CS | CONST_PERSISTENT);
227        REGISTER_LONG_CONSTANT("CACA_MAGENTA", CACA_MAGENTA, CONST_CS | CONST_PERSISTENT);
228        REGISTER_LONG_CONSTANT("CACA_BROWN", CACA_BROWN, CONST_CS | CONST_PERSISTENT);
229        REGISTER_LONG_CONSTANT("CACA_LIGHTGRAY", CACA_LIGHTGRAY, CONST_CS | CONST_PERSISTENT);
230        REGISTER_LONG_CONSTANT("CACA_DARKGRAY", CACA_DARKGRAY, CONST_CS | CONST_PERSISTENT);
231        REGISTER_LONG_CONSTANT("CACA_LIGHTBLUE", CACA_LIGHTBLUE, CONST_CS | CONST_PERSISTENT);
232        REGISTER_LONG_CONSTANT("CACA_LIGHTGREEN", CACA_LIGHTGREEN, CONST_CS | CONST_PERSISTENT);
233        REGISTER_LONG_CONSTANT("CACA_LIGHTCYAN", CACA_LIGHTCYAN, CONST_CS | CONST_PERSISTENT);
234        REGISTER_LONG_CONSTANT("CACA_LIGHTRED", CACA_LIGHTRED, CONST_CS | CONST_PERSISTENT);
235        REGISTER_LONG_CONSTANT("CACA_LIGHTMAGENTA", CACA_LIGHTMAGENTA, CONST_CS | CONST_PERSISTENT);
236        REGISTER_LONG_CONSTANT("CACA_YELLOW", CACA_YELLOW, CONST_CS | CONST_PERSISTENT);
237        REGISTER_LONG_CONSTANT("CACA_WHITE", CACA_WHITE, CONST_CS | CONST_PERSISTENT);
238        REGISTER_LONG_CONSTANT("CACA_DEFAULT", CACA_DEFAULT, CONST_CS | CONST_PERSISTENT);
239        REGISTER_LONG_CONSTANT("CACA_TRANSPARENT", CACA_TRANSPARENT, CONST_CS | CONST_PERSISTENT);
240        REGISTER_LONG_CONSTANT("CACA_BOLD", CACA_BOLD, CONST_CS | CONST_PERSISTENT);
241        REGISTER_LONG_CONSTANT("CACA_ITALICS", CACA_ITALICS, CONST_CS | CONST_PERSISTENT);
242        REGISTER_LONG_CONSTANT("CACA_UNDERLINE", CACA_UNDERLINE, CONST_CS | CONST_PERSISTENT);
243        REGISTER_LONG_CONSTANT("CACA_BLINK", CACA_BLINK, CONST_CS | CONST_PERSISTENT);
244
245        REGISTER_LONG_CONSTANT("CACA_EVENT_NONE", CACA_EVENT_NONE, CONST_CS | CONST_PERSISTENT);
246        REGISTER_LONG_CONSTANT("CACA_EVENT_KEY_PRESS", CACA_EVENT_KEY_PRESS, CONST_CS | CONST_PERSISTENT);
247        REGISTER_LONG_CONSTANT("CACA_EVENT_KEY_RELEASE", CACA_EVENT_KEY_RELEASE, CONST_CS | CONST_PERSISTENT);
248        REGISTER_LONG_CONSTANT("CACA_EVENT_MOUSE_PRESS", CACA_EVENT_MOUSE_PRESS, CONST_CS | CONST_PERSISTENT);
249        REGISTER_LONG_CONSTANT("CACA_EVENT_MOUSE_RELEASE", CACA_EVENT_MOUSE_RELEASE, CONST_CS | CONST_PERSISTENT);
250        REGISTER_LONG_CONSTANT("CACA_EVENT_MOUSE_MOTION", CACA_EVENT_MOUSE_MOTION, CONST_CS | CONST_PERSISTENT);
251        REGISTER_LONG_CONSTANT("CACA_EVENT_RESIZE", CACA_EVENT_RESIZE, CONST_CS | CONST_PERSISTENT);
252        REGISTER_LONG_CONSTANT("CACA_EVENT_QUIT", CACA_EVENT_QUIT, CONST_CS | CONST_PERSISTENT);
253        REGISTER_LONG_CONSTANT("CACA_EVENT_ANY", CACA_EVENT_ANY, CONST_CS | CONST_PERSISTENT);
254
255        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_A", CACA_KEY_CTRL_A, CONST_CS | CONST_PERSISTENT);
256        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_B", CACA_KEY_CTRL_B, CONST_CS | CONST_PERSISTENT);
257        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_C", CACA_KEY_CTRL_C, CONST_CS | CONST_PERSISTENT);
258        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_D", CACA_KEY_CTRL_D, CONST_CS | CONST_PERSISTENT);
259        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_E", CACA_KEY_CTRL_E, CONST_CS | CONST_PERSISTENT);
260        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_F", CACA_KEY_CTRL_F, CONST_CS | CONST_PERSISTENT);
261        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_G", CACA_KEY_CTRL_G, CONST_CS | CONST_PERSISTENT);
262        REGISTER_LONG_CONSTANT("CACA_KEY_BACKSPACE", CACA_KEY_BACKSPACE, CONST_CS | CONST_PERSISTENT);
263        REGISTER_LONG_CONSTANT("CACA_KEY_TAB", CACA_KEY_TAB, CONST_CS | CONST_PERSISTENT);
264        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_J", CACA_KEY_CTRL_J, CONST_CS | CONST_PERSISTENT);
265        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_K", CACA_KEY_CTRL_K, CONST_CS | CONST_PERSISTENT);
266        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_L", CACA_KEY_CTRL_L, CONST_CS | CONST_PERSISTENT);
267        REGISTER_LONG_CONSTANT("CACA_KEY_RETURN", CACA_KEY_RETURN, CONST_CS | CONST_PERSISTENT);
268        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_N", CACA_KEY_CTRL_N, CONST_CS | CONST_PERSISTENT);
269        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_O", CACA_KEY_CTRL_O, CONST_CS | CONST_PERSISTENT);
270        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_P", CACA_KEY_CTRL_P, CONST_CS | CONST_PERSISTENT);
271        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_Q", CACA_KEY_CTRL_Q, CONST_CS | CONST_PERSISTENT);
272        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_R", CACA_KEY_CTRL_R, CONST_CS | CONST_PERSISTENT);
273        REGISTER_LONG_CONSTANT("CACA_KEY_PAUSE", CACA_KEY_PAUSE, CONST_CS | CONST_PERSISTENT);
274        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_T", CACA_KEY_CTRL_T, CONST_CS | CONST_PERSISTENT);
275        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_U", CACA_KEY_CTRL_U, CONST_CS | CONST_PERSISTENT);
276        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_V", CACA_KEY_CTRL_V, CONST_CS | CONST_PERSISTENT);
277        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_W", CACA_KEY_CTRL_W, CONST_CS | CONST_PERSISTENT);
278        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_X", CACA_KEY_CTRL_X, CONST_CS | CONST_PERSISTENT);
279        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_Y", CACA_KEY_CTRL_Y, CONST_CS | CONST_PERSISTENT);
280        REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_Z", CACA_KEY_CTRL_Z, CONST_CS | CONST_PERSISTENT);
281        REGISTER_LONG_CONSTANT("CACA_KEY_ESCAPE", CACA_KEY_ESCAPE, CONST_CS | CONST_PERSISTENT);
282        REGISTER_LONG_CONSTANT("CACA_KEY_DELETE", CACA_KEY_DELETE, CONST_CS | CONST_PERSISTENT);
283        REGISTER_LONG_CONSTANT("CACA_KEY_UP", CACA_KEY_UP, CONST_CS | CONST_PERSISTENT);
284        REGISTER_LONG_CONSTANT("CACA_KEY_DOWN", CACA_KEY_DOWN, CONST_CS | CONST_PERSISTENT);
285        REGISTER_LONG_CONSTANT("CACA_KEY_LEFT", CACA_KEY_LEFT, CONST_CS | CONST_PERSISTENT);
286        REGISTER_LONG_CONSTANT("CACA_KEY_RIGHT", CACA_KEY_RIGHT, CONST_CS | CONST_PERSISTENT);
287        REGISTER_LONG_CONSTANT("CACA_KEY_INSERT", CACA_KEY_INSERT, CONST_CS | CONST_PERSISTENT);
288        REGISTER_LONG_CONSTANT("CACA_KEY_HOME", CACA_KEY_HOME, CONST_CS | CONST_PERSISTENT);
289        REGISTER_LONG_CONSTANT("CACA_KEY_END", CACA_KEY_END, CONST_CS | CONST_PERSISTENT);
290        REGISTER_LONG_CONSTANT("CACA_KEY_PAGEUP", CACA_KEY_PAGEUP, CONST_CS | CONST_PERSISTENT);
291        REGISTER_LONG_CONSTANT("CACA_KEY_PAGEDOWN", CACA_KEY_PAGEDOWN, CONST_CS | CONST_PERSISTENT);
292        REGISTER_LONG_CONSTANT("CACA_KEY_F1", CACA_KEY_F1, CONST_CS | CONST_PERSISTENT);
293        REGISTER_LONG_CONSTANT("CACA_KEY_F2", CACA_KEY_F2, CONST_CS | CONST_PERSISTENT);
294        REGISTER_LONG_CONSTANT("CACA_KEY_F3", CACA_KEY_F3, CONST_CS | CONST_PERSISTENT);
295        REGISTER_LONG_CONSTANT("CACA_KEY_F4", CACA_KEY_F4, CONST_CS | CONST_PERSISTENT);
296        REGISTER_LONG_CONSTANT("CACA_KEY_F5", CACA_KEY_F5, CONST_CS | CONST_PERSISTENT);
297        REGISTER_LONG_CONSTANT("CACA_KEY_F6", CACA_KEY_F6, CONST_CS | CONST_PERSISTENT);
298        REGISTER_LONG_CONSTANT("CACA_KEY_F7", CACA_KEY_F7, CONST_CS | CONST_PERSISTENT);
299        REGISTER_LONG_CONSTANT("CACA_KEY_F8", CACA_KEY_F8, CONST_CS | CONST_PERSISTENT);
300        REGISTER_LONG_CONSTANT("CACA_KEY_F9", CACA_KEY_F9, CONST_CS | CONST_PERSISTENT);
301        REGISTER_LONG_CONSTANT("CACA_KEY_F10", CACA_KEY_F10, CONST_CS | CONST_PERSISTENT);
302        REGISTER_LONG_CONSTANT("CACA_KEY_F11", CACA_KEY_F11, CONST_CS | CONST_PERSISTENT);
303        REGISTER_LONG_CONSTANT("CACA_KEY_F12", CACA_KEY_F12, CONST_CS | CONST_PERSISTENT);
304        REGISTER_LONG_CONSTANT("CACA_KEY_F13", CACA_KEY_F13, CONST_CS | CONST_PERSISTENT);
305        REGISTER_LONG_CONSTANT("CACA_KEY_F14", CACA_KEY_F14, CONST_CS | CONST_PERSISTENT);
306        REGISTER_LONG_CONSTANT("CACA_KEY_F15", CACA_KEY_F15, CONST_CS | CONST_PERSISTENT);
307
308        return SUCCESS;
309}
310
311//---------- Some usefull macros ---------------//
312
313#define FETCH_CANVAS(canvas) \
314        zval *_zval; \
315        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) { \
316                RETURN_FALSE; \
317        } \
318        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
319
320#define FETCH_DISPLAY(display) \
321        zval *_zval; \
322        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) { \
323                RETURN_FALSE; \
324        } \
325        ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
326
327#define FETCH_EVENT(event) \
328        zval *_zval; \
329        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) { \
330                RETURN_FALSE; \
331        } \
332        ZEND_FETCH_RESOURCE(event, caca_event_t*, &_zval, -1, PHP_CACA_EVENT_RES_NAME, le_caca_event);
333
334#define FETCH_LONG(l) \
335        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &l) == FAILURE) { \
336                RETURN_FALSE; \
337        }
338
339#define RETURN_CHAR(c) \
340        char *str = emalloc(2); \
341        str[0] = c; \
342        str[1] = '\0'; \
343        RETURN_STRING(str, 0);
344
345#define RETURN_SUCCESS(i) \
346        RETURN_BOOL((i) == 0);
347
348//---------- Some usefull functions --------------------//
349
350//Fetch external php resources such as gd resouces
351
352void *fetch_external_resource(zval *_zval, char const *type_name) {
353        int resource_id = _zval->value.lval;
354        int resource_type;
355        void *result = zend_list_find(resource_id, &resource_type);
356        if (!result)
357                return NULL;
358        char *resource_type_name = zend_rsrc_list_get_rsrc_type(resource_id);
359        return (strcmp(resource_type_name, type_name) == 0) ? result : NULL;
360}
361
362//Fetch buffer of pixels from gdImage
363
364void *gd_get_pixels(gdImage *img) {
365        if (!img->trueColor)
366                return NULL;
367
368        int line_size = img->sx * sizeof(int);
369        void *result = malloc(img->sy * line_size);
370        int j;         
371        for (j = 0; j < img->sy; j++)
372                memcpy(result + (j * line_size), (const void *) img->tpixels[j], line_size);
373        return result;
374}
375
376//------- PHP Binding's specific functions ----------//
377
378PHP_FUNCTION(caca_create_event) {
379        caca_event_t *event;
380        event = emalloc(sizeof(caca_event_t));
381        ZEND_REGISTER_RESOURCE(return_value, event, le_caca_event);
382}
383
384//------- Caca's functions ----------------//
385
386PHP_FUNCTION(caca_create_canvas) {
387        long width, height = 0;
388        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &width, &height) == FAILURE) {
389                RETURN_FALSE;
390        }
391        caca_canvas_t *canvas = caca_create_canvas(width, height);
392        if (!canvas) {
393                RETURN_FALSE;
394        }
395        ZEND_REGISTER_RESOURCE(return_value, canvas, le_caca_canvas);
396}
397
398PHP_FUNCTION(caca_set_canvas_size) {
399        zval *_zval;
400        long width, height = 0;
401        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &width, &height) == FAILURE) {
402                RETURN_FALSE;
403        }
404        caca_canvas_t *canvas;
405        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
406        RETURN_SUCCESS(caca_set_canvas_size(canvas, width, height));
407}
408
409PHP_FUNCTION(caca_get_canvas_width) {
410        caca_canvas_t *canvas;
411        FETCH_CANVAS(canvas);
412        RETURN_LONG(caca_get_canvas_width(canvas));
413}
414
415PHP_FUNCTION(caca_get_canvas_height) {
416        caca_canvas_t *canvas;
417        FETCH_CANVAS(canvas);
418        RETURN_LONG(caca_get_canvas_height(canvas));
419}
420
421PHP_FUNCTION(caca_get_canvas_chars) {
422        caca_canvas_t *canvas;
423        FETCH_CANVAS(canvas);
424        RETURN_STRING((char *) caca_get_canvas_chars(canvas), 1); //TODO: check that return \0 terminated string
425}
426
427PHP_FUNCTION(caca_get_canvas_attrs) {
428        caca_canvas_t *canvas;
429        FETCH_CANVAS(canvas);
430        RETURN_STRING((char *) caca_get_canvas_attrs(canvas), 1); //TODO: check that return \0 terminated string
431}
432
433PHP_FUNCTION(caca_rand) {
434        long min, max = 0;
435        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &min, &max) == FAILURE) {
436                RETURN_FALSE;
437        }
438        RETURN_LONG(caca_rand(min, max));
439}
440
441PHP_FUNCTION(caca_get_version) {
442        RETURN_STRING((char *) caca_get_version(), 1);
443}
444
445PHP_FUNCTION(caca_gotoxy) {
446        zval *_zval;
447        long x, y = 0;
448        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &x, &y) == FAILURE) {
449                RETURN_FALSE;
450        }
451        caca_canvas_t *canvas;
452        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
453        RETURN_SUCCESS(caca_gotoxy(canvas, x, y));
454}
455
456PHP_FUNCTION(caca_get_cursor_x) {
457        caca_canvas_t *canvas;
458        FETCH_CANVAS(canvas);
459        RETURN_LONG(caca_get_cursor_x(canvas));
460}
461
462PHP_FUNCTION(caca_get_cursor_y) {
463        caca_canvas_t *canvas;
464        FETCH_CANVAS(canvas);
465        RETURN_LONG(caca_get_cursor_y(canvas));
466}
467
468PHP_FUNCTION(caca_put_char) {
469        zval *_zval;
470        char *str;
471        long str_len, x, y = 0;
472        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlls", &_zval, &x, &y, &str, &str_len) == FAILURE) {
473                RETURN_FALSE;
474        }
475        caca_canvas_t *canvas;
476        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
477        if (str_len != 1) {
478                RETURN_FALSE;
479        }
480        RETURN_SUCCESS(caca_put_char(canvas, x, y, str[0]));
481}
482
483PHP_FUNCTION(caca_get_char) {
484        zval *_zval;
485        long x, y = 0;
486        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &x, &y) == FAILURE) {
487                RETURN_FALSE;
488        }
489        caca_canvas_t *canvas;
490        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
491        RETURN_CHAR(caca_get_char(canvas, x, y));
492}
493
494PHP_FUNCTION(caca_put_str) {
495        zval *_zval;
496        char *str;
497        long x, y, str_len = 0;
498        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlls", &_zval, &x, &y, &str, &str_len) == FAILURE) {
499                RETURN_FALSE;
500        }
501        caca_canvas_t *canvas;
502        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
503        RETURN_SUCCESS(caca_put_str(canvas, x, y, str));
504}
505
506PHP_FUNCTION(caca_clear_canvas) {
507        caca_canvas_t *canvas;
508        FETCH_CANVAS(canvas);
509        RETURN_LONG(caca_clear_canvas(canvas));
510}
511
512PHP_FUNCTION(caca_set_canvas_handle) {
513        zval *_zval;
514        long x, y = 0;
515        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &x, &y) == FAILURE) {
516                RETURN_FALSE;
517        }
518        caca_canvas_t *canvas;
519        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
520        RETURN_SUCCESS(caca_set_canvas_handle(canvas, x, y));
521}
522
523PHP_FUNCTION(caca_get_canvas_handle_x) {
524        caca_canvas_t *canvas;
525        FETCH_CANVAS(canvas);
526        RETURN_LONG(caca_get_canvas_handle_x(canvas));
527}
528
529PHP_FUNCTION(caca_get_canvas_handle_y) {
530        caca_canvas_t *canvas;
531        FETCH_CANVAS(canvas);
532        RETURN_LONG(caca_get_canvas_handle_y(canvas));
533}
534
535PHP_FUNCTION(caca_blit) {
536        zval *_zval1, *_zval2, *_zval3 = NULL;
537        long x, y = 0;
538        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllr|r", &_zval1, &x, &y, &_zval2, &_zval3) == FAILURE) {
539                RETURN_FALSE;
540        }
541        caca_canvas_t *dst, *src, *mask = NULL;
542        ZEND_FETCH_RESOURCE(dst, caca_canvas_t*, &_zval1, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
543        ZEND_FETCH_RESOURCE(src, caca_canvas_t*, &_zval2, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
544        if (_zval3) {
545                ZEND_FETCH_RESOURCE(mask, caca_canvas_t*, &_zval3, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
546        }
547        RETURN_SUCCESS(caca_blit(dst, x, y, src, NULL));
548}
549
550PHP_FUNCTION(caca_set_canvas_boundaries) {
551        zval *_zval;
552        long x, y, width, height = 0;
553        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &_zval, &x, &y, &width, &height) == FAILURE) {
554                RETURN_FALSE;
555        }
556        caca_canvas_t *canvas;
557        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
558        RETURN_SUCCESS(caca_set_canvas_boundaries(canvas, x, y, width, height));
559}
560
561PHP_FUNCTION(caca_invert) {
562        caca_canvas_t *canvas;
563        FETCH_CANVAS(canvas);
564        RETURN_SUCCESS(caca_invert(canvas));
565}
566
567PHP_FUNCTION(caca_flip) {
568        caca_canvas_t *canvas;
569        FETCH_CANVAS(canvas);
570        RETURN_SUCCESS(caca_flip(canvas));
571}
572
573PHP_FUNCTION(caca_flop) {
574        caca_canvas_t *canvas;
575        FETCH_CANVAS(canvas);
576        RETURN_SUCCESS(caca_flop(canvas));
577}
578
579PHP_FUNCTION(caca_rotate_180) {
580        caca_canvas_t *canvas;
581        FETCH_CANVAS(canvas);
582        RETURN_SUCCESS(caca_rotate_180(canvas));
583}
584
585PHP_FUNCTION(caca_rotate_left) {
586        caca_canvas_t *canvas;
587        FETCH_CANVAS(canvas);
588        RETURN_SUCCESS(caca_rotate_left(canvas));
589}
590
591PHP_FUNCTION(caca_rotate_right) {
592        caca_canvas_t *canvas;
593        FETCH_CANVAS(canvas);
594        RETURN_SUCCESS(caca_rotate_right(canvas));
595}
596
597PHP_FUNCTION(caca_stretch_left) {
598        caca_canvas_t *canvas;
599        FETCH_CANVAS(canvas);
600        RETURN_SUCCESS(caca_stretch_left(canvas));
601}
602
603PHP_FUNCTION(caca_stretch_right) {
604        caca_canvas_t *canvas;
605        FETCH_CANVAS(canvas);
606        RETURN_SUCCESS(caca_stretch_right(canvas));
607}
608
609PHP_FUNCTION(caca_get_attr) {
610        zval *_zval;
611        long x, y = 0;
612        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &x, &y) == FAILURE) {
613                RETURN_FALSE;
614        }
615        caca_canvas_t *canvas;
616        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
617        RETURN_LONG(caca_get_attr(canvas, x, y));
618}
619
620PHP_FUNCTION(caca_set_attr) {
621        zval *_zval;
622        long attr = 0;
623        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &attr) == FAILURE) {
624                RETURN_FALSE;
625        }
626        caca_canvas_t *canvas;
627        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
628        RETURN_SUCCESS(caca_set_attr(canvas, attr));
629}
630
631PHP_FUNCTION(caca_put_attr) {
632        zval *_zval;
633        long x, y, attr = 0;
634        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlll", &_zval, &x, &y, &attr) == FAILURE) {
635                RETURN_FALSE;
636        }
637        caca_canvas_t *canvas;
638        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
639        RETURN_SUCCESS(caca_put_attr(canvas, x, y, attr));
640}
641
642PHP_FUNCTION(caca_set_color_ansi) {
643        zval *_zval;
644        long foreground, background = 0;
645        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &foreground, &background) == FAILURE) {
646                RETURN_FALSE;
647        }
648        caca_canvas_t *canvas;
649        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
650        RETURN_SUCCESS(caca_set_color_ansi(canvas, foreground, background));
651}
652
653PHP_FUNCTION(caca_set_color_argb) {
654        zval *_zval;
655        long foreground, background = 0;
656        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &foreground, &background) == FAILURE) {
657                RETURN_FALSE;
658        }
659        caca_canvas_t *canvas;
660        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
661        RETURN_SUCCESS(caca_set_color_argb(canvas, foreground, background));
662}
663
664PHP_FUNCTION(caca_attr_to_ansi) {
665        long l;
666        FETCH_LONG(l);
667        RETURN_LONG(caca_attr_to_ansi(l));
668}
669
670PHP_FUNCTION(caca_attr_to_ansi_fg) {
671        long l;
672        FETCH_LONG(l);
673        RETURN_LONG(caca_attr_to_ansi_fg(l));
674}
675
676PHP_FUNCTION(caca_attr_to_ansi_bg) {
677        long l;
678        FETCH_LONG(l);
679        RETURN_LONG(caca_attr_to_ansi_bg(l));
680}
681
682PHP_FUNCTION(caca_attr_to_rgb12_fg) {
683        long l;
684        FETCH_LONG(l);
685        RETURN_LONG(caca_attr_to_rgb12_fg(l));
686}
687
688PHP_FUNCTION(caca_attr_to_rgb12_bg) {
689        long l;
690        FETCH_LONG(l);
691        RETURN_LONG(caca_attr_to_rgb12_bg(l));
692}
693
694PHP_FUNCTION(caca_attr_to_argb64) {
695}
696
697PHP_FUNCTION(caca_utf8_to_utf32) {
698}
699
700PHP_FUNCTION(caca_utf32_to_utf8) {
701}
702
703PHP_FUNCTION(caca_utf32_to_cp437) {
704}
705
706PHP_FUNCTION(caca_cp437_to_utf32) {
707}
708
709PHP_FUNCTION(caca_utf32_to_ascii) {
710}
711
712PHP_FUNCTION(caca_utf32_is_fullwidth) {
713}
714
715PHP_FUNCTION(caca_draw_line) {
716        zval *_zval;
717        char *str;
718        long str_len, xa, ya, xb, yb = 0;
719        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllls", &_zval, &xa, &ya, &xb, &yb, &str, &str_len) == FAILURE) {
720                RETURN_FALSE;
721        }
722        caca_canvas_t *canvas;
723        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
724        if (str_len != 1) {
725                RETURN_FALSE;
726        }
727        RETURN_SUCCESS(caca_draw_line(canvas, xa, ya, xb, yb, str[0]));
728}
729
730PHP_FUNCTION(caca_draw_polyline) {
731}
732
733PHP_FUNCTION(caca_draw_thin_line) {
734        zval *_zval;
735        long xa, ya, xb, yb = 0;
736        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &_zval, &xa, &ya, &xb, &yb) == FAILURE) {
737                RETURN_FALSE;
738        }
739        caca_canvas_t *canvas;
740        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
741        RETURN_SUCCESS(caca_draw_thin_line(canvas, xa, ya, xb, yb));
742}
743
744PHP_FUNCTION(caca_draw_thin_polyline) {
745}
746
747PHP_FUNCTION(caca_draw_circle) {
748        zval *_zval;
749        char *str;
750        long str_len, x, y, r = 0;
751        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllls", &_zval, &x, &y, &r, &str, &str_len) == FAILURE) {
752                RETURN_FALSE;
753        }
754        caca_canvas_t *canvas;
755        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
756        if (str_len != 1) {
757                RETURN_FALSE;
758        }
759        RETURN_SUCCESS(caca_draw_circle(canvas, x, y, r, str[0]));
760}
761
762PHP_FUNCTION(caca_draw_ellipse) {
763        zval *_zval;
764        char *str;
765        long str_len, xa, ya, xb, yb = 0;
766        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllls", &_zval, &xa, &ya, &xb, &yb, &str, &str_len) == FAILURE) {
767                RETURN_FALSE;
768        }
769        caca_canvas_t *canvas;
770        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
771        if (str_len != 1) {
772                RETURN_FALSE;
773        }
774        RETURN_SUCCESS(caca_draw_ellipse(canvas, xa, ya, xb, yb, str[0]));
775}
776
777PHP_FUNCTION(caca_draw_thin_ellipse) {
778        zval *_zval;
779        long xa, ya, xb, yb = 0;
780        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &_zval, &xa, &ya, &xb, &yb) == FAILURE) {
781                RETURN_FALSE;
782        }
783        caca_canvas_t *canvas;
784        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
785        RETURN_SUCCESS(caca_draw_thin_ellipse(canvas, xa, ya, xb, yb));
786}
787
788PHP_FUNCTION(caca_fill_ellipse) {
789        zval *_zval;
790        char *str;
791        long str_len, xa, ya, xb, yb = 0;
792        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllls", &_zval, &xa, &ya, &xb, &yb, &str, &str_len) == FAILURE) {
793                RETURN_FALSE;
794        }
795        caca_canvas_t *canvas;
796        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
797        if (str_len != 1) {
798                RETURN_FALSE;
799        }
800        RETURN_SUCCESS(caca_fill_ellipse(canvas, xa, ya, xb, yb, str[0]));
801}
802
803PHP_FUNCTION(caca_draw_box) {
804        zval *_zval;
805        char *str;
806        long str_len, xa, ya, xb, yb = 0;
807        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllls", &_zval, &xa, &ya, &xb, &yb, &str, &str_len) == FAILURE) {
808                RETURN_FALSE;
809        }
810        caca_canvas_t *canvas;
811        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
812        if (str_len != 1) {
813                RETURN_FALSE;
814        }
815        RETURN_SUCCESS(caca_draw_box(canvas, xa, ya, xb, yb, str[0]));
816}
817
818PHP_FUNCTION(caca_draw_thin_box) {
819        zval *_zval;
820        long xa, ya, xb, yb = 0;
821        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &_zval, &xa, &ya, &xb, &yb) == FAILURE) {
822                RETURN_FALSE;
823        }
824        caca_canvas_t *canvas;
825        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
826        RETURN_SUCCESS(caca_draw_thin_box(canvas, xa, ya, xb, yb));
827}
828
829PHP_FUNCTION(caca_draw_cp437_box) {
830        zval *_zval;
831        long xa, ya, xb, yb = 0;
832        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &_zval, &xa, &ya, &xb, &yb) == FAILURE) {
833                RETURN_FALSE;
834        }
835        caca_canvas_t *canvas;
836        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
837        RETURN_SUCCESS(caca_draw_cp437_box(canvas, xa, ya, xb, yb));
838}
839
840PHP_FUNCTION(caca_fill_box) {
841        zval *_zval;
842        char *str;
843        long str_len, xa, ya, xb, yb = 0;
844        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllls", &_zval, &xa, &ya, &xb, &yb, &str, &str_len) == FAILURE) {
845                RETURN_FALSE;
846        }
847        caca_canvas_t *canvas;
848        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
849        if (str_len != 1) {
850                RETURN_FALSE;
851        }
852        RETURN_SUCCESS(caca_fill_box(canvas, xa, ya, xb, yb, str[0]));
853}
854
855PHP_FUNCTION(caca_draw_triangle) {
856        zval *_zval;
857        char *str;
858        long str_len, xa, ya, xb, yb, xc, yc = 0;
859        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllllls", &_zval, &xa, &ya, &xb, &yb, &xc, &yc, &str, &str_len) == FAILURE) {
860                RETURN_FALSE;
861        }
862        caca_canvas_t *canvas;
863        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
864        if (str_len != 1) {
865                RETURN_FALSE;
866        }
867        RETURN_SUCCESS(caca_draw_triangle(canvas, xa, ya, xb, yb, xc, yc, str[0]));
868}
869
870PHP_FUNCTION(caca_draw_thin_triangle) {
871        zval *_zval;
872        long xa, ya, xb, yb, xc, yc = 0;
873        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllllll", &_zval, &xa, &ya, &xb, &yb, &xc, &yc) == FAILURE) {
874                RETURN_FALSE;
875        }
876        caca_canvas_t *canvas;
877        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
878        RETURN_SUCCESS(caca_draw_thin_triangle(canvas, xa, ya, xb, yb, xc, yc));
879}
880
881PHP_FUNCTION(caca_fill_triangle) {
882        zval *_zval;
883        char *str;
884        long str_len, xa, ya, xb, yb, xc, yc = 0;
885        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllllls", &_zval, &xa, &ya, &xb, &yb, &xc, &yc, &str, &str_len) == FAILURE) {
886                RETURN_FALSE;
887        }
888        caca_canvas_t *canvas;
889        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
890        if (str_len != 1) {
891                RETURN_FALSE;
892        }
893        RETURN_SUCCESS(caca_fill_triangle(canvas, xa, ya, xb, yb, xc, yc, str[0]));
894}
895
896PHP_FUNCTION(caca_get_frame_count) {
897        zval *_zval;
898        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
899                RETURN_FALSE;
900        }
901        caca_canvas_t *canvas;
902        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
903        RETURN_LONG(caca_get_canvas_count(canvas));
904}
905
906PHP_FUNCTION(caca_set_frame) {
907        zval *_zval;
908        long id;
909        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &id) == FAILURE) {
910                RETURN_FALSE;
911        }
912        caca_canvas_t *canvas;
913        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
914        RETURN_SUCCESS(caca_set_frame(canvas, id));
915}
916
917PHP_FUNCTION(caca_set_frame_name) {
918        zval *_zval;
919        char *str;
920        long str_len;
921        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
922                RETURN_FALSE;
923        }
924        caca_canvas_t *canvas;
925        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
926        RETURN_SUCCESS(caca_set_frame_name(canvas, str));
927}
928
929PHP_FUNCTION(caca_create_frame) {
930        zval *_zval;
931        long id;
932        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &id) == FAILURE) {
933                RETURN_FALSE;
934        }
935        caca_canvas_t *canvas;
936        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
937        RETURN_SUCCESS(caca_create_frame(canvas, id));
938}
939
940PHP_FUNCTION(caca_free_frame) {
941        zval *_zval;
942        long id;
943        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &id) == FAILURE) {
944                RETURN_FALSE;
945        }
946        caca_canvas_t *canvas;
947        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
948        RETURN_SUCCESS(caca_free_frame(canvas, id));
949}
950
951PHP_FUNCTION(caca_create_dither) {
952        long bpp, w, h, pitch, rmask, gmask, bmask, amask = 0;
953        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "llllllll", &bpp, &w, &h, &pitch, &rmask, &gmask, &bmask, &amask) == FAILURE) {
954                RETURN_FALSE;
955        }
956        caca_dither_t *dither = caca_create_dither(bpp, w, h, pitch, rmask, gmask, bmask, amask);
957        ZEND_REGISTER_RESOURCE(return_value, dither, le_caca_dither);
958}
959
960PHP_FUNCTION(caca_create_dither_gd) {
961        zval *_zval;
962        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
963                RETURN_FALSE;
964        }
965
966        gdImage *img = fetch_external_resource(_zval, "gd");
967        if (!img | !img->trueColor) {
968                RETURN_FALSE;
969        }
970        caca_dither_t *dither = caca_create_dither(sizeof(int) * 8, img->sx, img->sy, img->sx * sizeof(int), 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000);
971        ZEND_REGISTER_RESOURCE(return_value, dither, le_caca_dither);
972}
973
974PHP_FUNCTION(caca_set_dither_palette) {
975}
976
977PHP_FUNCTION(caca_set_dither_brightness) {
978        zval *_zval;
979        double value;
980        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rd", &_zval, &value) == FAILURE) {
981                RETURN_FALSE;
982        }
983        caca_dither_t *dither;
984        ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
985        RETURN_SUCCESS(caca_set_dither_brightness(dither, value));
986}
987
988PHP_FUNCTION(caca_get_dither_brightness) {
989        zval *_zval;
990        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
991                RETURN_FALSE;
992        }
993        caca_dither_t *dither;
994        ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
995        RETURN_DOUBLE(caca_get_dither_brightness(dither));
996}
997
998PHP_FUNCTION(caca_set_dither_gamma) {
999        zval *_zval;
1000        double value;
1001        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rd", &_zval, &value) == FAILURE) {
1002                RETURN_FALSE;
1003        }
1004        caca_dither_t *dither;
1005        ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
1006        RETURN_SUCCESS(caca_set_dither_gamma(dither, value));
1007}
1008
1009PHP_FUNCTION(caca_get_dither_gamma) {
1010        zval *_zval;
1011        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
1012                RETURN_FALSE;
1013        }
1014        caca_dither_t *dither;
1015        ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
1016        RETURN_DOUBLE(caca_get_dither_gamma(dither));
1017}
1018
1019PHP_FUNCTION(caca_set_dither_contrast) {
1020        zval *_zval;
1021        double value;
1022        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rd", &_zval, &value) == FAILURE) {
1023                RETURN_FALSE;
1024        }
1025        caca_dither_t *dither;
1026        ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
1027        RETURN_SUCCESS(caca_set_dither_contrast(dither, value));
1028}
1029
1030PHP_FUNCTION(caca_get_dither_contrast) {
1031        zval *_zval;
1032        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
1033                RETURN_FALSE;
1034        }
1035        caca_dither_t *dither;
1036        ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
1037        RETURN_DOUBLE(caca_get_dither_contrast(dither));
1038}
1039
1040PHP_FUNCTION(caca_set_dither_antialias) {
1041        zval *_zval;
1042        int str_len;
1043        char *str;
1044        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
1045                RETURN_FALSE;
1046        }
1047        caca_dither_t *dither;
1048        ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
1049        RETURN_SUCCESS(caca_set_dither_antialias(dither, str));
1050}
1051
1052PHP_FUNCTION(caca_get_dither_antialias_list) {
1053}
1054
1055PHP_FUNCTION(caca_get_dither_antialias) {
1056        zval *_zval;
1057        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
1058                RETURN_FALSE;
1059        }
1060        caca_dither_t *dither;
1061        ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
1062        RETURN_STRING((char *) caca_get_dither_antialias(dither), 1);
1063}
1064
1065PHP_FUNCTION(caca_set_dither_color) {
1066        zval *_zval;
1067        int str_len;
1068        char *str;
1069        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
1070                RETURN_FALSE;
1071        }
1072        caca_dither_t *dither;
1073        ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
1074        RETURN_SUCCESS(caca_set_dither_color(dither, str));
1075}
1076
1077PHP_FUNCTION(caca_get_dither_color_list) {
1078        zval *_zval;
1079        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
1080                RETURN_FALSE;
1081        }
1082        caca_dither_t *dither;
1083        ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
1084
1085        char const * const *list = caca_get_dither_antialias_list(dither);
1086        int i;
1087        array_init(return_value);       
1088        for(i = 0; list[i]; i += 2)
1089                add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1);
1090}
1091
1092PHP_FUNCTION(caca_get_dither_color) {
1093        zval *_zval;
1094        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
1095                RETURN_FALSE;
1096        }
1097        caca_dither_t *dither;
1098        ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
1099        RETURN_STRING((char *) caca_get_dither_color(dither), 1);
1100}
1101
1102PHP_FUNCTION(caca_set_dither_charset) {
1103        zval *_zval;
1104        int str_len;
1105        char *str;
1106        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
1107                RETURN_FALSE;
1108        }
1109        caca_dither_t *dither;
1110        ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
1111        RETURN_SUCCESS(caca_set_dither_charset(dither, str));
1112}
1113
1114PHP_FUNCTION(caca_get_dither_charset_list) {
1115        zval *_zval;
1116        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
1117                RETURN_FALSE;
1118        }
1119        caca_dither_t *dither;
1120        ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
1121
1122        char const * const *list = caca_get_dither_charset_list(dither);
1123        int i;
1124        array_init(return_value);       
1125        for(i = 0; list[i]; i += 2)
1126                add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1);
1127}
1128
1129PHP_FUNCTION(caca_get_dither_charset) {
1130        zval *_zval;
1131        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
1132                RETURN_FALSE;
1133        }
1134        caca_dither_t *dither;
1135        ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
1136        RETURN_STRING((char *) caca_get_dither_charset(dither), 1);
1137}
1138
1139PHP_FUNCTION(caca_set_dither_algorithm) {
1140        zval *_zval;
1141        int str_len;
1142        char *str;
1143        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
1144                RETURN_FALSE;
1145        }
1146        caca_dither_t *dither;
1147        ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
1148        RETURN_SUCCESS(caca_set_dither_algorithm(dither, str));
1149}
1150
1151PHP_FUNCTION(caca_get_dither_algorithm_list) {
1152        zval *_zval;
1153        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
1154                RETURN_FALSE;
1155        }
1156        caca_dither_t *dither;
1157        ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
1158
1159        char const * const *list = caca_get_dither_algorithm_list(dither);
1160        int i;
1161        array_init(return_value);       
1162        for(i = 0; list[i]; i += 2)
1163                add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1);
1164}
1165
1166PHP_FUNCTION(caca_get_dither_algorithm) {
1167        zval *_zval;
1168        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
1169                RETURN_FALSE;
1170        }
1171        caca_dither_t *dither;
1172        ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
1173        RETURN_STRING((char *) caca_get_dither_algorithm(dither), 1);
1174}
1175
1176PHP_FUNCTION(caca_dither_bitmap_gd) {
1177        zval *_zval1, *_zval2, *_zval3;
1178        long x, y, w, h = 0;
1179        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllllrr", &_zval1, &x, &y, &w, &h, &_zval2, &_zval3) == FAILURE) {
1180                RETURN_FALSE;
1181        }
1182
1183        caca_canvas_t *canvas;
1184        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval1, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
1185        caca_dither_t *dither;
1186        ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval2, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
1187
1188        gdImage *img = fetch_external_resource(_zval3, "gd");
1189        if (!img) {
1190                RETURN_FALSE;
1191        }
1192
1193        void *pixels = gd_get_pixels(img);
1194        if (!pixels) {
1195                RETURN_FALSE;
1196        }
1197
1198        caca_dither_bitmap(canvas, x, y, w, h, dither, pixels);
1199        free(pixels);
1200        RETURN_TRUE;
1201}
1202
1203PHP_FUNCTION(caca_load_font) {
1204}
1205
1206PHP_FUNCTION(caca_get_font_list) {
1207        char const * const *list = caca_get_font_list();
1208        int i;
1209        array_init(return_value);       
1210        for(i = 0; list[i]; i += 1)
1211                add_next_index_string(return_value, (char*) list[i], 1);
1212}
1213
1214PHP_FUNCTION(caca_get_font_width) {
1215        zval *_zval;
1216        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
1217                RETURN_FALSE;
1218        }
1219        caca_font_t *font;
1220        ZEND_FETCH_RESOURCE(font, caca_font_t*, &_zval, -1, PHP_CACA_FONT_RES_NAME, le_caca_font);
1221        RETURN_LONG(caca_get_font_width(font));
1222}
1223
1224PHP_FUNCTION(caca_get_font_height) {
1225        zval *_zval;
1226        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
1227                RETURN_FALSE;
1228        }
1229        caca_font_t *font;
1230        ZEND_FETCH_RESOURCE(font, caca_font_t*, &_zval, -1, PHP_CACA_FONT_RES_NAME, le_caca_font);
1231        RETURN_LONG(caca_get_font_height(font));
1232}
1233
1234PHP_FUNCTION(caca_get_font_bloc) {
1235}
1236
1237PHP_FUNCTION(caca_render_canvas) {
1238}
1239
1240PHP_FUNCTION(caca_canvas_set_figfont) {
1241        zval *_zval;
1242        char *font;
1243        long font_len;
1244        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &font, &font_len) == FAILURE) {
1245                RETURN_FALSE;
1246        }
1247        caca_canvas_t *canvas;
1248        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
1249        RETURN_SUCCESS(caca_canvas_set_figfont(canvas, font));
1250}
1251
1252PHP_FUNCTION(caca_put_figchar) {
1253}
1254
1255PHP_FUNCTION(caca_flush_figlet) {
1256        zval *_zval;
1257        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
1258                RETURN_FALSE;
1259        }
1260        caca_canvas_t *canvas;
1261        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
1262        RETURN_SUCCESS(caca_flush_figlet(canvas));
1263}
1264
1265PHP_FUNCTION(caca_file_open) {
1266        char *path, *mode;
1267        long path_len, mode_len;
1268        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &path, &path_len, &mode, &mode_len) == FAILURE) {
1269                RETURN_FALSE;
1270        }
1271        caca_file_t *file = caca_file_open(path, mode);
1272        ZEND_REGISTER_RESOURCE(return_value, file, le_caca_file);
1273}
1274
1275PHP_FUNCTION(caca_file_close) {
1276        zval *_zval;
1277        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
1278                RETURN_FALSE;
1279        }
1280        caca_file_t *file;
1281        ZEND_FETCH_RESOURCE(file, caca_file_t*, &_zval, -1, PHP_CACA_FILE_RES_NAME, le_caca_file);
1282        //TODO: check that file was not already closed
1283        RETURN_SUCCESS(caca_file_close(file));
1284}
1285
1286PHP_FUNCTION(caca_file_tell) {
1287        zval *_zval;
1288        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
1289                RETURN_FALSE;
1290        }
1291        caca_file_t *file;
1292        ZEND_FETCH_RESOURCE(file, caca_file_t*, &_zval, -1, PHP_CACA_FILE_RES_NAME, le_caca_file);
1293        RETURN_LONG(caca_file_tell(file));
1294}
1295
1296PHP_FUNCTION(caca_file_read) {
1297        zval *_zval;
1298        long len;
1299        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &len) == FAILURE) {
1300                RETURN_FALSE;
1301        }
1302        caca_file_t *file;
1303        ZEND_FETCH_RESOURCE(file, caca_file_t*, &_zval, -1, PHP_CACA_FILE_RES_NAME, le_caca_file);
1304
1305        char *buffer = emalloc(len);
1306        caca_file_read(file, buffer, len);
1307
1308        return_value->type = IS_STRING;
1309        return_value->value.str.len = len;
1310        return_value->value.str.val = buffer;
1311}
1312
1313PHP_FUNCTION(caca_file_write) {
1314        zval *_zval;
1315        char *buf;
1316        long buf_len = 0;
1317        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &buf, &buf_len) == FAILURE) {
1318                RETURN_FALSE;
1319        }
1320        caca_file_t *file;
1321        ZEND_FETCH_RESOURCE(file, caca_file_t*, &_zval, -1, PHP_CACA_FILE_RES_NAME, le_caca_file);
1322        RETURN_LONG(caca_file_write(file, buf, buf_len));
1323}
1324
1325PHP_FUNCTION(caca_file_gets) {
1326}
1327
1328PHP_FUNCTION(caca_file_eof) {
1329        zval *_zval;
1330        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
1331                RETURN_FALSE;
1332        }
1333        caca_file_t *file;
1334        ZEND_FETCH_RESOURCE(file, caca_file_t*, &_zval, -1, PHP_CACA_FILE_RES_NAME, le_caca_file);
1335        RETURN_BOOL(caca_file_eof(file) != 0);
1336}
1337
1338PHP_FUNCTION(caca_import_string) {
1339        zval *_zval;
1340        char *src, *format;
1341        long src_len, format_len = 0;
1342        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &_zval, &src, &src_len, &format, &format_len) == FAILURE) {
1343                RETURN_FALSE;
1344        }
1345        caca_canvas_t *canvas;
1346        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
1347
1348        RETURN_LONG(caca_import_memory(canvas, src, src_len, format));
1349}
1350
1351PHP_FUNCTION(caca_import_file) {
1352        zval *_zval;
1353        char *filename, *format;
1354        long filename_len, format_len = 0;
1355        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &_zval, &filename, &filename_len, &format, &format_len) == FAILURE) {
1356                RETURN_FALSE;
1357        }
1358        caca_canvas_t *canvas;
1359        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
1360
1361        RETURN_LONG(caca_import_file(canvas, filename, format));
1362}
1363
1364PHP_FUNCTION(caca_get_import_list) {
1365        char const * const *list = caca_get_import_list();
1366        int i;
1367        array_init(return_value);       
1368        for(i = 0; list[i]; i += 2)
1369                add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1);
1370}
1371
1372PHP_FUNCTION(caca_export_string) {
1373        zval *_zval;
1374        char *type;
1375        long type_len;
1376        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &type, &type_len) == FAILURE) {
1377                RETURN_FALSE;
1378        }
1379        caca_canvas_t *canvas;
1380        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
1381
1382        void *buffer;
1383        size_t len;
1384        buffer = caca_export_memory(canvas, type, &len);
1385        if (!buffer) {
1386                RETURN_FALSE;
1387        }
1388        return_value->type = IS_STRING;
1389        return_value->value.str.len = len;
1390        return_value->value.str.val = emalloc(len);
1391        memcpy(return_value->value.str.val, buffer, len);
1392        free(buffer);
1393}
1394
1395PHP_FUNCTION(caca_get_export_list) {
1396        char const * const *list = caca_get_export_list();
1397        int i;
1398        array_init(return_value);       
1399        for(i = 0; list[i]; i += 2)
1400                add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1);
1401}
1402
1403PHP_FUNCTION(caca_create_display) {
1404        caca_canvas_t *canvas;
1405        FETCH_CANVAS(canvas);
1406
1407        caca_display_t *display = caca_create_display(canvas);
1408        ZEND_REGISTER_RESOURCE(return_value, display, le_caca_display);
1409}
1410
1411PHP_FUNCTION(caca_create_display_with_driver) {
1412        zval *_zval;
1413        char *str;
1414        long str_len = 0;
1415        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
1416                RETURN_FALSE;
1417        }
1418        caca_canvas_t *canvas;
1419        ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
1420
1421        caca_display_t *display = caca_create_display_with_driver(canvas, str);
1422        if (!display) {
1423                RETURN_FALSE;
1424        }
1425        ZEND_REGISTER_RESOURCE(return_value, display, le_caca_display);
1426}
1427
1428PHP_FUNCTION(caca_get_display_driver_list) {
1429        char const * const *list = caca_get_display_driver_list();
1430        int i;
1431        array_init(return_value);       
1432        for(i = 0; list[i]; i += 2)
1433                add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1);
1434}
1435
1436PHP_FUNCTION(caca_get_display_driver) {
1437        zval *_zval;
1438        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
1439                RETURN_FALSE;
1440        }
1441        caca_display_t *display;
1442        ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
1443        RETURN_STRING((char *) caca_get_display_driver(display), 1);
1444}
1445
1446PHP_FUNCTION(caca_set_display_driver) {
1447        zval *_zval;
1448        char *str;
1449        long str_len;
1450        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
1451                RETURN_FALSE;
1452        }
1453        caca_display_t *display;
1454        ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
1455        RETURN_SUCESS(caca_set_display_driver(display, str));
1456}
1457
1458PHP_FUNCTION(caca_get_canvas) {
1459        zval *_zval;
1460        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
1461                RETURN_FALSE;
1462        }
1463        caca_display_t *display;
1464        ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
1465        caca_canvas_t *canvas = caca_get_canvas(display);
1466        ZEND_REGISTER_RESOURCE(return_value, canvas, le_caca_canvas);
1467}
1468
1469PHP_FUNCTION(caca_refresh_display) {
1470        caca_display_t *display;
1471        FETCH_DISPLAY(display);
1472        RETURN_SUCCESS(caca_refresh_display(display));
1473}
1474
1475PHP_FUNCTION(caca_set_display_time) {
1476        zval *_zval;
1477        long value = 0;
1478        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &value) == FAILURE) {
1479                RETURN_FALSE;
1480        }
1481        caca_display_t *display;
1482        ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
1483        RETURN_SUCCESS(caca_set_display_time(display, value));
1484}
1485
1486PHP_FUNCTION(caca_get_display_time) {
1487        caca_display_t *display;
1488        FETCH_DISPLAY(display);
1489        RETURN_LONG(caca_get_display_time(display));
1490}
1491
1492PHP_FUNCTION(caca_get_display_width) {
1493        caca_display_t *display;
1494        FETCH_DISPLAY(display);
1495        RETURN_LONG(caca_get_display_width(display));
1496}
1497
1498PHP_FUNCTION(caca_get_display_height) {
1499        caca_display_t *display;
1500        FETCH_DISPLAY(display);
1501        RETURN_LONG(caca_get_display_height(display));
1502}
1503
1504PHP_FUNCTION(caca_set_display_title) {
1505        zval *_zval;
1506        char *str;
1507        long str_len = 0;
1508        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
1509                RETURN_FALSE;
1510        }
1511        caca_display_t *display;
1512        ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
1513        RETURN_SUCCESS(caca_set_display(display, str));
1514}
1515
1516PHP_FUNCTION(caca_set_mouse) {
1517        zval *_zval;
1518        long value = 0;
1519        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &value) == FAILURE) {
1520                RETURN_FALSE;
1521        }
1522        caca_display_t *display;
1523        ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
1524        RETURN_SUCCESS(caca_set_mouse(display, value));
1525}
1526
1527PHP_FUNCTION(caca_set_cursor) {
1528        zval *_zval;
1529        long value = 0;
1530        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &value) == FAILURE) {
1531                RETURN_FALSE;
1532        }
1533        caca_display_t *display;
1534        ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
1535        RETURN_SUCCESS(caca_set_cursor(display, value));
1536}
1537
1538PHP_FUNCTION(caca_get_event) {
1539        zval *_zval1, *_zval2 = NULL;
1540        long g, aa = 0;
1541        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl|rl", &_zval1, &g, &_zval2, &aa) == FAILURE) {
1542                RETURN_FALSE;
1543        }
1544        caca_display_t *display;
1545        ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval1, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
1546
1547        caca_event_t *event = NULL;
1548        if (_zval2) {
1549                ZEND_FETCH_RESOURCE(event, caca_event_t*, &_zval2, -1, PHP_CACA_EVENT_RES_NAME, le_caca_event);
1550        }
1551        RETURN_LONG(caca_get_event(display, g, event, aa));
1552}
1553
1554PHP_FUNCTION(caca_get_mouse_x) {
1555        caca_display_t *display;
1556        FETCH_DISPLAY(display);
1557        RETURN_LONG(caca_get_mouse_x(display));
1558}
1559
1560PHP_FUNCTION(caca_get_mouse_y) {
1561        caca_display_t *display;
1562        FETCH_DISPLAY(display);
1563        RETURN_LONG(caca_get_mouse_y(display));
1564}
1565
1566PHP_FUNCTION(caca_get_event_type) {
1567        caca_event_t *event;
1568        FETCH_EVENT(event);
1569        RETURN_LONG(caca_get_event_type(event));
1570}
1571
1572PHP_FUNCTION(caca_get_event_key_ch) {
1573        caca_event_t *event;
1574        FETCH_EVENT(event);
1575        RETURN_LONG(caca_get_event_key_ch(event));
1576}
1577
1578PHP_FUNCTION(caca_get_event_mouse_button) {
1579        caca_event_t *event;
1580        FETCH_EVENT(event);
1581        RETURN_LONG(caca_get_event_mouse_button(event));
1582}
1583
1584PHP_FUNCTION(caca_get_event_mouse_x) {
1585        caca_event_t *event;
1586        FETCH_EVENT(event);
1587        RETURN_LONG(caca_get_event_mouse_x(event));
1588}
1589
1590PHP_FUNCTION(caca_get_event_mouse_y) {
1591        caca_event_t *event;
1592        FETCH_EVENT(event);
1593        RETURN_LONG(caca_get_event_mouse_y(event));
1594}
1595
1596PHP_FUNCTION(caca_get_event_resize_width) {
1597        caca_event_t *event;
1598        FETCH_EVENT(event);
1599        RETURN_LONG(caca_get_event_resize_width(event));
1600}
1601
1602PHP_FUNCTION(caca_get_event_resize_height) {
1603        caca_event_t *event;
1604        FETCH_EVENT(event);
1605        RETURN_LONG(caca_get_event_resize_height(event));
1606}
1607
Note: See TracBrowser for help on using the repository browser.