6666#include  "ext/standard/php_image.h" 
6767#include  "ext/standard/info.h"  
6868
69- #if  defined(PHP_WIN32 ) ||  (HAVE_MBSTRING  &&  !defined(COMPILE_DL_MBSTRING ))
70- #define  EXIF_USE_MBSTRING  1
71- #else 
72- #define  EXIF_USE_MBSTRING  0
73- #endif 
74- 
75- #if  EXIF_USE_MBSTRING 
76- #include  "ext/mbstring/mbstring.h" 
77- #endif 
78- 
7969/* needed for ssize_t definition */ 
8070#include  <sys/types.h> 
8171
@@ -176,23 +166,19 @@ ZEND_DECLARE_MODULE_GLOBALS(exif)
176166
177167ZEND_INI_MH (OnUpdateEncode )
178168{
179- #if  EXIF_USE_MBSTRING 
180- 	if  (new_value  &&  strlen (new_value ) &&  !php_mb_check_encoding_list (new_value  TSRMLS_CC )) {
169+ 	if  (new_value  &&  strlen (new_value ) &&  !zend_multibyte_check_encoding_list (new_value  TSRMLS_CC )) {
181170		php_error_docref (NULL  TSRMLS_CC , E_WARNING , "Illegal encoding ignored: '%s'" , new_value );
182171		return  FAILURE ;
183172	}
184- #endif 
185173	return  OnUpdateString (entry , new_value , new_value_length , mh_arg1 , mh_arg2 , mh_arg3 , stage  TSRMLS_CC );
186174}
187175
188176ZEND_INI_MH (OnUpdateDecode )
189177{
190- #if  EXIF_USE_MBSTRING 
191- 	if  (!php_mb_check_encoding_list (new_value  TSRMLS_CC )) {
178+ 	if  (!zend_multibyte_check_encoding_list (new_value  TSRMLS_CC )) {
192179		php_error_docref (NULL  TSRMLS_CC , E_WARNING , "Illegal encoding ignored: '%s'" , new_value );
193180		return  FAILURE ;
194181	}
195- #endif 
196182	return  OnUpdateString (entry , new_value , new_value_length , mh_arg1 , mh_arg2 , mh_arg3 , stage  TSRMLS_CC );
197183}
198184
@@ -224,7 +210,11 @@ static PHP_GINIT_FUNCTION(exif)
224210PHP_MINIT_FUNCTION (exif )
225211{
226212	REGISTER_INI_ENTRIES ();
227- 	REGISTER_LONG_CONSTANT ("EXIF_USE_MBSTRING" , EXIF_USE_MBSTRING , CONST_CS  | CONST_PERSISTENT ); 
213+ 	if  (zend_hash_exists (& module_registry , "mbstring" , sizeof ("mbstring" ))) {
214+ 		REGISTER_LONG_CONSTANT ("EXIF_USE_MBSTRING" , 1 , CONST_CS  | CONST_PERSISTENT ); 
215+ 	} else  {
216+ 		REGISTER_LONG_CONSTANT ("EXIF_USE_MBSTRING" , 0 , CONST_CS  | CONST_PERSISTENT ); 
217+ 	}
228218	return  SUCCESS ;
229219}
230220/* }}} */ 
@@ -241,9 +231,7 @@ PHP_MSHUTDOWN_FUNCTION(exif)
241231/* {{{ exif dependencies */ 
242232static  const  zend_module_dep  exif_module_deps [] =  {
243233	ZEND_MOD_REQUIRED ("standard" )
244- #if  EXIF_USE_MBSTRING 
245- 	ZEND_MOD_REQUIRED ("mbstring" )
246- #endif 
234+ 	ZEND_MOD_OPTIONAL ("mbstring" )
247235	{NULL , NULL , NULL }
248236};
249237/* }}} */ 
@@ -2588,7 +2576,6 @@ static int exif_process_undefined(char **result, char *value, size_t byte_count
25882576
25892577/* {{{ exif_process_string_raw 
25902578 * Copy a string in Exif header to a character string returns length of allocated buffer if any. */ 
2591- #if  !EXIF_USE_MBSTRING 
25922579static  int  exif_process_string_raw (char  * * result , char  * value , size_t  byte_count ) {
25932580	/* we cannot use strlcpy - here the problem is that we have to copy NUL 
25942581	 * chars up to byte_count, we also have to add a single NUL character to 
@@ -2602,7 +2589,6 @@ static int exif_process_string_raw(char **result, char *value, size_t byte_count
26022589	}
26032590	return  0 ;
26042591}
2605- #endif 
26062592/* }}} */ 
26072593
26082594/* {{{ exif_process_string 
@@ -2629,11 +2615,8 @@ static int exif_process_string(char **result, char *value, size_t byte_count TSR
26292615static  int  exif_process_user_comment (image_info_type  * ImageInfo , char  * * pszInfoPtr , char  * * pszEncoding , char  * szValuePtr , int  ByteCount  TSRMLS_DC )
26302616{
26312617	int    a ;
2632- 
2633- #if  EXIF_USE_MBSTRING 
26342618	char   * decode ;
26352619	size_t  len ;;
2636- #endif 
26372620
26382621	* pszEncoding  =  NULL ;
26392622	/* Copy the comment */ 
@@ -2642,7 +2625,6 @@ static int exif_process_user_comment(image_info_type *ImageInfo, char **pszInfoP
26422625			* pszEncoding  =  estrdup ((const  char * )szValuePtr );
26432626			szValuePtr  =  szValuePtr + 8 ;
26442627			ByteCount  -=  8 ;
2645- #if  EXIF_USE_MBSTRING 
26462628			/* First try to detect BOM: ZERO WIDTH NOBREAK SPACE (FEFF 16)  
26472629			 * since we have no encoding support for the BOM yet we skip that. 
26482630			 */ 
@@ -2659,34 +2641,38 @@ static int exif_process_user_comment(image_info_type *ImageInfo, char **pszInfoP
26592641			} else  {
26602642				decode  =  ImageInfo -> decode_unicode_le ;
26612643			}
2662- 			* pszInfoPtr  =  php_mb_convert_encoding (szValuePtr , ByteCount , ImageInfo -> encode_unicode , decode , & len  TSRMLS_CC );
2644+ 			if  (zend_multibyte_encoding_converter (
2645+ 					pszInfoPtr , 
2646+ 					& len , 
2647+ 					szValuePtr ,
2648+ 					ByteCount ,
2649+ 					ImageInfo -> encode_unicode ,
2650+ 					decode 
2651+ 					TSRMLS_DC ) !=  0 ) {
2652+ 				len  =  exif_process_string_raw (pszInfoPtr , szValuePtr , ByteCount );
2653+ 			}
26632654			return  len ;
2664- #else 
2665- 			return  exif_process_string_raw (pszInfoPtr , szValuePtr , ByteCount );
2666- #endif 
2667- 		} else 
2668- 		if  (!memcmp (szValuePtr , "ASCII\0\0\0" , 8 )) {
2655+ 		} else  if  (!memcmp (szValuePtr , "ASCII\0\0\0" , 8 )) {
26692656			* pszEncoding  =  estrdup ((const  char * )szValuePtr );
26702657			szValuePtr  =  szValuePtr + 8 ;
26712658			ByteCount  -=  8 ;
2672- 		} else 
2673- 		if  (!memcmp (szValuePtr , "JIS\0\0\0\0\0" , 8 )) {
2659+ 		} else  if  (!memcmp (szValuePtr , "JIS\0\0\0\0\0" , 8 )) {
26742660			/* JIS should be tanslated to MB or we leave it to the user - leave it to the user */ 
26752661			* pszEncoding  =  estrdup ((const  char * )szValuePtr );
26762662			szValuePtr  =  szValuePtr + 8 ;
26772663			ByteCount  -=  8 ;
2678- #if  EXIF_USE_MBSTRING 
2679- 			if  (ImageInfo -> motorola_intel ) {
2680- 				* pszInfoPtr  =  php_mb_convert_encoding (szValuePtr , ByteCount , ImageInfo -> encode_jis , ImageInfo -> decode_jis_be , & len  TSRMLS_CC );
2681- 			} else  {
2682- 				* pszInfoPtr  =  php_mb_convert_encoding (szValuePtr , ByteCount , ImageInfo -> encode_jis , ImageInfo -> decode_jis_le , & len  TSRMLS_CC );
2664+ 			if  (zend_multibyte_encoding_converter (
2665+ 					pszInfoPtr , 
2666+ 					& len , 
2667+ 					szValuePtr ,
2668+ 					ByteCount ,
2669+ 					ImageInfo -> encode_jis ,
2670+ 					ImageInfo -> motorola_intel  ? ImageInfo -> decode_jis_be  : ImageInfo -> decode_jis_le 
2671+ 					TSRMLS_DC ) !=  0 ) {
2672+ 				len  =  exif_process_string_raw (pszInfoPtr , szValuePtr , ByteCount );
26832673			}
26842674			return  len ;
2685- #else 
2686- 			return  exif_process_string_raw (pszInfoPtr , szValuePtr , ByteCount );
2687- #endif 
2688- 		} else 
2689- 		if  (!memcmp (szValuePtr , "\0\0\0\0\0\0\0\0" , 8 )) {
2675+ 		} else  if  (!memcmp (szValuePtr , "\0\0\0\0\0\0\0\0" , 8 )) {
26902676			/* 8 NULL means undefined and should be ASCII... */ 
26912677			* pszEncoding  =  estrdup ("UNDEFINED" );
26922678			szValuePtr  =  szValuePtr + 8 ;
@@ -2714,19 +2700,17 @@ static int exif_process_unicode(image_info_type *ImageInfo, xp_field_type *xp_fi
27142700	xp_field -> tag  =  tag ;	
27152701
27162702	/* Copy the comment */ 
2717- #if  EXIF_USE_MBSTRING 
2718- /*  What if MS supports big-endian with XP? */ 
2719- /*	if (ImageInfo->motorola_intel) { 
2720- 		xp_field->value = php_mb_convert_encoding(szValuePtr, ByteCount, ImageInfo->encode_unicode, ImageInfo->decode_unicode_be, &xp_field->size TSRMLS_CC); 
2721- 	} else { 
2722- 		xp_field->value = php_mb_convert_encoding(szValuePtr, ByteCount, ImageInfo->encode_unicode, ImageInfo->decode_unicode_le, &xp_field->size TSRMLS_CC); 
2723- 	}*/ 
2724- 	xp_field -> value  =  php_mb_convert_encoding (szValuePtr , ByteCount , ImageInfo -> encode_unicode , ImageInfo -> decode_unicode_le , & xp_field -> size  TSRMLS_CC );
2725- 	return  xp_field -> size ;
2726- #else 
2727- 	xp_field -> size  =  exif_process_string_raw (& xp_field -> value , szValuePtr , ByteCount );
2703+ 	if  (zend_multibyte_encoding_converter (
2704+ 			& xp_field -> value , 
2705+ 			& xp_field -> size , 
2706+ 			szValuePtr ,
2707+ 			ByteCount ,
2708+ 			ImageInfo -> encode_unicode ,
2709+ 			ImageInfo -> motorola_intel  ? ImageInfo -> decode_unicode_be  : ImageInfo -> decode_unicode_le 
2710+ 			TSRMLS_DC ) !=  0 ) {
2711+ 		xp_field -> size  =  exif_process_string_raw (& xp_field -> value , szValuePtr , ByteCount );
2712+ 	}
27282713	return  xp_field -> size ;
2729- #endif 
27302714}
27312715/* }}} */ 
27322716
0 commit comments