SCI: Merge kernelDerefCharPtr and kernelDerefString and change it from a macro to a function
svn-id: r44081
This commit is contained in:
parent
53450cc2e1
commit
c00edfb64f
5 changed files with 21 additions and 18 deletions
|
@ -742,11 +742,15 @@ static void *_kernel_dereference_pointer(SegManager *segMan, reg_t pointer, int
|
||||||
}
|
}
|
||||||
|
|
||||||
byte *kernelDerefBulkPtr(SegManager *segMan, reg_t pointer, int entries) {
|
byte *kernelDerefBulkPtr(SegManager *segMan, reg_t pointer, int entries) {
|
||||||
return (byte*)_kernel_dereference_pointer(segMan, pointer, entries, 1);
|
return (byte *)_kernel_dereference_pointer(segMan, pointer, entries, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
reg_t *kernelDerefRegPtr(SegManager *segMan, reg_t pointer, int entries) {
|
reg_t *kernelDerefRegPtr(SegManager *segMan, reg_t pointer, int entries) {
|
||||||
return (reg_t*)_kernel_dereference_pointer(segMan, pointer, entries, sizeof(reg_t));
|
return (reg_t *)_kernel_dereference_pointer(segMan, pointer, entries, sizeof(reg_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
char *kernelDerefString(SegManager *segMan, reg_t pointer, int entries) {
|
||||||
|
return (char *)_kernel_dereference_pointer(segMan, pointer, entries, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Kernel::setDefaultKernelNames() {
|
void Kernel::setDefaultKernelNames() {
|
||||||
|
|
|
@ -238,8 +238,7 @@ char *kernel_lookup_text(EngineState *s, reg_t address, int index);
|
||||||
*/
|
*/
|
||||||
reg_t *kernelDerefRegPtr(SegManager *segMan, reg_t pointer, int entries);
|
reg_t *kernelDerefRegPtr(SegManager *segMan, reg_t pointer, int entries);
|
||||||
byte *kernelDerefBulkPtr(SegManager *segMan, reg_t pointer, int entries);
|
byte *kernelDerefBulkPtr(SegManager *segMan, reg_t pointer, int entries);
|
||||||
#define kernelDerefCharPtr(state, pointer, entries) ((char*)kernelDerefBulkPtr(state, pointer, entries))
|
char *kernelDerefString(SegManager *segMan, reg_t pointer, int entries = 0);
|
||||||
#define kernelDerefString(state, pointer) ((char*)kernelDerefBulkPtr(state, pointer, 0))
|
|
||||||
|
|
||||||
/******************** Priority macros/functions ********************/
|
/******************** Priority macros/functions ********************/
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -811,7 +811,7 @@ reg_t kFileIO(EngineState *s, int, int argc, reg_t *argv) {
|
||||||
case K_FILEIO_WRITE_STRING : {
|
case K_FILEIO_WRITE_STRING : {
|
||||||
int handle = argv[1].toUint16();
|
int handle = argv[1].toUint16();
|
||||||
int size = argv[3].toUint16();
|
int size = argv[3].toUint16();
|
||||||
char *buf = kernelDerefCharPtr(s->segMan, argv[2], size);
|
char *buf = kernelDerefString(s->segMan, argv[2], size);
|
||||||
debug(3, "K_FILEIO_WRITE_STRING(%d,%d)", handle, size);
|
debug(3, "K_FILEIO_WRITE_STRING(%d,%d)", handle, size);
|
||||||
|
|
||||||
// FIXME: What is the difference between K_FILEIO_WRITE_STRING and
|
// FIXME: What is the difference between K_FILEIO_WRITE_STRING and
|
||||||
|
|
|
@ -602,14 +602,14 @@ reg_t kGraph(EngineState *s, int, int argc, reg_t *argv) {
|
||||||
|
|
||||||
reg_t kTextSize(EngineState *s, int, int argc, reg_t *argv) {
|
reg_t kTextSize(EngineState *s, int, int argc, reg_t *argv) {
|
||||||
int width, height;
|
int width, height;
|
||||||
char *text = argv[1].segment ? (char *) kernelDerefBulkPtr(s->segMan, argv[1], 0) : NULL;
|
char *text = argv[1].segment ? kernelDerefString(s->segMan, argv[1]) : NULL;
|
||||||
const char *sep = NULL;
|
const char *sep = NULL;
|
||||||
reg_t *dest = kernelDerefRegPtr(s->segMan, argv[0], 4);
|
reg_t *dest = kernelDerefRegPtr(s->segMan, argv[0], 4);
|
||||||
int maxwidth = (argc > 3) ? argv[3].toUint16() : 0;
|
int maxwidth = (argc > 3) ? argv[3].toUint16() : 0;
|
||||||
int font_nr = argv[2].toUint16();
|
int font_nr = argv[2].toUint16();
|
||||||
|
|
||||||
if ((argc > 4) && (argv[4].segment))
|
if ((argc > 4) && (argv[4].segment))
|
||||||
sep = (const char *)kernelDerefBulkPtr(s->segMan, argv[4], 0);
|
sep = kernelDerefString(s->segMan, argv[4]);
|
||||||
|
|
||||||
if (maxwidth < 0)
|
if (maxwidth < 0)
|
||||||
maxwidth = 0;
|
maxwidth = 0;
|
||||||
|
@ -3135,7 +3135,7 @@ reg_t kDisplay(EngineState *s, int, int argc, reg_t *argv) {
|
||||||
|
|
||||||
if (textp.segment) {
|
if (textp.segment) {
|
||||||
argpt = 1;
|
argpt = 1;
|
||||||
text = (char *)kernelDerefBulkPtr(s->segMan, textp, 0);
|
text = kernelDerefString(s->segMan, textp);
|
||||||
} else {
|
} else {
|
||||||
argpt = 2;
|
argpt = 2;
|
||||||
text = kernel_lookup_text(s, textp, index);
|
text = kernel_lookup_text(s, textp, index);
|
||||||
|
|
|
@ -44,7 +44,7 @@ char *kernel_lookup_text(EngineState *s, reg_t address, int index) {
|
||||||
Resource *textres;
|
Resource *textres;
|
||||||
|
|
||||||
if (address.segment)
|
if (address.segment)
|
||||||
return (char *)kernelDerefBulkPtr(s->segMan, address, 0);
|
return kernelDerefString(s->segMan, address);
|
||||||
else {
|
else {
|
||||||
int textlen;
|
int textlen;
|
||||||
int _index = index;
|
int _index = index;
|
||||||
|
@ -87,7 +87,7 @@ reg_t kSaid(EngineState *s, int, int argc, reg_t *argv) {
|
||||||
if (!heap_said_block.segment)
|
if (!heap_said_block.segment)
|
||||||
return NULL_REG;
|
return NULL_REG;
|
||||||
|
|
||||||
said_block = (byte *) kernelDerefBulkPtr(s->segMan, heap_said_block, 0);
|
said_block = (byte *)kernelDerefBulkPtr(s->segMan, heap_said_block, 0);
|
||||||
|
|
||||||
if (!said_block) {
|
if (!said_block) {
|
||||||
warning("Said on non-string, pointer %04x:%04x", PRINT_REG(heap_said_block));
|
warning("Said on non-string, pointer %04x:%04x", PRINT_REG(heap_said_block));
|
||||||
|
@ -287,8 +287,8 @@ reg_t kStrCmp(EngineState *s, int, int argc, reg_t *argv) {
|
||||||
|
|
||||||
|
|
||||||
reg_t kStrCpy(EngineState *s, int, int argc, reg_t *argv) {
|
reg_t kStrCpy(EngineState *s, int, int argc, reg_t *argv) {
|
||||||
char *dest = (char *) kernelDerefBulkPtr(s->segMan, argv[0], 0);
|
char *dest = kernelDerefString(s->segMan, argv[0]);
|
||||||
char *src = (char *) kernelDerefBulkPtr(s->segMan, argv[1], 0);
|
char *src = kernelDerefString(s->segMan, argv[1]);
|
||||||
|
|
||||||
if (!dest) {
|
if (!dest) {
|
||||||
warning("Attempt to strcpy TO invalid pointer %04x:%04x",
|
warning("Attempt to strcpy TO invalid pointer %04x:%04x",
|
||||||
|
@ -352,7 +352,7 @@ static int is_print_str(const char *str) {
|
||||||
|
|
||||||
|
|
||||||
reg_t kStrAt(EngineState *s, int, int argc, reg_t *argv) {
|
reg_t kStrAt(EngineState *s, int, int argc, reg_t *argv) {
|
||||||
byte *dest = (byte *)kernelDerefBulkPtr(s->segMan, argv[0], 0);
|
char *dest = kernelDerefString(s->segMan, argv[0]);
|
||||||
reg_t *dest2;
|
reg_t *dest2;
|
||||||
|
|
||||||
if (!dest) {
|
if (!dest) {
|
||||||
|
@ -380,7 +380,7 @@ reg_t kStrAt(EngineState *s, int, int argc, reg_t *argv) {
|
||||||
int odd = !(argv[1].toUint16() & 1);
|
int odd = !(argv[1].toUint16() & 1);
|
||||||
#endif
|
#endif
|
||||||
dest2 = ((reg_t *) dest) + (argv[1].toUint16() / 2);
|
dest2 = ((reg_t *) dest) + (argv[1].toUint16() / 2);
|
||||||
dest = ((byte *)(&dest2->offset)) + odd;
|
dest = ((char *)(&dest2->offset)) + odd;
|
||||||
} else
|
} else
|
||||||
dest += argv[1].toUint16();
|
dest += argv[1].toUint16();
|
||||||
|
|
||||||
|
@ -420,7 +420,7 @@ reg_t kReadNumber(EngineState *s, int, int argc, reg_t *argv) {
|
||||||
reg_t kFormat(EngineState *s, int, int argc, reg_t *argv) {
|
reg_t kFormat(EngineState *s, int, int argc, reg_t *argv) {
|
||||||
int *arguments;
|
int *arguments;
|
||||||
reg_t dest = argv[0];
|
reg_t dest = argv[0];
|
||||||
char *target = (char *) kernelDerefBulkPtr(s->segMan, dest, 0);
|
char *target = kernelDerefString(s->segMan, dest);
|
||||||
reg_t position = argv[1]; /* source */
|
reg_t position = argv[1]; /* source */
|
||||||
int index = argv[2].toUint16();
|
int index = argv[2].toUint16();
|
||||||
char *source;
|
char *source;
|
||||||
|
@ -740,7 +740,7 @@ reg_t kMessage(EngineState *s, int, int argc, reg_t *argv) {
|
||||||
|
|
||||||
if (!bufferReg.isNull()) {
|
if (!bufferReg.isNull()) {
|
||||||
int len = str.size() + 1;
|
int len = str.size() + 1;
|
||||||
buffer = kernelDerefCharPtr(s->segMan, bufferReg, len);
|
buffer = kernelDerefString(s->segMan, bufferReg, len);
|
||||||
|
|
||||||
if (buffer) {
|
if (buffer) {
|
||||||
strcpy(buffer, str.c_str());
|
strcpy(buffer, str.c_str());
|
||||||
|
@ -748,7 +748,7 @@ reg_t kMessage(EngineState *s, int, int argc, reg_t *argv) {
|
||||||
warning("Message: buffer %04x:%04x invalid or too small to hold the following text of %i bytes: '%s'", PRINT_REG(bufferReg), len, str.c_str());
|
warning("Message: buffer %04x:%04x invalid or too small to hold the following text of %i bytes: '%s'", PRINT_REG(bufferReg), len, str.c_str());
|
||||||
|
|
||||||
// Set buffer to empty string if possible
|
// Set buffer to empty string if possible
|
||||||
buffer = kernelDerefCharPtr(s->segMan, bufferReg, 1);
|
buffer = kernelDerefString(s->segMan, bufferReg, 1);
|
||||||
if (buffer)
|
if (buffer)
|
||||||
*buffer = 0;
|
*buffer = 0;
|
||||||
}
|
}
|
||||||
|
@ -821,7 +821,7 @@ reg_t kStrSplit(EngineState *s, int, int argc, reg_t *argv) {
|
||||||
Common::String str = s->strSplit(format, sep);
|
Common::String str = s->strSplit(format, sep);
|
||||||
|
|
||||||
// Make sure target buffer is large enough
|
// Make sure target buffer is large enough
|
||||||
char *buf = kernelDerefCharPtr(s->segMan, argv[0], str.size() + 1);
|
char *buf = kernelDerefString(s->segMan, argv[0], str.size() + 1);
|
||||||
|
|
||||||
if (buf) {
|
if (buf) {
|
||||||
strcpy(buf, str.c_str());
|
strcpy(buf, str.c_str());
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue