@@ -175,6 +175,36 @@ char *TWIG_STRTOLOWER(const char *str, int str_len)
175175 return item_dup ;
176176}
177177
178+ char * TWIG_DECAMELIZE (const char * str )
179+ {
180+ int i , chars = 0 , underscored = 0 ;
181+ char prev , current ;
182+ int str_len = strlen (str );
183+ char * retval = emalloc (2 * str_len + 1 );
184+
185+ prev = str [0 ];
186+ for (i = 1 ; i < str_len ; i ++ ) {
187+ current = str [i ];
188+ if (islower (current ) && isupper (prev ) && i > 1 && !underscored ) {
189+ retval [chars ++ ] = '_' ;
190+ }
191+ underscored = 0 ;
192+ retval [chars ++ ] = tolower (prev );
193+ if (isupper (current ) && (islower (prev ) || isdigit (prev ))) {
194+ retval [chars ++ ] = '_' ;
195+ underscored = 1 ;
196+ } else if (isupper (current ) && prev == '_' ) {
197+ underscored = 1 ;
198+ }
199+ prev = current ;
200+ }
201+
202+ retval [chars ++ ] = prev ;
203+ retval [chars ++ ] = '\0' ;
204+ erealloc (retval , chars );
205+ return retval ;
206+ }
207+
178208zval * TWIG_CALL_USER_FUNC_ARRAY (zval * object , char * function , zval * arguments TSRMLS_DC )
179209{
180210 zend_fcall_info fci ;
@@ -682,11 +712,14 @@ static int twig_add_method_to_class(void *pDest APPLY_TSRMLS_DC, int num_args, v
682712 lMethod = TWIG_STRTOLOWER (method , method_len );
683713
684714 add_assoc_string (retval , lMethod , method , 1 );
715+ add_assoc_string (retval , TWIG_DECAMELIZE (method ), method , 1 );
685716
686717 if (method_len > 3 && 0 == strncmp ("get" , lMethod , 3 )) {
687- add_assoc_string (retval , estrndup (lMethod + 3 , method_len - 3 ), method , 1 );
718+ add_assoc_string (retval , estrndup (lMethod + 3 , method_len - 3 ), method , 1 );
719+ add_assoc_string (retval , TWIG_DECAMELIZE (estrndup (method + 3 , method_len - 3 )), method , 1 );
688720 } else if (method_len > 2 && 0 == strncmp ("is" , lMethod , 2 )) {
689- add_assoc_string (retval , estrndup (lMethod + 2 , method_len - 2 ), method , 1 );
721+ add_assoc_string (retval , estrndup (lMethod + 2 , method_len - 2 ), method , 1 );
722+ add_assoc_string (retval , TWIG_DECAMELIZE (estrndup (method + 2 , method_len - 2 )), method , 1 );
690723 }
691724
692725 return 0 ;
0 commit comments