root/ext/dom/characterdata.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. dom_characterdata_data_read
  2. dom_characterdata_data_write
  3. dom_characterdata_length_read
  4. PHP_FUNCTION
  5. PHP_FUNCTION
  6. PHP_FUNCTION
  7. PHP_FUNCTION
  8. PHP_FUNCTION

   1 /*
   2    +----------------------------------------------------------------------+
   3    | PHP Version 5                                                        |
   4    +----------------------------------------------------------------------+
   5    | Copyright (c) 1997-2016 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$ */
  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         convert_to_string_copy(newval, value_copy);
 116 
 117         xmlNodeSetContentLen(nodep, Z_STRVAL_P(newval), Z_STRLEN_P(newval) + 1);
 118 
 119         if (newval == &value_copy) {
 120                 zval_dtor(newval);
 121         }
 122 
 123         return SUCCESS;
 124 }
 125 
 126 /* }}} */
 127 
 128 /* {{{ length   long    
 129 readonly=yes 
 130 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-7D61178C
 131 Since: 
 132 */
 133 int dom_characterdata_length_read(dom_object *obj, zval **retval TSRMLS_DC)
 134 {
 135         xmlNodePtr nodep;
 136         xmlChar *content;
 137         long length = 0;
 138 
 139         nodep = dom_object_get_node(obj);
 140 
 141         if (nodep == NULL) {
 142                 php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
 143                 return FAILURE;
 144         }
 145 
 146         ALLOC_ZVAL(*retval);
 147         
 148         content = xmlNodeGetContent(nodep);
 149 
 150         if (content) {
 151                 length = xmlUTF8Strlen(content);
 152                 xmlFree(content);
 153         }
 154 
 155         ZVAL_LONG(*retval, length);
 156 
 157         return SUCCESS;
 158 }
 159 
 160 /* }}} */
 161 
 162 /* {{{ proto string dom_characterdata_substring_data(int offset, int count);
 163 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6531BCCF
 164 Since: 
 165 */
 166 PHP_FUNCTION(dom_characterdata_substring_data)
 167 {
 168         zval       *id;
 169         xmlChar    *cur;
 170         xmlChar    *substring;
 171         xmlNodePtr  node;
 172         long        offset, count;
 173         int         length;
 174         dom_object      *intern;
 175 
 176         if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oll", &id, dom_characterdata_class_entry, &offset, &count) == FAILURE) {
 177                 return;
 178         }
 179 
 180         DOM_GET_OBJ(node, id, xmlNodePtr, intern);
 181 
 182         cur = xmlNodeGetContent(node);
 183         if (cur == NULL) {
 184                 RETURN_FALSE;
 185         }
 186 
 187         length = xmlUTF8Strlen(cur);
 188 
 189         if (offset < 0 || count < 0 || offset > length) {
 190                 xmlFree(cur);
 191                 php_dom_throw_error(INDEX_SIZE_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
 192                 RETURN_FALSE;
 193         }
 194 
 195         if ((offset + count) > length) {
 196                 count = length - offset;
 197         }
 198 
 199         substring = xmlUTF8Strsub(cur, offset, count);
 200         xmlFree(cur);
 201 
 202         if (substring) {
 203                 RETVAL_STRING(substring, 1);
 204                 xmlFree(substring);
 205         } else {
 206                 RETVAL_EMPTY_STRING();
 207         }
 208 }
 209 /* }}} end dom_characterdata_substring_data */
 210 
 211 /* {{{ proto void dom_characterdata_append_data(string arg);
 212 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-32791A2F
 213 Since: 
 214 */
 215 PHP_FUNCTION(dom_characterdata_append_data)
 216 {
 217         zval *id;
 218         xmlNode *nodep;
 219         dom_object *intern;
 220         char *arg;
 221         int arg_len;
 222 
 223         if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &id, dom_characterdata_class_entry, &arg, &arg_len) == FAILURE) {
 224                 return;
 225         }
 226 
 227         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
 228 #if LIBXML_VERSION < 20627
 229 /* Implement logic from libxml xmlTextConcat to add suport for comments and PI */
 230     if ((nodep->content == (xmlChar *) &(nodep->properties)) ||
 231         ((nodep->doc != NULL) && (nodep->doc->dict != NULL) &&
 232                 xmlDictOwns(nodep->doc->dict, nodep->content))) {
 233         nodep->content = xmlStrncatNew(nodep->content, arg, arg_len);
 234     } else {
 235         nodep->content = xmlStrncat(nodep->content, arg, arg_len);
 236     }
 237     nodep->properties = NULL;
 238 #else
 239         xmlTextConcat(nodep, arg, arg_len);
 240 #endif
 241         RETURN_TRUE;
 242 }
 243 /* }}} end dom_characterdata_append_data */
 244 
 245 /* {{{ proto void dom_characterdata_insert_data(int offset, string arg);
 246 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-3EDB695F
 247 Since: 
 248 */
 249 PHP_FUNCTION(dom_characterdata_insert_data)
 250 {
 251         zval *id;
 252         xmlChar         *cur, *first, *second;
 253         xmlNodePtr  node;
 254         char            *arg;
 255         long        offset;
 256         int         length, arg_len;
 257         dom_object      *intern;
 258 
 259         if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ols", &id, dom_characterdata_class_entry, &offset, &arg, &arg_len) == FAILURE) {
 260                 return;
 261         }
 262 
 263         DOM_GET_OBJ(node, id, xmlNodePtr, intern);
 264 
 265         cur = xmlNodeGetContent(node);
 266         if (cur == NULL) {
 267                 RETURN_FALSE;
 268         }
 269 
 270         length = xmlUTF8Strlen(cur);
 271 
 272         if (offset < 0 || offset > length) {
 273                 xmlFree(cur);
 274                 php_dom_throw_error(INDEX_SIZE_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
 275                 RETURN_FALSE;
 276         }
 277 
 278         first = xmlUTF8Strndup(cur, offset);
 279         second = xmlUTF8Strsub(cur, offset, length - offset);
 280         xmlFree(cur);
 281 
 282         xmlNodeSetContent(node, first);
 283         xmlNodeAddContent(node, arg);
 284         xmlNodeAddContent(node, second);
 285         
 286         xmlFree(first);
 287         xmlFree(second);
 288 
 289         RETURN_TRUE;
 290 }
 291 /* }}} end dom_characterdata_insert_data */
 292 
 293 /* {{{ proto void dom_characterdata_delete_data(int offset, int count);
 294 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-7C603781
 295 Since: 
 296 */
 297 PHP_FUNCTION(dom_characterdata_delete_data)
 298 {
 299         zval *id;
 300         xmlChar    *cur, *substring, *second;
 301         xmlNodePtr  node;
 302         long        offset, count;
 303         int         length;
 304         dom_object      *intern;
 305 
 306         if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oll", &id, dom_characterdata_class_entry, &offset, &count) == FAILURE) {
 307                 return;
 308         }
 309 
 310         DOM_GET_OBJ(node, id, xmlNodePtr, intern);
 311 
 312         cur = xmlNodeGetContent(node);
 313         if (cur == NULL) {
 314                 RETURN_FALSE;
 315         }
 316 
 317         length = xmlUTF8Strlen(cur);
 318 
 319         if (offset < 0 || count < 0 || offset > length) {
 320                 xmlFree(cur);
 321                 php_dom_throw_error(INDEX_SIZE_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
 322                 RETURN_FALSE;
 323         }
 324 
 325         if (offset > 0) {
 326                 substring = xmlUTF8Strsub(cur, 0, offset);
 327         } else {
 328                 substring = NULL;
 329         }
 330 
 331         if ((offset + count) > length) {
 332                 count = length - offset;
 333         }
 334 
 335         second = xmlUTF8Strsub(cur, offset + count, length - offset);
 336         substring = xmlStrcat(substring, second);
 337 
 338         xmlNodeSetContent(node, substring);
 339 
 340         xmlFree(cur);
 341         xmlFree(second);
 342         xmlFree(substring);
 343 
 344         RETURN_TRUE;
 345 }
 346 /* }}} end dom_characterdata_delete_data */
 347 
 348 /* {{{ proto void dom_characterdata_replace_data(int offset, int count, string arg);
 349 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-E5CBA7FB
 350 Since: 
 351 */
 352 PHP_FUNCTION(dom_characterdata_replace_data)
 353 {
 354         zval *id;
 355         xmlChar         *cur, *substring, *second = NULL;
 356         xmlNodePtr  node;
 357         char            *arg;
 358         long        offset, count;
 359         int         length, arg_len;
 360         dom_object      *intern;
 361 
 362         if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Olls", &id, dom_characterdata_class_entry, &offset, &count, &arg, &arg_len) == FAILURE) {
 363                 return;
 364         }
 365 
 366         DOM_GET_OBJ(node, id, xmlNodePtr, intern);
 367 
 368         cur = xmlNodeGetContent(node);
 369         if (cur == NULL) {
 370                 RETURN_FALSE;
 371         }
 372 
 373         length = xmlUTF8Strlen(cur);
 374 
 375         if (offset < 0 || count < 0 || offset > length) {
 376                 xmlFree(cur);
 377                 php_dom_throw_error(INDEX_SIZE_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
 378                 RETURN_FALSE;
 379         }
 380 
 381         if (offset > 0) {
 382                 substring = xmlUTF8Strsub(cur, 0, offset);
 383         } else {
 384                 substring = NULL;
 385         }
 386 
 387         if ((offset + count) > length) {
 388                 count = length - offset;
 389         }
 390 
 391         if (offset < length) {
 392                 second = xmlUTF8Strsub(cur, offset + count, length - offset);
 393         }
 394 
 395         substring = xmlStrcat(substring, arg);
 396         substring = xmlStrcat(substring, second);
 397 
 398         xmlNodeSetContent(node, substring);
 399 
 400         xmlFree(cur);
 401         if (second) {
 402                 xmlFree(second);
 403         }
 404         xmlFree(substring);
 405 
 406         RETURN_TRUE;
 407 }
 408 /* }}} end dom_characterdata_replace_data */
 409 
 410 #endif
 411 
 412 /*
 413  * Local variables:
 414  * tab-width: 4
 415  * c-basic-offset: 4
 416  * End:
 417  * vim600: noet sw=4 ts=4 fdm=marker
 418  * vim<600: noet sw=4 ts=4
 419  */

/* [<][>][^][v][top][bottom][index][help] */