Annotation of embedaddon/php/ext/intl/transliterator/transliterator_methods.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:    +----------------------------------------------------------------------+
                      3:    | PHP Version 5                                                        |
                      4:    +----------------------------------------------------------------------+
                      5:    | This source file is subject to version 3.01 of the PHP license,      |
                      6:    | that is bundled with this package in the file LICENSE, and is        |
                      7:    | available through the world-wide-web at the following url:           |
                      8:    | http://www.php.net/license/3_01.txt                                  |
                      9:    | If you did not receive a copy of the PHP license and are unable to   |
                     10:    | obtain it through the world-wide-web, please send a note to          |
                     11:    | license@php.net so we can mail you a copy immediately.               |
                     12:    +----------------------------------------------------------------------+
                     13:    | Authors: Gustavo Lopes <cataphract@php.net>                          |
                     14:    +----------------------------------------------------------------------+
                     15:  */
                     16: 
                     17: #ifdef HAVE_CONFIG_H
                     18: #include "config.h"
                     19: #endif
                     20: 
                     21: #include "php_intl.h"
                     22: #include "transliterator.h"
                     23: #include "transliterator_class.h"
                     24: #include "transliterator_methods.h"
                     25: #include "intl_data.h"
                     26: #include "intl_convert.h"
                     27: 
                     28: #include <zend_exceptions.h>
                     29: 
                     30: static int create_transliterator( char *str_id, int str_id_len, long direction, zval *object TSRMLS_DC )
                     31: {
                     32:        Transliterator_object *to;
                     33:        UChar                 *ustr_id    = NULL;
                     34:        int32_t               ustr_id_len = 0;
                     35:        UTransliterator       *utrans;
                     36:        UParseError           parse_error   = {0, -1};
                     37: 
                     38:        intl_error_reset( NULL TSRMLS_CC );
                     39: 
                     40:        if( ( direction != TRANSLITERATOR_FORWARD ) && (direction != TRANSLITERATOR_REVERSE ) )
                     41:        {
                     42:                intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
                     43:                        "transliterator_create: invalid direction", 0 TSRMLS_CC );
                     44:                return FAILURE;
                     45:        }
                     46: 
                     47:        object_init_ex( object, Transliterator_ce_ptr );
                     48:        TRANSLITERATOR_METHOD_FETCH_OBJECT_NO_CHECK; /* fetch zend object from zval "object" into "to" */
                     49: 
                     50:        /* Convert transliterator id to UTF-16 */
                     51:        intl_convert_utf8_to_utf16( &ustr_id, &ustr_id_len, str_id, str_id_len, TRANSLITERATOR_ERROR_CODE_P( to ) );
                     52:        if( U_FAILURE( TRANSLITERATOR_ERROR_CODE( to ) ) )
                     53:        {
                     54:                intl_error_set_code( NULL, TRANSLITERATOR_ERROR_CODE( to ) TSRMLS_CC );
                     55:                intl_error_set_custom_msg( NULL, "String conversion of id to UTF-16 failed", 0 TSRMLS_CC );
                     56:                zval_dtor( object );
                     57:                return FAILURE;
                     58:        }
                     59: 
                     60:        /* Open ICU Transliterator. */
                     61:        utrans = utrans_openU( ustr_id, ustr_id_len, (UTransDirection ) direction,
                     62:                NULL, -1, &parse_error, TRANSLITERATOR_ERROR_CODE_P( to ) );
                     63:        if (ustr_id) {
                     64:                efree( ustr_id );
                     65:        }
                     66:        
                     67:        if( U_FAILURE( TRANSLITERATOR_ERROR_CODE( to ) ) )
                     68:        {
                     69:                char *buf = NULL;
                     70:                intl_error_set_code( NULL, TRANSLITERATOR_ERROR_CODE( to ) TSRMLS_CC );
                     71:                spprintf( &buf, 0, "transliterator_create: unable to open ICU transliterator"
                     72:                        " with id \"%s\"", str_id );
                     73:                if( buf == NULL ) {
                     74:                        intl_error_set_custom_msg( NULL,
                     75:                                "transliterator_create: unable to open ICU transliterator", 0 TSRMLS_CC );
                     76:                }
                     77:                else
                     78:                {
                     79:                        intl_error_set_custom_msg( NULL, buf, /* copy message */ 1 TSRMLS_CC );
                     80:                        efree( buf );
                     81:                }
                     82:                zval_dtor( object );
                     83:                return FAILURE;
                     84:        }
                     85:        
                     86:        transliterator_object_construct( object, utrans, TRANSLITERATOR_ERROR_CODE_P( to ) TSRMLS_CC );
                     87:        /* no need to close the transliterator manually on construction error */
                     88:        if( U_FAILURE( TRANSLITERATOR_ERROR_CODE( to ) ) )
                     89:        {
                     90:                intl_error_set_code( NULL, TRANSLITERATOR_ERROR_CODE( to ) TSRMLS_CC );
                     91:                intl_error_set_custom_msg( NULL,
                     92:                        "transliterator_create: internal constructor call failed", 0 TSRMLS_CC );
                     93:                zval_dtor( object );
                     94:                return FAILURE;
                     95:        }
                     96: 
                     97:        return SUCCESS;
                     98: }
                     99: 
                    100: /* {{{ proto Transliterator transliterator_create( string id [, int direction ] )
                    101:  *     proto Transliterator Transliterator::create( string id [, int direction ] )
                    102:  * Opens a transliterator by id.
                    103:  */
                    104: PHP_FUNCTION( transliterator_create )
                    105: {
                    106:        char  *str_id;
                    107:        int   str_id_len;
                    108:        long  direction   = TRANSLITERATOR_FORWARD;
                    109:        int res;
                    110: 
                    111:        TRANSLITERATOR_METHOD_INIT_VARS;
                    112:        
                    113:        (void) to; /* unused */
                    114: 
                    115:        if( zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "s|l",
                    116:                &str_id, &str_id_len, &direction ) == FAILURE )
                    117:        {
                    118:                intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
                    119:                        "transliterator_create: bad arguments", 0 TSRMLS_CC );
                    120:                RETURN_NULL();
                    121:        }
                    122: 
                    123:        object = return_value;
                    124:        res = create_transliterator( str_id, str_id_len, direction, object TSRMLS_CC );
                    125:        if( res == FAILURE )
                    126:                RETURN_NULL();
                    127:        
                    128:        /* success, leave return_value as it is (set by create_transliterator) */
                    129: }
                    130: /* }}} */
                    131: 
                    132: /* {{{ proto Transliterator transliterator_create_from_rules( string rules [, int direction ] )
                    133:  *     proto Transliterator Transliterator::createFromRules( string rules [, int direction ] )
                    134:  * Opens a transliterator by id.
                    135:  */
                    136: PHP_FUNCTION( transliterator_create_from_rules )
                    137: {
                    138:        char                *str_rules;
                    139:        int             str_rules_len;
                    140:        UChar               *ustr_rules    = NULL;
                    141:        int32_t         ustr_rules_len = 0;
                    142:        long            direction      = TRANSLITERATOR_FORWARD;
                    143:        UParseError     parse_error    = {0, -1};
                    144:        UTransliterator *utrans;
                    145:        UChar           id[] = {0x52, 0x75, 0x6C, 0x65, 0x73, 0x54, 0x72,
                    146:                                               0x61, 0x6E, 0x73, 0x50, 0x48, 0x50, 0}; /* RulesTransPHP */
                    147:        TRANSLITERATOR_METHOD_INIT_VARS;
                    148: 
                    149:        if( zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "s|l",
                    150:                &str_rules, &str_rules_len, &direction ) == FAILURE )
                    151:        {
                    152:                intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
                    153:                        "transliterator_create_from_rules: bad arguments", 0 TSRMLS_CC );
                    154:                RETURN_NULL();
                    155:        }
                    156: 
                    157:        if( ( direction != TRANSLITERATOR_FORWARD ) && (direction != TRANSLITERATOR_REVERSE ) )
                    158:        {
                    159:                intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
                    160:                        "transliterator_create_from_rules: invalid direction", 0 TSRMLS_CC );
                    161:                RETURN_NULL();
                    162:        }
                    163: 
                    164:        object = return_value;
                    165:        object_init_ex( object, Transliterator_ce_ptr );
                    166:        TRANSLITERATOR_METHOD_FETCH_OBJECT_NO_CHECK;
                    167: 
                    168:        intl_convert_utf8_to_utf16( &ustr_rules, &ustr_rules_len,
                    169:                str_rules, str_rules_len, TRANSLITERATOR_ERROR_CODE_P( to ) );
                    170:        /* (I'm not a big fan of non-obvious flow control macros ).
                    171:         * This one checks the error value, destroys object and returns false */
                    172:        INTL_CTOR_CHECK_STATUS( to, "String conversion of rules to UTF-16 failed" );
                    173: 
                    174:        /* Open ICU Transliterator. */
                    175:        utrans = utrans_openU( id, ( sizeof( id ) - 1 ) / ( sizeof( *id ) ), (UTransDirection ) direction,
                    176:                ustr_rules, ustr_rules_len, &parse_error, TRANSLITERATOR_ERROR_CODE_P( to ) );
                    177:        if (ustr_rules) {
                    178:                efree( ustr_rules );
                    179:        }
                    180:        
                    181:        intl_error_set_code( NULL, INTL_DATA_ERROR_CODE( to ) TSRMLS_CC );
                    182:        if( U_FAILURE( INTL_DATA_ERROR_CODE( to ) ) )
                    183:        {
                    184:                char *msg = NULL;
                    185:                smart_str parse_error_str;
                    186:                parse_error_str = transliterator_parse_error_to_string( &parse_error );
                    187:                spprintf( &msg, 0, "transliterator_create_from_rules: unable to "
                    188:                        "create ICU transliterator from rules (%s)", parse_error_str.c );
                    189:                smart_str_free( &parse_error_str );
                    190:                if( msg != NULL )
                    191:                {
                    192:                        intl_errors_set_custom_msg( INTL_DATA_ERROR_P( to ), msg, 1 TSRMLS_CC );
                    193:                        efree( msg );
                    194:                }
                    195:                zval_dtor( return_value );
                    196:                RETURN_NULL();
                    197:     }
                    198:        transliterator_object_construct( object, utrans, TRANSLITERATOR_ERROR_CODE_P( to ) TSRMLS_CC );
                    199:        /* no need to close the transliterator manually on construction error */
                    200:        INTL_CTOR_CHECK_STATUS( to, "transliterator_create_from_rules: internal constructor call failed" );
                    201: }
                    202: /* }}} */
                    203: 
                    204: /* {{{ proto Transliterator transliterator_create_inverse( Transliterator orig_trans )
                    205:  *     proto Transliterator Transliterator::createInverse()
                    206:  * Opens the inverse transliterator transliterator.
                    207:  */
                    208: PHP_FUNCTION( transliterator_create_inverse )
                    209: {
                    210:        Transliterator_object *to_orig;
                    211:        UTransliterator       *utrans;
                    212:        TRANSLITERATOR_METHOD_INIT_VARS;
                    213: 
                    214:        if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
                    215:                &object, Transliterator_ce_ptr ) == FAILURE )
                    216:        {
                    217:                intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
                    218:                        "transliterator_create_inverse: bad arguments", 0 TSRMLS_CC );
                    219:                RETURN_NULL();
                    220:        }
                    221: 
                    222:        TRANSLITERATOR_METHOD_FETCH_OBJECT;
                    223:        to_orig = to;
                    224: 
                    225:        object = return_value;
                    226:        object_init_ex( object, Transliterator_ce_ptr );
                    227:        TRANSLITERATOR_METHOD_FETCH_OBJECT_NO_CHECK; /* change "to" into new object (from "object" ) */
                    228:        
                    229:        utrans = utrans_openInverse( to_orig->utrans, TRANSLITERATOR_ERROR_CODE_P( to ) );
                    230:        INTL_CTOR_CHECK_STATUS( to, "transliterator_create_inverse: could not create "
                    231:                "inverse ICU transliterator" );
                    232:        transliterator_object_construct( object, utrans, TRANSLITERATOR_ERROR_CODE_P( to ) TSRMLS_CC );
                    233:        /* no need to close the transliterator manually on construction error */
                    234:        INTL_CTOR_CHECK_STATUS( to, "transliterator_create: internal constructor call failed" );
                    235: }
                    236: /* }}} */
                    237: 
                    238: /* {{{ proto array transliterator_list_ids()
                    239:  *     proto array Transliterator::listIDs()
                    240:  * Return an array with the registered transliterator IDs.
                    241:  */
                    242: PHP_FUNCTION( transliterator_list_ids )
                    243: {
                    244:        UEnumeration  *en;
                    245:        const UChar       *elem;
                    246:        int32_t           elem_len;
                    247:        UErrorCode        status = U_ZERO_ERROR;
                    248:        
                    249:        intl_error_reset( NULL TSRMLS_CC );
                    250: 
                    251:        if( zend_parse_parameters_none() == FAILURE )
                    252:        {
                    253:                /* seems to be the convention in this lib to return false instead of
                    254:                 * null on bad parameter types, except on constructors and factory
                    255:                 * methods */
                    256:                intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
                    257:                        "transliterator_list_ids: bad arguments", 0 TSRMLS_CC );
                    258:                RETURN_FALSE;
                    259:        }
                    260: 
                    261:        en = utrans_openIDs( &status );
                    262:        INTL_CHECK_STATUS( status,
                    263:                "transliterator_list_ids: Failed to obtain registered transliterators" );
                    264: 
                    265:        array_init( return_value );
                    266:        while( (elem = uenum_unext( en, &elem_len, &status )) )
                    267:        {
                    268:                char *el_char = NULL;
                    269:                int  el_len   = 0;
                    270: 
                    271:                intl_convert_utf16_to_utf8( &el_char, &el_len, elem, elem_len, &status );
                    272: 
                    273:                if( U_FAILURE( status ) )
                    274:                {
                    275:                        efree( el_char );
                    276:                        break;
                    277:                }
                    278:                else
                    279:                {
                    280:                        add_next_index_stringl( return_value, el_char, el_len, 0 );
                    281:                }
                    282:        }
                    283:        uenum_close( en );
                    284: 
                    285:        intl_error_set_code( NULL, status TSRMLS_CC );
                    286:        if( U_FAILURE( status ) )
                    287:        {
                    288:                zval_dtor( return_value );
                    289:                RETVAL_FALSE;
                    290:                intl_error_set_custom_msg( NULL, "transliterator_list_ids: "
                    291:                        "Failed to build array of registered transliterators", 0 TSRMLS_CC );
                    292:        }
                    293: }
                    294: /* }}} */
                    295: 
                    296: /* {{{ proto string transliterator_transliterate( Transliterator trans, string subject [, int start = 0 [, int end = -1 ]] )
                    297:  *     proto string Transliterator::transliterate( string subject [, int start = 0 [, int end = -1 ]] )
                    298:  * Transliterate a string. */
                    299: PHP_FUNCTION( transliterator_transliterate )
                    300: {
                    301:        char        *str;
                    302:        UChar           *ustr           = NULL,
                    303:                                *uresult        = NULL;
                    304:        int                     str_len;
                    305:        int32_t         ustr_len        = 0,
                    306:                                capacity,
                    307:                                uresult_len;
                    308:        long            start           = 0,
                    309:                                limit           = -1;
                    310:        int                     success     = 0,
                    311:                                temp_trans  = 0;
                    312:        TRANSLITERATOR_METHOD_INIT_VARS;
                    313: 
                    314:        object = getThis();
                    315: 
                    316:        if( object == NULL )
                    317:        {
                    318:                /* in non-OOP version, accept both a transliterator and a string */
                    319:                zval **arg1;
                    320:                if( zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "Zs|ll",
                    321:                        &arg1, &str, &str_len, &start, &limit ) == FAILURE )
                    322:                {
                    323:                        intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
                    324:                                "transliterator_transliterate: bad arguments", 0 TSRMLS_CC );
                    325:                        RETURN_FALSE;
                    326:                }
                    327:                
                    328:                if( Z_TYPE_PP( arg1 ) == IS_OBJECT &&
                    329:                        instanceof_function( Z_OBJCE_PP( arg1 ), Transliterator_ce_ptr TSRMLS_CC ) )
                    330:                {
                    331:                        object = *arg1;
                    332:                }
                    333:                else
                    334:                { /* not a transliterator object as first argument */
                    335:                        int res;
                    336:                        if(Z_TYPE_PP( arg1 ) != IS_STRING )
                    337:                        {
                    338:                                SEPARATE_ZVAL( arg1 );
                    339:                                convert_to_string( *arg1 );
                    340:                        }
                    341:                        ALLOC_INIT_ZVAL( object );
                    342:                        temp_trans = 1;
                    343:                        res = create_transliterator( Z_STRVAL_PP( arg1 ), Z_STRLEN_PP( arg1 ),
                    344:                                        TRANSLITERATOR_FORWARD, object TSRMLS_CC );
                    345:                        if( res == FAILURE )
                    346:                        {
                    347:                                char *message = intl_error_get_message( NULL TSRMLS_CC );
                    348:                                php_error_docref0( NULL TSRMLS_CC, E_WARNING, "Could not create "
                    349:                                        "transliterator with ID \"%s\" (%s)", Z_STRVAL_PP( arg1 ), message );
                    350:                                efree( message );
                    351:                                /* don't set U_ILLEGAL_ARGUMENT_ERROR to allow fetching of inner error */
                    352:                                goto cleanup;
                    353:                        }
                    354:                }
                    355:        }
                    356:        else if( zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "s|ll",
                    357:                &str, &str_len, &start, &limit ) == FAILURE )
                    358:        {
                    359:                intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
                    360:                        "transliterator_transliterate: bad arguments", 0 TSRMLS_CC );
                    361:                RETURN_FALSE;
                    362:        }
                    363:        
                    364:        if( limit < -1 )
                    365:        {
                    366:                intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
                    367:                        "transliterator_transliterate: \"end\" argument should be "
                    368:                        "either non-negative or -1", 0 TSRMLS_CC );
                    369:                RETURN_FALSE;
                    370:        }
                    371: 
                    372:        if( start < 0 || ((limit != -1 ) && (start > limit )) )
                    373:        {
                    374:                intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
                    375:                        "transliterator_transliterate: \"start\" argument should be "
                    376:                        "non-negative and not bigger than \"end\" (if defined)", 0 TSRMLS_CC );
                    377:                RETURN_FALSE;
                    378:        }
                    379: 
                    380:        /* end argument parsing/validation */
                    381: 
                    382:        TRANSLITERATOR_METHOD_FETCH_OBJECT;
                    383:        
                    384:        intl_convert_utf8_to_utf16( &ustr, &ustr_len, str, str_len,
                    385:                TRANSLITERATOR_ERROR_CODE_P( to ) );
                    386:        INTL_METHOD_CHECK_STATUS( to, "String conversion of string to UTF-16 failed" );
                    387: 
                    388:        /* we've started allocating resources, goto from now on */
                    389: 
                    390:        if( ( start > ustr_len ) || (( limit != -1 ) && (limit > ustr_len ) ) )
                    391:        {
                    392:                char *msg;
                    393:                spprintf( &msg, 0,
                    394:                        "transliterator_transliterate: Neither \"start\" nor the \"end\" "
                    395:                        "arguments can exceed the number of UTF-16 code units "
                    396:                        "(in this case, %d)", (int) ustr_len );
                    397:                if(msg != NULL )
                    398:                {
                    399:                        intl_errors_set( TRANSLITERATOR_ERROR_P( to ), U_ILLEGAL_ARGUMENT_ERROR,
                    400:                                msg, 1 TSRMLS_CC );
                    401:                        efree( msg );
                    402:                }
                    403:                RETVAL_FALSE;
                    404:                goto cleanup;
                    405:        }
                    406: 
                    407:        uresult = safe_emalloc( ustr_len, sizeof( UChar ), 1 * sizeof( UChar ) );
                    408:        capacity = ustr_len + 1;
                    409: 
                    410:        while( 1 )
                    411:        {
                    412:                int32_t temp_limit = ( limit == -1 ? ustr_len : (int32_t) limit );
                    413:                memcpy( uresult, ustr, ustr_len * sizeof( UChar ) );
                    414:                uresult_len = ustr_len;
                    415: 
                    416:                utrans_transUChars( to->utrans, uresult, &uresult_len, capacity, (int32_t) start,
                    417:                        &temp_limit, TRANSLITERATOR_ERROR_CODE_P( to ) );
                    418:                if( TRANSLITERATOR_ERROR_CODE( to ) == U_BUFFER_OVERFLOW_ERROR )
                    419:                {
                    420:                        efree( uresult );
                    421: 
                    422:                        uresult = safe_emalloc( uresult_len, sizeof( UChar ), 1 * sizeof( UChar ) );
                    423:                        capacity = uresult_len + 1;
                    424: 
                    425:                        intl_error_reset( TRANSLITERATOR_ERROR_P( to ) TSRMLS_CC );
                    426:                }
                    427:                else if(TRANSLITERATOR_ERROR_CODE( to ) == U_STRING_NOT_TERMINATED_WARNING )
                    428:                {
                    429:                        uresult = safe_erealloc( uresult, uresult_len, sizeof( UChar ), 1 * sizeof( UChar ) );
                    430:                        
                    431:                        intl_error_reset( TRANSLITERATOR_ERROR_P( to ) TSRMLS_CC );
                    432:                        break;
                    433:                }
                    434:                else if( U_FAILURE( TRANSLITERATOR_ERROR_CODE( to ) ) )
                    435:                {
                    436:                        intl_error_set_code( NULL, TRANSLITERATOR_ERROR_CODE( to ) TSRMLS_CC );
                    437:                        intl_errors_set_custom_msg( TRANSLITERATOR_ERROR_P( to ),
                    438:                                "transliterator_transliterate: transliteration failed", 0 TSRMLS_CC );
                    439:                        goto cleanup;
                    440:                }
                    441:                else
                    442:                        break;
                    443:        }
                    444: 
                    445:        uresult[uresult_len] = (UChar) 0;
                    446:        
                    447:        success = 1;
                    448: 
                    449: cleanup:
                    450:        if( ustr )
                    451:                efree( ustr );
                    452: 
                    453:        if( success ) {
                    454:                /* frees uresult even on error */
                    455:                INTL_METHOD_RETVAL_UTF8( to, uresult, uresult_len, 1 );
                    456:        }
                    457:        else
                    458:        {
                    459:                if( uresult )
                    460:                        efree( uresult );
                    461:                RETVAL_FALSE;
                    462:        }
                    463: 
                    464:        if (temp_trans )
                    465:                zval_ptr_dtor( &object );
                    466: }
                    467: /* }}} */
                    468: 
                    469: PHP_METHOD( Transliterator, __construct )
                    470: {
                    471:        /* this constructor shouldn't be called as it's private */
                    472:        zend_throw_exception( NULL,
                    473:                "An object of this type cannot be created with the new operator.",
                    474:                0 TSRMLS_CC );
                    475: }
                    476: 
                    477: /* {{{ proto int transliterator_get_error_code( Transliterator trans )
                    478:  *     proto int Transliterator::getErrorCode()
                    479:  * Get the last error code for this transliterator.
                    480:  */
                    481: PHP_FUNCTION( transliterator_get_error_code )
                    482: {
                    483:        TRANSLITERATOR_METHOD_INIT_VARS
                    484: 
                    485:        if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
                    486:                &object, Transliterator_ce_ptr ) == FAILURE )
                    487:        {
                    488:                intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
                    489:                        "transliterator_get_error_code: unable to parse input params", 0 TSRMLS_CC );
                    490: 
                    491:                RETURN_FALSE;
                    492:        }
                    493: 
                    494:        /* Fetch the object (without resetting its last error code ). */
                    495:        to = zend_object_store_get_object( object TSRMLS_CC );
                    496:        if (to == NULL )
                    497:                RETURN_FALSE;
                    498: 
                    499:        RETURN_LONG( (long) TRANSLITERATOR_ERROR_CODE( to ) );
                    500: }
                    501: /* }}} */
                    502: 
                    503: 
                    504: /* {{{ proto string transliterator_get_error_message( Transliterator trans )
                    505:  *     proto string Transliterator::getErrorMessage()
                    506:  * Get the last error message for this transliterator.
                    507:  */
                    508: PHP_FUNCTION( transliterator_get_error_message )
                    509: {
                    510:        const char* message = NULL;
                    511:        TRANSLITERATOR_METHOD_INIT_VARS
                    512: 
                    513:        if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
                    514:                &object, Transliterator_ce_ptr ) == FAILURE )
                    515:        {
                    516:                intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
                    517:                        "transliterator_get_error_message: unable to parse input params", 0 TSRMLS_CC );
                    518: 
                    519:                RETURN_FALSE;
                    520:        }
                    521: 
                    522: 
                    523:        /* Fetch the object (without resetting its last error code ). */
                    524:        to = zend_object_store_get_object( object TSRMLS_CC );
                    525:        if (to == NULL )
                    526:                RETURN_FALSE;
                    527: 
                    528:        /* Return last error message. */
                    529:        message = intl_error_get_message( TRANSLITERATOR_ERROR_P( to ) TSRMLS_CC );
                    530:        RETURN_STRING( message, 0 );
                    531: }
                    532: /* }}} */
                    533: 
                    534: 
                    535: /*
                    536:  * Local variables:
                    537:  * tab-width: 4
                    538:  * c-basic-offset: 4
                    539:  * End:
                    540:  * vim600: noet sw=4 ts=4 fdm=marker
                    541:  * vim<600: noet sw=4 ts=4
                    542:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>