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