--- /dev/null
+dnl $Id$
+dnl config.m4 for extension fribidi
+dnl don't forget to call PHP_EXTENSION(fribidi)
+
+
+
+PHP_ARG_WITH(fribidi, whether to add fribidi support,
+[ --with-fribidi[=DIR] Include fribidi support (requires FriBidi >=0.1.12).
+ DIR is the fribidi installation directory -
+ default /usr/local/],"no")
+
+
+
+if test "$PHP_FRIBIDI" != "no"; then
+
+dnl if module was requested with default path of fribidi installation then
+dnl $PHP_FRIBIDI will be "yes"
+
+ if test "$PHP_FRIBIDI" == "yes"; then
+ PHP_FRIBIDI="/usr/local"
+ fi
+
+
+
+ dnl check for fribidi header files
+
+ AC_MSG_CHECKING([for header files in "$PHP_FRIBIDI/include/fribidi"])
+ if test -f $PHP_FRIBIDI/include/fribidi/fribidi.h && test -f $PHP_FRIBIDI/include/fribidi/fribidi_types.h && test -f $PHP_FRIBIDI/include/fribidi/fribidi_char_sets.h; then
+ FRIBIDI_INCDIR="$PHP_FRIBIDI/include/fribidi/"
+ AC_MSG_RESULT([found all])
+ else
+ AC_MSG_RESULT([missing])
+ fi
+
+
+
+ dnl check for fribidi shared library
+
+ AC_MSG_CHECKING([for libfribidi.so file in "$PHP_FRIBIDI/lib/"])
+ if test -f "$PHP_FRIBIDI/lib/libfribidi.so" ; then
+ FRIBIDI_LIBDIR="$PHP_FRIBIDI/lib/"
+ AC_MSG_RESULT([found])
+ else
+ AC_MSG_RESULT([missing])
+ fi
+
+ dnl check for glib header files
+
+ AC_MSG_CHECKING([for glibconfig.h in "usr/lib/glib/include/"])
+ if test -f /usr/lib/glib/include/glibconfig.h ; then
+ AC_MSG_RESULT([found])
+ GLIB_INCDIR=/usr/lib/glib/include/
+ else
+ AC_MSG_RESULT([missing])
+ fi
+
+
+ AC_MSG_CHECKING([sanity to build extension])
+ if test -n "$FRIBIDI_INCDIR" && test -n "$FRIBIDI_LIBDIR" && test -n "$GLIB_INCDIR"; then
+
+ AC_MSG_RESULT([yes])
+
+
+ AC_ADD_INCLUDE("$FRIBIDI_INCDIR")
+ AC_ADD_INCLUDE("$GLIB_INCDIR")
+ AC_ADD_LIBRARY_WITH_PATH(fribidi,"$FRIBIDI_LIBDIR", FRIBIDI_SHARED_LIBADD)
+ PHP_SUBST(FRIBIDI_SHARED_LIBADD)
+
+ AC_DEFINE(HAVE_FRIBIDI, 1, [ ])
+ PHP_EXTENSION(fribidi, $ext_shared)
+ else
+ AC_MSG_RESULT([no])
+ fi
+fi
--- /dev/null
+/*
+ +----------------------------------------------------------------------+
+ | PHP version 4.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 2.02 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available at through the world-wide-web at |
+ | http://www.php.net/license/2_02.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: |
+ | |
+ +----------------------------------------------------------------------+
+ */
+
+#include "php.h"
+#include "php_ini.h"
+#include "php_fribidi.h"
+#include "fribidi.h"
+
+/* You should tweak config.m4 so this symbol (or some else suitable)
+ gets defined.
+*/
+#if HAVE_FRIBIDI
+
+/* If you declare any globals in php_fribidi.h uncomment this:
+ZEND_DECLARE_MODULE_GLOBALS(fribidi)
+*/
+
+/* True global resources - no need for thread safety here */
+/* static int le_fribidi; */
+
+/* Every user visible function must have an entry in fribidi_functions[].
+*/
+function_entry fribidi_functions[] = {
+ ZEND_FE(fribidi_log2vis, NULL)
+ {NULL, NULL, NULL} /* Must be the last line in fribidi_functions[] */
+};
+
+zend_module_entry fribidi_module_entry = {
+ "fribidi",
+ fribidi_functions,
+ PHP_MINIT(fribidi),
+ PHP_MSHUTDOWN(fribidi),
+ PHP_RINIT(fribidi), /* Replace with NULL if there's nothing to do at request start */
+ PHP_RSHUTDOWN(fribidi), /* Replace with NULL if there's nothing to do at request end */
+ PHP_MINFO(fribidi),
+ STANDARD_MODULE_PROPERTIES
+};
+
+#ifdef COMPILE_DL_FRIBIDI
+ZEND_GET_MODULE(fribidi)
+#endif
+
+/* Remove comments and fill if you need to have entries in php.ini
+PHP_INI_BEGIN()
+PHP_INI_END()
+*/
+
+PHP_MINIT_FUNCTION(fribidi)
+{
+/* Remove comments if you have entries in php.ini
+ REGISTER_INI_ENTRIES();
+*/
+
+ REGISTER_LONG_CONSTANT("FRIBIDI_CHARSET_UTF8",FRIBIDI_CHARSET_UTF8, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("FRIBIDI_CHARSET_8859_6",FRIBIDI_CHARSET_8859_6, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("FRIBIDI_CHARSET_8859_8",FRIBIDI_CHARSET_8859_8, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("FRIBIDI_CHARSET_CP1255",FRIBIDI_CHARSET_CP1255, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("FRIBIDI_CHARSET_CP1256",FRIBIDI_CHARSET_CP1256, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("FRIBIDI_CHARSET_ISIRI_3342",FRIBIDI_CHARSET_ISIRI_3342, CONST_CS | CONST_PERSISTENT);
+
+ return SUCCESS;
+}
+
+PHP_MSHUTDOWN_FUNCTION(fribidi)
+{
+/* Remove comments if you have entries in php.ini
+ UNREGISTER_INI_ENTRIES();
+*/
+ return SUCCESS;
+}
+
+/* Remove if there's nothing to do at request start */
+PHP_RINIT_FUNCTION(fribidi)
+{
+ return SUCCESS;
+}
+
+/* Remove if there's nothing to do at request end */
+PHP_RSHUTDOWN_FUNCTION(fribidi)
+{
+ return SUCCESS;
+}
+
+PHP_MINFO_FUNCTION(fribidi)
+{
+ php_info_print_table_start();
+ php_info_print_table_header(2, "fribidi support", "enabled");
+ php_info_print_table_end();
+
+ /* Remove comments if you have entries in php.ini
+ DISPLAY_INI_ENTRIES();
+ */
+}
+
+
+/*--------------------------------------------------------------*/
+/* Name: fribidi_log2vis */
+/* Purpose: convert a logical string to a visual one */
+/* Input: 1) The logical string. */
+/* 2) Base direction - */
+/* Possible values: */
+/* a) "L" - base language is left to right. */
+/* b) "R" - base language is right to left. */
+/* c) empty - base language is determined */
+/* automatically by the FriBiDi algorithm */
+/* 3) Character code being used - */
+/* Possible values (i.e., char sets supported) */
+/* FRIBIDI_CHARSET_UTF8 */
+/* FRIBIDI_CHARSET_8859_6 */
+/* FRIBIDI_CHARSET_8859_8 */
+/* FRIBIDI_CHARSET_CP1255 */
+/* FRIBIDI_CHARSET_CP1256 */
+/* FRIBIDI_CHARSET_ISIRI_3342 */
+/* */
+/* Output: on success: The visual string. */
+/* on failure: */
+/*--------------------------------------------------------------*/
+
+ZEND_FUNCTION(fribidi_log2vis)
+{
+ zval **parameter1,**parameter2, **parameter3;
+
+
+ FriBidiChar *u_logical_str,*u_visual_str; /* unicode strings .... */
+ char *inString;
+ guchar *outString;
+ int len,alloc_len,utf8_len;
+
+
+ FriBidiCharType base_dir;
+
+ guint16 *position_L_to_V_list;
+ guint16 *position_V_to_L_list;
+ guint8 *embedding_level_list;
+
+ /* get parameters from input */
+
+ if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, ¶meter1, ¶meter2, ¶meter3) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ /* convert input to expected type.... */
+
+ convert_to_string_ex(parameter1);
+ convert_to_string_ex(parameter2);
+ convert_to_long_ex(parameter3);
+
+ /* allocate space and prepare all local variables */
+
+
+ len = Z_STRLEN_PP(parameter1);
+
+ inString = estrndup(Z_STRVAL_PP(parameter1), len);
+
+ alloc_len = len+1;
+
+ u_logical_str = (FriBidiChar*) emalloc(sizeof(FriBidiChar)*alloc_len);
+ u_visual_str = (FriBidiChar*) emalloc(sizeof(FriBidiChar)*alloc_len);
+
+ position_L_to_V_list = (guint16*) emalloc(sizeof(guint16)*alloc_len);
+ position_V_to_L_list = (guint16*) emalloc(sizeof(guint16)*alloc_len);
+ embedding_level_list = (guint8*) emalloc(sizeof(guint8)*alloc_len);
+
+ outString = (guchar*)emalloc(sizeof(guchar)*alloc_len);
+
+ if(inString[len-1] == '\n') {
+ inString[len-1] = '\0';
+ }
+
+ switch(Z_LVAL_PP(parameter3)) {
+ case FRIBIDI_CHARSET_UTF8:
+ utf8_len=fribidi_utf8_to_unicode(inString,u_logical_str);
+ break;
+ case FRIBIDI_CHARSET_8859_6:
+ fribidi_iso8859_6_to_unicode(inString,u_logical_str);
+ break;
+ case FRIBIDI_CHARSET_8859_8:
+ fribidi_iso8859_8_to_unicode(inString,u_logical_str);
+ break;
+ case FRIBIDI_CHARSET_CP1255:
+ fribidi_cp1255_to_unicode(inString,u_logical_str);
+ break;
+ case FRIBIDI_CHARSET_CP1256:
+ fribidi_cp1256_to_unicode(inString,u_logical_str);
+ break;
+ case FRIBIDI_CHARSET_ISIRI_3342:
+ fribidi_isiri_3342_to_unicode(inString,u_logical_str);
+ break;
+ default:
+ zend_error(E_ERROR,"unknown character set %d<BR>",Z_LVAL_PP(parameter3));
+ }
+
+
+ /* visualize the logical.... */
+
+ if ((Z_STRVAL_PP(parameter2))[0] == 'R') {
+ base_dir = FRIBIDI_TYPE_RTL;
+ } else if (Z_STRVAL_PP(parameter2)[0] == 'L')
+ base_dir = FRIBIDI_TYPE_LTR;
+ else
+ base_dir = FRIBIDI_TYPE_N;
+
+ fribidi_log2vis(u_logical_str,len,&base_dir,u_visual_str,position_L_to_V_list,position_V_to_L_list,embedding_level_list);
+
+ /* convert back to original char set */
+
+ switch(Z_LVAL_PP(parameter3)) {
+ case FRIBIDI_CHARSET_UTF8:
+ fribidi_unicode_to_utf8(u_visual_str,utf8_len , outString);
+ break;
+ case FRIBIDI_CHARSET_8859_6:
+ fribidi_unicode_to_iso8859_6(u_visual_str,len , outString);
+ break;
+ case FRIBIDI_CHARSET_8859_8:
+ fribidi_unicode_to_iso8859_8(u_visual_str,len , outString);
+ break;
+ case FRIBIDI_CHARSET_CP1255:
+ fribidi_unicode_to_cp1255(u_visual_str,len , outString);
+ break;
+ case FRIBIDI_CHARSET_CP1256:
+ fribidi_unicode_to_cp1256(u_visual_str,len , outString);
+ break;
+ case FRIBIDI_CHARSET_ISIRI_3342:
+ fribidi_unicode_to_isiri_3342(u_visual_str,len , outString);
+ break;
+ default:
+ zend_error(E_ERROR,"unknown character set %d<BR>",Z_LVAL_PP(parameter3));
+ }
+
+
+ efree(u_logical_str);
+ efree(u_visual_str);
+
+ efree(position_L_to_V_list);
+ efree(position_V_to_L_list);
+ efree(embedding_level_list);
+
+ RETURN_STRING(outString,1);
+}
+
+#endif /* HAVE_FRIBIDI */
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
--- /dev/null
+/*
+ +----------------------------------------------------------------------+
+ | PHP version 4.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 2.02 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available at through the world-wide-web at |
+ | http://www.php.net/license/2_02.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: |
+ | |
+ +----------------------------------------------------------------------+
+ */
+
+#ifndef PHP_FRIBIDI_H
+#define PHP_FRIBIDI_H
+
+#if HAVE_FRIBIDI
+
+#include "fribidi.h"
+#include "../standard/info.h"
+
+extern zend_module_entry fribidi_module_entry;
+#define phpext_fribidi_ptr &fribidi_module_entry
+
+
+typedef struct _php_fribidi_rsrc{
+ guint16 *position_L_to_V_list;
+ guint16 *position_V_to_L_list;
+ guint8 *embedding_level_list;
+ guchar *out_string;
+} php_fribidi_rsrc;
+
+
+#ifdef PHP_WIN32
+#define PHP_FRIBIDI_API __declspec(dllexport)
+#else
+#define PHP_FRIBIDI_API
+#endif
+
+PHP_MINIT_FUNCTION(fribidi);
+PHP_MSHUTDOWN_FUNCTION(fribidi);
+PHP_RINIT_FUNCTION(fribidi);
+PHP_RSHUTDOWN_FUNCTION(fribidi);
+PHP_MINFO_FUNCTION(fribidi);
+
+ZEND_FUNCTION(fribidi_log2vis);
+/*void php_fribidi_free_rsrc(php_fribidi_rsrc* p_rsrc);*/
+/*
+ Declare any global variables you may need between the BEGIN
+ and END macros here:
+
+ZEND_BEGIN_MODULE_GLOBALS(fribidi)
+ int global_variable;
+ZEND_END_MODULE_GLOBALS(fribidi)
+*/
+
+/* In every function that needs to use variables in php_fribidi_globals,
+ do call FRIBIDILS_FETCH(); after declaring other variables used by
+ that function, and always refer to them as FRIBIDIG(variable).
+ You are encouraged to rename these macros something shorter, see
+ examples in any other php module directory.
+*/
+
+#ifdef ZTS
+#define FRIBIDIG(v) (fribidi_globals->v)
+#define FRIBIDILS_FETCH() php_fribidi_globals *fribidi_globals = ts_resource(fribidi_globals_id)
+#else
+#define FRIBIDIG(v) (fribidi_globals.v)
+#define FRIBIDILS_FETCH()
+#endif
+
+#else
+
+#define phpext_fribidi_ptr NULL
+
+#endif
+
+#endif /* PHP_FRIBIDI_H */
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */