From 400175be4fe289422fa39e9e92d95449b63767df Mon Sep 17 00:00:00 2001 From: Nicolas Vion Date: Sun, 26 Oct 2008 20:51:04 +0000 Subject: [PATCH] * Add php binding for 15 new functions * Add new sample program "examples/drivers.php" --- caca-php/examples/drivers.php | 8 +++ caca-php/php_caca.c | 103 +++++++++++++++++++++++++++++++++- 2 files changed, 108 insertions(+), 3 deletions(-) create mode 100755 caca-php/examples/drivers.php diff --git a/caca-php/examples/drivers.php b/caca-php/examples/drivers.php new file mode 100755 index 0000000..5133f8a --- /dev/null +++ b/caca-php/examples/drivers.php @@ -0,0 +1,8 @@ +#!/usr/bin/php5 + $name) + echo "* $name ($type)\n"; diff --git a/caca-php/php_caca.c b/caca-php/php_caca.c index 055e3bd..15added 100644 --- a/caca-php/php_caca.c +++ b/caca-php/php_caca.c @@ -327,6 +327,11 @@ PHP_MINIT_FUNCTION(caca) { } \ ZEND_FETCH_RESOURCE(event, caca_event_t*, &_zval, -1, PHP_CACA_EVENT_RES_NAME, le_caca_event); +#define FETCH_LONG(l) \ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &l) == FAILURE) { \ + RETURN_FALSE; \ + } + #define RETURN_CHAR(c) \ char *str = emalloc(2); \ str[0] = c; \ @@ -390,13 +395,13 @@ PHP_FUNCTION(caca_get_canvas_height) { PHP_FUNCTION(caca_get_canvas_chars) { caca_canvas_t *canvas; FETCH_CANVAS(canvas); - RETURN_STRING(estrdup(caca_get_canvas_chars(canvas)), 0); //TODO: check that return \0 terminated string + RETURN_STRING((char *) caca_get_canvas_chars(canvas), 1); //TODO: check that return \0 terminated string } PHP_FUNCTION(caca_get_canvas_attrs) { caca_canvas_t *canvas; FETCH_CANVAS(canvas); - RETURN_STRING(estrdup(caca_get_canvas_attrs(canvas)), 0); //TODO: check that return \0 terminated string + RETURN_STRING((char *) caca_get_canvas_attrs(canvas), 1); //TODO: check that return \0 terminated string } PHP_FUNCTION(caca_rand) { @@ -408,7 +413,7 @@ PHP_FUNCTION(caca_rand) { } PHP_FUNCTION(caca_get_version) { - RETURN_STRING(estrdup(caca_get_version()), 0); + RETURN_STRING((char *) caca_get_version(), 1); } PHP_FUNCTION(caca_gotoxy) { @@ -620,21 +625,44 @@ PHP_FUNCTION(caca_set_color_ansi) { } PHP_FUNCTION(caca_set_color_argb) { + zval *_zval; + long foreground, background = 0; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &foreground, &background) == FAILURE) { + RETURN_FALSE; + } + caca_canvas_t *canvas; + ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas); + RETURN_SUCCESS(caca_set_color_argb(canvas, foreground, background)); } PHP_FUNCTION(caca_attr_to_ansi) { + long l; + FETCH_LONG(l); + RETURN_LONG(caca_attr_to_ansi(l)); } PHP_FUNCTION(caca_attr_to_ansi_fg) { + long l; + FETCH_LONG(l); + RETURN_LONG(caca_attr_to_ansi_fg(l)); } PHP_FUNCTION(caca_attr_to_ansi_bg) { + long l; + FETCH_LONG(l); + RETURN_LONG(caca_attr_to_ansi_bg(l)); } PHP_FUNCTION(caca_attr_to_rgb12_fg) { + long l; + FETCH_LONG(l); + RETURN_LONG(caca_attr_to_rgb12_fg(l)); } PHP_FUNCTION(caca_attr_to_rgb12_bg) { + long l; + FETCH_LONG(l); + RETURN_LONG(caca_attr_to_rgb12_bg(l)); } PHP_FUNCTION(caca_attr_to_argb64) { @@ -840,18 +868,58 @@ PHP_FUNCTION(caca_fill_triangle) { } PHP_FUNCTION(caca_get_frame_count) { + zval *_zval; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) { + RETURN_FALSE; + } + caca_canvas_t *canvas; + ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas); + RETURN_LONG(caca_get_canvas_count(canvas)); } PHP_FUNCTION(caca_set_frame) { + zval *_zval; + long id; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &id) == FAILURE) { + RETURN_FALSE; + } + caca_canvas_t *canvas; + ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas); + RETURN_SUCCESS(caca_set_frame(canvas, id)); } PHP_FUNCTION(caca_set_frame_name) { + zval *_zval; + char *str; + long str_len; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) { + RETURN_FALSE; + } + caca_canvas_t *canvas; + ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas); + RETURN_SUCCESS(caca_set_frame_name(canvas, str)); } PHP_FUNCTION(caca_create_frame) { + zval *_zval; + long id; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &id) == FAILURE) { + RETURN_FALSE; + } + caca_canvas_t *canvas; + ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas); + RETURN_SUCCESS(caca_create_frame(canvas, id)); } PHP_FUNCTION(caca_free_frame) { + zval *_zval; + long id; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &id) == FAILURE) { + RETURN_FALSE; + } + caca_canvas_t *canvas; + ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas); + RETURN_SUCCESS(caca_free_frame(canvas, id)); } PHP_FUNCTION(caca_set_dither_palette) { @@ -1021,15 +1089,44 @@ PHP_FUNCTION(caca_create_display_with_driver) { } PHP_FUNCTION(caca_get_display_driver_list) { + char const * const *list = caca_get_display_driver_list(); + int i; + array_init(return_value); + for(i = 0; list[i]; i += 2) + add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1); } PHP_FUNCTION(caca_get_display_driver) { + zval *_zval; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) { + RETURN_FALSE; + } + caca_display_t *display; + ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display); + RETURN_STRING((char *) caca_get_display_driver(display), 1); } PHP_FUNCTION(caca_set_display_driver) { + zval *_zval; + char *str; + long str_len; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) { + RETURN_FALSE; + } + caca_display_t *display; + ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display); + RETURN_SUCESS(caca_set_display_driver(display, str)); } PHP_FUNCTION(caca_get_canvas) { + zval *_zval; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) { + RETURN_FALSE; + } + caca_display_t *display; + ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display); + caca_canvas_t *canvas = caca_get_canvas(display); + ZEND_REGISTER_RESOURCE(return_value, canvas, le_caca_canvas); } PHP_FUNCTION(caca_refresh_display) {