@@ -719,6 +719,7 @@ static bool php_tidy_set_tidy_opt(TidyDoc doc, const char *optname, zval *value,
719719{
720720 TidyOption opt = tidyGetOptionByName (doc , optname );
721721 zend_long lval ;
722+ zend_string * tmp_str ;
722723
723724 if (!opt ) {
724725 zend_argument_value_error (arg , "Unknown Tidy configuration option \"%s\"" , optname );
@@ -736,17 +737,42 @@ static bool php_tidy_set_tidy_opt(TidyDoc doc, const char *optname, zval *value,
736737
737738 TidyOptionType type = tidyOptGetType (opt );
738739 if (type == TidyString ) {
739- zend_string * tmp_str ;
740740 const zend_string * str = zval_get_tmp_string (value , & tmp_str );
741741 const bool result = tidyOptSetValue (doc , tidyOptGetId (opt ), ZSTR_VAL (str ));
742742 if (UNEXPECTED (!result )) {
743743 zend_argument_type_error (arg , "option \"%s\" does not accept \"%s\" as a value" , optname , ZSTR_VAL (str ));
744744 }
745745 zend_tmp_string_release (tmp_str );
746746 return result ;
747- } else if (type == TidyInteger ) {
748- lval = zval_get_long (value );
749- return tidyOptSetInt (doc , tidyOptGetId (opt ), lval );
747+ } else if (type == TidyInteger ) { /* integer or enum */
748+ ZVAL_DEREF (value );
749+ /* Enum will correspond to a non-numeric string or object */
750+ if (Z_TYPE_P (value ) == IS_STRING || Z_TYPE_P (value ) == IS_OBJECT ) {
751+ double dval ;
752+ bool result ;
753+ const zend_string * str = zval_try_get_tmp_string (value , & tmp_str );
754+ if (UNEXPECTED (!str )) {
755+ return false;
756+ }
757+ uint8_t type = is_numeric_string (ZSTR_VAL (str ), ZSTR_LEN (str ), & lval , & dval , true);
758+ if (type == IS_DOUBLE ) {
759+ lval = zend_dval_to_lval_cap (dval , str );
760+ type = IS_LONG ;
761+ }
762+ if (type == IS_LONG ) {
763+ result = tidyOptSetInt (doc , tidyOptGetId (opt ), lval );
764+ } else {
765+ result = tidyOptSetValue (doc , tidyOptGetId (opt ), ZSTR_VAL (str ));
766+ if (UNEXPECTED (!result )) {
767+ zend_argument_type_error (arg , "option \"%s\" does not accept \"%s\" as a value" , optname , ZSTR_VAL (str ));
768+ }
769+ }
770+ zend_tmp_string_release (tmp_str );
771+ return result ;
772+ } else {
773+ lval = zval_get_long (value );
774+ return tidyOptSetInt (doc , tidyOptGetId (opt ), lval );
775+ }
750776 } else {
751777 ZEND_ASSERT (type == TidyBoolean );
752778 lval = zval_get_long (value );
0 commit comments