Annotation of embedaddon/php/ext/dom/characterdata.c, revision 1.1.1.2

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: 
1.1.1.2 ! misho      20: /* $Id$ */
1.1       misho      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>