1 /*
2 +----------------------------------------------------------------------+
3 | PHP Version 7 |
4 +----------------------------------------------------------------------+
5 | This source file is subject to version 3.01 of the PHP license, |
6 | that is bundled with this package in the file LICENSE, and is |
7 | available through the world-wide-web at the following url: |
8 | http://www.php.net/license/3_01.txt |
9 | If you did not receive a copy of the PHP license and are unable to |
10 | obtain it through the world-wide-web, please send a note to |
11 | license@php.net so we can mail you a copy immediately. |
12 +----------------------------------------------------------------------+
13 | Authors: Hans-Peter Oeri (University of St.Gallen) <hp@oeri.ch> |
14 +----------------------------------------------------------------------+
15 */
16
17 #include <unicode/ures.h>
18
19 #include <zend.h>
20 #include <zend_API.h>
21
22 #include "intl_convert.h"
23 #include "intl_data.h"
24 #include "resourcebundle/resourcebundle_class.h"
25
26 /* {{{ ResourceBundle_extract_value */
resourcebundle_extract_value(zval * return_value,ResourceBundle_object * source)27 void resourcebundle_extract_value( zval *return_value, ResourceBundle_object *source )
28 {
29 UResType restype;
30 const UChar* ufield;
31 const uint8_t* bfield;
32 const int32_t* vfield;
33 int32_t ilen;
34 int i;
35 zend_long lfield;
36 ResourceBundle_object* newrb;
37
38 restype = ures_getType( source->child );
39 switch (restype)
40 {
41 case URES_STRING:
42 ufield = ures_getString( source->child, &ilen, &INTL_DATA_ERROR_CODE(source) );
43 INTL_METHOD_CHECK_STATUS(source, "Failed to retrieve string value");
44 INTL_METHOD_RETVAL_UTF8(source, (UChar *)ufield, ilen, 0);
45 break;
46
47 case URES_BINARY:
48 bfield = ures_getBinary( source->child, &ilen, &INTL_DATA_ERROR_CODE(source) );
49 INTL_METHOD_CHECK_STATUS(source, "Failed to retrieve binary value");
50 ZVAL_STRINGL( return_value, (char *) bfield, ilen );
51 break;
52
53 case URES_INT:
54 lfield = ures_getInt( source->child, &INTL_DATA_ERROR_CODE(source) );
55 INTL_METHOD_CHECK_STATUS(source, "Failed to retrieve integer value");
56 ZVAL_LONG( return_value, lfield );
57 break;
58
59 case URES_INT_VECTOR:
60 vfield = ures_getIntVector( source->child, &ilen, &INTL_DATA_ERROR_CODE(source) );
61 INTL_METHOD_CHECK_STATUS(source, "Failed to retrieve vector value");
62 array_init( return_value );
63 for (i=0; i<ilen; i++) {
64 add_next_index_long( return_value, vfield[i] );
65 }
66 break;
67
68 case URES_ARRAY:
69 case URES_TABLE:
70 object_init_ex( return_value, ResourceBundle_ce_ptr );
71 newrb = Z_INTL_RESOURCEBUNDLE_P(return_value);
72 newrb->me = source->child;
73 source->child = NULL;
74 intl_errors_reset(INTL_DATA_ERROR_P(source));
75 break;
76
77 default:
78 intl_errors_set(INTL_DATA_ERROR_P(source), U_ILLEGAL_ARGUMENT_ERROR, "Unknown resource type", 0);
79 RETURN_FALSE;
80 break;
81 }
82 }
83 /* }}} */
84