Annotation of embedaddon/php/ext/dom/characterdata.c, revision 1.1
1.1 ! misho 1: /*
! 2: +----------------------------------------------------------------------+
! 3: | PHP Version 5 |
! 4: +----------------------------------------------------------------------+
! 5: | Copyright (c) 1997-2012 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: | Authors: Christian Stocker <chregu@php.net> |
! 16: | Rob Richards <rrichards@php.net> |
! 17: +----------------------------------------------------------------------+
! 18: */
! 19:
! 20: /* $Id: characterdata.c 321634 2012-01-01 13:15:04Z felipe $ */
! 21:
! 22: #ifdef HAVE_CONFIG_H
! 23: #include "config.h"
! 24: #endif
! 25:
! 26: #include "php.h"
! 27: #if HAVE_LIBXML && HAVE_DOM
! 28: #include "php_dom.h"
! 29:
! 30:
! 31: /* {{{ arginfo */
! 32: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_characterdata_substring_data, 0, 0, 2)
! 33: ZEND_ARG_INFO(0, offset)
! 34: ZEND_ARG_INFO(0, count)
! 35: ZEND_END_ARG_INFO();
! 36:
! 37: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_characterdata_append_data, 0, 0, 1)
! 38: ZEND_ARG_INFO(0, arg)
! 39: ZEND_END_ARG_INFO();
! 40:
! 41: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_characterdata_insert_data, 0, 0, 2)
! 42: ZEND_ARG_INFO(0, offset)
! 43: ZEND_ARG_INFO(0, arg)
! 44: ZEND_END_ARG_INFO();
! 45:
! 46: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_characterdata_delete_data, 0, 0, 2)
! 47: ZEND_ARG_INFO(0, offset)
! 48: ZEND_ARG_INFO(0, count)
! 49: ZEND_END_ARG_INFO();
! 50:
! 51: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_characterdata_replace_data, 0, 0, 3)
! 52: ZEND_ARG_INFO(0, offset)
! 53: ZEND_ARG_INFO(0, count)
! 54: ZEND_ARG_INFO(0, arg)
! 55: ZEND_END_ARG_INFO();
! 56: /* }}} */
! 57:
! 58: /*
! 59: * class DOMCharacterData extends DOMNode
! 60: *
! 61: * URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-FF21A306
! 62: * Since:
! 63: */
! 64:
! 65: const zend_function_entry php_dom_characterdata_class_functions[] = {
! 66: PHP_FALIAS(substringData, dom_characterdata_substring_data, arginfo_dom_characterdata_substring_data)
! 67: PHP_FALIAS(appendData, dom_characterdata_append_data, arginfo_dom_characterdata_append_data)
! 68: PHP_FALIAS(insertData, dom_characterdata_insert_data, arginfo_dom_characterdata_insert_data)
! 69: PHP_FALIAS(deleteData, dom_characterdata_delete_data, arginfo_dom_characterdata_delete_data)
! 70: PHP_FALIAS(replaceData, dom_characterdata_replace_data, arginfo_dom_characterdata_replace_data)
! 71: PHP_FE_END
! 72: };
! 73:
! 74: /* {{{ data string
! 75: readonly=no
! 76: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-72AB8359
! 77: Since:
! 78: */
! 79: int dom_characterdata_data_read(dom_object *obj, zval **retval TSRMLS_DC)
! 80: {
! 81: xmlNodePtr nodep;
! 82: xmlChar *content;
! 83:
! 84: nodep = dom_object_get_node(obj);
! 85:
! 86: if (nodep == NULL) {
! 87: php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
! 88: return FAILURE;
! 89: }
! 90:
! 91: ALLOC_ZVAL(*retval);
! 92:
! 93: if ((content = xmlNodeGetContent(nodep)) != NULL) {
! 94: ZVAL_STRING(*retval, content, 1);
! 95: xmlFree(content);
! 96: } else {
! 97: ZVAL_EMPTY_STRING(*retval);
! 98: }
! 99:
! 100: return SUCCESS;
! 101: }
! 102:
! 103: int dom_characterdata_data_write(dom_object *obj, zval *newval TSRMLS_DC)
! 104: {
! 105: zval value_copy;
! 106: xmlNode *nodep;
! 107:
! 108: nodep = dom_object_get_node(obj);
! 109:
! 110: if (nodep == NULL) {
! 111: php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
! 112: return FAILURE;
! 113: }
! 114:
! 115: if (newval->type != IS_STRING) {
! 116: if(Z_REFCOUNT_P(newval) > 1) {
! 117: value_copy = *newval;
! 118: zval_copy_ctor(&value_copy);
! 119: newval = &value_copy;
! 120: }
! 121: convert_to_string(newval);
! 122: }
! 123:
! 124: xmlNodeSetContentLen(nodep, Z_STRVAL_P(newval), Z_STRLEN_P(newval) + 1);
! 125:
! 126: if (newval == &value_copy) {
! 127: zval_dtor(newval);
! 128: }
! 129:
! 130: return SUCCESS;
! 131: }
! 132:
! 133: /* }}} */
! 134:
! 135: /* {{{ length long
! 136: readonly=yes
! 137: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-7D61178C
! 138: Since:
! 139: */
! 140: int dom_characterdata_length_read(dom_object *obj, zval **retval TSRMLS_DC)
! 141: {
! 142: xmlNodePtr nodep;
! 143: xmlChar *content;
! 144: long length = 0;
! 145:
! 146: nodep = dom_object_get_node(obj);
! 147:
! 148: if (nodep == NULL) {
! 149: php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
! 150: return FAILURE;
! 151: }
! 152:
! 153: ALLOC_ZVAL(*retval);
! 154:
! 155: content = xmlNodeGetContent(nodep);
! 156:
! 157: if (content) {
! 158: length = xmlUTF8Strlen(content);
! 159: xmlFree(content);
! 160: }
! 161:
! 162: ZVAL_LONG(*retval, length);
! 163:
! 164: return SUCCESS;
! 165: }
! 166:
! 167: /* }}} */
! 168:
! 169: /* {{{ proto string dom_characterdata_substring_data(int offset, int count);
! 170: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6531BCCF
! 171: Since:
! 172: */
! 173: PHP_FUNCTION(dom_characterdata_substring_data)
! 174: {
! 175: zval *id;
! 176: xmlChar *cur;
! 177: xmlChar *substring;
! 178: xmlNodePtr node;
! 179: long offset, count;
! 180: int length;
! 181: dom_object *intern;
! 182:
! 183: if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oll", &id, dom_characterdata_class_entry, &offset, &count) == FAILURE) {
! 184: return;
! 185: }
! 186:
! 187: DOM_GET_OBJ(node, id, xmlNodePtr, intern);
! 188:
! 189: cur = xmlNodeGetContent(node);
! 190: if (cur == NULL) {
! 191: RETURN_FALSE;
! 192: }
! 193:
! 194: length = xmlUTF8Strlen(cur);
! 195:
! 196: if (offset < 0 || count < 0 || offset > length) {
! 197: xmlFree(cur);
! 198: php_dom_throw_error(INDEX_SIZE_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
! 199: RETURN_FALSE;
! 200: }
! 201:
! 202: if ((offset + count) > length) {
! 203: count = length - offset;
! 204: }
! 205:
! 206: substring = xmlUTF8Strsub(cur, offset, count);
! 207: xmlFree(cur);
! 208:
! 209: if (substring) {
! 210: RETVAL_STRING(substring, 1);
! 211: xmlFree(substring);
! 212: } else {
! 213: RETVAL_EMPTY_STRING();
! 214: }
! 215: }
! 216: /* }}} end dom_characterdata_substring_data */
! 217:
! 218: /* {{{ proto void dom_characterdata_append_data(string arg);
! 219: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-32791A2F
! 220: Since:
! 221: */
! 222: PHP_FUNCTION(dom_characterdata_append_data)
! 223: {
! 224: zval *id;
! 225: xmlNode *nodep;
! 226: dom_object *intern;
! 227: char *arg;
! 228: int arg_len;
! 229:
! 230: if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &id, dom_characterdata_class_entry, &arg, &arg_len) == FAILURE) {
! 231: return;
! 232: }
! 233:
! 234: DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
! 235: #if LIBXML_VERSION < 20627
! 236: /* Implement logic from libxml xmlTextConcat to add suport for comments and PI */
! 237: if ((nodep->content == (xmlChar *) &(nodep->properties)) ||
! 238: ((nodep->doc != NULL) && (nodep->doc->dict != NULL) &&
! 239: xmlDictOwns(nodep->doc->dict, nodep->content))) {
! 240: nodep->content = xmlStrncatNew(nodep->content, arg, arg_len);
! 241: } else {
! 242: nodep->content = xmlStrncat(nodep->content, arg, arg_len);
! 243: }
! 244: nodep->properties = NULL;
! 245: #else
! 246: xmlTextConcat(nodep, arg, arg_len);
! 247: #endif
! 248: RETURN_TRUE;
! 249: }
! 250: /* }}} end dom_characterdata_append_data */
! 251:
! 252: /* {{{ proto void dom_characterdata_insert_data(int offset, string arg);
! 253: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-3EDB695F
! 254: Since:
! 255: */
! 256: PHP_FUNCTION(dom_characterdata_insert_data)
! 257: {
! 258: zval *id;
! 259: xmlChar *cur, *first, *second;
! 260: xmlNodePtr node;
! 261: char *arg;
! 262: long offset;
! 263: int length, arg_len;
! 264: dom_object *intern;
! 265:
! 266: if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ols", &id, dom_characterdata_class_entry, &offset, &arg, &arg_len) == FAILURE) {
! 267: return;
! 268: }
! 269:
! 270: DOM_GET_OBJ(node, id, xmlNodePtr, intern);
! 271:
! 272: cur = xmlNodeGetContent(node);
! 273: if (cur == NULL) {
! 274: RETURN_FALSE;
! 275: }
! 276:
! 277: length = xmlUTF8Strlen(cur);
! 278:
! 279: if (offset < 0 || offset > length) {
! 280: xmlFree(cur);
! 281: php_dom_throw_error(INDEX_SIZE_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
! 282: RETURN_FALSE;
! 283: }
! 284:
! 285: first = xmlUTF8Strndup(cur, offset);
! 286: second = xmlUTF8Strsub(cur, offset, length - offset);
! 287: xmlFree(cur);
! 288:
! 289: xmlNodeSetContent(node, first);
! 290: xmlNodeAddContent(node, arg);
! 291: xmlNodeAddContent(node, second);
! 292:
! 293: xmlFree(first);
! 294: xmlFree(second);
! 295:
! 296: RETURN_TRUE;
! 297: }
! 298: /* }}} end dom_characterdata_insert_data */
! 299:
! 300: /* {{{ proto void dom_characterdata_delete_data(int offset, int count);
! 301: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-7C603781
! 302: Since:
! 303: */
! 304: PHP_FUNCTION(dom_characterdata_delete_data)
! 305: {
! 306: zval *id;
! 307: xmlChar *cur, *substring, *second;
! 308: xmlNodePtr node;
! 309: long offset, count;
! 310: int length;
! 311: dom_object *intern;
! 312:
! 313: if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oll", &id, dom_characterdata_class_entry, &offset, &count) == FAILURE) {
! 314: return;
! 315: }
! 316:
! 317: DOM_GET_OBJ(node, id, xmlNodePtr, intern);
! 318:
! 319: cur = xmlNodeGetContent(node);
! 320: if (cur == NULL) {
! 321: RETURN_FALSE;
! 322: }
! 323:
! 324: length = xmlUTF8Strlen(cur);
! 325:
! 326: if (offset < 0 || count < 0 || offset > length) {
! 327: xmlFree(cur);
! 328: php_dom_throw_error(INDEX_SIZE_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
! 329: RETURN_FALSE;
! 330: }
! 331:
! 332: if (offset > 0) {
! 333: substring = xmlUTF8Strsub(cur, 0, offset);
! 334: } else {
! 335: substring = NULL;
! 336: }
! 337:
! 338: if ((offset + count) > length) {
! 339: count = length - offset;
! 340: }
! 341:
! 342: second = xmlUTF8Strsub(cur, offset + count, length - offset);
! 343: substring = xmlStrcat(substring, second);
! 344:
! 345: xmlNodeSetContent(node, substring);
! 346:
! 347: xmlFree(cur);
! 348: xmlFree(second);
! 349: xmlFree(substring);
! 350:
! 351: RETURN_TRUE;
! 352: }
! 353: /* }}} end dom_characterdata_delete_data */
! 354:
! 355: /* {{{ proto void dom_characterdata_replace_data(int offset, int count, string arg);
! 356: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-E5CBA7FB
! 357: Since:
! 358: */
! 359: PHP_FUNCTION(dom_characterdata_replace_data)
! 360: {
! 361: zval *id;
! 362: xmlChar *cur, *substring, *second = NULL;
! 363: xmlNodePtr node;
! 364: char *arg;
! 365: long offset, count;
! 366: int length, arg_len;
! 367: dom_object *intern;
! 368:
! 369: if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Olls", &id, dom_characterdata_class_entry, &offset, &count, &arg, &arg_len) == FAILURE) {
! 370: return;
! 371: }
! 372:
! 373: DOM_GET_OBJ(node, id, xmlNodePtr, intern);
! 374:
! 375: cur = xmlNodeGetContent(node);
! 376: if (cur == NULL) {
! 377: RETURN_FALSE;
! 378: }
! 379:
! 380: length = xmlUTF8Strlen(cur);
! 381:
! 382: if (offset < 0 || count < 0 || offset > length) {
! 383: xmlFree(cur);
! 384: php_dom_throw_error(INDEX_SIZE_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
! 385: RETURN_FALSE;
! 386: }
! 387:
! 388: if (offset > 0) {
! 389: substring = xmlUTF8Strsub(cur, 0, offset);
! 390: } else {
! 391: substring = NULL;
! 392: }
! 393:
! 394: if ((offset + count) > length) {
! 395: count = length - offset;
! 396: }
! 397:
! 398: if (offset < length) {
! 399: second = xmlUTF8Strsub(cur, offset + count, length - offset);
! 400: }
! 401:
! 402: substring = xmlStrcat(substring, arg);
! 403: substring = xmlStrcat(substring, second);
! 404:
! 405: xmlNodeSetContent(node, substring);
! 406:
! 407: xmlFree(cur);
! 408: if (second) {
! 409: xmlFree(second);
! 410: }
! 411: xmlFree(substring);
! 412:
! 413: RETURN_TRUE;
! 414: }
! 415: /* }}} end dom_characterdata_replace_data */
! 416:
! 417: #endif
! 418:
! 419: /*
! 420: * Local variables:
! 421: * tab-width: 4
! 422: * c-basic-offset: 4
! 423: * End:
! 424: * vim600: noet sw=4 ts=4 fdm=marker
! 425: * vim<600: noet sw=4 ts=4
! 426: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>