core/systems/CFunction.cpp
changeset 192 dee91851dcd4
parent 188 8951baf7cb3c
child 209 fae1894d884c
     1.1 --- a/core/systems/CFunction.cpp	Wed Dec 06 00:53:34 2006 +0000
     1.2 +++ b/core/systems/CFunction.cpp	Wed Dec 06 14:52:11 2006 +0000
     1.3 @@ -112,15 +112,15 @@
     1.4  
     1.5  int CFunction::PushString(const char *string)
     1.6  {
     1.7 -	return _PushString(string, 0);
     1.8 +	return _PushString(string, SP_STRING_COPY, 0, strlen(string)+1);
     1.9  }
    1.10  
    1.11 -int CFunction::PushStringEx(char *string, int flags)
    1.12 +int CFunction::PushStringEx(char *buffer, size_t length, int sz_flags, int cp_flags)
    1.13  {
    1.14 -	return _PushString(string, flags);
    1.15 +	return _PushString(buffer, sz_flags, cp_flags, length);
    1.16  }
    1.17  
    1.18 -int CFunction::_PushString(const char *string, int flags)
    1.19 +int CFunction::_PushString(const char *string, int sz_flags, int cp_flags, size_t len)
    1.20  {
    1.21  	if (m_curparam >= SP_MAX_EXEC_PARAMS)
    1.22  	{
    1.23 @@ -129,8 +129,7 @@
    1.24  
    1.25  	IPluginContext *base = m_pPlugin->m_ctx_current.base;
    1.26  	ParamInfo *info = &m_info[m_curparam];
    1.27 -	size_t len = strlen(string);
    1.28 -	size_t cells = (len + sizeof(cell_t)) / sizeof(cell_t);
    1.29 +	size_t cells = (len + sizeof(cell_t) - 1) / sizeof(cell_t);
    1.30  	int err;
    1.31  
    1.32  	if ((err=base->HeapAlloc(cells, &info->local_addr, &info->phys_addr)) != SP_ERROR_NONE)
    1.33 @@ -142,12 +141,26 @@
    1.34  	m_params[m_curparam] = info->local_addr;
    1.35  	m_curparam++;	/* Prevent a leak */
    1.36  
    1.37 -	if ((err=base->StringToLocalUTF8(info->local_addr, len+1, string, NULL)) != SP_ERROR_NONE)
    1.38 +	if (!(sz_flags & SP_STRING_COPY))
    1.39  	{
    1.40 -		return SetError(err);
    1.41 +		goto skip_localtostr;
    1.42  	}
    1.43  
    1.44 -	info->flags = flags;
    1.45 +	if (sz_flags & SP_STRING_UTF8)
    1.46 +	{
    1.47 +		if ((err=base->StringToLocalUTF8(info->local_addr, len, string, NULL)) != SP_ERROR_NONE)
    1.48 +		{
    1.49 +			return SetError(err);
    1.50 +		}
    1.51 +	} else {
    1.52 +		if ((err=base->StringToLocal(info->local_addr, len, string)) != SP_ERROR_NONE)
    1.53 +		{
    1.54 +			return SetError(err);
    1.55 +		}
    1.56 +	}
    1.57 +
    1.58 +skip_localtostr:
    1.59 +	info->flags = cp_flags;
    1.60  	info->orig_addr = (cell_t *)string;
    1.61  	info->size = cells;
    1.62