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; 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; 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)) if (((local_addr >= ctx->hp) && (local_addr < ctx->sp)) || (local_addr < 0) || ((ucell_t)local_addr >= ctx->mem_size))
{ {
return SP_ERROR_INVALID_ADDRESS; return SP_ERROR_INVALID_ADDRESS;
} }
if (bytes == 0)
{
return SP_ERROR_NONE;
}
len = strlen(source); len = strlen(source);
dest = (char *)(ctx->memory + local_addr); dest = (char *)(ctx->memory + local_addr);
if ((size_t)len >= chars) if ((size_t)len >= bytes)
{ {
len = chars - 1; len = bytes - 1;
}
if (len <= 0)
{
return SP_ERROR_NONE;
} }
memcpy(dest, source, len); memcpy(dest, source, len);
@ -762,7 +763,7 @@ inline int __CheckValidChar(char *c)
int BaseContext::StringToLocalUTF8(cell_t local_addr, size_t maxbytes, const char *source, size_t *wrtnbytes) int BaseContext::StringToLocalUTF8(cell_t local_addr, size_t maxbytes, const char *source, size_t *wrtnbytes)
{ {
char *dest; char *dest;
int len; size_t len;
bool needtocheck = false; bool needtocheck = false;
if (((local_addr >= ctx->hp) && (local_addr < ctx->sp)) || (local_addr < 0) || ((ucell_t)local_addr >= ctx->mem_size)) if (((local_addr >= ctx->hp) && (local_addr < ctx->sp)) || (local_addr < 0) || ((ucell_t)local_addr >= ctx->mem_size))
@ -770,6 +771,11 @@ int BaseContext::StringToLocalUTF8(cell_t local_addr, size_t maxbytes, const cha
return SP_ERROR_INVALID_ADDRESS; return SP_ERROR_INVALID_ADDRESS;
} }
if (maxbytes == 0)
{
return SP_ERROR_NONE;
}
len = strlen(source); len = strlen(source);
dest = (char *)(ctx->memory + local_addr); 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; len = maxbytes - 1;
needtocheck = true; needtocheck = true;
} }
if (len <= 0)
{
return SP_ERROR_NONE;
}
memcpy(dest, source, len); memcpy(dest, source, len);
if ((dest[len-1] & 1<<7) && needtocheck) if ((dest[len-1] & 1<<7) && needtocheck)