PHP  
 PHP: Test and Code Coverage Analysis
downloads | QA | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net 
 

LTP GCOV extension - code coverage report
Current view: directory - tidy - tidy.c
Test: PHP Code Coverage
Date: 2009-11-19 Instrumented lines: 743
Code covered: 85.9 % Executed lines: 638
Legend: not executed executed

       1                 : /*
       2                 :   +----------------------------------------------------------------------+
       3                 :   | PHP Version 5                                                        |
       4                 :   +----------------------------------------------------------------------+
       5                 :   | Copyright (c) 1997-2009 The PHP Group                                |
       6                 :   +----------------------------------------------------------------------+
       7                 :   | This source file is subject to version 3.01 of the PHP license,      |
       8                 :   | that is bundled with this package in the file LICENSE, and is        |
       9                 :   | available through the world-wide-web at the following url:           |
      10                 :   | http://www.php.net/license/3_01.txt                                  |
      11                 :   | If you did not receive a copy of the PHP license and are unable to   |
      12                 :   | obtain it through the world-wide-web, please send a note to          |
      13                 :   | license@php.net so we can mail you a copy immediately.               |
      14                 :   +----------------------------------------------------------------------+
      15                 :   | Author: John Coggeshall <john@php.net>                               |
      16                 :   +----------------------------------------------------------------------+
      17                 : */
      18                 : 
      19                 : /* $Id: tidy.c 272374 2008-12-31 11:17:49Z sebastian $ */
      20                 : 
      21                 : #ifdef HAVE_CONFIG_H
      22                 : #include "config.h"
      23                 : #endif
      24                 : 
      25                 : #include "php.h"
      26                 : #include "php_tidy.h"
      27                 : 
      28                 : #if HAVE_TIDY
      29                 : 
      30                 : #include "php_ini.h"
      31                 : #include "ext/standard/info.h"
      32                 : #include "safe_mode.h"
      33                 : 
      34                 : #include "tidy.h"
      35                 : #include "buffio.h"
      36                 : 
      37                 : /* compatibility with older versions of libtidy */
      38                 : #ifndef TIDY_CALL
      39                 : #define TIDY_CALL
      40                 : #endif
      41                 : 
      42                 : #define PHP_TIDY_MODULE_VERSION "2.0"
      43                 : 
      44                 : /* {{{ ext/tidy macros
      45                 : */
      46                 : #define TIDY_SET_CONTEXT \
      47                 :     zval *object = getThis();
      48                 : 
      49                 : #define TIDY_FETCH_OBJECT       \
      50                 :         PHPTidyObj *obj;        \
      51                 :         TIDY_SET_CONTEXT; \
      52                 :         if (object) {   \
      53                 :                 if (ZEND_NUM_ARGS()) {  \
      54                 :                         WRONG_PARAM_COUNT;      \
      55                 :                 }       \
      56                 :         } else {        \
      57                 :                 if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, NULL, "O", &object, tidy_ce_doc) == FAILURE) {        \
      58                 :                         RETURN_FALSE;   \
      59                 :                 }       \
      60                 :         }       \
      61                 :         obj = (PHPTidyObj *) zend_object_store_get_object(object TSRMLS_CC);    \
      62                 : 
      63                 : #define TIDY_FETCH_ONLY_OBJECT  \
      64                 :         PHPTidyObj *obj;        \
      65                 :         TIDY_SET_CONTEXT; \
      66                 :         if (ZEND_NUM_ARGS()) {  \
      67                 :                 WRONG_PARAM_COUNT;      \
      68                 :         }       \
      69                 :         obj = (PHPTidyObj *) zend_object_store_get_object(object TSRMLS_CC);    \
      70                 : 
      71                 : #define TIDY_APPLY_CONFIG_ZVAL(_doc, _val) \
      72                 :     if(_val) { \
      73                 :         if(Z_TYPE_PP(_val) == IS_ARRAY) { \
      74                 :             _php_tidy_apply_config_array(_doc, HASH_OF(*_val) TSRMLS_CC); \
      75                 :         } else { \
      76                 :             convert_to_string_ex(_val); \
      77                 :             TIDY_SAFE_MODE_CHECK(Z_STRVAL_PP(_val)); \
      78                 :             switch (tidyLoadConfig(_doc, Z_STRVAL_PP(_val))) { \
      79                 :               case -1: \
      80                 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not load configuration file '%s'", Z_STRVAL_PP(_val)); \
      81                 :                 break; \
      82                 :               case 1: \
      83                 :                 php_error_docref(NULL TSRMLS_CC, E_NOTICE, "There were errors while parsing the configuration file '%s'", Z_STRVAL_PP(_val)); \
      84                 :                 break; \
      85                 :             } \
      86                 :         } \
      87                 :     }
      88                 : 
      89                 : #define REGISTER_TIDY_CLASS(classname, name, parent, __flags) \
      90                 :         { \
      91                 :                 zend_class_entry ce; \
      92                 :                 INIT_CLASS_ENTRY(ce, # classname, tidy_funcs_ ## name); \
      93                 :                 ce.create_object = tidy_object_new_ ## name; \
      94                 :                 tidy_ce_ ## name = zend_register_internal_class_ex(&ce, parent, NULL TSRMLS_CC); \
      95                 :                 tidy_ce_ ## name->ce_flags |= __flags;  \
      96                 :                 memcpy(&tidy_object_handlers_ ## name, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); \
      97                 :                 tidy_object_handlers_ ## name.clone_obj = NULL; \
      98                 :         }
      99                 : 
     100                 : #define TIDY_TAG_CONST(tag) REGISTER_LONG_CONSTANT("TIDY_TAG_" #tag, TidyTag_##tag, CONST_CS | CONST_PERSISTENT)
     101                 : #define TIDY_NODE_CONST(name, type) REGISTER_LONG_CONSTANT("TIDY_NODETYPE_" #name, TidyNode_##type, CONST_CS | CONST_PERSISTENT)
     102                 : 
     103                 : #ifndef TRUE
     104                 : #define TRUE 1
     105                 : #endif
     106                 : 
     107                 : #ifndef FALSE
     108                 : #define FALSE 0
     109                 : #endif
     110                 : 
     111                 : #define ADD_PROPERTY_STRING(_table, _key, _string) \
     112                 :         { \
     113                 :                 zval *tmp; \
     114                 :                 MAKE_STD_ZVAL(tmp); \
     115                 :                 if (_string) { \
     116                 :                         ZVAL_STRING(tmp, (char *)_string, 1); \
     117                 :                 } else { \
     118                 :                         ZVAL_EMPTY_STRING(tmp); \
     119                 :                 } \
     120                 :                 zend_hash_update(_table, #_key, sizeof(#_key), (void *)&tmp, sizeof(zval *), NULL); \
     121                 :         }
     122                 : 
     123                 : #define ADD_PROPERTY_STRINGL(_table, _key, _string, _len) \
     124                 :    { \
     125                 :        zval *tmp; \
     126                 :        MAKE_STD_ZVAL(tmp); \
     127                 :        if (_string) { \
     128                 :            ZVAL_STRINGL(tmp, (char *)_string, _len, 1); \
     129                 :        } else { \
     130                 :            ZVAL_EMPTY_STRING(tmp); \
     131                 :        } \
     132                 :        zend_hash_update(_table, #_key, sizeof(#_key), (void *)&tmp, sizeof(zval *), NULL); \
     133                 :    }
     134                 : 
     135                 : #define ADD_PROPERTY_LONG(_table, _key, _long) \
     136                 :         { \
     137                 :                 zval *tmp; \
     138                 :                 MAKE_STD_ZVAL(tmp); \
     139                 :                 ZVAL_LONG(tmp, _long); \
     140                 :                 zend_hash_update(_table, #_key, sizeof(#_key), (void *)&tmp, sizeof(zval *), NULL); \
     141                 :         }
     142                 : 
     143                 : #define ADD_PROPERTY_NULL(_table, _key) \
     144                 :         { \
     145                 :                 zval *tmp; \
     146                 :                 MAKE_STD_ZVAL(tmp); \
     147                 :                 ZVAL_NULL(tmp); \
     148                 :                 zend_hash_update(_table, #_key, sizeof(#_key), (void *)&tmp, sizeof(zval *), NULL); \
     149                 :         }
     150                 : 
     151                 : #define ADD_PROPERTY_BOOL(_table, _key, _bool) \
     152                 :     { \
     153                 :        zval *tmp; \
     154                 :        MAKE_STD_ZVAL(tmp); \
     155                 :        ZVAL_BOOL(tmp, _bool); \
     156                 :        zend_hash_update(_table, #_key, sizeof(#_key), (void *)&tmp, sizeof(zval *), NULL); \
     157                 :    }
     158                 : 
     159                 : #define TIDY_SAFE_MODE_CHECK(filename) \
     160                 : if ((PG(safe_mode) && (!php_checkuid(filename, NULL, CHECKUID_CHECK_FILE_AND_DIR))) || php_check_open_basedir(filename TSRMLS_CC)) { \
     161                 :         RETURN_FALSE; \
     162                 : } \
     163                 : 
     164                 : #define TIDY_SET_DEFAULT_CONFIG(_doc) \
     165                 :         if (TG(default_config) && TG(default_config)[0]) { \
     166                 :                 if (tidyLoadConfig(_doc, TG(default_config)) < 0) { \
     167                 :                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to load Tidy configuration file at '%s'.", TG(default_config)); \
     168                 :                 } \
     169                 :         }
     170                 : /* }}} */
     171                 : 
     172                 : /* {{{ ext/tidy structs 
     173                 : */
     174                 : typedef struct _PHPTidyDoc PHPTidyDoc;
     175                 : typedef struct _PHPTidyObj PHPTidyObj;
     176                 : 
     177                 : typedef enum {
     178                 :         is_node,
     179                 :         is_doc
     180                 : } tidy_obj_type;
     181                 : 
     182                 : typedef enum {
     183                 :         is_root_node,
     184                 :         is_html_node,
     185                 :         is_head_node,
     186                 :         is_body_node
     187                 : } tidy_base_nodetypes;
     188                 : 
     189                 : struct _PHPTidyDoc {
     190                 :         TidyDoc     doc;
     191                 :         TidyBuffer  *errbuf;
     192                 :         unsigned int ref_count;
     193                 : };
     194                 : 
     195                 : struct _PHPTidyObj {
     196                 :         zend_object         std;
     197                 :         TidyNode            node;
     198                 :         tidy_obj_type       type;
     199                 :         PHPTidyDoc          *ptdoc;
     200                 : };
     201                 : /* }}} */
     202                 : 
     203                 : /* {{{ ext/tidy prototypes
     204                 : */
     205                 : static char *php_tidy_file_to_mem(char *, zend_bool, int * TSRMLS_DC);
     206                 : static void tidy_object_free_storage(void * TSRMLS_DC);
     207                 : static zend_object_value tidy_object_new_node(zend_class_entry * TSRMLS_DC);
     208                 : static zend_object_value tidy_object_new_doc(zend_class_entry * TSRMLS_DC);
     209                 : static zend_class_entry *tidy_get_ce_node(zval * TSRMLS_DC);
     210                 : static zend_class_entry *tidy_get_ce_doc(zval * TSRMLS_DC);
     211                 : static zval * tidy_instanciate(zend_class_entry *, zval * TSRMLS_DC);
     212                 : static int tidy_doc_cast_handler(zval *, zval *, int TSRMLS_DC);
     213                 : static int tidy_node_cast_handler(zval *, zval *, int TSRMLS_DC);
     214                 : static void tidy_doc_update_properties(PHPTidyObj * TSRMLS_DC);
     215                 : static void tidy_add_default_properties(PHPTidyObj *, tidy_obj_type TSRMLS_DC);
     216                 : static void *php_tidy_get_opt_val(PHPTidyDoc *, TidyOption, TidyOptionType * TSRMLS_DC);
     217                 : static void php_tidy_create_node(INTERNAL_FUNCTION_PARAMETERS, tidy_base_nodetypes);
     218                 : static int _php_tidy_set_tidy_opt(TidyDoc, char *, zval * TSRMLS_DC);
     219                 : static int _php_tidy_apply_config_array(TidyDoc doc, HashTable *ht_options TSRMLS_DC);
     220                 : static void _php_tidy_register_nodetypes(INIT_FUNC_ARGS);
     221                 : static void _php_tidy_register_tags(INIT_FUNC_ARGS);
     222                 : 
     223                 : static PHP_MINIT_FUNCTION(tidy);
     224                 : static PHP_MSHUTDOWN_FUNCTION(tidy);
     225                 : static PHP_RINIT_FUNCTION(tidy);
     226                 : static PHP_MINFO_FUNCTION(tidy);
     227                 : 
     228                 : static PHP_FUNCTION(tidy_getopt);
     229                 : static PHP_FUNCTION(tidy_parse_string);
     230                 : static PHP_FUNCTION(tidy_parse_file);
     231                 : static PHP_FUNCTION(tidy_clean_repair);
     232                 : static PHP_FUNCTION(tidy_repair_string);
     233                 : static PHP_FUNCTION(tidy_repair_file);
     234                 : static PHP_FUNCTION(tidy_diagnose);
     235                 : static PHP_FUNCTION(tidy_get_output);
     236                 : static PHP_FUNCTION(tidy_get_error_buffer);
     237                 : static PHP_FUNCTION(tidy_get_release);
     238                 : static PHP_FUNCTION(tidy_get_config);
     239                 : static PHP_FUNCTION(tidy_get_status);
     240                 : static PHP_FUNCTION(tidy_get_html_ver);
     241                 : #if HAVE_TIDYOPTGETDOC
     242                 : static PHP_FUNCTION(tidy_get_opt_doc);
     243                 : #endif
     244                 : static PHP_FUNCTION(tidy_is_xhtml);
     245                 : static PHP_FUNCTION(tidy_is_xml);
     246                 : static PHP_FUNCTION(tidy_error_count);
     247                 : static PHP_FUNCTION(tidy_warning_count);
     248                 : static PHP_FUNCTION(tidy_access_count);
     249                 : static PHP_FUNCTION(tidy_config_count);
     250                 : 
     251                 : static PHP_FUNCTION(ob_tidyhandler);
     252                 : 
     253                 : static PHP_FUNCTION(tidy_get_root);
     254                 : static PHP_FUNCTION(tidy_get_html);
     255                 : static PHP_FUNCTION(tidy_get_head);
     256                 : static PHP_FUNCTION(tidy_get_body);
     257                 : 
     258                 : static TIDY_DOC_METHOD(__construct);
     259                 : static TIDY_DOC_METHOD(parseFile);
     260                 : static TIDY_DOC_METHOD(parseString);
     261                 : 
     262                 : static TIDY_NODE_METHOD(hasChildren);
     263                 : static TIDY_NODE_METHOD(hasSiblings);
     264                 : static TIDY_NODE_METHOD(isComment);
     265                 : static TIDY_NODE_METHOD(isHtml);
     266                 : static TIDY_NODE_METHOD(isText);
     267                 : static TIDY_NODE_METHOD(isJste);
     268                 : static TIDY_NODE_METHOD(isAsp);
     269                 : static TIDY_NODE_METHOD(isPhp);
     270                 : static TIDY_NODE_METHOD(getParent);
     271                 : /* }}} */
     272                 : 
     273                 : ZEND_DECLARE_MODULE_GLOBALS(tidy)
     274                 : 
     275                 : PHP_INI_BEGIN()
     276                 : STD_PHP_INI_ENTRY("tidy.default_config",      "",   PHP_INI_SYSTEM,         OnUpdateString,         default_config,         zend_tidy_globals,      tidy_globals)
     277                 : PHP_INI_ENTRY("tidy.clean_output",     "0",    PHP_INI_PERDIR,         NULL)
     278                 : PHP_INI_END()
     279                 : 
     280                 : static zend_function_entry tidy_functions[] = {
     281                 :         PHP_FE(tidy_getopt,             NULL)
     282                 :         PHP_FE(tidy_parse_string,       NULL)
     283                 :         PHP_FE(tidy_parse_file,         NULL)
     284                 :         PHP_FE(tidy_get_output,         NULL)
     285                 :         PHP_FE(tidy_get_error_buffer,   NULL) 
     286                 :         PHP_FE(tidy_clean_repair,       NULL)
     287                 :         PHP_FE(tidy_repair_string,      NULL)
     288                 :         PHP_FE(tidy_repair_file,        NULL)
     289                 :         PHP_FE(tidy_diagnose,           NULL)
     290                 :         PHP_FE(tidy_get_release,        NULL)
     291                 :         PHP_FE(tidy_get_config,         NULL)
     292                 :         PHP_FE(tidy_get_status,         NULL)
     293                 :         PHP_FE(tidy_get_html_ver,       NULL)
     294                 :         PHP_FE(tidy_is_xhtml,           NULL)
     295                 :         PHP_FE(tidy_is_xml,             NULL)
     296                 :         PHP_FE(tidy_error_count,        NULL)
     297                 :         PHP_FE(tidy_warning_count,      NULL)
     298                 :         PHP_FE(tidy_access_count,       NULL)
     299                 :         PHP_FE(tidy_config_count,       NULL) 
     300                 : #if HAVE_TIDYOPTGETDOC
     301                 :         PHP_FE(tidy_get_opt_doc,        NULL)
     302                 : #endif
     303                 :         PHP_FE(tidy_get_root,           NULL)
     304                 :         PHP_FE(tidy_get_head,           NULL)
     305                 :         PHP_FE(tidy_get_html,           NULL)
     306                 :         PHP_FE(tidy_get_body,           NULL)
     307                 :         PHP_FE(ob_tidyhandler,          NULL)
     308                 :         {NULL, NULL, NULL}
     309                 : };
     310                 : 
     311                 : static zend_function_entry tidy_funcs_doc[] = {
     312                 :         TIDY_METHOD_MAP(getOpt, tidy_getopt, NULL)
     313                 :         TIDY_METHOD_MAP(cleanRepair, tidy_clean_repair, NULL)
     314                 :         TIDY_DOC_ME(parseFile, NULL)
     315                 :         TIDY_DOC_ME(parseString, NULL)
     316                 :         TIDY_METHOD_MAP(repairString, tidy_repair_string, NULL)
     317                 :         TIDY_METHOD_MAP(repairFile, tidy_repair_file, NULL)
     318                 :         TIDY_METHOD_MAP(diagnose, tidy_diagnose, NULL)
     319                 :         TIDY_METHOD_MAP(getRelease, tidy_get_release, NULL)
     320                 :         TIDY_METHOD_MAP(getConfig, tidy_get_config, NULL)
     321                 :         TIDY_METHOD_MAP(getStatus, tidy_get_status, NULL)
     322                 :         TIDY_METHOD_MAP(getHtmlVer, tidy_get_html_ver, NULL)
     323                 : #if HAVE_TIDYOPTGETDOC
     324                 :         TIDY_METHOD_MAP(getOptDoc, tidy_get_opt_doc, NULL)
     325                 : #endif
     326                 :         TIDY_METHOD_MAP(isXhtml, tidy_is_xhtml, NULL)
     327                 :         TIDY_METHOD_MAP(isXml, tidy_is_xml, NULL)
     328                 :         TIDY_METHOD_MAP(root, tidy_get_root, NULL)
     329                 :         TIDY_METHOD_MAP(head, tidy_get_head, NULL)
     330                 :         TIDY_METHOD_MAP(html, tidy_get_html, NULL)
     331                 :         TIDY_METHOD_MAP(body, tidy_get_body, NULL)
     332                 :         TIDY_DOC_ME(__construct, NULL)
     333                 :         {NULL, NULL, NULL}
     334                 : };
     335                 : 
     336                 : static zend_function_entry tidy_funcs_node[] = {
     337                 :         TIDY_NODE_ME(hasChildren, NULL)
     338                 :         TIDY_NODE_ME(hasSiblings, NULL)
     339                 :         TIDY_NODE_ME(isComment, NULL)
     340                 :         TIDY_NODE_ME(isHtml, NULL)
     341                 :         TIDY_NODE_ME(isText, NULL)
     342                 :         TIDY_NODE_ME(isJste, NULL)
     343                 :         TIDY_NODE_ME(isAsp, NULL)
     344                 :         TIDY_NODE_ME(isPhp, NULL)
     345                 :         TIDY_NODE_ME(getParent, NULL)
     346                 :         {NULL, NULL, NULL}
     347                 : };
     348                 : 
     349                 : static zend_class_entry *tidy_ce_doc, *tidy_ce_node;
     350                 : 
     351                 : static zend_object_handlers tidy_object_handlers_doc;
     352                 : static zend_object_handlers tidy_object_handlers_node;
     353                 : 
     354                 : zend_module_entry tidy_module_entry = {
     355                 :         STANDARD_MODULE_HEADER,
     356                 :         "tidy",
     357                 :         tidy_functions,
     358                 :         PHP_MINIT(tidy),
     359                 :         PHP_MSHUTDOWN(tidy),
     360                 :         PHP_RINIT(tidy),
     361                 :         NULL,
     362                 :         PHP_MINFO(tidy),
     363                 :         PHP_TIDY_MODULE_VERSION,
     364                 :         PHP_MODULE_GLOBALS(tidy),
     365                 :         NULL,
     366                 :         NULL,
     367                 :         NULL,
     368                 :         STANDARD_MODULE_PROPERTIES_EX
     369                 : };
     370                 : 
     371                 : #ifdef COMPILE_DL_TIDY
     372                 : ZEND_GET_MODULE(tidy)
     373                 : #endif
     374                 : 
     375                 : static void* TIDY_CALL php_tidy_malloc(size_t len)
     376            1655 : {
     377            1655 :         return emalloc(len);
     378                 : }
     379                 : 
     380                 : static void* TIDY_CALL php_tidy_realloc(void *buf, size_t len)
     381              13 : {
     382              13 :         return erealloc(buf, len);
     383                 : }
     384                 : 
     385                 : static void TIDY_CALL php_tidy_free(void *buf)
     386            1655 : {
     387            1655 :         efree(buf);
     388            1655 : }
     389                 : 
     390                 : static void TIDY_CALL php_tidy_panic(ctmbstr msg)
     391               0 : {
     392                 :         TSRMLS_FETCH();
     393               0 :         php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not allocate memory for tidy! (Reason: %s)", (char *)msg);
     394               0 : }
     395                 : 
     396                 : static int _php_tidy_set_tidy_opt(TidyDoc doc, char *optname, zval *value TSRMLS_DC)
     397              23 : {
     398              23 :         TidyOption opt = tidyGetOptionByName(doc, optname);
     399              23 :         zval conv = *value;
     400                 : 
     401              23 :         if (!opt) {
     402               1 :                 php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unknown Tidy Configuration Option '%s'", optname);
     403               1 :                 return FAILURE;
     404                 :         }
     405                 :         
     406              22 :         if (tidyOptIsReadOnly(opt)) {
     407               0 :                 php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Attempting to set read-only option '%s'", optname);
     408               0 :                 return FAILURE;
     409                 :         }
     410                 : 
     411              22 :         switch(tidyOptGetType(opt)) {
     412                 :                 case TidyString:
     413               3 :                         if (Z_TYPE(conv) != IS_STRING) {
     414               0 :                                 zval_copy_ctor(&conv);
     415               0 :                                 convert_to_string(&conv);
     416                 :                         }
     417               3 :                         if (tidyOptSetValue(doc, tidyOptGetId(opt), Z_STRVAL(conv))) {
     418               2 :                                 if (Z_TYPE(conv) != Z_TYPE_P(value)) {
     419               0 :                                         zval_dtor(&conv);
     420                 :                                 }
     421               2 :                                 return SUCCESS;
     422                 :                         }
     423               1 :                         if (Z_TYPE(conv) != Z_TYPE_P(value)) {
     424               0 :                                 zval_dtor(&conv);
     425                 :                         }
     426               1 :                         break;
     427                 : 
     428                 :                 case TidyInteger:
     429              11 :                         if (Z_TYPE(conv) != IS_LONG) {
     430               8 :                                 zval_copy_ctor(&conv);
     431               8 :                                 convert_to_long(&conv);
     432                 :                         }
     433              11 :                         if (tidyOptSetInt(doc, tidyOptGetId(opt), Z_LVAL(conv))) {
     434              11 :                                 return SUCCESS;
     435                 :                         }
     436               0 :                         break;
     437                 : 
     438                 :                 case TidyBoolean:
     439               8 :                         if (Z_TYPE(conv) != IS_LONG) {
     440               7 :                                 zval_copy_ctor(&conv);
     441               7 :                                 convert_to_long(&conv);
     442                 :                         }
     443               8 :                         if (tidyOptSetBool(doc, tidyOptGetId(opt), Z_LVAL(conv))) {
     444               8 :                                 return SUCCESS;
     445                 :                         }
     446               0 :                         break;
     447                 : 
     448                 :                 default:
     449               0 :                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to determine type of configuration option");
     450                 :                         break;
     451                 :         }       
     452                 : 
     453               1 :         return FAILURE;
     454                 : }
     455                 : 
     456                 : static void php_tidy_quick_repair(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_file)
     457              17 : {
     458              17 :         char *data=NULL, *arg1, *enc = NULL;
     459              17 :         int arg1_len, enc_len = 0, data_len = 0;
     460              17 :         zend_bool use_include_path = 0;
     461                 :         TidyDoc doc;
     462                 :         TidyBuffer *errbuf;
     463                 :         zval **config;
     464                 : 
     465              17 :         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|Zsb", &arg1, &arg1_len, &config, &enc, &enc_len, &use_include_path) == FAILURE) {
     466               4 :                 RETURN_FALSE;
     467                 :         }
     468                 :         
     469              13 :         if (is_file) {
     470               6 :                 if (!(data = php_tidy_file_to_mem(arg1, use_include_path, &data_len TSRMLS_CC))) {
     471               6 :                         RETURN_FALSE;
     472                 :                 }
     473                 :         } else {
     474               7 :                 data = arg1;
     475               7 :                 data_len = arg1_len;
     476                 :         }
     477                 : 
     478               7 :         doc = tidyCreate();
     479               7 :         errbuf = emalloc(sizeof(TidyBuffer));
     480               7 :         tidyBufInit(errbuf);
     481                 :         
     482               7 :         if (tidySetErrorBuffer(doc, errbuf) != 0) {
     483               0 :                 tidyBufFree(errbuf);
     484               0 :                 efree(errbuf);
     485               0 :                 tidyRelease(doc);
     486               0 :                 php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not set Tidy error buffer");
     487                 :         }
     488                 :         
     489               7 :         tidyOptSetBool(doc, TidyForceOutput, yes);
     490               7 :         tidyOptSetBool(doc, TidyMark, no);
     491                 :         
     492               7 :         TIDY_SET_DEFAULT_CONFIG(doc);
     493                 :         
     494               7 :         if (ZEND_NUM_ARGS() > 1) {
     495               7 :                 TIDY_APPLY_CONFIG_ZVAL(doc, config);
     496                 :         }
     497                 : 
     498               7 :         if(enc_len) {
     499               4 :                 if (tidySetCharEncoding(doc, enc) < 0) {
     500               4 :                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not set encoding '%s'", enc);
     501               4 :                         RETVAL_FALSE;
     502                 :                 }
     503                 :         }
     504                 :         
     505               7 :         if (data) {
     506                 :                 TidyBuffer buf;
     507                 : 
     508               7 :                 tidyBufInit(&buf);
     509               7 :                 tidyBufAppend(&buf, data, data_len);
     510                 : 
     511               7 :                 if (tidyParseBuffer(doc, &buf) < 0) {
     512               0 :                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", errbuf->bp);
     513               0 :                         RETVAL_FALSE;
     514                 :                 } else {
     515               7 :                         if (tidyCleanAndRepair(doc) >= 0) {
     516                 :                                 TidyBuffer output;
     517               7 :                                 tidyBufInit(&output);
     518                 : 
     519               7 :                                 tidySaveBuffer (doc, &output);
     520               7 :                                 RETVAL_STRINGL((char*)output.bp, output.size ? output.size-1 : 0, 1);
     521               7 :                                 tidyBufFree(&output);
     522                 :                         } else {
     523               0 :                                 RETVAL_FALSE;
     524                 :                         }
     525                 :                 }
     526                 :                 
     527               7 :                 tidyBufFree(&buf);
     528                 :         }
     529                 : 
     530               7 :         if (is_file) {
     531               0 :                 efree(data);
     532                 :         }
     533                 :         
     534               7 :         tidyBufFree(errbuf);
     535               7 :         efree(errbuf);
     536               7 :         tidyRelease(doc);
     537                 : }
     538                 : 
     539                 : static char *php_tidy_file_to_mem(char *filename, zend_bool use_include_path, int *len TSRMLS_DC)
     540              11 : {
     541                 :         php_stream *stream;
     542              11 :         char *data = NULL;
     543                 : 
     544              11 :         if (!(stream = php_stream_open_wrapper(filename, "rb", (use_include_path ? USE_PATH : 0) | ENFORCE_SAFE_MODE, NULL))) {
     545               6 :                 return NULL;
     546                 :         }
     547               5 :         if ((*len = (int) php_stream_copy_to_mem(stream, &data, PHP_STREAM_COPY_ALL, 0)) == 0) {
     548               0 :                 data = estrdup("");
     549               0 :                 *len = 0;
     550                 :         }
     551               5 :         php_stream_close(stream);
     552                 : 
     553               5 :         return data;
     554                 : }
     555                 : 
     556                 : static void tidy_object_free_storage(void *object TSRMLS_DC)
     557             155 : {
     558             155 :         PHPTidyObj *intern = (PHPTidyObj *)object;
     559                 : 
     560             155 :         zend_object_std_dtor(&intern->std TSRMLS_CC);
     561                 : 
     562             155 :         if (intern->ptdoc) {
     563             150 :                 intern->ptdoc->ref_count--;
     564                 : 
     565             150 :                 if (intern->ptdoc->ref_count <= 0) {
     566              39 :                         tidyBufFree(intern->ptdoc->errbuf);
     567              39 :                         efree(intern->ptdoc->errbuf);
     568              39 :                         tidyRelease(intern->ptdoc->doc);
     569              39 :                         efree(intern->ptdoc);
     570                 :                 }
     571                 :         }
     572                 : 
     573             155 :         efree(object);
     574             155 : }
     575                 : 
     576                 : static void tidy_object_new(zend_class_entry *class_type, zend_object_handlers *handlers,
     577                 :                                                         zend_object_value *retval, tidy_obj_type objtype TSRMLS_DC)
     578             155 : {
     579                 :         PHPTidyObj *intern;
     580                 :         zval *tmp;
     581                 : 
     582             155 :         intern = emalloc(sizeof(PHPTidyObj));
     583             155 :         memset(intern, 0, sizeof(PHPTidyObj));
     584             155 :         zend_object_std_init(&intern->std, class_type TSRMLS_CC);
     585                 :         
     586             155 :         zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *));
     587                 : 
     588             155 :         switch(objtype) {
     589                 :                 case is_node:
     590             116 :                         break;
     591                 : 
     592                 :                 case is_doc:
     593              39 :                         tidySetMallocCall(php_tidy_malloc);
     594              39 :                         tidySetReallocCall(php_tidy_realloc);
     595              39 :                         tidySetFreeCall(php_tidy_free);
     596              39 :                         tidySetPanicCall(php_tidy_panic);
     597                 : 
     598              39 :                         intern->ptdoc = emalloc(sizeof(PHPTidyDoc));
     599              39 :                         intern->ptdoc->doc = tidyCreate();
     600              39 :                         intern->ptdoc->ref_count = 1;
     601              39 :                         intern->ptdoc->errbuf = emalloc(sizeof(TidyBuffer));
     602              39 :                         tidyBufInit(intern->ptdoc->errbuf);
     603                 : 
     604              39 :                         if (tidySetErrorBuffer(intern->ptdoc->doc, intern->ptdoc->errbuf) != 0) {
     605               0 :                                 tidyBufFree(intern->ptdoc->errbuf);
     606               0 :                                 efree(intern->ptdoc->errbuf);
     607               0 :                                 tidyRelease(intern->ptdoc->doc);
     608               0 :                                 efree(intern->ptdoc);
     609               0 :                                 efree(intern);
     610               0 :                                 php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not set Tidy error buffer");
     611                 :                         }
     612                 : 
     613              39 :                         tidyOptSetBool(intern->ptdoc->doc, TidyForceOutput, yes);
     614              39 :                         tidyOptSetBool(intern->ptdoc->doc, TidyMark, no);
     615                 : 
     616              39 :                         TIDY_SET_DEFAULT_CONFIG(intern->ptdoc->doc);
     617                 : 
     618              39 :                         tidy_add_default_properties(intern, is_doc TSRMLS_CC);
     619                 :                         break;
     620                 : 
     621                 :                 default:
     622                 :                         break;
     623                 :         }
     624                 : 
     625             155 :         retval->handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t)zend_objects_destroy_object, (zend_objects_free_object_storage_t) tidy_object_free_storage, NULL TSRMLS_CC);
     626             155 :         retval->handlers = handlers;
     627             155 : }
     628                 : 
     629                 : static zend_object_value tidy_object_new_node(zend_class_entry *class_type TSRMLS_DC)
     630             116 : {
     631                 :         zend_object_value retval;
     632             116 :         tidy_object_new(class_type, &tidy_object_handlers_node, &retval, is_node TSRMLS_CC);
     633             116 :         return retval;
     634                 : }
     635                 : 
     636                 : static zend_object_value tidy_object_new_doc(zend_class_entry *class_type TSRMLS_DC)
     637              39 : {
     638                 :         zend_object_value retval;
     639              39 :         tidy_object_new(class_type, &tidy_object_handlers_doc, &retval, is_doc TSRMLS_CC);
     640              39 :         return retval;
     641                 : }
     642                 : 
     643                 : static zend_class_entry *tidy_get_ce_node(zval *object TSRMLS_DC)
     644               6 : {
     645               6 :         return tidy_ce_node;
     646                 : }
     647                 : 
     648                 : static zend_class_entry *tidy_get_ce_doc(zval *object TSRMLS_DC)
     649              36 : {
     650              36 :         return tidy_ce_doc;
     651                 : }
     652                 : 
     653                 : static zval * tidy_instanciate(zend_class_entry *pce, zval *object TSRMLS_DC)
     654             139 : {
     655             139 :         if (!object) {
     656               0 :                 ALLOC_ZVAL(object);
     657                 :         }
     658                 : 
     659             139 :         Z_TYPE_P(object) = IS_OBJECT;
     660             139 :         object_init_ex(object, pce);
     661             139 :         object->refcount = 1;
     662             139 :         object->is_ref = 1;
     663             139 :         return object;
     664                 : }
     665                 : 
     666                 : static int tidy_doc_cast_handler(zval *in, zval *out, int type TSRMLS_DC)
     667               4 : {
     668                 :         TidyBuffer output;
     669                 :         PHPTidyObj *obj;
     670                 : 
     671               4 :         switch(type) {
     672                 :                 case IS_LONG:
     673               0 :                         ZVAL_LONG(out, 0);
     674               0 :                         break;
     675                 : 
     676                 :                 case IS_DOUBLE:
     677               0 :                         ZVAL_DOUBLE(out, 0);
     678               0 :                         break;
     679                 : 
     680                 :                 case IS_BOOL:
     681               0 :                         ZVAL_BOOL(out, TRUE);
     682               0 :                         break;
     683                 : 
     684                 :                 case IS_STRING:
     685               4 :                         obj = (PHPTidyObj *)zend_object_store_get_object(in TSRMLS_CC);
     686               4 :                         tidyBufInit(&output);
     687               4 :                         tidySaveBuffer (obj->ptdoc->doc, &output);
     688               4 :                         ZVAL_STRINGL(out, (char*)output.bp, output.size ? output.size-1 : 0, TRUE);
     689               4 :                         tidyBufFree(&output);
     690               4 :                         break;
     691                 : 
     692                 :                 default:
     693               0 :                         return FAILURE;
     694                 :         }
     695                 : 
     696               4 :         return SUCCESS;
     697                 : }
     698                 : 
     699                 : static int tidy_node_cast_handler(zval *in, zval *out, int type TSRMLS_DC)
     700               5 : {
     701                 :         TidyBuffer buf;
     702                 :         PHPTidyObj *obj;
     703                 : 
     704               5 :         switch(type) {
     705                 :                 case IS_LONG:
     706               1 :                         ZVAL_LONG(out, 0);
     707               1 :                         break;
     708                 : 
     709                 :                 case IS_DOUBLE:
     710               1 :                         ZVAL_DOUBLE(out, 0);
     711               1 :                         break;
     712                 : 
     713                 :                 case IS_BOOL:
     714               1 :                         ZVAL_BOOL(out, TRUE);
     715               1 :                         break;
     716                 : 
     717                 :                 case IS_STRING:
     718               2 :                         obj = (PHPTidyObj *)zend_object_store_get_object(in TSRMLS_CC);
     719               2 :                         tidyBufInit(&buf);
     720               2 :                         if (obj->ptdoc) {
     721               1 :                                 tidyNodeGetText(obj->ptdoc->doc, obj->node, &buf);
     722                 :                         }
     723               2 :                         ZVAL_STRINGL(out, (char*)buf.bp, buf.size ? buf.size-1 : 0, TRUE);
     724               2 :                         tidyBufFree(&buf);
     725               2 :                         break;
     726                 : 
     727                 :                 default:
     728               0 :                         return FAILURE;
     729                 :         }
     730                 : 
     731               5 :         return SUCCESS;
     732                 : }
     733                 : 
     734                 : static void tidy_doc_update_properties(PHPTidyObj *obj TSRMLS_DC)
     735              48 : {
     736                 : 
     737                 :         TidyBuffer output;
     738                 :         zval *temp;
     739                 : 
     740              48 :         tidyBufInit(&output);
     741              48 :         tidySaveBuffer (obj->ptdoc->doc, &output);
     742                 :         
     743              48 :         if (output.size) {
     744              46 :                 MAKE_STD_ZVAL(temp);
     745              46 :                 ZVAL_STRINGL(temp, (char*)output.bp, output.size-1, TRUE);
     746              46 :                 zend_hash_update(obj->std.properties, "value", sizeof("value"), (void *)&temp, sizeof(zval *), NULL);
     747                 :         }
     748                 :         
     749              48 :         tidyBufFree(&output);
     750                 : 
     751              48 :         if (obj->ptdoc->errbuf->size) {
     752              47 :                 MAKE_STD_ZVAL(temp);
     753              47 :                 ZVAL_STRINGL(temp, (char*)obj->ptdoc->errbuf->bp, obj->ptdoc->errbuf->size-1, TRUE);
     754              47 :                 zend_hash_update(obj->std.properties, "errorBuffer", sizeof("errorBuffer"), (void *)&temp, sizeof(zval *), NULL);
     755                 :         }
     756              48 : }
     757                 : 
     758                 : static void tidy_add_default_properties(PHPTidyObj *obj, tidy_obj_type type TSRMLS_DC)
     759             150 : {
     760                 : 
     761                 :         TidyBuffer buf;
     762                 :         TidyAttr        tempattr;
     763                 :         TidyNode        tempnode;
     764                 :         zval *attribute, *children, *temp;
     765                 :         PHPTidyObj *newobj;
     766                 : 
     767             150 :         switch(type) {
     768                 : 
     769                 :                 case is_node:
     770             111 :                         tidyBufInit(&buf);
     771             111 :                         tidyNodeGetText(obj->ptdoc->doc, obj->node, &buf);
     772             111 :                         ADD_PROPERTY_STRINGL(obj->std.properties, value, buf.bp, buf.size-1);
     773             111 :                         tidyBufFree(&buf);
     774                 : 
     775             111 :                         ADD_PROPERTY_STRING(obj->std.properties, name, tidyNodeGetName(obj->node));
     776             111 :                         ADD_PROPERTY_LONG(obj->std.properties, type, tidyNodeGetType(obj->node));
     777             111 :                         ADD_PROPERTY_LONG(obj->std.properties, line, tidyNodeLine(obj->node));
     778             111 :                         ADD_PROPERTY_LONG(obj->std.properties, column, tidyNodeColumn(obj->node));
     779             111 :                         ADD_PROPERTY_BOOL(obj->std.properties, proprietary, tidyNodeIsProp(obj->ptdoc->doc, obj->node));
     780                 : 
     781             111 :                         switch(tidyNodeGetType(obj->node)) {
     782                 :                                 case TidyNode_Root:
     783                 :                                 case TidyNode_DocType:
     784                 :                                 case TidyNode_Text:
     785                 :                                 case TidyNode_Comment:
     786              24 :                                         break;
     787                 :         
     788                 :                                 default:
     789              87 :                                         ADD_PROPERTY_LONG(obj->std.properties, id, tidyNodeGetId(obj->node));
     790                 :                         }
     791                 : 
     792             111 :                         tempattr = tidyAttrFirst(obj->node);
     793             111 :                         MAKE_STD_ZVAL(attribute);
     794                 : 
     795             111 :                         if (tempattr) {
     796                 :                                 char *name, *val;
     797               5 :                                 array_init(attribute);
     798                 : 
     799                 :                                 do {
     800              10 :                                         name = (char *)tidyAttrName(tempattr);
     801              10 :                                         val = (char *)tidyAttrValue(tempattr);
     802              10 :                                         if (name && val) {
     803              10 :                                                 add_assoc_string(attribute, name, val, TRUE);
     804                 :                                         }
     805              10 :                                 } while((tempattr = tidyAttrNext(tempattr)));
     806                 :                         } else {
     807             106 :                                 ZVAL_NULL(attribute);
     808                 :                         }
     809             111 :                         zend_hash_update(obj->std.properties, "attribute", sizeof("attribute"), (void *)&attribute, sizeof(zval *), NULL);
     810                 : 
     811             111 :                         tempnode = tidyGetChild(obj->node);
     812                 : 
     813             111 :                         MAKE_STD_ZVAL(children);
     814             111 :                         if (tempnode) {
     815              62 :                                 array_init(children);
     816                 :                                 do {
     817              89 :                                         MAKE_STD_ZVAL(temp);
     818              89 :                                         tidy_instanciate(tidy_ce_node, temp TSRMLS_CC);
     819              89 :                                         newobj = (PHPTidyObj *) zend_object_store_get_object(temp TSRMLS_CC);
     820              89 :                                         newobj->node = tempnode;
     821              89 :                                         newobj->type = is_node;
     822              89 :                                         newobj->ptdoc = obj->ptdoc;
     823              89 :                                         newobj->ptdoc->ref_count++;
     824                 : 
     825              89 :                                         tidy_add_default_properties(newobj, is_node TSRMLS_CC);
     826              89 :                                         add_next_index_zval(children, temp);
     827                 : 
     828              89 :                                 } while((tempnode = tidyGetNext(tempnode)));
     829                 : 
     830                 :                         } else {
     831              49 :                                 ZVAL_NULL(children);
     832                 :                         }
     833                 : 
     834             111 :                         zend_hash_update(obj->std.properties, "child", sizeof("child"), (void *)&children, sizeof(zval *), NULL);
     835                 : 
     836             111 :                         break;
     837                 : 
     838                 :                 case is_doc:
     839              39 :                         ADD_PROPERTY_NULL(obj->std.properties, errorBuffer);
     840              39 :                         ADD_PROPERTY_NULL(obj->std.properties, value);
     841                 :                         break;
     842                 :         }
     843             150 : }
     844                 : 
     845                 : static void *php_tidy_get_opt_val(PHPTidyDoc *ptdoc, TidyOption opt, TidyOptionType *type TSRMLS_DC)
     846              90 : {
     847              90 :         *type = tidyOptGetType(opt);
     848                 : 
     849              90 :         switch (*type) {
     850                 :                 case TidyString: {
     851              13 :                         char *val = (char *) tidyOptGetValue(ptdoc->doc, tidyOptGetId(opt));
     852              13 :                         if (val) {
     853               1 :                                 return (void *) estrdup(val);
     854                 :                         } else {
     855              12 :                                 return (void *) estrdup("");
     856                 :                         }
     857                 :                 }
     858                 :                         break;
     859                 : 
     860                 :                 case TidyInteger:
     861              18 :                         return (void *) tidyOptGetInt(ptdoc->doc, tidyOptGetId(opt));
     862                 :                         break;
     863                 : 
     864                 :                 case TidyBoolean:
     865              59 :                         return (void *) tidyOptGetBool(ptdoc->doc, tidyOptGetId(opt));
     866                 :                         break;
     867                 :         }
     868                 : 
     869                 :         /* should not happen */
     870               0 :         return NULL;
     871                 : }
     872                 : 
     873                 : static void php_tidy_create_node(INTERNAL_FUNCTION_PARAMETERS, tidy_base_nodetypes node_type)
     874              23 : {
     875                 :         PHPTidyObj *newobj;
     876                 :         TidyNode node;
     877              23 :         TIDY_FETCH_OBJECT;
     878                 : 
     879              23 :         switch (node_type) {
     880                 :                 case is_root_node:
     881              14 :                         node = tidyGetRoot(obj->ptdoc->doc);
     882              14 :                         break;
     883                 : 
     884                 :                 case is_html_node:
     885               2 :                         node = tidyGetHtml(obj->ptdoc->doc);
     886               2 :                         break;
     887                 : 
     888                 :                 case is_head_node:
     889               1 :                         node = tidyGetHead(obj->ptdoc->doc);
     890               1 :                         break;
     891                 : 
     892                 :                 case is_body_node:
     893               6 :                         node = tidyGetBody(obj->ptdoc->doc);
     894                 :                         break;
     895                 :         }
     896                 : 
     897              23 :         if (!node) {
     898               2 :                 RETURN_NULL();
     899                 :         }
     900                 : 
     901              21 :         tidy_instanciate(tidy_ce_node, return_value TSRMLS_CC);
     902              21 :         newobj = (PHPTidyObj *) zend_object_store_get_object(return_value TSRMLS_CC);
     903              21 :         newobj->type  = is_node;
     904              21 :         newobj->ptdoc = obj->ptdoc;
     905              21 :         newobj->node  = node;
     906              21 :         newobj->ptdoc->ref_count++;
     907                 : 
     908              21 :         tidy_add_default_properties(newobj, is_node TSRMLS_CC);
     909                 : }
     910                 : 
     911                 : static int _php_tidy_apply_config_array(TidyDoc doc, HashTable *ht_options TSRMLS_DC)
     912              11 : {
     913              11 :         char *opt_name = NULL;
     914                 :         zval **opt_val;
     915                 :         ulong opt_indx;
     916                 :         
     917              11 :         for (zend_hash_internal_pointer_reset(ht_options);
     918              45 :                  zend_hash_get_current_data(ht_options, (void **)&opt_val) == SUCCESS;
     919              23 :                  zend_hash_move_forward(ht_options)) {
     920                 :                 
     921              23 :                 if(zend_hash_get_current_key(ht_options, &opt_name, &opt_indx, FALSE) == FAILURE) {
     922               0 :                         php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not retrieve key from option array");
     923               0 :                         return FAILURE;
     924                 :                 }
     925                 : 
     926              23 :                 if(opt_name) {
     927              23 :                         _php_tidy_set_tidy_opt(doc, opt_name, *opt_val TSRMLS_CC);
     928              23 :                         opt_name = NULL;
     929                 :                 }
     930                 :                                         
     931                 :         }
     932                 :         
     933              11 :         return SUCCESS;
     934                 : }
     935                 : 
     936                 : static int php_tidy_parse_string(PHPTidyObj *obj, char *string, int len, char *enc TSRMLS_DC)
     937              35 : {
     938                 :         TidyBuffer buf;
     939                 :         
     940              35 :         if(enc) {
     941               3 :                 if (tidySetCharEncoding(obj->ptdoc->doc, enc) < 0) {
     942               0 :                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not set encoding '%s'", enc);
     943               0 :                         return FAILURE;
     944                 :                 }
     945                 :         }
     946                 :         
     947              35 :         tidyBufInit(&buf);
     948              35 :         tidyBufAppend(&buf, string, len);
     949              35 :         if (tidyParseBuffer(obj->ptdoc->doc, &buf) < 0) {
     950               0 :                 tidyBufFree(&buf);
     951               0 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", obj->ptdoc->errbuf->bp);
     952               0 :                 return FAILURE;
     953                 :         
     954                 :         }
     955              35 :         tidyBufFree(&buf);
     956              35 :         tidy_doc_update_properties(obj TSRMLS_CC);
     957                 : 
     958              35 :         return SUCCESS;
     959                 : }
     960                 : 
     961                 : static PHP_MINIT_FUNCTION(tidy)
     962           13565 : {
     963           13565 :         REGISTER_INI_ENTRIES();
     964           13565 :         REGISTER_TIDY_CLASS(tidy, doc,  NULL, 0);
     965           13565 :         REGISTER_TIDY_CLASS(tidyNode, node,     NULL, ZEND_ACC_FINAL_CLASS);
     966                 : 
     967           13565 :         tidy_object_handlers_doc.get_class_entry = tidy_get_ce_doc;
     968           13565 :         tidy_object_handlers_node.get_class_entry = tidy_get_ce_node;
     969                 :         
     970           13565 :         tidy_object_handlers_doc.cast_object = tidy_doc_cast_handler;
     971           13565 :         tidy_object_handlers_node.cast_object = tidy_node_cast_handler;
     972                 : 
     973           13565 :         _php_tidy_register_tags(INIT_FUNC_ARGS_PASSTHRU);
     974           13565 :         _php_tidy_register_nodetypes(INIT_FUNC_ARGS_PASSTHRU);
     975                 : 
     976           13565 :         return SUCCESS;
     977                 : }
     978                 : 
     979                 : static PHP_RINIT_FUNCTION(tidy)
     980           13551 : {
     981           13551 :         if (INI_BOOL("tidy.clean_output") == TRUE) {
     982               2 :                 if (php_start_ob_buffer_named("ob_tidyhandler", 0, 1 TSRMLS_CC) == FAILURE) {
     983               0 :                         zend_error(E_NOTICE, "Failure installing Tidy output buffering.");
     984                 :                 }
     985                 :         }
     986                 : 
     987           13551 :         return SUCCESS;
     988                 : }
     989                 : 
     990                 : static PHP_MSHUTDOWN_FUNCTION(tidy)
     991           13598 : {
     992           13598 :         UNREGISTER_INI_ENTRIES();
     993           13598 :         return SUCCESS;
     994                 : }
     995                 : 
     996                 : static PHP_MINFO_FUNCTION(tidy)
     997               6 : {
     998               6 :         php_info_print_table_start();
     999               6 :         php_info_print_table_header(2, "Tidy support", "enabled");
    1000               6 :         php_info_print_table_row(2, "libTidy Release", (char *)tidyReleaseDate());
    1001               6 :         php_info_print_table_row(2, "Extension Version", PHP_TIDY_MODULE_VERSION " ($Id: tidy.c 272374 2008-12-31 11:17:49Z sebastian $)");
    1002               6 :         php_info_print_table_end();
    1003                 : 
    1004               6 :         DISPLAY_INI_ENTRIES();
    1005               6 : }
    1006                 : 
    1007                 : static PHP_FUNCTION(ob_tidyhandler)
    1008               3 : {
    1009                 :         char *input;
    1010                 :         int input_len;
    1011                 :         long mode;
    1012                 :         TidyBuffer errbuf;
    1013                 :         TidyDoc doc;
    1014                 : 
    1015               3 :         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &input, &input_len, &mode) == FAILURE) {
    1016               0 :                 return;
    1017                 :         }
    1018                 : 
    1019               3 :         doc = tidyCreate();
    1020               3 :         tidyBufInit(&errbuf);
    1021                 : 
    1022               3 :         tidyOptSetBool(doc, TidyForceOutput, yes);
    1023               3 :         tidyOptSetBool(doc, TidyMark, no);
    1024                 : 
    1025               3 :         if (tidySetErrorBuffer(doc, &errbuf) != 0) {
    1026               0 :                 tidyRelease(doc);
    1027               0 :                 tidyBufFree(&errbuf);
    1028                 : 
    1029               0 :                 php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not set Tidy error buffer");
    1030                 :         }
    1031                 : 
    1032               3 :         TIDY_SET_DEFAULT_CONFIG(doc);
    1033                 : 
    1034               3 :         if (input_len > 1) {
    1035                 :                 TidyBuffer buf;
    1036                 :                 
    1037               2 :                 tidyBufInit(&buf);
    1038               2 :                 tidyBufAppend(&buf, input, input_len);
    1039                 :                 
    1040               2 :                 if (tidyParseBuffer(doc, &buf) < 0 || tidyCleanAndRepair(doc) < 0) {
    1041               0 :                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", errbuf.bp);
    1042               0 :                         RETVAL_NULL();
    1043                 :                 } else {
    1044                 :                         TidyBuffer output;
    1045               2 :                         tidyBufInit(&output);
    1046                 : 
    1047               2 :                         tidySaveBuffer(doc, &output);
    1048               2 :                         RETVAL_STRINGL((char*)output.bp, output.size ? output.size-1 : 0, 1);
    1049                 : 
    1050               2 :                         tidyBufFree(&output);
    1051                 :                 }
    1052                 :                 
    1053               2 :                 tidyBufFree(&buf);
    1054                 :         } else {
    1055               1 :                 RETVAL_NULL();
    1056                 :         }
    1057                 : 
    1058               3 :         tidyRelease(doc);
    1059               3 :         tidyBufFree(&errbuf);
    1060                 : }
    1061                 : 
    1062                 : /* {{{ proto bool tidy_parse_string(string input [, mixed config_options [, string encoding]])
    1063                 :    Parse a document stored in a string */
    1064                 : static PHP_FUNCTION(tidy_parse_string)
    1065              25 : {
    1066              25 :         char *input, *enc = NULL;
    1067              25 :         int input_len, enc_len = 0;
    1068              25 :         zval **options = NULL;
    1069                 :         
    1070                 :         PHPTidyObj *obj;
    1071                 : 
    1072              25 :         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|Zs", &input, &input_len, &options, &enc, &enc_len) == FAILURE) {
    1073               0 :                 RETURN_FALSE;
    1074                 :         }
    1075                 : 
    1076              25 :         tidy_instanciate(tidy_ce_doc, return_value TSRMLS_CC);
    1077              25 :         obj = (PHPTidyObj *) zend_object_store_get_object(return_value TSRMLS_CC);
    1078                 :                 
    1079              25 :         TIDY_APPLY_CONFIG_ZVAL(obj->ptdoc->doc, options);
    1080                 :         
    1081              25 :         if(php_tidy_parse_string(obj, input, input_len, enc TSRMLS_CC) == FAILURE) {
    1082               0 :                 zval_dtor(return_value);
    1083               0 :                 INIT_ZVAL(*return_value);
    1084               0 :                 RETURN_FALSE;
    1085                 :         }
    1086                 :         
    1087                 : }
    1088                 : /* }}} */
    1089                 : 
    1090                 : /* {{{ proto string tidy_get_error_buffer([boolean detailed])
    1091                 :    Return warnings and errors which occured parsing the specified document*/
    1092                 : static PHP_FUNCTION(tidy_get_error_buffer)
    1093               2 : {
    1094               2 :         TIDY_FETCH_OBJECT;
    1095                 : 
    1096               2 :         if (obj->ptdoc->errbuf && obj->ptdoc->errbuf->bp) {
    1097               2 :                 RETURN_STRINGL((char*)obj->ptdoc->errbuf->bp, obj->ptdoc->errbuf->size-1, 1);
    1098                 :         } else {
    1099               0 :                 RETURN_FALSE;
    1100                 :         }
    1101                 : }
    1102                 : /* }}} */
    1103                 : 
    1104                 : /* {{{ proto string tidy_get_output()
    1105                 :    Return a string representing the parsed tidy markup */
    1106                 : static PHP_FUNCTION(tidy_get_output)
    1107               6 : {
    1108                 :         TidyBuffer output;
    1109               6 :         TIDY_FETCH_OBJECT;
    1110                 : 
    1111               6 :         tidyBufInit(&output);
    1112               6 :         tidySaveBuffer(obj->ptdoc->doc, &output);
    1113                 : 
    1114               6 :         RETVAL_STRINGL((char*)output.bp, output.size ? output.size-1 : 0, 1);
    1115                 : 
    1116               6 :         tidyBufFree(&output);
    1117                 : }
    1118                 : /* }}} */
    1119                 : 
    1120                 : /* {{{ proto boolean tidy_parse_file(string file [, mixed config_options [, string encoding [, bool use_include_path]]])
    1121                 :    Parse markup in file or URI */
    1122                 : static PHP_FUNCTION(tidy_parse_file)
    1123               3 : {
    1124               3 :         char *inputfile, *enc = NULL;
    1125               3 :         int input_len, contents_len, enc_len = 0;
    1126               3 :         zend_bool use_include_path = 0;
    1127                 :         char *contents;
    1128               3 :         zval **options = NULL;
    1129                 :         
    1130                 :         PHPTidyObj *obj;
    1131                 : 
    1132               3 :         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|Zsb", &inputfile, &input_len,
    1133                 :                                                           &options, &enc, &enc_len, &use_include_path) == FAILURE) {
    1134               0 :                 RETURN_FALSE;
    1135                 :         }
    1136                 : 
    1137               3 :         tidy_instanciate(tidy_ce_doc, return_value TSRMLS_CC);
    1138               3 :         obj = (PHPTidyObj *) zend_object_store_get_object(return_value TSRMLS_CC);
    1139                 : 
    1140               3 :         if (!(contents = php_tidy_file_to_mem(inputfile, use_include_path, &contents_len TSRMLS_CC))) {
    1141               0 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot Load '%s' into memory %s", inputfile, (use_include_path) ? "(Using include path)" : "");
    1142               0 :                 RETURN_FALSE;
    1143                 :         }
    1144                 : 
    1145               3 :         TIDY_APPLY_CONFIG_ZVAL(obj->ptdoc->doc, options);
    1146                 : 
    1147               3 :         if(php_tidy_parse_string(obj, contents, contents_len, enc TSRMLS_CC) == FAILURE) {
    1148               0 :                 zval_dtor(return_value);
    1149               0 :                 INIT_ZVAL(*return_value);
    1150               0 :                 RETVAL_FALSE;
    1151                 :         }
    1152                 : 
    1153               3 :         efree(contents);
    1154                 : }
    1155                 : /* }}} */
    1156                 : 
    1157                 : /* {{{ proto boolean tidy_clean_repair()
    1158                 :    Execute configured cleanup and repair operations on parsed markup */
    1159                 : static PHP_FUNCTION(tidy_clean_repair)
    1160              10 : {
    1161              10 :         TIDY_FETCH_OBJECT;
    1162                 : 
    1163              10 :         if (tidyCleanAndRepair(obj->ptdoc->doc) >= 0) {
    1164              10 :                 tidy_doc_update_properties(obj TSRMLS_CC);
    1165              10 :                 RETURN_TRUE;
    1166                 :         }
    1167                 : 
    1168               0 :         RETURN_FALSE;
    1169                 : }
    1170                 : /* }}} */
    1171                 : 
    1172                 : /* {{{ proto boolean tidy_repair_string(string data [, mixed config_file [, string encoding]])
    1173                 :    Repair a string using an optionally provided configuration file */
    1174                 : static PHP_FUNCTION(tidy_repair_string)
    1175               9 : {
    1176               9 :         php_tidy_quick_repair(INTERNAL_FUNCTION_PARAM_PASSTHRU, FALSE);
    1177               9 : }
    1178                 : /* }}} */
    1179                 : 
    1180                 : /* {{{ proto boolean tidy_repair_file(string filename [, mixed config_file [, string encoding [, bool use_include_path]]])
    1181                 :    Repair a file using an optionally provided configuration file */
    1182                 : static PHP_FUNCTION(tidy_repair_file)
    1183               8 : {
    1184               8 :         php_tidy_quick_repair(INTERNAL_FUNCTION_PARAM_PASSTHRU, TRUE);
    1185               8 : }
    1186                 : /* }}} */
    1187                 : 
    1188                 : /* {{{ proto boolean tidy_diagnose()
    1189                 :    Run configured diagnostics on parsed and repaired markup. */
    1190                 : static PHP_FUNCTION(tidy_diagnose)
    1191               3 : {
    1192               3 :         TIDY_FETCH_OBJECT;
    1193                 : 
    1194               3 :         if (tidyRunDiagnostics(obj->ptdoc->doc) >= 0) {
    1195               3 :                 tidy_doc_update_properties(obj TSRMLS_CC);
    1196               3 :                 RETURN_TRUE;
    1197                 :         }
    1198                 : 
    1199               0 :         RETURN_FALSE;
    1200                 : }
    1201                 : /* }}} */
    1202                 : 
    1203                 : /* {{{ proto string tidy_get_release()
    1204                 :    Get release date (version) for Tidy library */
    1205                 : static PHP_FUNCTION(tidy_get_release)
    1206               1 : {
    1207               1 :         if (ZEND_NUM_ARGS()) {
    1208               0 :                 WRONG_PARAM_COUNT;
    1209                 :         }
    1210                 : 
    1211               1 :         RETURN_STRING((char *)tidyReleaseDate(), 1);
    1212                 : }
    1213                 : /* }}} */
    1214                 : 
    1215                 : 
    1216                 : #if HAVE_TIDYOPTGETDOC
    1217                 : /* {{{ proto string tidy_get_opt_doc(tidy resource, string optname)
    1218                 :    Returns the documentation for the given option name */
    1219                 : static PHP_FUNCTION(tidy_get_opt_doc)
    1220               3 : {
    1221                 :         PHPTidyObj *obj;
    1222                 :         char *optname, *optval;
    1223                 :         int optname_len;
    1224                 :         TidyOption opt;
    1225                 : 
    1226               3 :         TIDY_SET_CONTEXT;
    1227                 : 
    1228               3 :         if (object) {
    1229               1 :                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &optname, &optname_len) == FAILURE) {
    1230               0 :                         RETURN_FALSE;
    1231                 :                 }
    1232                 :         } else {
    1233               2 :                 if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, NULL, "Os", &object, tidy_ce_doc, &optname, &optname_len) == FAILURE) {
    1234               0 :                         RETURN_FALSE;
    1235                 :                 }
    1236                 :         }
    1237                 : 
    1238               3 :         obj = (PHPTidyObj *) zend_object_store_get_object(object TSRMLS_CC);
    1239                 : 
    1240               3 :         opt = tidyGetOptionByName(obj->ptdoc->doc, optname);
    1241                 : 
    1242               3 :         if (!opt) {
    1243               1 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown Tidy Configuration Option '%s'", optname);
    1244               1 :                 RETURN_FALSE;
    1245                 :         }
    1246                 : 
    1247               2 :         if ( (optval = (char *) tidyOptGetDoc(obj->ptdoc->doc, opt)) ) {
    1248               2 :                 RETURN_STRING(optval, 1);
    1249                 :         }
    1250                 : 
    1251               0 :         RETURN_FALSE;
    1252                 : }
    1253                 : /* }}} */
    1254                 : #endif
    1255                 : 
    1256                 : 
    1257                 : /* {{{ proto array tidy_get_config()
    1258                 :    Get current Tidy configuarion */
    1259                 : static PHP_FUNCTION(tidy_get_config)
    1260               1 : {
    1261                 :         TidyIterator itOpt;
    1262                 :         char *opt_name;
    1263                 :         void *opt_value;
    1264                 :         TidyOptionType optt;
    1265                 : 
    1266               1 :         TIDY_FETCH_OBJECT;
    1267                 : 
    1268               1 :         itOpt = tidyGetOptionList(obj->ptdoc->doc);
    1269                 : 
    1270               1 :         array_init(return_value);
    1271                 : 
    1272              89 :         while (itOpt) {
    1273              87 :                 TidyOption opt = tidyGetNextOption(obj->ptdoc->doc, &itOpt);
    1274                 : 
    1275              87 :                 opt_name = (char *)tidyOptGetName(opt);
    1276              87 :                 opt_value = php_tidy_get_opt_val(obj->ptdoc, opt, &optt TSRMLS_CC);
    1277              87 :                 switch (optt) {
    1278                 :                         case TidyString:
    1279              12 :                                 add_assoc_string(return_value, opt_name, (char*)opt_value, 0);
    1280              12 :                                 break;
    1281                 : 
    1282                 :                         case TidyInteger:
    1283              17 :                                 add_assoc_long(return_value, opt_name, (long)opt_value);
    1284              17 :                                 break;
    1285                 : 
    1286                 :                         case TidyBoolean:
    1287              58 :                                 add_assoc_bool(return_value, opt_name, (long)opt_value);
    1288                 :                                 break;
    1289                 :                 }
    1290                 :         }
    1291                 : 
    1292               1 :         return;
    1293                 : }
    1294                 : /* }}} */
    1295                 : 
    1296                 : /* {{{ proto int tidy_get_status()
    1297                 :    Get status of specfied document. */
    1298                 : static PHP_FUNCTION(tidy_get_status)
    1299               3 : {
    1300               3 :         TIDY_FETCH_OBJECT;
    1301                 : 
    1302               3 :         RETURN_LONG(tidyStatus(obj->ptdoc->doc));
    1303                 : }
    1304                 : /* }}} */
    1305                 : 
    1306                 : /* {{{ proto int tidy_get_html_ver()
    1307                 :    Get the Detected HTML version for the specified document. */
    1308                 : static PHP_FUNCTION(tidy_get_html_ver)
    1309               0 : {
    1310               0 :         TIDY_FETCH_OBJECT;
    1311                 : 
    1312               0 :         RETURN_LONG(tidyDetectedHtmlVersion(obj->ptdoc->doc));
    1313                 : }
    1314                 : /* }}} */
    1315                 : 
    1316                 : /* {{{ proto boolean tidy_is_xhtml()
    1317                 :    Indicates if the document is a XHTML document. */
    1318                 : static PHP_FUNCTION(tidy_is_xhtml)
    1319               0 : {
    1320               0 :         TIDY_FETCH_OBJECT;
    1321                 : 
    1322               0 :         RETURN_BOOL(tidyDetectedXhtml(obj->ptdoc->doc));
    1323                 : }
    1324                 : /* }}} */
    1325                 : 
    1326                 : /* {{{ proto boolean tidy_is_xml()
    1327                 :    Indicates if the document is a generic (non HTML/XHTML) XML document. */
    1328                 : static PHP_FUNCTION(tidy_is_xml)
    1329               0 : {
    1330               0 :         TIDY_FETCH_OBJECT;
    1331                 : 
    1332               0 :         RETURN_BOOL(tidyDetectedGenericXml(obj->ptdoc->doc));
    1333                 : }
    1334                 : /* }}} */
    1335                 : 
    1336                 : /* {{{ proto int tidy_error_count()
    1337                 :    Returns the Number of Tidy errors encountered for specified document. */
    1338                 : static PHP_FUNCTION(tidy_error_count)
    1339               1 : {
    1340               1 :         TIDY_FETCH_OBJECT;
    1341                 : 
    1342               1 :         RETURN_LONG(tidyErrorCount(obj->ptdoc->doc));
    1343                 : }
    1344                 : /* }}} */
    1345                 : 
    1346                 : /* {{{ proto int tidy_warning_count()
    1347                 :    Returns the Number of Tidy warnings encountered for specified document. */
    1348                 : static PHP_FUNCTION(tidy_warning_count)
    1349               2 : {
    1350               2 :         TIDY_FETCH_OBJECT;
    1351                 : 
    1352               2 :         RETURN_LONG(tidyWarningCount(obj->ptdoc->doc));
    1353                 : }
    1354                 : /* }}} */
    1355                 : 
    1356                 : /* {{{ proto int tidy_access_count()
    1357                 :    Returns the Number of Tidy accessibility warnings encountered for specified document. */
    1358                 : static PHP_FUNCTION(tidy_access_count)
    1359               1 : {
    1360               1 :         TIDY_FETCH_OBJECT;
    1361                 : 
    1362               1 :         RETURN_LONG(tidyAccessWarningCount(obj->ptdoc->doc));
    1363                 : }
    1364                 : /* }}} */
    1365                 : 
    1366                 : /* {{{ proto int tidy_config_count()
    1367                 :    Returns the Number of Tidy configuration errors encountered for specified document. */
    1368                 : static PHP_FUNCTION(tidy_config_count)
    1369               1 : {
    1370               1 :         TIDY_FETCH_OBJECT;
    1371                 : 
    1372               1 :         RETURN_LONG(tidyConfigErrorCount(obj->ptdoc->doc));
    1373                 : }
    1374                 : /* }}} */
    1375                 : 
    1376                 : /* {{{ proto mixed tidy_getopt(string option)
    1377                 :    Returns the value of the specified configuration option for the tidy document. */
    1378                 : static PHP_FUNCTION(tidy_getopt)
    1379               5 : {  
    1380                 :         PHPTidyObj *obj;
    1381                 :         char *optname;
    1382                 :         void *optval;
    1383                 :         int optname_len;
    1384                 :         TidyOption opt;
    1385                 :         TidyOptionType optt;
    1386                 :         
    1387               5 :         TIDY_SET_CONTEXT;
    1388                 : 
    1389               5 :         if (object) {
    1390               4 :                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &optname, &optname_len) == FAILURE) {
    1391               0 :                         RETURN_FALSE;
    1392                 :                 }
    1393                 :         } else {
    1394               1 :                 if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, NULL, "Os", &object, tidy_ce_doc, &optname, &optname_len) == FAILURE) {
    1395               0 :                         RETURN_FALSE;
    1396                 :                 }
    1397                 :         }
    1398                 : 
    1399               5 :         obj = (PHPTidyObj *) zend_object_store_get_object(object TSRMLS_CC);
    1400                 : 
    1401               5 :         opt = tidyGetOptionByName(obj->ptdoc->doc, optname);
    1402                 : 
    1403               5 :         if (!opt) {
    1404               2 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown Tidy Configuration Option '%s'", optname);
    1405               2 :                 RETURN_FALSE;
    1406                 :         }
    1407                 : 
    1408               3 :         optval = php_tidy_get_opt_val(obj->ptdoc, opt, &optt TSRMLS_CC);
    1409               3 :         switch (optt) {
    1410                 :                 case TidyString:
    1411               1 :                         RETURN_STRING((char *)optval, 0);
    1412                 :                         break;
    1413                 : 
    1414                 :                 case TidyInteger:
    1415               1 :                         RETURN_LONG((long)optval);
    1416                 :                         break;
    1417                 : 
    1418                 :                 case TidyBoolean:
    1419               1 :                         if (optval) {
    1420               0 :                                 RETURN_TRUE;
    1421                 :                         } else {
    1422               1 :                                 RETURN_FALSE;
    1423                 :                         }
    1424                 :                         break;
    1425                 : 
    1426                 :                 default:
    1427               0 :                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to determine type of configuration option");
    1428                 :                         break;
    1429                 :         }
    1430                 : 
    1431               0 :         RETURN_FALSE;
    1432                 : }
    1433                 : /* }}} */
    1434                 : 
    1435                 : static TIDY_DOC_METHOD(__construct)
    1436              11 : {
    1437              11 :         char *inputfile = NULL, *enc = NULL;
    1438              11 :         int input_len = 0, enc_len = 0, contents_len = 0;
    1439              11 :         zend_bool use_include_path = 0;
    1440                 :         char *contents;
    1441              11 :         zval **options = NULL;
    1442                 :         
    1443                 :         PHPTidyObj *obj;
    1444              11 :         TIDY_SET_CONTEXT;       
    1445                 :         
    1446              11 :         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sZsb", &inputfile, &input_len,
    1447                 :                                                           &options, &enc, &enc_len, &use_include_path) == FAILURE) {
    1448               0 :                 RETURN_FALSE;
    1449                 :         }
    1450                 :         
    1451              11 :         obj = (PHPTidyObj *)zend_object_store_get_object(object TSRMLS_CC);
    1452                 :         
    1453              11 :         if (inputfile) {
    1454               2 :                 if (!(contents = php_tidy_file_to_mem(inputfile, use_include_path, &contents_len TSRMLS_CC))) {
    1455               0 :                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot Load '%s' into memory %s", inputfile, (use_include_path) ? "(Using include path)" : "");
    1456               0 :                         return;
    1457                 :                 }
    1458                 : 
    1459               2 :                 TIDY_APPLY_CONFIG_ZVAL(obj->ptdoc->doc, options);
    1460                 : 
    1461               2 :                 php_tidy_parse_string(obj, contents, contents_len, enc TSRMLS_CC);
    1462                 : 
    1463               2 :                 efree(contents);
    1464                 :         }
    1465                 : }
    1466                 : 
    1467                 : static TIDY_DOC_METHOD(parseFile)
    1468               0 : {
    1469               0 :         char *inputfile, *enc = NULL;
    1470               0 :         int input_len, enc_len = 0, contents_len = 0;
    1471               0 :         zend_bool use_include_path = 0;
    1472                 :         char *contents;
    1473               0 :         zval **options = NULL;
    1474                 :         PHPTidyObj *obj;
    1475                 : 
    1476               0 :         TIDY_SET_CONTEXT;
    1477                 : 
    1478               0 :         obj = (PHPTidyObj *)zend_object_store_get_object(object TSRMLS_CC);
    1479                 : 
    1480               0 :         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|Zsb", &inputfile, &input_len,
    1481                 :                                                           &options, &enc, &enc_len, &use_include_path) == FAILURE) {
    1482               0 :                 RETURN_FALSE;
    1483                 :         }
    1484                 :         
    1485               0 :         if (!(contents = php_tidy_file_to_mem(inputfile, use_include_path, &contents_len TSRMLS_CC))) {
    1486               0 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot Load '%s' into memory %s", inputfile, (use_include_path) ? "(Using include path)" : "");
    1487               0 :                 RETURN_FALSE;
    1488                 :         }
    1489                 : 
    1490               0 :         TIDY_APPLY_CONFIG_ZVAL(obj->ptdoc->doc, options);
    1491                 : 
    1492               0 :         if(php_tidy_parse_string(obj, contents, contents_len, enc TSRMLS_CC) == FAILURE) {
    1493               0 :                 RETVAL_FALSE;
    1494                 :         } else {
    1495               0 :                 RETVAL_TRUE;
    1496                 :         }
    1497                 : 
    1498               0 :         efree(contents);
    1499                 : }
    1500                 : 
    1501                 : static TIDY_DOC_METHOD(parseString)
    1502               5 : {
    1503               5 :         char *input, *enc = NULL;
    1504               5 :         int input_len, enc_len = 0;
    1505               5 :         zval **options = NULL;
    1506                 :         PHPTidyObj *obj;
    1507                 : 
    1508               5 :         TIDY_SET_CONTEXT;
    1509                 : 
    1510               5 :         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|Zs", &input, &input_len, &options, &enc, &enc_len) == FAILURE) {
    1511               0 :                 RETURN_FALSE;
    1512                 :         }
    1513                 : 
    1514               5 :         obj = (PHPTidyObj *)zend_object_store_get_object(object TSRMLS_CC);
    1515                 : 
    1516               5 :         TIDY_APPLY_CONFIG_ZVAL(obj->ptdoc->doc, options);
    1517                 : 
    1518               5 :         if(php_tidy_parse_string(obj, input, input_len, enc TSRMLS_CC) == SUCCESS) {
    1519               5 :                 RETURN_TRUE;
    1520                 :         }
    1521                 :         
    1522               0 :         RETURN_FALSE;
    1523                 : }
    1524                 : 
    1525                 : 
    1526                 : /* {{{ proto TidyNode tidy_get_root()
    1527                 :    Returns a TidyNode Object representing the root of the tidy parse tree */
    1528                 : static PHP_FUNCTION(tidy_get_root)
    1529              14 : {
    1530              14 :         php_tidy_create_node(INTERNAL_FUNCTION_PARAM_PASSTHRU, is_root_node);
    1531              14 : }
    1532                 : /* }}} */
    1533                 : 
    1534                 : /* {{{ proto TidyNode tidy_get_html()
    1535                 :    Returns a TidyNode Object starting from the <HTML> tag of the tidy parse tree */
    1536                 : static PHP_FUNCTION(tidy_get_html)
    1537               2 : {
    1538               2 :         php_tidy_create_node(INTERNAL_FUNCTION_PARAM_PASSTHRU, is_html_node);
    1539               2 : }
    1540                 : /* }}} */
    1541                 : 
    1542                 : /* {{{ proto TidyNode tidy_get_head()
    1543                 :    Returns a TidyNode Object starting from the <HEAD> tag of the tidy parse tree */
    1544                 : static PHP_FUNCTION(tidy_get_head)
    1545               1 : {
    1546               1 :         php_tidy_create_node(INTERNAL_FUNCTION_PARAM_PASSTHRU, is_head_node);
    1547               1 : }
    1548                 : /* }}} */
    1549                 : 
    1550                 : /* {{{ proto TidyNode tidy_get_body(resource tidy)
    1551                 :    Returns a TidyNode Object starting from the <BODY> tag of the tidy parse tree */
    1552                 : static PHP_FUNCTION(tidy_get_body)
    1553               6 : {
    1554               6 :         php_tidy_create_node(INTERNAL_FUNCTION_PARAM_PASSTHRU, is_body_node);
    1555               6 : }
    1556                 : /* }}} */
    1557                 : 
    1558                 : /* {{{ proto boolean tidyNode::hasChildren()
    1559                 :    Returns true if this node has children */
    1560                 : static TIDY_NODE_METHOD(hasChildren)
    1561              23 : {
    1562              23 :         TIDY_FETCH_ONLY_OBJECT;
    1563                 : 
    1564              23 :         if (tidyGetChild(obj->node)) {
    1565              18 :                 RETURN_TRUE;
    1566                 :         } else {
    1567               5 :                 RETURN_FALSE;
    1568                 :         }
    1569                 : }
    1570                 : /* }}} */
    1571                 : 
    1572                 : /* {{{ proto boolean tidyNode::hasSiblings()
    1573                 :    Returns true if this node has siblings */
    1574                 : static TIDY_NODE_METHOD(hasSiblings)
    1575               2 : {
    1576               2 :         TIDY_FETCH_ONLY_OBJECT;
    1577                 : 
    1578               2 :         if (obj->node && tidyGetNext(obj->node)) {
    1579               1 :                 RETURN_TRUE;
    1580                 :         } else {
    1581               1 :                 RETURN_FALSE;
    1582                 :         }
    1583                 : }
    1584                 : /* }}} */
    1585                 : 
    1586                 : /* {{{ proto boolean tidyNode::isComment()
    1587                 :    Returns true if this node represents a comment */
    1588                 : static TIDY_NODE_METHOD(isComment)
    1589               2 : {
    1590               2 :         TIDY_FETCH_ONLY_OBJECT;
    1591                 : 
    1592               2 :         if (tidyNodeGetType(obj->node) == TidyNode_Comment) {
    1593               1 :                 RETURN_TRUE;
    1594                 :         } else {
    1595               1 :                 RETURN_FALSE;
    1596                 :         }
    1597                 : }
    1598                 : /* }}} */
    1599                 : 
    1600                 : /* {{{ proto boolean tidyNode::isHtml()
    1601                 :    Returns true if this node is part of a HTML document */
    1602                 : static TIDY_NODE_METHOD(isHtml)
    1603               2 : {
    1604               2 :         TIDY_FETCH_ONLY_OBJECT;
    1605                 : 
    1606               2 :         if (tidyNodeGetType(obj->node) & (TidyNode_Start | TidyNode_End | TidyNode_StartEnd)) {
    1607               1 :                 RETURN_TRUE;
    1608                 :         }
    1609                 : 
    1610               1 :         RETURN_FALSE;
    1611                 : }
    1612                 : /* }}} */
    1613                 : 
    1614                 : /* {{{ proto boolean tidyNode::isText()
    1615                 :    Returns true if this node represents text (no markup) */
    1616                 : static TIDY_NODE_METHOD(isText)
    1617               2 : {
    1618               2 :         TIDY_FETCH_ONLY_OBJECT;
    1619                 : 
    1620               2 :         if (tidyNodeGetType(obj->node) == TidyNode_Text) {
    1621               1 :                 RETURN_TRUE;
    1622                 :         } else {
    1623               1 :                 RETURN_FALSE;
    1624                 :         }
    1625                 : }
    1626                 : /* }}} */
    1627                 : 
    1628                 : /* {{{ proto boolean tidyNode::isJste()
    1629                 :    Returns true if this node is JSTE */
    1630                 : static TIDY_NODE_METHOD(isJste)
    1631               2 : {
    1632               2 :         TIDY_FETCH_ONLY_OBJECT;
    1633                 : 
    1634               2 :         if (tidyNodeGetType(obj->node) == TidyNode_Jste) {
    1635               1 :                 RETURN_TRUE;
    1636                 :         } else {
    1637               1 :                 RETURN_FALSE;
    1638                 :         }
    1639                 : }
    1640                 : /* }}} */
    1641                 : 
    1642                 : /* {{{ proto boolean tidyNode::isAsp()
    1643                 :    Returns true if this node is ASP */
    1644                 : static TIDY_NODE_METHOD(isAsp)
    1645               2 : {
    1646               2 :         TIDY_FETCH_ONLY_OBJECT;
    1647                 : 
    1648               2 :         if (tidyNodeGetType(obj->node) == TidyNode_Asp) {
    1649               1 :                 RETURN_TRUE;
    1650                 :         } else {
    1651               1 :                 RETURN_FALSE;
    1652                 :         }
    1653                 : }
    1654                 : /* }}} */
    1655                 : 
    1656                 : /* {{{ proto boolean tidyNode::isPhp()
    1657                 :    Returns true if this node is PHP */
    1658                 : static TIDY_NODE_METHOD(isPhp)
    1659               2 : {
    1660               2 :         TIDY_FETCH_ONLY_OBJECT;
    1661                 : 
    1662               2 :         if (tidyNodeGetType(obj->node) == TidyNode_Php) {
    1663               1 :                 RETURN_TRUE;
    1664                 :         } else {
    1665               1 :                 RETURN_FALSE;
    1666                 :         }
    1667                 : }
    1668                 : /* }}} */
    1669                 : 
    1670                 : /* {{{ proto tidyNode tidyNode::getParent()
    1671                 :    Returns the parent node if available or NULL */
    1672                 : static TIDY_NODE_METHOD(getParent)
    1673               2 : {
    1674                 :         TidyNode        parent_node;
    1675                 :         PHPTidyObj *newobj;
    1676               2 :         TIDY_FETCH_ONLY_OBJECT;
    1677                 : 
    1678               2 :         parent_node = tidyGetParent(obj->node);
    1679               2 :         if(parent_node) {
    1680               1 :                 tidy_instanciate(tidy_ce_node, return_value TSRMLS_CC);
    1681               1 :                 newobj = (PHPTidyObj *) zend_object_store_get_object(return_value TSRMLS_CC);
    1682               1 :                 newobj->node = parent_node;
    1683               1 :                 newobj->type = is_node;
    1684               1 :                 newobj->ptdoc = obj->ptdoc;
    1685               1 :                 newobj->ptdoc->ref_count++;
    1686               1 :                 tidy_add_default_properties(newobj, is_node TSRMLS_CC);
    1687                 :         } else {
    1688               1 :                 ZVAL_NULL(return_value);
    1689                 :         }
    1690                 : }
    1691                 : /* }}} */
    1692                 : 
    1693                 : static void _php_tidy_register_nodetypes(INIT_FUNC_ARGS)
    1694           13565 : {
    1695           13565 :         TIDY_NODE_CONST(ROOT, Root);
    1696           13565 :         TIDY_NODE_CONST(DOCTYPE, DocType);
    1697           13565 :         TIDY_NODE_CONST(COMMENT, Comment);
    1698           13565 :         TIDY_NODE_CONST(PROCINS, ProcIns);
    1699           13565 :         TIDY_NODE_CONST(TEXT, Text);
    1700           13565 :         TIDY_NODE_CONST(START, Start);
    1701           13565 :         TIDY_NODE_CONST(END, End);
    1702           13565 :         TIDY_NODE_CONST(STARTEND, StartEnd);
    1703           13565 :         TIDY_NODE_CONST(CDATA, CDATA);
    1704           13565 :         TIDY_NODE_CONST(SECTION, Section);
    1705           13565 :         TIDY_NODE_CONST(ASP, Asp);
    1706           13565 :         TIDY_NODE_CONST(JSTE, Jste);
    1707           13565 :         TIDY_NODE_CONST(PHP, Php);
    1708           13565 :         TIDY_NODE_CONST(XMLDECL, XmlDecl);
    1709           13565 : }
    1710                 : 
    1711                 : static void _php_tidy_register_tags(INIT_FUNC_ARGS)
    1712           13565 : {
    1713           13565 :         TIDY_TAG_CONST(UNKNOWN);
    1714           13565 :         TIDY_TAG_CONST(A);
    1715           13565 :         TIDY_TAG_CONST(ABBR);
    1716           13565 :         TIDY_TAG_CONST(ACRONYM);
    1717           13565 :         TIDY_TAG_CONST(ADDRESS);
    1718           13565 :         TIDY_TAG_CONST(ALIGN);
    1719           13565 :         TIDY_TAG_CONST(APPLET);
    1720           13565 :         TIDY_TAG_CONST(AREA);
    1721           13565 :         TIDY_TAG_CONST(B);
    1722           13565 :         TIDY_TAG_CONST(BASE);
    1723           13565 :         TIDY_TAG_CONST(BASEFONT);
    1724           13565 :         TIDY_TAG_CONST(BDO);
    1725           13565 :         TIDY_TAG_CONST(BGSOUND);
    1726           13565 :         TIDY_TAG_CONST(BIG);
    1727           13565 :         TIDY_TAG_CONST(BLINK);
    1728           13565 :         TIDY_TAG_CONST(BLOCKQUOTE);
    1729           13565 :         TIDY_TAG_CONST(BODY);
    1730           13565 :         TIDY_TAG_CONST(BR);
    1731           13565 :         TIDY_TAG_CONST(BUTTON);
    1732           13565 :         TIDY_TAG_CONST(CAPTION);
    1733           13565 :         TIDY_TAG_CONST(CENTER);
    1734           13565 :         TIDY_TAG_CONST(CITE);
    1735           13565 :         TIDY_TAG_CONST(CODE);
    1736           13565 :         TIDY_TAG_CONST(COL);
    1737           13565 :         TIDY_TAG_CONST(COLGROUP);
    1738           13565 :         TIDY_TAG_CONST(COMMENT);
    1739           13565 :         TIDY_TAG_CONST(DD);
    1740           13565 :         TIDY_TAG_CONST(DEL);
    1741           13565 :         TIDY_TAG_CONST(DFN);
    1742           13565 :         TIDY_TAG_CONST(DIR);
    1743           13565 :         TIDY_TAG_CONST(DIV);
    1744           13565 :         TIDY_TAG_CONST(DL);
    1745           13565 :         TIDY_TAG_CONST(DT);
    1746           13565 :         TIDY_TAG_CONST(EM);
    1747           13565 :         TIDY_TAG_CONST(EMBED);
    1748           13565 :         TIDY_TAG_CONST(FIELDSET);
    1749           13565 :         TIDY_TAG_CONST(FONT);
    1750           13565 :         TIDY_TAG_CONST(FORM);
    1751           13565 :         TIDY_TAG_CONST(FRAME);
    1752           13565 :         TIDY_TAG_CONST(FRAMESET);
    1753           13565 :         TIDY_TAG_CONST(H1);
    1754           13565 :         TIDY_TAG_CONST(H2);
    1755           13565 :         TIDY_TAG_CONST(H3);
    1756           13565 :         TIDY_TAG_CONST(H4);
    1757           13565 :         TIDY_TAG_CONST(H5);
    1758           13565 :         TIDY_TAG_CONST(H6);
    1759           13565 :         TIDY_TAG_CONST(HEAD);
    1760           13565 :         TIDY_TAG_CONST(HR);
    1761           13565 :         TIDY_TAG_CONST(HTML);
    1762           13565 :         TIDY_TAG_CONST(I);
    1763           13565 :         TIDY_TAG_CONST(IFRAME);
    1764           13565 :         TIDY_TAG_CONST(ILAYER);
    1765           13565 :         TIDY_TAG_CONST(IMG);
    1766           13565 :         TIDY_TAG_CONST(INPUT);
    1767           13565 :         TIDY_TAG_CONST(INS);
    1768           13565 :         TIDY_TAG_CONST(ISINDEX);
    1769           13565 :         TIDY_TAG_CONST(KBD);
    1770           13565 :         TIDY_TAG_CONST(KEYGEN);
    1771           13565 :         TIDY_TAG_CONST(LABEL);
    1772           13565 :         TIDY_TAG_CONST(LAYER);
    1773           13565 :         TIDY_TAG_CONST(LEGEND);
    1774           13565 :         TIDY_TAG_CONST(LI);
    1775           13565 :         TIDY_TAG_CONST(LINK);
    1776           13565 :         TIDY_TAG_CONST(LISTING);
    1777           13565 :         TIDY_TAG_CONST(MAP);
    1778           13565 :         TIDY_TAG_CONST(MARQUEE);
    1779           13565 :         TIDY_TAG_CONST(MENU);
    1780           13565 :         TIDY_TAG_CONST(META);
    1781           13565 :         TIDY_TAG_CONST(MULTICOL);
    1782           13565 :         TIDY_TAG_CONST(NOBR);
    1783           13565 :         TIDY_TAG_CONST(NOEMBED);
    1784           13565 :         TIDY_TAG_CONST(NOFRAMES);
    1785           13565 :         TIDY_TAG_CONST(NOLAYER);
    1786           13565 :         TIDY_TAG_CONST(NOSAVE);
    1787           13565 :         TIDY_TAG_CONST(NOSCRIPT);
    1788           13565 :         TIDY_TAG_CONST(OBJECT);
    1789           13565 :         TIDY_TAG_CONST(OL);
    1790           13565 :         TIDY_TAG_CONST(OPTGROUP);
    1791           13565 :         TIDY_TAG_CONST(OPTION);
    1792           13565 :         TIDY_TAG_CONST(P);
    1793           13565 :         TIDY_TAG_CONST(PARAM);
    1794           13565 :         TIDY_TAG_CONST(PLAINTEXT);
    1795           13565 :         TIDY_TAG_CONST(PRE);
    1796           13565 :         TIDY_TAG_CONST(Q);
    1797           13565 :         TIDY_TAG_CONST(RB);
    1798           13565 :         TIDY_TAG_CONST(RBC);
    1799           13565 :         TIDY_TAG_CONST(RP);
    1800           13565 :         TIDY_TAG_CONST(RT);
    1801           13565 :         TIDY_TAG_CONST(RTC);
    1802           13565 :         TIDY_TAG_CONST(RUBY);
    1803           13565 :         TIDY_TAG_CONST(S);
    1804           13565 :         TIDY_TAG_CONST(SAMP);
    1805           13565 :         TIDY_TAG_CONST(SCRIPT);
    1806           13565 :         TIDY_TAG_CONST(SELECT);
    1807           13565 :         TIDY_TAG_CONST(SERVER);
    1808           13565 :         TIDY_TAG_CONST(SERVLET);
    1809           13565 :         TIDY_TAG_CONST(SMALL);
    1810           13565 :         TIDY_TAG_CONST(SPACER);
    1811           13565 :         TIDY_TAG_CONST(SPAN);
    1812           13565 :         TIDY_TAG_CONST(STRIKE);
    1813           13565 :         TIDY_TAG_CONST(STRONG);
    1814           13565 :         TIDY_TAG_CONST(STYLE);
    1815           13565 :         TIDY_TAG_CONST(SUB);
    1816           13565 :         TIDY_TAG_CONST(SUP);
    1817           13565 :         TIDY_TAG_CONST(TABLE);
    1818           13565 :         TIDY_TAG_CONST(TBODY);
    1819           13565 :         TIDY_TAG_CONST(TD);
    1820           13565 :         TIDY_TAG_CONST(TEXTAREA);
    1821           13565 :         TIDY_TAG_CONST(TFOOT);
    1822           13565 :         TIDY_TAG_CONST(TH);
    1823           13565 :         TIDY_TAG_CONST(THEAD);
    1824           13565 :         TIDY_TAG_CONST(TITLE);
    1825           13565 :         TIDY_TAG_CONST(TR);
    1826           13565 :         TIDY_TAG_CONST(TT);
    1827           13565 :         TIDY_TAG_CONST(U);
    1828           13565 :         TIDY_TAG_CONST(UL);
    1829           13565 :         TIDY_TAG_CONST(VAR);
    1830           13565 :         TIDY_TAG_CONST(WBR);
    1831           13565 :         TIDY_TAG_CONST(XMP);
    1832           13565 : }
    1833                 : 
    1834                 : #endif
    1835                 : 
    1836                 : /*
    1837                 :  * Local variables:
    1838                 :  * tab-width: 4
    1839                 :  * c-basic-offset: 4
    1840                 :  * End:
    1841                 :  * vim600: noet sw=4 ts=4 fdm=marker
    1842                 :  * vim<600: noet sw=4 ts=4
    1843                 :  */

Generated by: LTP GCOV extension version 1.5

Generated at Thu, 19 Nov 2009 08:20:24 +0000 (5 days ago)

Copyright © 2005-2009 The PHP Group
All rights reserved.