Empty strings can now properly be passed via PushString and StringToLocal

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40701
This commit is contained in:
Scott Ehlert 2007-04-14 04:19:58 +00:00
parent b56de5d546
commit c8f507561c

View File

@ -693,26 +693,27 @@ int BaseContext::PushString(cell_t *local_addr, char **phys_addr, const char *st
return SP_ERROR_NONE;
}
int BaseContext::StringToLocal(cell_t local_addr, size_t chars, const char *source)
int BaseContext::StringToLocal(cell_t local_addr, size_t bytes, const char *source)
{
char *dest;
int len;
size_t len;
if (((local_addr >= ctx->hp) && (local_addr < ctx->sp)) || (local_addr < 0) || ((ucell_t)local_addr >= ctx->mem_size))
{
return SP_ERROR_INVALID_ADDRESS;
}
if (bytes == 0)
{
return SP_ERROR_NONE;
}
len = strlen(source);
dest = (char *)(ctx->memory + local_addr);
if ((size_t)len >= chars)
if ((size_t)len >= bytes)
{
len = chars - 1;
}
if (len <= 0)
{
return SP_ERROR_NONE;
len = bytes - 1;
}
memcpy(dest, source, len);
@ -762,13 +763,18 @@ inline int __CheckValidChar(char *c)
int BaseContext::StringToLocalUTF8(cell_t local_addr, size_t maxbytes, const char *source, size_t *wrtnbytes)
{
char *dest;
int len;
size_t len;
bool needtocheck = false;
if (((local_addr >= ctx->hp) && (local_addr < ctx->sp)) || (local_addr < 0) || ((ucell_t)local_addr >= ctx->mem_size))
{
return SP_ERROR_INVALID_ADDRESS;
}
if (maxbytes == 0)
{
return SP_ERROR_NONE;
}
len = strlen(source);
dest = (char *)(ctx->memory + local_addr);
@ -778,10 +784,6 @@ int BaseContext::StringToLocalUTF8(cell_t local_addr, size_t maxbytes, const cha
len = maxbytes - 1;
needtocheck = true;
}
if (len <= 0)
{
return SP_ERROR_NONE;
}
memcpy(dest, source, len);
if ((dest[len-1] & 1<<7) && needtocheck)