diff options
Diffstat (limited to 'ext/tidy/tidy.c')
| -rw-r--r-- | ext/tidy/tidy.c | 1874 | 
1 files changed, 1874 insertions, 0 deletions
diff --git a/ext/tidy/tidy.c b/ext/tidy/tidy.c new file mode 100644 index 0000000000..21e000eba6 --- /dev/null +++ b/ext/tidy/tidy.c @@ -0,0 +1,1874 @@ +/* +  +----------------------------------------------------------------------+ +  | PHP Version 4                                                        | +  +----------------------------------------------------------------------+ +  | Copyright (c) 1997-2003 The PHP Group                                | +  +----------------------------------------------------------------------+ +  | This source file is subject to version 3.0 of the PHP license,       | +  | that is bundled with this package in the file LICENSE, and is        | +  | available through the world-wide-web at the following url:           | +  | http://www.php.net/license/3_0.txt.                                  | +  | If you did not receive a copy of the PHP license and are unable to   | +  | obtain it through the world-wide-web, please send a note to          | +  | license@php.net so we can mail you a copy immediately.               | +  +----------------------------------------------------------------------+ +  | Author: John Coggeshall <john@php.net>                               | +  +----------------------------------------------------------------------+ +*/ + +/* $Id$ */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "php.h" +#include "php_ini.h" +#include "ext/standard/info.h" +#include "php_tidy.h" +#include "Zend/zend_API.h" +#include "Zend/zend_hash.h" +#include "safe_mode.h" + +ZEND_DECLARE_MODULE_GLOBALS(tidy); + +static int le_tidydoc; +#define le_tidydoc_name "Tidy Document" + +zend_class_entry *php_tidy_ce; + +function_entry tidy_functions[] = { +	PHP_FE(tidy_create,	        	NULL) +	PHP_FE(tidy_setopt,             NULL) +	PHP_FE(tidy_getopt,             NULL) +	PHP_FE(tidy_parse_string,       NULL) +	PHP_FE(tidy_parse_file,         NULL) +	PHP_FE(tidy_get_output,         NULL) +	PHP_FE(tidy_get_error_buffer,   NULL) +	PHP_FE(tidy_clean_repair,       NULL) +	PHP_FE(tidy_diagnose,           NULL) +	PHP_FE(tidy_get_release,		NULL) +	PHP_FE(tidy_get_status,		  	NULL) +	PHP_FE(tidy_get_html_ver,	  	NULL) +	PHP_FE(tidy_is_xhtml,		  	NULL) +	PHP_FE(tidy_is_xml,		       	NULL) +	PHP_FE(tidy_error_count,		NULL) +	PHP_FE(tidy_warning_count,	  	NULL) +	PHP_FE(tidy_access_count,	  	NULL) +	PHP_FE(tidy_config_count,	  	NULL) +	PHP_FE(tidy_load_config,		NULL) +	PHP_FE(tidy_load_config_enc,	NULL) +	PHP_FE(tidy_set_encoding,	  	NULL) +	PHP_FE(tidy_save_config,		NULL) +	PHP_FE(tidy_get_root,		  	NULL) +	PHP_FE(tidy_get_head,		  	NULL) +	PHP_FE(tidy_get_html,		  	NULL) +	PHP_FE(tidy_get_body,		  	NULL) +	{NULL, NULL, NULL} +}; + + +zend_module_entry tidy_module_entry = { +#if ZEND_MODULE_API_NO >= 20010901 +	STANDARD_MODULE_HEADER, +#endif +	"Tidy", +	tidy_functions, +	PHP_MINIT(tidy), +	PHP_MSHUTDOWN(tidy), +	NULL,	 +	NULL, +	PHP_MINFO(tidy), +#if ZEND_MODULE_API_NO >= 20010901 +	"0.5b", +#endif +	STANDARD_MODULE_PROPERTIES +}; + + +#ifdef COMPILE_DL_TIDY +ZEND_GET_MODULE(tidy) +#endif + +static inline PHPTidyObj *php_tidy_fetch_object(zval *object TSRMLS_DC) { +	return (PHPTidyObj *) zend_object_store_get_object(object TSRMLS_CC); +} + +void * _php_tidy_mem_alloc(size_t size) { +	return emalloc(size); +} + +void * _php_tidy_mem_realloc(void *mem, size_t newsize) { +	return erealloc(mem, newsize); +} + +void _php_tidy_mem_free(void *mem) { +	efree(mem); +} + +void _php_tidy_mem_panic(ctmbstr errmsg) { +	 +	php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not allocate memory for Tidy: %s", (char *)errmsg); +} + + +PHPTidyObj *php_tidy_new(TSRMLS_DC) { + +	PHPTidyObj *intern; + +	intern = emalloc(sizeof(PHPTidyObj)); +	intern->obj.ce = php_tidy_ce; +	intern->obj.in_get = 0; +	intern->obj.in_set = 0; +	intern->node = NULL; +	intern->attr = NULL; +	intern->type = PHP_IS_TIDYUNDEF; + +	return intern;	 +	 +} + +static zend_object_value php_tidy_register_object(PHPTidyObj *intern TSRMLS_DC) { +	 +	zend_object_value retval; + +	retval.handle = zend_objects_store_put(intern, +										   php_tidy_obj_dtor, +										   php_tidy_obj_clone TSRMLS_CC); +	retval.handlers = (zend_object_handlers *) &php_tidy_object_handlers; + +	return retval; +} + +static void php_tidy_obj_dtor(void *object, zend_object_handle handle TSRMLS_DC) { +	 +	PHPTidyObj *o = (PHPTidyObj *)object; +	efree(o); +} + +static void php_tidy_obj_clone(void *object, void **object_clone TSRMLS_DC) { +	 +	PHPTidyObj *intern = (PHPTidyObj *) object; +	PHPTidyObj **intern_clone = (PHPTidyObj **) object_clone; + +	*intern_clone = emalloc(sizeof(PHPTidyObj)); +	(*intern_clone)->obj.ce = intern->obj.ce; +	(*intern_clone)->obj.in_get = 0; +	(*intern_clone)->obj.in_set = 0; +	ALLOC_HASHTABLE((*intern_clone)->obj.properties); +	 +	/* memcopy these.. */ +	memcpy((*intern_clone)->node, intern->node, sizeof(TidyNode)); +	memcpy((*intern_clone)->attr, intern->attr, sizeof(TidyAttr)); +	memcpy((*intern_clone)->tdoc, intern->tdoc, sizeof(PHPTidyDoc)); +	(*intern_clone)->type = intern->type; +	 +} +  +void dtor_TidyDoc(zend_rsrc_list_entry *rsrc TSRMLS_DC) { +     +    PHPTidyDoc *tdoc = (PHPTidyDoc *)rsrc->ptr; +    tidyRelease(tdoc->doc); +	efree(tdoc); +     +} + +static void php_tidy_init_globals(zend_tidy_globals *tidy_globals) { +	 +	/* No globals for now */ +} + +PHP_MINIT_FUNCTION(tidy) { + +    zend_class_entry _tidy_entry; +     +    INIT_CLASS_ENTRY(_tidy_entry, "TidyObject", NULL); +    php_tidy_ce = zend_register_internal_class(&_tidy_entry TSRMLS_CC); +     +    ZEND_INIT_MODULE_GLOBALS(tidy, php_tidy_init_globals, NULL); +    le_tidydoc = zend_register_list_destructors_ex(dtor_TidyDoc, NULL, le_tidydoc_name, module_number); +     +    _php_tidy_register_tags(INIT_FUNC_ARGS_PASSTHRU); +    _php_tidy_register_attributes(INIT_FUNC_ARGS_PASSTHRU); +	_php_tidy_register_nodetypes(INIT_FUNC_ARGS_PASSTHRU); +	 +	tidySetMallocCall(_php_tidy_mem_alloc); +	tidySetReallocCall(_php_tidy_mem_realloc); +	tidySetFreeCall(_php_tidy_mem_free); +	tidySetPanicCall(_php_tidy_mem_panic); +	 +    return SUCCESS; + +} + + +PHP_MSHUTDOWN_FUNCTION(tidy) { +   +	 +    return SUCCESS; + +} + + + +PHP_MINFO_FUNCTION(tidy) { +     +	php_info_print_table_start(); +	php_info_print_table_header(2, "Tidy support", "enabled"); +	php_info_print_table_row(2, "Tidy Build Date", (char *)tidyReleaseDate()); +	php_info_print_table_end(); + +} + +/* {{{ proto resource tidy_create() +   Initialize a new tidy document */ +PHP_FUNCTION(tidy_create) { +     +    PHPTidyDoc *tdoc; +    tdoc = emalloc(sizeof(PHPTidyDoc)); +    tdoc->doc = tidyCreate(); +    tdoc->parsed = 0; +     +    tdoc->errbuf = emalloc(sizeof(TidyBuffer)); +    tidyBufInit(tdoc->errbuf); +     +   if(tidySetErrorBuffer(tdoc->doc, tdoc->errbuf) != 0)  +        php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not set Tidy error buffer"); +    +    tidyOptSetBool(tdoc->doc, TidyForceOutput, yes); +	tidyOptSetBool(tdoc->doc, TidyMark, no); +		 +    ZEND_REGISTER_RESOURCE(return_value, tdoc, le_tidydoc); +     +} +/* }}} */ + +/* {{{ proto void tidy_parse_string(resource tidy, string input) +   Parse a document stored in a string */ +PHP_FUNCTION(tidy_parse_string) { +     +    char *input; +    zval *res; +    PHPTidyDoc *tdoc; + +    if(ZEND_NUM_ARGS() != 2) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "rs", &res, &input) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); +     +    if(tidyParseString(tdoc->doc, input) < 0) { +        php_error_docref(NULL TSRMLS_CC, E_ERROR, "[Tidy error] %s", tdoc->errbuf->bp); +    } +     +    tdoc->parsed = 1; +     +} +/* }}} */ + +/* {{{ proto string tidy_get_error_buffer(resource tidy [, boolean detailed]) +   Return warnings and errors which occured parsing the specified document*/ +PHP_FUNCTION(tidy_get_error_buffer) { + +    zval *res; +    PHPTidyDoc *tdoc; +    zend_bool detailed; +     +    if((ZEND_NUM_ARGS() == 0) || (ZEND_NUM_ARGS() > 2)) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "r|b", &res, &detailed) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); +     +    if(!tdoc->parsed) { +		php_error_docref(NULL TSRMLS_CC, E_WARNING, "A document must be parsed before executing this function."); +		RETURN_FALSE; +    } +     +    if(detailed) { +	tidyErrorSummary(tdoc->doc); +    } + +    RETVAL_STRING(tdoc->errbuf->bp, 1); +     +    tidyBufClear(tdoc->errbuf);  +     +} +/* }}} */ + +/* {{{ proto string tidy_get_output(resource tidy)  +   Return a string representing the parsed tidy markup */ +PHP_FUNCTION(tidy_get_output) { +     +    zval *res; +    PHPTidyDoc *tdoc; +    TidyBuffer output = {0}; +     +    if(ZEND_NUM_ARGS() != 1) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "r", &res) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); +  +    if(!tdoc->parsed) { +		php_error_docref(NULL TSRMLS_CC, E_WARNING, "A document must be parsed before executing this function."); +		RETURN_FALSE; +    } +  +    tidySaveBuffer( tdoc->doc, &output ); +     +    RETVAL_STRING(output.bp, 1); +     +    tidyBufFree(&output); +     +} +/* }}} */ + +/* {{{ proto boolean tidy_parse_file(resource tidy, string file) +   Parse markup in file or URI */ +PHP_FUNCTION(tidy_parse_file) { +	 +     +    char *inputfile; +    zval *res; +    PHPTidyDoc *tdoc; +    php_stream *stream; +    char *contents; +     +    if(ZEND_NUM_ARGS() != 2) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "rs", &res, &inputfile) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); +     +    stream = php_stream_open_wrapper(inputfile, "rb", +									 ENFORCE_SAFE_MODE | REPORT_ERRORS, +									 NULL); +     +    if(!stream) { +		RETURN_FALSE; +    } +     +	if (php_stream_copy_to_mem(stream, &contents, PHP_STREAM_COPY_ALL, 0) > 0) { +		 +		if(tidyParseString(tdoc->doc, contents) < 0) { +			php_error_docref(NULL TSRMLS_CC, E_ERROR, "[Tidy error] %s", tdoc->errbuf->bp); +		} +		tdoc->parsed = TRUE; +		efree(contents); +	} + +	php_stream_close(stream); +     +    RETURN_TRUE; +} +/* }}} */ + +/* {{{ proto boolean tidy_clean_repair(resource tidy) +   Execute configured cleanup and repair operations on parsed markup */ +PHP_FUNCTION(tidy_clean_repair) { +     +    zval *res; +    PHPTidyDoc *tdoc; +     +    if(ZEND_NUM_ARGS() != 1) { +       WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "r", &res) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); + +    if(!tdoc->parsed) { +		php_error_docref(NULL TSRMLS_CC, E_WARNING, "A document must be parsed before executing this function."); +		RETURN_FALSE; +    } +     +    if(tidyCleanAndRepair(tdoc->doc) >= 0) RETURN_TRUE; +     +    RETURN_FALSE; +         +} +/* }}} */ + +/* {{{ proto boolean tidy_diagnose(resource tidy) +    Run configured diagnostics on parsed and repaired markup. */ +PHP_FUNCTION(tidy_diagnose) { +     +    zval *res; +    PHPTidyDoc *tdoc; +   +    if(ZEND_NUM_ARGS() != 1) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "r", &res) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); + +    if(!tdoc->parsed) { +		php_error_docref(NULL TSRMLS_CC, E_WARNING, "A document must be parsed before executing this function."); +		RETURN_FALSE; +    } +     +    if(tidyRunDiagnostics(tdoc->doc) >= 0) RETURN_TRUE; +     +    RETURN_FALSE;     +} + +/* }}} */ + +/* {{{ proto string tidy_get_release() +    Get release date (version) for Tidy library */ +PHP_FUNCTION(tidy_get_release) { + +    RETURN_STRING((char *)tidyReleaseDate(), 1);     +} +/* }}} */ + +/* {{{ proto int tidy_get_status(resource tidy) +    Get status of specfied document. */ +PHP_FUNCTION(tidy_get_status) { +    zval *res; +    PHPTidyDoc *tdoc; +   +    if(ZEND_NUM_ARGS() != 1) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "r", &res) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); + +    RETURN_LONG(tidyStatus(tdoc->doc)); +     +} +/* }}} */ + +/* {{{ proto int tidy_get_html_ver(resource tidy) +    Get the Detected HTML version for the specified document. */ +PHP_FUNCTION(tidy_get_html_ver) { +    zval *res; +    PHPTidyDoc *tdoc; +   +    if(ZEND_NUM_ARGS() != 1) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "r", &res) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); + +    if(!tdoc->parsed) { +		php_error_docref(NULL TSRMLS_CC, E_WARNING, "A document must be parsed before executing this function."); +		RETURN_FALSE; +    } + + +    RETURN_LONG(tidyDetectedHtmlVersion(tdoc->doc)); +} +/* }}} */ + +/* {{{ proto boolean tidy_is_xhtml(resource tidy) +    Indicates if the document is a XHTML document. */ +PHP_FUNCTION(tidy_is_xhtml) { +    zval *res; +    PHPTidyDoc *tdoc; +   +    if(ZEND_NUM_ARGS() != 1) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "r", &res) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); + +    if(!tdoc->parsed) { +		php_error_docref(NULL TSRMLS_CC, E_WARNING, "A document must be parsed before executing this function."); +		RETURN_FALSE; +    } + +    RETURN_BOOL(tidyDetectedXhtml(tdoc->doc));	 +	 +} +/* }}} */ + +/* {{{ proto boolean tidy_is_xhtml(resource tidy) +    Indicates if the document is a generic (non HTML/XHTML) XML document. */ +PHP_FUNCTION(tidy_is_xml) { +    zval *res; +    PHPTidyDoc *tdoc; +   +    if(ZEND_NUM_ARGS() != 1) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "r", &res) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); + +    if(!tdoc->parsed) { +		php_error_docref(NULL TSRMLS_CC, E_WARNING, "A document must be parsed before executing this function."); +		RETURN_FALSE; +    } + +    RETURN_BOOL(tidyDetectedGenericXml(tdoc->doc));	 +} +/* }}} */ + +/* {{{ proto int tidy_error_count(resource tidy) +    Returns the Number of Tidy errors encountered for specified document. */ +PHP_FUNCTION(tidy_error_count) { +    zval *res; +    PHPTidyDoc *tdoc; +   +    if(ZEND_NUM_ARGS() != 1) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "r", &res) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); + +    if(!tdoc->parsed) { +		php_error_docref(NULL TSRMLS_CC, E_WARNING, "A document must be parsed before executing this function."); +		RETURN_FALSE; +    } + +    RETURN_LONG(tidyErrorCount(tdoc->doc));	 +} +/* }}} */ + +/* {{{ proto int tidy_warning_count(resource tidy) +    Returns the Number of Tidy warnings encountered for specified document. */ +PHP_FUNCTION(tidy_warning_count) { +    zval *res; +    PHPTidyDoc *tdoc; +   +    if(ZEND_NUM_ARGS() != 1) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "r", &res) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); + +    if(!tdoc->parsed) { +		php_error_docref(NULL TSRMLS_CC, E_WARNING, "A document must be parsed before executing this function."); +		RETURN_FALSE; +    } + +    RETURN_LONG(tidyWarningCount(tdoc->doc));	 +} +/* }}} */ + +/* {{{ proto int tidy_access_count(resource tidy) +    Returns the Number of Tidy accessibility warnings encountered for specified document. */ +PHP_FUNCTION(tidy_access_count) { +    zval *res; +    PHPTidyDoc *tdoc; +   +    if(ZEND_NUM_ARGS() != 1) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "r", &res) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); + +    if(!tdoc->parsed) { +		php_error_docref(NULL TSRMLS_CC, E_WARNING, "A document must be parsed before executing this function."); +		RETURN_FALSE; +    } + +    RETURN_LONG(tidyAccessWarningCount(tdoc->doc));	 +		 +} +/* }}} */ + +/* {{{ proto int tidy_config_count(resource tidy) +    Returns the Number of Tidy configuration errors encountered for specified document. */ +PHP_FUNCTION(tidy_config_count) { +    zval *res; +    PHPTidyDoc *tdoc; +   +    if(ZEND_NUM_ARGS() != 1) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "r", &res) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); + + +    RETURN_LONG(tidyConfigErrorCount(tdoc->doc));	 +	 +} +/* }}} */ + +/* {{{ proto void tidy_load_config(resource tidy, string filename) +    Load an ASCII Tidy configuration file */ +PHP_FUNCTION(tidy_load_config) { +    zval *res; +    char *filename; +    PHPTidyDoc *tdoc; +   +    if(ZEND_NUM_ARGS() != 2) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "rs", &res, &filename) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); +    if(tidyLoadConfig(tdoc->doc, filename) < 0) { +	 php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not load configuration file '%s'", filename); +    } +     +} +/* }}} */ + +/* {{{ proto void tidy_load_config(resource tidy, string filename, string encoding) +    Load an ASCII Tidy configuration file with the specified encoding */ +PHP_FUNCTION(tidy_load_config_enc) { +    zval *res; +    char *filename; +    char *encoding; +    PHPTidyDoc *tdoc; +   +    if(ZEND_NUM_ARGS() != 2) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "rss", &res, &filename, &encoding) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); +    if(tidyLoadConfigEnc(tdoc->doc, filename, encoding) < 0) { +	 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not load configuration file '%s' using encoding '%s'", filename, encoding); +	 RETURN_FALSE; +    } +     +    RETURN_TRUE; +} +/* }}} */ + +/* {{{ proto boolean tidy_set_encoding(resource tidy, string encoding) +    Set the input/output character encoding for parsing markup. +    Values include: ascii, latin1, raw, utf8, iso2022, mac, win1252, utf16le, +    utf16be, utf16, big5 and shiftjis. */ +PHP_FUNCTION(tidy_set_encoding) { +    zval *res; +    char *encoding; +    PHPTidyDoc *tdoc; +   +    if(ZEND_NUM_ARGS() != 2) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "rs", &res, &encoding) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); +    if(tidySetCharEncoding(tdoc->doc, encoding) < 0) { +	 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not set encoding '%s'", encoding); +	 RETURN_FALSE; +    } +     +    RETURN_TRUE; +} +/* }}} */ + +/* {{{ proto boolean tidy_save_config(resource tidy, string filename) +    Save current settings to named file. Only non-default values are written. */ +PHP_FUNCTION(tidy_save_config) { +    zval *res; +    char *filename; +    PHPTidyDoc *tdoc; +   +    if(ZEND_NUM_ARGS() != 2) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "rs", &res, &filename) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); +    if(tidyOptSaveFile(tdoc->doc, filename) < 0) { +	 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not write tidy configuration file '%s'", filename); +	 RETURN_FALSE; +    } +     +    RETURN_TRUE; +} +/* }}} */ + +/* {{{ proto boolean tidy_setopt(resource tidy, string option, mixed newvalue) +    Updates the configuration settings for the specified tidy document. */ +PHP_FUNCTION(tidy_setopt) { +	 +	zval *res, *value; +    char *optname; +    int optname_len; +    PHPTidyDoc *tdoc; +    TidyOption opt; +     +   +    if(ZEND_NUM_ARGS() != 3) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "rsz", &res, &optname, &optname_len, &value) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); + +    if(!tdoc->doc) { +		php_error_docref(NULL TSRMLS_CC,E_ERROR, "Invalid Tidy Resource Specified"); +		RETURN_FALSE; +    } +     +    opt = tidyGetOptionByName(tdoc->doc, optname); +	if(!opt) { +		php_error_docref(NULL TSRMLS_CC,E_WARNING, "Unknown Tidy Configuration Option '%s'", optname); +		RETURN_FALSE; +	} +	 +    switch(tidyOptGetType(opt)) { +		 +		case TidyString: +			if(tidyOptSetValue(tdoc->doc, tidyOptGetId(opt), Z_STRVAL_P(value))) { +				RETURN_TRUE; +			}  +			break; +			 +		case TidyInteger: +			if(tidyOptSetInt(tdoc->doc, tidyOptGetId(opt), Z_LVAL_P(value))) { +				RETURN_TRUE; +			}  +			break; +			 +		case TidyBoolean: +			if(tidyOptSetBool(tdoc->doc,  tidyOptGetId(opt), Z_LVAL_P(value))) { +				RETURN_TRUE; +			}  +			break; +			 +		default: +			 +			php_error_docref(NULL TSRMLS_CC,E_WARNING, "Unable to determine type of Tidy configuration constant to set"); +			 +    } +    RETURN_FALSE; +} +/* }}} */ + +/* {{{ proto mixed tidy_getopt(resource tidy, string option) +    Returns the value of the specified configuration option for the tidy document. */ +PHP_FUNCTION(tidy_getopt) { +	 +	zval *res; +    char *optname, *strval; +    int optname_len; +    PHPTidyDoc *tdoc; +	TidyOption opt; +	 +    if(ZEND_NUM_ARGS() != 2) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "rs", &res, &optname, &optname_len) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); +    +    if(!tdoc->doc) { +		php_error_docref(NULL TSRMLS_CC,E_ERROR, "Invalid Tidy Resource Specified"); +		RETURN_FALSE; +    } +     +    opt = tidyGetOptionByName(tdoc->doc, optname); +	if(!opt) { +		php_error_docref(NULL TSRMLS_CC,E_WARNING, "Unknown Tidy Configuration Option '%s'", optname); +		RETURN_FALSE; +	} +	 +    switch(tidyOptGetType(opt)) { +		 +		case TidyString: +			strval = (char *)tidyOptGetValue(tdoc->doc, tidyOptGetId(opt)); +			 +			if(strval) { +				RETURN_STRING(strval, 0); +			} else { +				RETURN_EMPTY_STRING(); +			} +			 +			break; +		case TidyInteger: +			RETURN_LONG(tidyOptGetInt(tdoc->doc, tidyOptGetId(opt))) +			break; +		case TidyBoolean:	 +						 +			if(tidyOptGetBool(tdoc->doc, tidyOptGetId(opt))) { +				RETURN_TRUE; +			} +			 +			break; +			 +		default: +			 +			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to determine type of Tidy configuration constant to get"); +			 +    } +     +    RETURN_FALSE; +	 +} +/* }}} */ + +/* {{{ proto TidyNode tidy_get_root(resource tidy) +    Returns a TidyNode Object representing the root of the tidy parse tree */ +PHP_FUNCTION(tidy_get_root) { +     +    zval *res; +    PHPTidyDoc *tdoc; +	PHPTidyObj *obj; +	 +    if(ZEND_NUM_ARGS() != 1) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "r", &res) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); + +    if(!tdoc->parsed) { +		php_error_docref(NULL TSRMLS_CC, E_WARNING, "A document must be parsed before executing this function."); +		RETURN_FALSE; +    } +     +    obj = php_tidy_new(); +    obj->node = tidyGetRoot(tdoc->doc); +    obj->tdoc = tdoc; +    obj->attr = NULL; +    obj->type = PHP_IS_TIDYNODE; +     +    return_value->type = IS_OBJECT; +	return_value->value.obj = php_tidy_register_object(obj TSRMLS_CC);	 +	 +} +/* }}} */ + +/* {{{ proto TidyNode tidy_get_html(resource tidy) +    Returns a TidyNode Object starting from the <HTML> tag of the tidy parse tree */ +PHP_FUNCTION(tidy_get_html) { +     +    zval *res; +    PHPTidyDoc *tdoc; +	PHPTidyObj *obj; +	 +    if(ZEND_NUM_ARGS() != 1) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "r", &res) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); + +    if(!tdoc->parsed) { +		php_error_docref(NULL TSRMLS_CC, E_WARNING, "A document must be parsed before executing this function."); +		RETURN_FALSE; +    } +     +    obj = php_tidy_new(); +    obj->node = tidyGetHtml(tdoc->doc); +    obj->tdoc = tdoc; +    obj->attr = NULL; +    obj->type = PHP_IS_TIDYNODE; +     +    return_value->type = IS_OBJECT; +	return_value->value.obj = php_tidy_register_object(obj TSRMLS_CC);	 +	 +} +/* }}} */ + +/* {{{ proto TidyNode tidy_get_head(resource tidy) +    Returns a TidyNode Object starting from the <HEAD> tag of the tidy parse tree */ +PHP_FUNCTION(tidy_get_head) { +     +    zval *res; +    PHPTidyDoc *tdoc; +	PHPTidyObj *obj; +	 +    if(ZEND_NUM_ARGS() != 1) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "r", &res) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); + +    if(!tdoc->parsed) { +		php_error_docref(NULL TSRMLS_CC, E_WARNING, "A document must be parsed before executing this function."); +		RETURN_FALSE; +    } +     +    obj = php_tidy_new(); +    obj->node = tidyGetHead(tdoc->doc); +    obj->tdoc = tdoc; +    obj->attr = NULL; +    obj->type = PHP_IS_TIDYNODE; +     +    return_value->type = IS_OBJECT; +	return_value->value.obj = php_tidy_register_object(obj TSRMLS_CC);	 +	 +} +/* }}} */ + +/* {{{ proto TidyNode tidy_get_body(resource tidy) +    Returns a TidyNode Object starting from the <BODY> tag of the tidy parse tree */ +PHP_FUNCTION(tidy_get_body) { +     +    zval *res; +    PHPTidyDoc *tdoc; +	PHPTidyObj *obj; +	 +    if(ZEND_NUM_ARGS() != 1) { +        WRONG_PARAM_COUNT; +    } +     +    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "r", &res) == FAILURE) { +        return; +    } +     +    ZEND_FETCH_RESOURCE(tdoc, PHPTidyDoc *, &res, -1, le_tidydoc_name, le_tidydoc); + +    if(!tdoc->parsed) { +		php_error_docref(NULL TSRMLS_CC, E_WARNING, "A document must be parsed before executing this function."); +		RETURN_FALSE; +    } +     +    obj = php_tidy_new(); +    obj->node = tidyGetBody(tdoc->doc); +    obj->tdoc = tdoc; +    obj->attr = NULL; +    obj->type = PHP_IS_TIDYNODE; +     +    return_value->type = IS_OBJECT; +	return_value->value.obj = php_tidy_register_object(obj TSRMLS_CC);	 +	 +} +/* }}} */ + +void tidy_property_delete(zval *obj, zval *member TSRMLS_DC) {} +void tidy_property_write(zval *obj, zval *member, zval *value TSRMLS_DC) {} +void tidy_object_cast(zval *readobj, zval *writeobj, int type, int should_free TSRMLS_DC) {} +void tidy_object_set(zval **property, zval *value TSRMLS_DC) {} +union _zend_function * tidy_get_constructor(zval *obj TSRMLS_DC) { +	return NULL; +} + +zend_class_entry * tidy_get_class_entry(zval *obj TSRMLS_DC) { +	return php_tidy_ce; +} + +zval * tidy_object_get(zval *property TSRMLS_DC) { +	return NULL; +} + +zval ** tidy_property_get_ptr(zval *obj, zval *member TSRMLS_DC) { +	zval **p_ptr; +	zval  *p; + +	p_ptr = emalloc(sizeof(zval **)); + +	p = tidy_property_read(obj, member, 0 TSRMLS_CC); + +	*p_ptr = p; +	 +	return p_ptr; +	 +} + +zval * tidy_property_read(zval *object, zval *member, zend_bool silent TSRMLS_DC) { +	 +	PHPTidyObj *obj = php_tidy_fetch_object(object); +	PHPTidyObj *newobj; +	zval *return_value, *temp; +	TidyBuffer buf; +	TidyNode tempnode; +	TidyAttr tempattr; +	char *temp_str; +	 +	char *name = Z_STRVAL_P(member); +	    +	MAKE_STD_ZVAL(return_value); +	ZVAL_NULL(return_value); + +	switch(obj->type) { +		 +		case PHP_IS_TIDYNODE: +					 +			if(!strcmp(name, "name")) { +				temp_str = (char *)tidyNodeGetName(obj->node); +				if(temp_str) { +					ZVAL_STRING(return_value, temp_str, 1); +				}  +				 +			} else if(!strcmp(name, "value")) { +				 +				memset(&buf, 0, sizeof(buf)); +				tidyNodeGetText(obj->tdoc->doc, obj->node, &buf); +				ZVAL_STRING(return_value, (char *)buf.bp, 1); +				 +				/* The buffer adds a newline at the end of the string */ +				REMOVE_NEWLINE(return_value); +				 +				tidyBufFree(&buf); +						 +			} else if(!strcmp(name, "type")) { +				 +				ZVAL_LONG(return_value, tidyNodeGetType(obj->node)); +						   +			} else if(!strcmp(name, "id")) { +				 +				if(tidyNodeGetName(obj->node)) { +					ZVAL_LONG(return_value, tidyNodeGetId(obj->node)); +				} +						   +			} else if(!strcmp(name, "attribs")) { +				 +				array_init(return_value); +				 +				tempattr = tidyAttrFirst(obj->node); +				 +				if(tempattr) { +					 +					newobj = php_tidy_new(); +					newobj->node = obj->node; +					newobj->tdoc = obj->tdoc; +					newobj->attr = tempattr; +					newobj->type = PHP_IS_TIDYATTR; +					 +					MAKE_STD_ZVAL(temp); +			 +					temp->type = IS_OBJECT; +					temp->value.obj = php_tidy_register_object(newobj TSRMLS_CC); +					//zend_objects_store_add_ref(object); +					add_next_index_zval(return_value, temp); +					 +					while((tempattr = tidyAttrNext(tempattr))) { +						 +						newobj = php_tidy_new(); +						newobj->node = obj->node; +						newobj->tdoc = obj->tdoc; +						newobj->attr = tempattr; +						newobj->type = PHP_IS_TIDYATTR; +						 +						MAKE_STD_ZVAL(temp); +			 +						temp->type = IS_OBJECT; +						temp->value.obj = php_tidy_register_object(newobj TSRMLS_CC); +						//zend_objects_store_add_ref(object); +						add_next_index_zval(return_value, temp); +						 +					} +				} +				 +			} else if(!strcmp(name, "children")) { +				 +				array_init(return_value); +				tempnode = tidyGetChild(obj->node); +				if(tempnode) { +					 +					newobj = php_tidy_new(); +					newobj->node = tempnode; +					newobj->tdoc = obj->tdoc; +					newobj->attr = NULL; +					newobj->type = PHP_IS_TIDYNODE; +					 +					MAKE_STD_ZVAL(temp); +			 +					temp->type = IS_OBJECT; +					temp->value.obj = php_tidy_register_object(newobj TSRMLS_CC); +					//zend_objects_store_add_ref(object); +					add_next_index_zval(return_value, temp); +					 +					while((tempnode = tidyGetNext(tempnode))) { +						 +							newobj = php_tidy_new(); +							newobj->node = tempnode; +							newobj->tdoc = obj->tdoc; +							newobj->attr = NULL; +							newobj->type = PHP_IS_TIDYNODE; +				 +							MAKE_STD_ZVAL(temp); +					 +							temp->type = IS_OBJECT; +							temp->value.obj = php_tidy_register_object(newobj TSRMLS_CC); +							//zend_objects_store_add_ref(object); +							add_next_index_zval(return_value, temp); +							 +					} +				} +				 +			} else if(!strcmp(name, "line")) { +				ZVAL_LONG(return_value, tidyNodeLine(obj->node)); +			} else if(!strcmp(name, "column")) { +				ZVAL_LONG(return_value, tidyNodeColumn(obj->node)); +			} else if(!strcmp(name, "html_ver")) { +				ZVAL_LONG(return_value, tidyDetectedHtmlVersion(obj->tdoc->doc)); +			} +			 +			break; +		case PHP_IS_TIDYATTR: +			 +			if(!strcmp(name, "name")) { +				temp_str = (char *)tidyAttrName(obj->attr); +				if(temp_str) { +					ZVAL_STRING(return_value, temp_str , 1); +				} +			} else if(!strcmp(name, "value")) { +				temp_str = (char *)tidyAttrValue(obj->attr); +				if(temp_str) { +					ZVAL_STRING(return_value, temp_str , 1); +					efree(temp_str); +				} +			} else if(!strcmp(name, "id")) { +				ZVAL_LONG(return_value,	tidyAttrGetId(obj->attr)); +			} +			 +			break; +		default: +			php_error_docref(NULL TSRMLS_CC,E_ERROR, "Something is wrong -- undefined object type."); +			break; +	} +	 +	return return_value; +			 +} + +int tidy_property_exists(zval *object, zval *member, int check_empty TSRMLS_DC) { +	 +	return TRUE; +} + +HashTable * tidy_get_properties(zval *object TSRMLS_DC) { +	 +	return NULL; +	 +} + +union _zend_function * tidy_get_method(zval *obj, char *method, int method_len TSRMLS_DC) { +	 +	zend_internal_function *f; + +	f = emalloc(sizeof(zend_internal_function)); +	f->type = ZEND_OVERLOADED_FUNCTION; +	f->arg_types = NULL; +	f->scope = php_tidy_ce; +	f->fn_flags = 0; +		f->function_name = estrndup(method, method_len); + +	return (union _zend_function *) f; +} + +zend_bool _php_tidy_node_call_method(char *method, INTERNAL_FUNCTION_PARAMETERS) { + +	PHPTidyObj *obj = php_tidy_fetch_object(getThis()); +	PHPTidyObj *newobj; +	TidyNode tempnode; +	TidyAttr tempattr; +	 +	int param; +	 +	if(strstr(method, "has_")) { +	 +		if(!strcmp(method, "has_siblings")) { +			 +			if(tidyGetNext(obj->node) || tidyGetPrev(obj->node)) { +				TIDY_RV_TRUE(return_value); +			} else { +				TIDY_RV_FALSE(return_value); +			} +					 +		} else if(!strcmp(method, "has_children")) { +		 +			if(tidyGetChild(obj->node)) { +				TIDY_RV_TRUE(return_value); +			} else { +				TIDY_RV_FALSE(return_value); +			} +				 +		} else if(!strcmp(method, "has_parent")) { +			 +			if(tidyGetParent(obj->node)) { +				TIDY_RV_TRUE(return_value); +			} else { +				TIDY_RV_FALSE(return_value); +			} +		 +		}		 +	 +	} else if(strstr(method, "is_")) { + +		if(!strcmp(method, "is_comment")) { +		 +			if(tidyNodeGetType(obj->node) == TidyNode_Comment) { +				TIDY_RV_TRUE(return_value); +			} else { +				TIDY_RV_FALSE(return_value); +			} +		 +		} else if(!strcmp(method, "is_xhtml")) { +		 +			if(tidyDetectedXhtml(obj->tdoc->doc)) { +				TIDY_RV_TRUE(return_value); +			} else { +				TIDY_RV_FALSE(return_value); +			} +		 +		} else if(!strcmp(method, "is_xml")) { +		 +			if(tidyDetectedGenericXml(obj->tdoc->doc)) { +				TIDY_RV_TRUE(return_value); +			} else { +				TIDY_RV_FALSE(return_value); +			} +		 +		} else if(!strcmp(method, "is_text")) { +		 +			if(tidyNodeGetType(obj->node) == TidyNode_Text) { +				TIDY_RV_TRUE(return_value); +			} else { +				TIDY_RV_FALSE(return_value); +			} +		 +		} else if(!strcmp(method, "is_jste")) { +		 +			if(tidyNodeGetType(obj->node) == TidyNode_Jste) { +				TIDY_RV_TRUE(return_value); +			} else { +				TIDY_RV_FALSE(return_value); +			} +		 +		} else if(!strcmp(method, "is_asp")) { +		 +			if(tidyNodeGetType(obj->node) == TidyNode_Asp) { +				TIDY_RV_TRUE(return_value); +			} else { +				TIDY_RV_FALSE(return_value); +			} +		 +		} else if(!strcmp(method, "is_php")) { +		 +			if(tidyNodeGetType(obj->node) == TidyNode_Php) { +				TIDY_RV_TRUE(return_value); +			} else { +				TIDY_RV_FALSE(return_value); +			} +		 +		} else if(!strcmp(method, "is_html")) { +				 +			switch(tidyNodeGetType(obj->node)) { +				 +				case TidyNode_Start: +				case TidyNode_End: +				case TidyNode_StartEnd: +					TIDY_RV_TRUE(return_value); +					break; +				default: +					TIDY_RV_FALSE(return_value); +					break; +			} +	 +		} +				 +	} else { +		 +		if(!strcmp(method, "next")) { +				 +				tempnode = tidyGetNext(obj->node); +				if(tempnode) { +					newobj = php_tidy_new(); +					newobj->tdoc = obj->tdoc; +					newobj->node = tempnode; +					newobj->type = PHP_IS_TIDYNODE; +					return_value->type = IS_OBJECT; +					return_value->value.obj = php_tidy_register_object(newobj TSRMLS_CC); +					//zend_objects_store_add_ref(getThis()); +				}  +							 +		}  else if(!strcmp(method, "prev")) { + +				tempnode = tidyGetPrev(obj->node); +				if(tempnode) { +					newobj = php_tidy_new(); +					newobj->tdoc = obj->tdoc; +					newobj->node = tempnode; +					newobj->type = PHP_IS_TIDYNODE; +					return_value->type = IS_OBJECT; +					return_value->value.obj = php_tidy_register_object(newobj TSRMLS_CC); +					//zend_objects_store_add_ref(getThis()); +				}  +				 +		} else if(!strcmp(method, "parent")) { + +				tempnode = tidyGetParent(obj->node); +				if(tempnode) { +					newobj = php_tidy_new(); +					newobj->tdoc = obj->tdoc; +					newobj->node = tempnode; +					newobj->type = PHP_IS_TIDYNODE; +					return_value->type = IS_OBJECT; +					return_value->value.obj = php_tidy_register_object(newobj TSRMLS_CC); +					//zend_objects_store_add_ref(getThis()); +				}  +				 +		} else if(!strcmp(method, "child")) { + +				tempnode = tidyGetChild(obj->node); +				if(tempnode) { +					newobj = php_tidy_new(); +					newobj->tdoc = obj->tdoc; +					newobj->node = tempnode; +					newobj->type = PHP_IS_TIDYNODE; +					return_value->type = IS_OBJECT; +					return_value->value.obj = php_tidy_register_object(newobj TSRMLS_CC); +					//zend_objects_store_add_ref(getThis()); +				}  +		 +		} else if(!strcmp(method, "get_attr_type")) { +			 +			if(ZEND_NUM_ARGS() != 1) { +				zend_wrong_param_count(TSRMLS_CC); +				return TRUE; +			} +			 +			if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, +                             "l", ¶m) == FAILURE) { +				return FALSE; +			} +			 +			newobj = php_tidy_new(); +			newobj->tdoc = obj->tdoc; +			 +			for(tempattr = tidyAttrFirst(obj->node); +				tempattr; +				tempattr = tidyAttrNext(tempattr)) { +				 +				if(tidyAttrGetId(tempattr) == param) { +			 +					newobj->attr = tempattr; +					newobj->type = PHP_IS_TIDYATTR; +					 +					return_value->type = IS_OBJECT; +					return_value->value.obj = php_tidy_register_object(newobj TSRMLS_CC); +					//zend_objects_store_add_ref(getThis()); +					break; +			 +				} +				 +			} +						 +		} else { +			 +			return FALSE; + +		} +	} +	 +	return TRUE; +	 +} + +zend_bool _php_tidy_attr_call_method(char *method, INTERNAL_FUNCTION_PARAMETERS) { +	 +	PHPTidyObj *obj = php_tidy_fetch_object(getThis()); +	PHPTidyObj *newobj; +	TidyAttr tempattr; +		 +	if(!strcmp(method, "next")) { +		 +		tempattr = tidyAttrNext(obj->attr); +		 +		if(tempattr) { +			 +			newobj = php_tidy_new(); +			newobj->tdoc = obj->tdoc; +			newobj->node = obj->node; +			newobj->attr = tempattr; +			newobj->type = PHP_IS_TIDYATTR; +			return_value->type = IS_OBJECT; +			return_value->value.obj = php_tidy_register_object(newobj TSRMLS_CC); +			zend_objects_store_add_ref(getThis()); +			 +		} else { +			 +			TIDY_RV_FALSE(return_value); +		 +		} +		 +	} else if(!strcmp(method, "tag")) { +		 +			newobj = php_tidy_new(); +			newobj->tdoc = obj->tdoc; +			newobj->node = obj->node; +			newobj->attr = NULL; +			newobj->type = PHP_IS_TIDYNODE; +			return_value->type = IS_OBJECT; +			return_value->value.obj = php_tidy_register_object(newobj TSRMLS_CC); +			zend_objects_store_add_ref(getThis()); +				 +	} else { +		 +		return FALSE; +		 +	} +	 +	return TRUE; +} + +int tidy_call_method(char *method, INTERNAL_FUNCTION_PARAMETERS) { +	 +	PHPTidyObj *obj = php_tidy_fetch_object(getThis()); +	 +	switch(obj->type) { +		 +		case PHP_IS_TIDYNODE: +			return _php_tidy_node_call_method(method, INTERNAL_FUNCTION_PARAM_PASSTHRU); +			break; +		case PHP_IS_TIDYATTR: +			return _php_tidy_attr_call_method(method, INTERNAL_FUNCTION_PARAM_PASSTHRU); +			break; +		default: +			php_error_docref(NULL TSRMLS_CC, E_ERROR, "Undefined Tidy object type."); +			break; +	} +	 +	return FALSE; +} + +int tidy_get_class_name(zval *obj, char **class_name, zend_uint *name_len, int parent TSRMLS_DC) { +	 +	PHPTidyObj *object = php_tidy_fetch_object(obj); +	 +	switch(object->type) { +		 +		case PHP_IS_TIDYNODE: +	 +			*class_name = estrdup("Tidy_Node"); +			*name_len = sizeof("Tidy_Node"); +	 +			break; +		case PHP_IS_TIDYATTR: +	 +			*class_name = estrdup("Tidy_Attribute"); +			*name_len = sizeof("Tidy_Attribute"); +	 +			break; +		default: +			 +			*class_name = estrdup("Tidy_Unknown"); +			*name_len = sizeof("Tidy_Unknown"); +			break; +	} +	 +	return TRUE; +} + +int tidy_objects_compare(zval *obj_one, zval *obj_two TSRMLS_DC) { +	PHPTidyObj *obj1, *obj2; +	 +	obj1 = php_tidy_fetch_object(obj_one); +	obj2 = php_tidy_fetch_object(obj_two); +	 +	if( (obj1->tdoc == obj2->tdoc) && +		(obj1->node == obj2->node) && +		(obj1->attr == obj2->attr) && +		(obj1->type == obj2->type)) { +		 +		return TRUE; +		 +	} +	 +	return FALSE; +	 +} + + +void _php_tidy_register_nodetypes(INIT_FUNC_ARGS) { +     +    TIDY_NODE_CONST(ROOT, Root); +    TIDY_NODE_CONST(DOCTYPE, DocType); +    TIDY_NODE_CONST(COMMENT, Comment); +    TIDY_NODE_CONST(PROCINS, ProcIns); +    TIDY_NODE_CONST(TEXT, Text); +    TIDY_NODE_CONST(START, Start); +    TIDY_NODE_CONST(END, End); +    TIDY_NODE_CONST(STARTEND, StartEnd); +    TIDY_NODE_CONST(CDATA, CDATA); +    TIDY_NODE_CONST(SECTION, Section); +    TIDY_NODE_CONST(ASP, Asp); +    TIDY_NODE_CONST(JSTE, Jste); +    TIDY_NODE_CONST(PHP, Php); +    TIDY_NODE_CONST(XMLDECL, XmlDecl); +     +} + +void _php_tidy_register_tags(INIT_FUNC_ARGS) { + +    TIDY_TAG_CONST(UNKNOWN); +    TIDY_TAG_CONST(A); +    TIDY_TAG_CONST(ABBR); +    TIDY_TAG_CONST(ACRONYM); +    TIDY_TAG_CONST(ADDRESS); +    TIDY_TAG_CONST(ALIGN); +    TIDY_TAG_CONST(APPLET); +    TIDY_TAG_CONST(AREA); +    TIDY_TAG_CONST(B); +    TIDY_TAG_CONST(BASE); +    TIDY_TAG_CONST(BASEFONT); +    TIDY_TAG_CONST(BDO); +    TIDY_TAG_CONST(BGSOUND); +    TIDY_TAG_CONST(BIG); +    TIDY_TAG_CONST(BLINK); +    TIDY_TAG_CONST(BLOCKQUOTE); +    TIDY_TAG_CONST(BODY); +    TIDY_TAG_CONST(BR); +    TIDY_TAG_CONST(BUTTON); +    TIDY_TAG_CONST(CAPTION); +    TIDY_TAG_CONST(CENTER); +    TIDY_TAG_CONST(CITE); +    TIDY_TAG_CONST(CODE); +    TIDY_TAG_CONST(COL); +    TIDY_TAG_CONST(COLGROUP); +    TIDY_TAG_CONST(COMMENT); +    TIDY_TAG_CONST(DD); +    TIDY_TAG_CONST(DEL); +    TIDY_TAG_CONST(DFN); +    TIDY_TAG_CONST(DIR); +    TIDY_TAG_CONST(DIV); +    TIDY_TAG_CONST(DL); +    TIDY_TAG_CONST(DT); +    TIDY_TAG_CONST(EM); +    TIDY_TAG_CONST(EMBED); +    TIDY_TAG_CONST(FIELDSET); +    TIDY_TAG_CONST(FONT); +    TIDY_TAG_CONST(FORM); +    TIDY_TAG_CONST(FRAME); +    TIDY_TAG_CONST(FRAMESET); +    TIDY_TAG_CONST(H1); +    TIDY_TAG_CONST(H2); +    TIDY_TAG_CONST(H3); +    TIDY_TAG_CONST(H4); +    TIDY_TAG_CONST(H5); +    TIDY_TAG_CONST(H6); +    TIDY_TAG_CONST(HEAD); +    TIDY_TAG_CONST(HR); +    TIDY_TAG_CONST(HTML); +    TIDY_TAG_CONST(I); +    TIDY_TAG_CONST(IFRAME); +    TIDY_TAG_CONST(ILAYER); +    TIDY_TAG_CONST(IMG); +    TIDY_TAG_CONST(INPUT); +    TIDY_TAG_CONST(INS); +    TIDY_TAG_CONST(ISINDEX); +    TIDY_TAG_CONST(KBD); +    TIDY_TAG_CONST(KEYGEN); +    TIDY_TAG_CONST(LABEL); +    TIDY_TAG_CONST(LAYER); +    TIDY_TAG_CONST(LEGEND); +    TIDY_TAG_CONST(LI); +    TIDY_TAG_CONST(LINK); +    TIDY_TAG_CONST(LISTING); +    TIDY_TAG_CONST(MAP); +    TIDY_TAG_CONST(MARQUEE); +    TIDY_TAG_CONST(MENU); +    TIDY_TAG_CONST(META); +    TIDY_TAG_CONST(MULTICOL); +    TIDY_TAG_CONST(NOBR); +    TIDY_TAG_CONST(NOEMBED); +    TIDY_TAG_CONST(NOFRAMES); +    TIDY_TAG_CONST(NOLAYER); +    TIDY_TAG_CONST(NOSAVE); +    TIDY_TAG_CONST(NOSCRIPT); +    TIDY_TAG_CONST(OBJECT); +    TIDY_TAG_CONST(OL); +    TIDY_TAG_CONST(OPTGROUP); +    TIDY_TAG_CONST(OPTION); +    TIDY_TAG_CONST(P); +    TIDY_TAG_CONST(PARAM); +    TIDY_TAG_CONST(PLAINTEXT); +    TIDY_TAG_CONST(PRE); +    TIDY_TAG_CONST(Q); +    TIDY_TAG_CONST(RB); +    TIDY_TAG_CONST(RBC); +    TIDY_TAG_CONST(RP); +    TIDY_TAG_CONST(RT); +    TIDY_TAG_CONST(RTC); +    TIDY_TAG_CONST(RUBY); +    TIDY_TAG_CONST(S); +    TIDY_TAG_CONST(SAMP); +    TIDY_TAG_CONST(SCRIPT); +    TIDY_TAG_CONST(SELECT); +    TIDY_TAG_CONST(SERVER); +    TIDY_TAG_CONST(SERVLET); +    TIDY_TAG_CONST(SMALL); +    TIDY_TAG_CONST(SPACER); +    TIDY_TAG_CONST(SPAN); +    TIDY_TAG_CONST(STRIKE); +    TIDY_TAG_CONST(STRONG); +    TIDY_TAG_CONST(STYLE); +    TIDY_TAG_CONST(SUB); +    TIDY_TAG_CONST(SUP); +    TIDY_TAG_CONST(TABLE); +    TIDY_TAG_CONST(TBODY); +    TIDY_TAG_CONST(TD); +    TIDY_TAG_CONST(TEXTAREA); +    TIDY_TAG_CONST(TFOOT); +    TIDY_TAG_CONST(TH); +    TIDY_TAG_CONST(THEAD); +    TIDY_TAG_CONST(TITLE); +    TIDY_TAG_CONST(TR); +    TIDY_TAG_CONST(TT); +    TIDY_TAG_CONST(U); +    TIDY_TAG_CONST(UL); +    TIDY_TAG_CONST(VAR); +    TIDY_TAG_CONST(WBR); +    TIDY_TAG_CONST(XMP); + +} + +void _php_tidy_register_attributes(INIT_FUNC_ARGS) { + +    TIDY_ATTR_CONST(UNKNOWN); +    TIDY_ATTR_CONST(ABBR); +    TIDY_ATTR_CONST(ACCEPT); +    TIDY_ATTR_CONST(ACCEPT_CHARSET); +    TIDY_ATTR_CONST(ACCESSKEY); +    TIDY_ATTR_CONST(ACTION); +    TIDY_ATTR_CONST(ADD_DATE); +    TIDY_ATTR_CONST(ALIGN); +    TIDY_ATTR_CONST(ALINK); +    TIDY_ATTR_CONST(ALT); +    TIDY_ATTR_CONST(ARCHIVE); +    TIDY_ATTR_CONST(AXIS); +    TIDY_ATTR_CONST(BACKGROUND); +    TIDY_ATTR_CONST(BGCOLOR); +    TIDY_ATTR_CONST(BGPROPERTIES); +    TIDY_ATTR_CONST(BORDER); +    TIDY_ATTR_CONST(BORDERCOLOR); +    TIDY_ATTR_CONST(BOTTOMMARGIN); +    TIDY_ATTR_CONST(CELLPADDING); +    TIDY_ATTR_CONST(CELLSPACING); +    TIDY_ATTR_CONST(CHAR); +    TIDY_ATTR_CONST(CHAROFF); +    TIDY_ATTR_CONST(CHARSET); +    TIDY_ATTR_CONST(CHECKED); +    TIDY_ATTR_CONST(CITE); +    TIDY_ATTR_CONST(CLASS); +    TIDY_ATTR_CONST(CLASSID); +    TIDY_ATTR_CONST(CLEAR); +    TIDY_ATTR_CONST(CODE); +    TIDY_ATTR_CONST(CODEBASE); +    TIDY_ATTR_CONST(CODETYPE); +    TIDY_ATTR_CONST(COLOR); +    TIDY_ATTR_CONST(COLS); +    TIDY_ATTR_CONST(COLSPAN); +    TIDY_ATTR_CONST(COMPACT); +    TIDY_ATTR_CONST(CONTENT); +    TIDY_ATTR_CONST(COORDS); +    TIDY_ATTR_CONST(DATA); +    TIDY_ATTR_CONST(DATAFLD); +    //TIDY_ATTR_CONST(DATAFORMATSAS); +    TIDY_ATTR_CONST(DATAPAGESIZE); +    TIDY_ATTR_CONST(DATASRC); +    TIDY_ATTR_CONST(DATETIME); +    TIDY_ATTR_CONST(DECLARE); +    TIDY_ATTR_CONST(DEFER); +    TIDY_ATTR_CONST(DIR); +    TIDY_ATTR_CONST(DISABLED); +    TIDY_ATTR_CONST(ENCODING); +    TIDY_ATTR_CONST(ENCTYPE); +    TIDY_ATTR_CONST(FACE); +    TIDY_ATTR_CONST(FOR); +    TIDY_ATTR_CONST(FRAME); +    TIDY_ATTR_CONST(FRAMEBORDER); +    TIDY_ATTR_CONST(FRAMESPACING); +    TIDY_ATTR_CONST(GRIDX); +    TIDY_ATTR_CONST(GRIDY); +    TIDY_ATTR_CONST(HEADERS); +    TIDY_ATTR_CONST(HEIGHT); +    TIDY_ATTR_CONST(HREF); +    TIDY_ATTR_CONST(HREFLANG); +    TIDY_ATTR_CONST(HSPACE); +    TIDY_ATTR_CONST(HTTP_EQUIV); +    TIDY_ATTR_CONST(ID); +    TIDY_ATTR_CONST(ISMAP); +    TIDY_ATTR_CONST(LABEL); +    TIDY_ATTR_CONST(LANG); +    TIDY_ATTR_CONST(LANGUAGE); +    TIDY_ATTR_CONST(LAST_MODIFIED); +    TIDY_ATTR_CONST(LAST_VISIT); +    TIDY_ATTR_CONST(LEFTMARGIN); +    TIDY_ATTR_CONST(LINK); +    TIDY_ATTR_CONST(LONGDESC); +    TIDY_ATTR_CONST(LOWSRC); +    TIDY_ATTR_CONST(MARGINHEIGHT); +    TIDY_ATTR_CONST(MARGINWIDTH); +    TIDY_ATTR_CONST(MAXLENGTH); +    TIDY_ATTR_CONST(MEDIA); +    TIDY_ATTR_CONST(METHOD); +    TIDY_ATTR_CONST(MULTIPLE); +    TIDY_ATTR_CONST(NAME); +    TIDY_ATTR_CONST(NOHREF); +    TIDY_ATTR_CONST(NORESIZE); +    TIDY_ATTR_CONST(NOSHADE); +    TIDY_ATTR_CONST(NOWRAP); +    TIDY_ATTR_CONST(OBJECT); +    TIDY_ATTR_CONST(OnAFTERUPDATE); +    TIDY_ATTR_CONST(OnBEFOREUNLOAD); +    TIDY_ATTR_CONST(OnBEFOREUPDATE); +    TIDY_ATTR_CONST(OnBLUR); +    TIDY_ATTR_CONST(OnCHANGE); +    TIDY_ATTR_CONST(OnCLICK); +    TIDY_ATTR_CONST(OnDATAAVAILABLE); +    TIDY_ATTR_CONST(OnDATASETCHANGED); +    TIDY_ATTR_CONST(OnDATASETCOMPLETE); +    TIDY_ATTR_CONST(OnDBLCLICK); +    TIDY_ATTR_CONST(OnERRORUPDATE); +    TIDY_ATTR_CONST(OnFOCUS); +    TIDY_ATTR_CONST(OnKEYDOWN); +    TIDY_ATTR_CONST(OnKEYPRESS); +    TIDY_ATTR_CONST(OnKEYUP); +    TIDY_ATTR_CONST(OnLOAD); +    TIDY_ATTR_CONST(OnMOUSEDOWN); +    TIDY_ATTR_CONST(OnMOUSEMOVE); +    TIDY_ATTR_CONST(OnMOUSEOUT); +    TIDY_ATTR_CONST(OnMOUSEOVER); +    TIDY_ATTR_CONST(OnMOUSEUP); +    TIDY_ATTR_CONST(OnRESET); +    TIDY_ATTR_CONST(OnROWENTER); +    TIDY_ATTR_CONST(OnROWEXIT); +    TIDY_ATTR_CONST(OnSELECT); +    TIDY_ATTR_CONST(OnSUBMIT); +    TIDY_ATTR_CONST(OnUNLOAD); +    TIDY_ATTR_CONST(PROFILE); +    TIDY_ATTR_CONST(PROMPT); +    TIDY_ATTR_CONST(RBSPAN); +    TIDY_ATTR_CONST(READONLY); +    TIDY_ATTR_CONST(REL); +    TIDY_ATTR_CONST(REV); +    TIDY_ATTR_CONST(RIGHTMARGIN); +    TIDY_ATTR_CONST(ROWS); +    TIDY_ATTR_CONST(ROWSPAN); +    TIDY_ATTR_CONST(RULES); +    TIDY_ATTR_CONST(SCHEME); +    TIDY_ATTR_CONST(SCOPE); +    TIDY_ATTR_CONST(SCROLLING); +    TIDY_ATTR_CONST(SELECTED); +    TIDY_ATTR_CONST(SHAPE); +    TIDY_ATTR_CONST(SHOWGRID); +    TIDY_ATTR_CONST(SHOWGRIDX); +    TIDY_ATTR_CONST(SHOWGRIDY); +    TIDY_ATTR_CONST(SIZE); +    TIDY_ATTR_CONST(SPAN); +    TIDY_ATTR_CONST(SRC); +    TIDY_ATTR_CONST(STANDBY); +    TIDY_ATTR_CONST(START); +    TIDY_ATTR_CONST(STYLE); +    TIDY_ATTR_CONST(SUMMARY); +    TIDY_ATTR_CONST(TABINDEX); +    TIDY_ATTR_CONST(TARGET); +    TIDY_ATTR_CONST(TEXT); +    TIDY_ATTR_CONST(TITLE); +    TIDY_ATTR_CONST(TOPMARGIN); +    TIDY_ATTR_CONST(TYPE); +    TIDY_ATTR_CONST(USEMAP); +    TIDY_ATTR_CONST(VALIGN); +    TIDY_ATTR_CONST(VALUE); +    TIDY_ATTR_CONST(VALUETYPE); +    TIDY_ATTR_CONST(VERSION); +    TIDY_ATTR_CONST(VLINK); +    TIDY_ATTR_CONST(VSPACE); +    TIDY_ATTR_CONST(WIDTH); +    TIDY_ATTR_CONST(WRAP); +    TIDY_ATTR_CONST(XML_LANG); +    TIDY_ATTR_CONST(XML_SPACE); +    TIDY_ATTR_CONST(XMLNS); +         +}  | 
