diff options
author | Filippos Karapetis | 2010-05-26 22:05:51 +0000 |
---|---|---|
committer | Filippos Karapetis | 2010-05-26 22:05:51 +0000 |
commit | 2c2a1fa1ba9c4da4f955f341a8710b9cb40ede7e (patch) | |
tree | 65a6679155e30963c9abd34eb3d8c22c9232ce21 | |
parent | d35121fc6144eb9fc9e06d60d5c8cf49f5c1b181 (diff) | |
download | scummvm-rg350-2c2a1fa1ba9c4da4f955f341a8710b9cb40ede7e.tar.gz scummvm-rg350-2c2a1fa1ba9c4da4f955f341a8710b9cb40ede7e.tar.bz2 scummvm-rg350-2c2a1fa1ba9c4da4f955f341a8710b9cb40ede7e.zip |
Made _k_new_node() a method of the segment manager, and fixed a bug with the rarely used SCI0 kernel function kSort in the process (_k_new_node was called with key, value instead of value, key inside kSort)
svn-id: r49251
-rw-r--r-- | engines/sci/engine/klists.cpp | 26 | ||||
-rw-r--r-- | engines/sci/engine/seg_manager.cpp | 10 | ||||
-rw-r--r-- | engines/sci/engine/seg_manager.h | 8 |
3 files changed, 22 insertions, 22 deletions
diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index c04454ca3d..7fefccd9d7 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -155,28 +155,10 @@ 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) { - - 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]); + reg_t nodeValue = argv[0]; + reg_t nodeKey = (argc == 2) ? argv[1] : NULL_REG; + s->r_acc = s->_segMan->newNode(nodeValue, nodeKey); debugC(2, kDebugLevelNodes, "New nodebase at %04x:%04x", PRINT_REG(s->r_acc)); @@ -453,7 +435,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 = _k_new_node(s, temp_array[i].key, temp_array[i].value); + reg_t lNode = s->_segMan->newNode(temp_array[i].value, temp_array[i].key); _k_add_to_end(s, output_data, lNode); } diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index e0b6e75d70..a8f46213ec 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -523,6 +523,16 @@ Node *SegManager::allocateNode(reg_t *addr) { return &(table->_table[offset]); } +reg_t SegManager::newNode(reg_t value, reg_t key) { + reg_t nodebase; + Node *n = allocateNode(&nodebase); + n->pred = n->succ = NULL_REG; + n->key = key; + n->value = value; + + return nodebase; +} + List *SegManager::lookupList(reg_t addr) { if (getSegmentType(addr.segment) != SEG_TYPE_LISTS) { warning("Attempt to use non-list %04x:%04x as list", PRINT_REG(addr)); diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index e8bbdbdb3f..24d3f3fc1c 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -215,6 +215,14 @@ public: Node *allocateNode(reg_t *addr); /** + * Allocate and initialize a new list node. + * @param[in] value The value to set the node to + * @param[in] key The key to set + * @return Pointer to the newly initialized list node + */ + reg_t newNode(reg_t value, reg_t key); + + /** * Resolves a list pointer to a list. * @param addr The address to resolve * @return The list referenced, or NULL on error |