aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine/klists.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/engine/klists.cpp')
-rw-r--r--engines/sci/engine/klists.cpp52
1 files changed, 35 insertions, 17 deletions
diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp
index f06f3eec77..c04454ca3d 100644
--- a/engines/sci/engine/klists.cpp
+++ b/engines/sci/engine/klists.cpp
@@ -155,10 +155,28 @@ reg_t kDisposeList(EngineState *s, int argc, reg_t *argv) {
return s->r_acc;
}
+static reg_t _k_new_node(EngineState *s, reg_t value, reg_t key) {
+ reg_t nodebase;
+ Node *n = s->_segMan->allocateNode(&nodebase);
+
+ if (!n) {
+ error("[Kernel] Out of memory while creating a node");
+ return NULL_REG;
+ }
+
+ n->pred = n->succ = NULL_REG;
+ n->key = key;
+ n->value = value;
+
+ return nodebase;
+}
+
reg_t kNewNode(EngineState *s, int argc, reg_t *argv) {
- reg_t nodeValue = argv[0];
- reg_t nodeKey = (argc == 2) ? argv[1] : NULL_REG;
- s->r_acc = s->_segMan->newNode(nodeValue, nodeKey);
+
+ if (argc == 1)
+ s->r_acc = _k_new_node(s, argv[0], argv[0]);
+ else
+ s->r_acc = _k_new_node(s, argv[0], argv[1]);
debugC(2, kDebugLevelNodes, "New nodebase at %04x:%04x", PRINT_REG(s->r_acc));
@@ -397,11 +415,11 @@ reg_t kSort(EngineState *s, int argc, reg_t *argv) {
reg_t dest = argv[1];
reg_t order_func = argv[2];
- int input_size = (int16)readSelectorValue(segMan, source, SELECTOR(size));
+ int input_size = (int16)GET_SEL32V(segMan, source, SELECTOR(size));
int i;
- reg_t input_data = readSelector(segMan, source, SELECTOR(elements));
- reg_t output_data = readSelector(segMan, dest, SELECTOR(elements));
+ reg_t input_data = GET_SEL32(segMan, source, SELECTOR(elements));
+ reg_t output_data = GET_SEL32(segMan, dest, SELECTOR(elements));
List *list;
Node *node;
@@ -412,10 +430,10 @@ reg_t kSort(EngineState *s, int argc, reg_t *argv) {
if (output_data.isNull()) {
list = s->_segMan->allocateList(&output_data);
list->first = list->last = NULL_REG;
- writeSelector(segMan, dest, SELECTOR(elements), output_data);
+ PUT_SEL32(segMan, dest, SELECTOR(elements), output_data);
}
- writeSelectorValue(segMan, dest, SELECTOR(size), input_size);
+ PUT_SEL32V(segMan, dest, SELECTOR(size), input_size);
list = s->_segMan->lookupList(input_data);
node = s->_segMan->lookupNode(list->first);
@@ -424,7 +442,7 @@ reg_t kSort(EngineState *s, int argc, reg_t *argv) {
i = 0;
while (node) {
- invokeSelector(INV_SEL(s, order_func, doit, kStopOnInvalidSelector), 1, node->value);
+ invoke_selector(INV_SEL(s, order_func, doit, kStopOnInvalidSelector), 1, node->value);
temp_array[i].key = node->key;
temp_array[i].value = node->value;
temp_array[i].order = s->r_acc;
@@ -435,7 +453,7 @@ reg_t kSort(EngineState *s, int argc, reg_t *argv) {
qsort(temp_array, input_size, sizeof(sort_temp_t), sort_temp_cmp);
for (i = 0;i < input_size;i++) {
- reg_t lNode = s->_segMan->newNode(temp_array[i].value, temp_array[i].key);
+ reg_t lNode = _k_new_node(s, temp_array[i].key, temp_array[i].value);
_k_add_to_end(s, output_data, lNode);
}
@@ -515,15 +533,15 @@ reg_t kListEachElementDo(EngineState *s, int argc, reg_t *argv) {
curObject = curNode->value;
// First, check if the target selector is a variable
- if (lookupSelector(s->_segMan, curObject, slc, &address, NULL) == kSelectorVariable) {
+ if (lookup_selector(s->_segMan, curObject, slc, &address, NULL) == kSelectorVariable) {
// This can only happen with 3 params (list, target selector, variable)
if (argc != 3) {
warning("kListEachElementDo: Attempted to modify a variable selector with %d params", argc);
} else {
- writeSelector(s->_segMan, curObject, slc, argv[2]);
+ write_selector(s->_segMan, curObject, slc, argv[2]);
}
} else {
- invokeSelectorArgv(s, curObject, slc, kContinueOnInvalidSelector, argc, argv, argc - 2, argv + 2);
+ invoke_selector_argv(s, curObject, slc, kContinueOnInvalidSelector, argc, argv, argc - 2, argv + 2);
}
curNode = s->_segMan->lookupNode(nextNode);
@@ -548,11 +566,11 @@ reg_t kListFirstTrue(EngineState *s, int argc, reg_t *argv) {
curObject = curNode->value;
// First, check if the target selector is a variable
- if (lookupSelector(s->_segMan, curObject, slc, &address, NULL) == kSelectorVariable) {
+ if (lookup_selector(s->_segMan, curObject, slc, &address, NULL) == kSelectorVariable) {
// Can this happen with variable selectors?
warning("kListFirstTrue: Attempted to access a variable selector");
} else {
- invokeSelectorArgv(s, curObject, slc, kContinueOnInvalidSelector, argc, argv, argc - 2, argv + 2);
+ invoke_selector_argv(s, curObject, slc, kContinueOnInvalidSelector, argc, argv, argc - 2, argv + 2);
// Check if the result is true
if (!s->r_acc.isNull())
@@ -582,11 +600,11 @@ reg_t kListAllTrue(EngineState *s, int argc, reg_t *argv) {
curObject = curNode->value;
// First, check if the target selector is a variable
- if (lookupSelector(s->_segMan, curObject, slc, &address, NULL) == kSelectorVariable) {
+ if (lookup_selector(s->_segMan, curObject, slc, &address, NULL) == kSelectorVariable) {
// Can this happen with variable selectors?
warning("kListAllTrue: Attempted to access a variable selector");
} else {
- invokeSelectorArgv(s, curObject, slc, kContinueOnInvalidSelector, argc, argv, argc - 2, argv + 2);
+ invoke_selector_argv(s, curObject, slc, kContinueOnInvalidSelector, argc, argv, argc - 2, argv + 2);
// Check if the result isn't true
if (s->r_acc.isNull())