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