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:
parent
b56de5d546
commit
c8f507561c
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user