Back to index

php5  5.3.10
Defines | Functions
msgformat_format.c File Reference
#include <unicode/ustring.h>
#include "php_intl.h"
#include "msgformat_class.h"
#include "msgformat_format.h"
#include "msgformat_data.h"
#include "msgformat_helpers.h"
#include "intl_convert.h"

Go to the source code of this file.

Defines

#define Z_ADDREF_P(z)   ((z)->refcount++)

Functions

static void msgfmt_do_format (MessageFormatter_object *mfo, zval *args, zval *return_value TSRMLS_DC)
 PHP_FUNCTION (msgfmt_format)
 PHP_FUNCTION (msgfmt_format_message)

Define Documentation

#define Z_ADDREF_P (   z)    ((z)->refcount++)

Definition at line 31 of file msgformat_format.c.


Function Documentation

static void msgfmt_do_format ( MessageFormatter_object mfo,
zval *  args,
zval *return_value  TSRMLS_DC 
) [static]

Definition at line 35 of file msgformat_format.c.

{
       zval **fargs;
       int count;
       UChar* formatted = NULL;
       int formatted_len = 0;
       HashPosition pos;
       int i;

       count = zend_hash_num_elements(Z_ARRVAL_P(args));

       if(count < umsg_format_arg_count(MSG_FORMAT_OBJECT(mfo))) {
              /* Not enough aguments for format! */
              intl_error_set( INTL_DATA_ERROR_P(mfo), U_ILLEGAL_ARGUMENT_ERROR,
                     "msgfmt_format: not enough parameters", 0 TSRMLS_CC );
              RETVAL_FALSE;
              return;
       }

       fargs = safe_emalloc(count, sizeof(zval *), 0);

       zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(args), &pos);
       for(i=0;i<count;i++) {
              zval **val;
              zend_hash_get_current_data_ex(Z_ARRVAL_P(args), (void **)&val, &pos);
              fargs[i] = *val;
              Z_ADDREF_P(fargs[i]);
              /* TODO: needs refcount increase here? */
              zend_hash_move_forward_ex(Z_ARRVAL_P(args), &pos);
       }

       umsg_format_helper(MSG_FORMAT_OBJECT(mfo), count, fargs, &formatted, &formatted_len, &INTL_DATA_ERROR_CODE(mfo) TSRMLS_CC);

       for(i=0;i<count;i++) {
              zval_ptr_dtor(&fargs[i]);
       }

       efree(fargs);

       if (formatted && U_FAILURE( INTL_DATA_ERROR_CODE(mfo) ) ) {
                     efree(formatted);
       }

       INTL_METHOD_CHECK_STATUS( mfo, "Number formatting failed" );
       INTL_METHOD_RETVAL_UTF8( mfo, formatted, formatted_len, 1 );
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 88 of file msgformat_format.c.

{
       zval *args;
       MSG_FORMAT_METHOD_INIT_VARS;


       /* Parse parameters. */
       if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oa",
              &object, MessageFormatter_ce_ptr,  &args ) == FAILURE )
       {
              intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
                     "msgfmt_format: unable to parse input params", 0 TSRMLS_CC );

              RETURN_FALSE;
       }

       /* Fetch the object. */
       MSG_FORMAT_METHOD_FETCH_OBJECT;

       msgfmt_do_format(mfo, args, return_value TSRMLS_CC);
}

Here is the call graph for this function:

Definition at line 116 of file msgformat_format.c.

{
       zval       *args;
       UChar      *spattern = NULL;
       int         spattern_len = 0;
       char       *pattern = NULL;
       int         pattern_len = 0;
       char       *slocale = NULL;
       int         slocale_len = 0;
       MessageFormatter_object mf = {0};
       MessageFormatter_object *mfo = &mf;

       /* Parse parameters. */
       if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "ssa",
                &slocale, &slocale_len, &pattern, &pattern_len, &args ) == FAILURE )
       {
              intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
                     "msgfmt_format_message: unable to parse input params", 0 TSRMLS_CC );

              RETURN_FALSE;
       }

       msgformat_data_init(&mfo->mf_data TSRMLS_CC);

       if(pattern && pattern_len) {
              intl_convert_utf8_to_utf16(&spattern, &spattern_len, pattern, pattern_len, &INTL_DATA_ERROR_CODE(mfo));
              if( U_FAILURE(INTL_DATA_ERROR_CODE((mfo))) )
              {
                     intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
                            "msgfmt_format_message: error converting pattern to UTF-16", 0 TSRMLS_CC );
                     RETURN_FALSE;
              }
       } else {
              spattern_len = 0;
              spattern = NULL;
       }

       if(slocale_len == 0) {
              slocale = INTL_G(default_locale);
       }

       if(msgformat_fix_quotes(&spattern, &spattern_len, &INTL_DATA_ERROR_CODE(mfo)) != SUCCESS) {
              intl_error_set( NULL, U_INVALID_FORMAT_ERROR,
                     "msgfmt_format_message: error converting pattern to quote-friendly format", 0 TSRMLS_CC );
              RETURN_FALSE;
       }

       /* Create an ICU message formatter. */
       MSG_FORMAT_OBJECT(mfo) = umsg_open(spattern, spattern_len, slocale, NULL, &INTL_DATA_ERROR_CODE(mfo));
       if(spattern && spattern_len) {
              efree(spattern);
       }
       INTL_METHOD_CHECK_STATUS(mfo, "Creating message formatter failed");

       msgfmt_do_format(mfo, args, return_value TSRMLS_CC);

       /* drop the temporary formatter */
       msgformat_data_free(&mfo->mf_data TSRMLS_CC);
}

Here is the call graph for this function: