Applied patch by waltervn to remove the length parameter from getText() and fixed a silly bug in getLength()

svn-id: r40421
This commit is contained in:
Filippos Karapetis 2009-05-10 13:47:38 +00:00
parent dd84aaf648
commit 53f24f3e43
3 changed files with 40 additions and 50 deletions

View file

@ -727,56 +727,49 @@ reg_t kGetFarText(EngineState *s, int funct_nr, int argc, reg_t *argv) {
static MessageState state; static MessageState state;
reg_t kMessage(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kMessage(EngineState *s, int funct_nr, int argc, reg_t *argv) {
MessageTuple tuple;
if (!state.isInitialized()) if (!state.isInitialized())
message_state_initialize(s->resmgr, &state); message_state_initialize(s->resmgr, &state);
switch (UKPV(0)) { switch (UKPV(0)) {
case 0 : { case 0:
char *buffer = argc == 7 ? kernel_dereference_char_pointer(s, argv[6], 0) : NULL; case 2:
MessageTuple tuple; case 3:
int module = UKPV(1); case 4:
case 5:
if (!state.loadRes(UKPV(1)))
return NULL_REG;
tuple.noun = UKPV(2); tuple.noun = UKPV(2);
tuple.verb = UKPV(3); tuple.verb = UKPV(3);
tuple.cond = UKPV(4); tuple.cond = UKPV(4);
tuple.seq = UKPV(5); tuple.seq = UKPV(5);
}
switch (UKPV(0)) {
case 0 :
case 1 :
if (UKPV(0) == 0 ? state.getSpecific(&tuple) : state.getNext()) {
char *buffer = argc == 7 ? kernel_dereference_char_pointer(s, argv[6], state.getLength() + 1) : NULL;
if (state.loadRes(module) && state.getSpecific(&tuple)) {
if (buffer) if (buffer)
state.getText(buffer, 100); state.getText(buffer);
// Talker id // Talker id
return make_reg(0, state.getTalker()); return make_reg(0, state.getTalker());
} else { } else {
if (buffer) strcpy(buffer, DUMMY_MESSAGE); char *buffer = argc == 7 ? kernel_dereference_char_pointer(s, argv[6], 0) : NULL;
return NULL_REG;
}
}
case 1 : {
char *buffer = argc == 7 ? kernel_dereference_char_pointer(s, argv[6], 0) : NULL;
if (state.getNext()) {
if (buffer) if (buffer)
state.getText(buffer, 100); strcpy(buffer, DUMMY_MESSAGE);
// Talker id
return make_reg(0, state.getTalker());
} else {
if (buffer) strcpy(buffer, DUMMY_MESSAGE);
return NULL_REG; return NULL_REG;
} }
} case 2:
case 2 : { if (state.getSpecific(&tuple))
MessageTuple tuple;
int module = UKPV(1);
tuple.noun = UKPV(2);
tuple.verb = UKPV(3);
tuple.cond = UKPV(4);
tuple.seq = UKPV(5);
if (state.loadRes(module) && state.getSpecific(&tuple))
return make_reg(0, state.getLength() + 1); return make_reg(0, state.getLength() + 1);
else return NULL_REG; else return NULL_REG;
} }
}
return NULL_REG; return NULL_REG;
} }
@ -785,8 +778,6 @@ reg_t kGetMessage(EngineState *s, int funct_nr, int argc, reg_t *argv) {
if (!state.isInitialized()) if (!state.isInitialized())
message_state_initialize(s->resmgr, &state); message_state_initialize(s->resmgr, &state);
char *buffer = kernel_dereference_char_pointer(s, argv[3], 0);
MessageTuple tuple; MessageTuple tuple;
tuple.noun = UKPV(0); tuple.noun = UKPV(0);
int module = UKPV(1); int module = UKPV(1);
@ -794,12 +785,17 @@ reg_t kGetMessage(EngineState *s, int funct_nr, int argc, reg_t *argv) {
tuple.cond = 0; tuple.cond = 0;
tuple.seq = 0; tuple.seq = 0;
if (buffer && state.loadRes(module) && state.getSpecific(&tuple)) { if (state.loadRes(module) && state.getSpecific(&tuple)) {
state.getText(buffer, 255); int len = state.getLength();
return argv[3]; char *buffer = kernel_dereference_char_pointer(s, argv[3], len + 1);
} else {
return NULL_REG; if (buffer) {
state.getText(buffer);
return argv[3];
}
} }
return NULL_REG;
} }
} // End of namespace Sci } // End of namespace Sci

View file

@ -93,22 +93,16 @@ int MessageState::getTalker() {
return *(_engineCursor.index_record + 4); return *(_engineCursor.index_record + 4);
} }
int MessageState::getText(char *buffer, int length) { void MessageState::getText(char *buffer) {
int offset; int offset = READ_LE_UINT16(_engineCursor.index_record + ((_version == 2101) ? 2 : 5));
if (_version == 2101)
offset = READ_LE_UINT16(_engineCursor.index_record + 2);
else
offset = READ_LE_UINT16(_engineCursor.index_record + 5);
char *stringptr = (char *)_engineCursor.resource_beginning + offset; char *stringptr = (char *)_engineCursor.resource_beginning + offset;
strncpy(buffer, stringptr, length); strcpy(buffer, stringptr);
return strlen(buffer);
} }
int MessageState::getLength() { int MessageState::getLength() {
char buffer[500]; int offset = READ_LE_UINT16(_engineCursor.index_record + ((_version == 2101) ? 2 : 5));
return getText(buffer, sizeof(buffer)); char *stringptr = (char *)_engineCursor.resource_beginning + offset;
return strlen(stringptr);
} }
int MessageState::loadRes(int module) { int MessageState::loadRes(int module) {

View file

@ -46,7 +46,7 @@ struct IndexRecordCursor {
//typedef int index_record_size_t(); //typedef int index_record_size_t();
typedef void parse_index_record_t(IndexRecordCursor *index_record, MessageTuple *t); typedef void parse_index_record_t(IndexRecordCursor *index_record, MessageTuple *t);
typedef int get_talker_t(IndexRecordCursor *cursor); typedef int get_talker_t(IndexRecordCursor *cursor);
typedef void get_text_t(IndexRecordCursor *cursor, char *buffer, int buffer_size); typedef void get_text_t(IndexRecordCursor *cursor);
typedef int index_record_count_t(byte *header); typedef int index_record_count_t(byte *header);
class MessageState { class MessageState {
@ -55,7 +55,7 @@ public:
int getNext(); int getNext();
int getTalker(); int getTalker();
int getLength(); int getLength();
int getText(char *buffer, int length); void getText(char *buffer);
int loadRes(int module); int loadRes(int module);
int isInitialized() { return _initialized; } int isInitialized() { return _initialized; }
void initialize(ResourceManager *resmgr); void initialize(ResourceManager *resmgr);