summaryrefslogtreecommitdiff
path: root/ext/intl/resourcebundle/resourcebundle.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/intl/resourcebundle/resourcebundle.c')
-rw-r--r--ext/intl/resourcebundle/resourcebundle.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/ext/intl/resourcebundle/resourcebundle.c b/ext/intl/resourcebundle/resourcebundle.c
new file mode 100644
index 0000000..6d39dfb
--- /dev/null
+++ b/ext/intl/resourcebundle/resourcebundle.c
@@ -0,0 +1,92 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.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: Hans-Peter Oeri (University of St.Gallen) <hp@oeri.ch> |
+ +----------------------------------------------------------------------+
+ */
+
+#include <unicode/ures.h>
+
+#include <zend.h>
+#include <zend_API.h>
+
+#include "intl_convert.h"
+#include "intl_data.h"
+#include "resourcebundle/resourcebundle_class.h"
+
+/* {{{ ResourceBundle_extract_value */
+void resourcebundle_extract_value( zval *return_value, ResourceBundle_object *source TSRMLS_DC )
+{
+ UResType restype;
+ const UChar* ufield;
+ const uint8_t* bfield;
+ const int32_t* vfield;
+ int32_t ilen;
+ int i;
+ long lfield;
+ ResourceBundle_object* newrb;
+
+ restype = ures_getType( source->child );
+ switch (restype)
+ {
+ case URES_STRING:
+ ufield = ures_getString( source->child, &ilen, &INTL_DATA_ERROR_CODE(source) );
+ INTL_METHOD_CHECK_STATUS(source, "Failed to retrieve string value");
+ INTL_METHOD_RETVAL_UTF8(source, ufield, ilen, 0);
+ break;
+
+ case URES_BINARY:
+ bfield = ures_getBinary( source->child, &ilen, &INTL_DATA_ERROR_CODE(source) );
+ INTL_METHOD_CHECK_STATUS(source, "Failed to retrieve binary value");
+ ZVAL_STRINGL( return_value, (char *) bfield, ilen, 1 );
+ break;
+
+ case URES_INT:
+ lfield = ures_getInt( source->child, &INTL_DATA_ERROR_CODE(source) );
+ INTL_METHOD_CHECK_STATUS(source, "Failed to retrieve integer value");
+ ZVAL_LONG( return_value, lfield );
+ break;
+
+ case URES_INT_VECTOR:
+ vfield = ures_getIntVector( source->child, &ilen, &INTL_DATA_ERROR_CODE(source) );
+ INTL_METHOD_CHECK_STATUS(source, "Failed to retrieve vector value");
+ array_init( return_value );
+ for (i=0; i<ilen; i++) {
+ add_next_index_long( return_value, vfield[i] );
+ }
+ break;
+
+ case URES_ARRAY:
+ case URES_TABLE:
+ object_init_ex( return_value, ResourceBundle_ce_ptr );
+ newrb = (ResourceBundle_object *) zend_object_store_get_object( return_value TSRMLS_CC );
+ newrb->me = source->child;
+ source->child = NULL;
+ intl_errors_reset(INTL_DATA_ERROR_P(source) TSRMLS_CC);
+ break;
+
+ default:
+ intl_errors_set(INTL_DATA_ERROR_P(source), U_ILLEGAL_ARGUMENT_ERROR, "Unknown resource type", 0 TSRMLS_CC);
+ RETURN_FALSE;
+ break;
+ }
+}
+/* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */