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;
reg_t kMessage(EngineState *s, int funct_nr, int argc, reg_t *argv) {
MessageTuple tuple;
if (!state.isInitialized())
message_state_initialize(s->resmgr, &state);
switch (UKPV(0)) {
case 0 : {
char *buffer = argc == 7 ? kernel_dereference_char_pointer(s, argv[6], 0) : NULL;
MessageTuple tuple;
int module = UKPV(1);
case 0:
case 2:
case 3:
case 4:
case 5:
if (!state.loadRes(UKPV(1)))
return NULL_REG;
tuple.noun = UKPV(2);
tuple.verb = UKPV(3);
tuple.cond = UKPV(4);
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)
state.getText(buffer, 100);
state.getText(buffer);
// Talker id
return make_reg(0, state.getTalker());
} else {
if (buffer) strcpy(buffer, DUMMY_MESSAGE);
return NULL_REG;
}
}
case 1 : {
char *buffer = argc == 7 ? kernel_dereference_char_pointer(s, argv[6], 0) : NULL;
char *buffer = argc == 7 ? kernel_dereference_char_pointer(s, argv[6], 0) : NULL;
if (state.getNext()) {
if (buffer)
state.getText(buffer, 100);
// Talker id
return make_reg(0, state.getTalker());
} else {
if (buffer) strcpy(buffer, DUMMY_MESSAGE);
strcpy(buffer, DUMMY_MESSAGE);
return NULL_REG;
}
}
case 2 : {
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))
case 2:
if (state.getSpecific(&tuple))
return make_reg(0, state.getLength() + 1);
else 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())
message_state_initialize(s->resmgr, &state);
char *buffer = kernel_dereference_char_pointer(s, argv[3], 0);
MessageTuple tuple;
tuple.noun = UKPV(0);
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.seq = 0;
if (buffer && state.loadRes(module) && state.getSpecific(&tuple)) {
state.getText(buffer, 255);
return argv[3];
} else {
return NULL_REG;
if (state.loadRes(module) && state.getSpecific(&tuple)) {
int len = state.getLength();
char *buffer = kernel_dereference_char_pointer(s, argv[3], len + 1);
if (buffer) {
state.getText(buffer);
return argv[3];
}
}
return NULL_REG;
}
} // End of namespace Sci

View file

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

View file

@ -46,7 +46,7 @@ struct IndexRecordCursor {
//typedef int index_record_size_t();
typedef void parse_index_record_t(IndexRecordCursor *index_record, MessageTuple *t);
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);
class MessageState {
@ -55,7 +55,7 @@ public:
int getNext();
int getTalker();
int getLength();
int getText(char *buffer, int length);
void getText(char *buffer);
int loadRes(int module);
int isInitialized() { return _initialized; }
void initialize(ResourceManager *resmgr);