Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
src/vm/dict.c@0:14e5e829dffe, 2010-07-21 (annotated)
- Committer:
- dadaista
- Date:
- Wed Jul 21 12:50:41 2010 +0000
- Revision:
- 0:14e5e829dffe
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dadaista | 0:14e5e829dffe | 1 | /* |
dadaista | 0:14e5e829dffe | 2 | # This file is Copyright 2003, 2006, 2007, 2009 Dean Hall. |
dadaista | 0:14e5e829dffe | 3 | # |
dadaista | 0:14e5e829dffe | 4 | # This file is part of the PyMite VM. |
dadaista | 0:14e5e829dffe | 5 | # The PyMite VM is free software: you can redistribute it and/or modify |
dadaista | 0:14e5e829dffe | 6 | # it under the terms of the GNU GENERAL PUBLIC LICENSE Version 2. |
dadaista | 0:14e5e829dffe | 7 | # |
dadaista | 0:14e5e829dffe | 8 | # The PyMite VM is distributed in the hope that it will be useful, |
dadaista | 0:14e5e829dffe | 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
dadaista | 0:14e5e829dffe | 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
dadaista | 0:14e5e829dffe | 11 | # A copy of the GNU GENERAL PUBLIC LICENSE Version 2 |
dadaista | 0:14e5e829dffe | 12 | # is seen in the file COPYING in this directory. |
dadaista | 0:14e5e829dffe | 13 | */ |
dadaista | 0:14e5e829dffe | 14 | |
dadaista | 0:14e5e829dffe | 15 | |
dadaista | 0:14e5e829dffe | 16 | #undef __FILE_ID__ |
dadaista | 0:14e5e829dffe | 17 | #define __FILE_ID__ 0x02 |
dadaista | 0:14e5e829dffe | 18 | |
dadaista | 0:14e5e829dffe | 19 | |
dadaista | 0:14e5e829dffe | 20 | /** |
dadaista | 0:14e5e829dffe | 21 | * \file |
dadaista | 0:14e5e829dffe | 22 | * \brief Dict Object Type |
dadaista | 0:14e5e829dffe | 23 | * |
dadaista | 0:14e5e829dffe | 24 | * Dict object type operations. |
dadaista | 0:14e5e829dffe | 25 | */ |
dadaista | 0:14e5e829dffe | 26 | |
dadaista | 0:14e5e829dffe | 27 | |
dadaista | 0:14e5e829dffe | 28 | #include "pm.h" |
dadaista | 0:14e5e829dffe | 29 | |
dadaista | 0:14e5e829dffe | 30 | |
dadaista | 0:14e5e829dffe | 31 | PmReturn_t |
dadaista | 0:14e5e829dffe | 32 | dict_new(pPmObj_t *r_pdict) |
dadaista | 0:14e5e829dffe | 33 | { |
dadaista | 0:14e5e829dffe | 34 | PmReturn_t retval = PM_RET_OK; |
dadaista | 0:14e5e829dffe | 35 | pPmDict_t pdict = C_NULL; |
dadaista | 0:14e5e829dffe | 36 | uint8_t *pchunk; |
dadaista | 0:14e5e829dffe | 37 | |
dadaista | 0:14e5e829dffe | 38 | /* Allocate a dict */ |
dadaista | 0:14e5e829dffe | 39 | retval = heap_getChunk(sizeof(PmDict_t), &pchunk); |
dadaista | 0:14e5e829dffe | 40 | PM_RETURN_IF_ERROR(retval); |
dadaista | 0:14e5e829dffe | 41 | |
dadaista | 0:14e5e829dffe | 42 | /* Init dict fields */ |
dadaista | 0:14e5e829dffe | 43 | pdict = (pPmDict_t)pchunk; |
dadaista | 0:14e5e829dffe | 44 | OBJ_SET_TYPE(pdict, OBJ_TYPE_DIC); |
dadaista | 0:14e5e829dffe | 45 | pdict->length = 0; |
dadaista | 0:14e5e829dffe | 46 | pdict->d_keys = C_NULL; |
dadaista | 0:14e5e829dffe | 47 | pdict->d_vals = C_NULL; |
dadaista | 0:14e5e829dffe | 48 | |
dadaista | 0:14e5e829dffe | 49 | *r_pdict = (pPmObj_t)pchunk; |
dadaista | 0:14e5e829dffe | 50 | return retval; |
dadaista | 0:14e5e829dffe | 51 | } |
dadaista | 0:14e5e829dffe | 52 | |
dadaista | 0:14e5e829dffe | 53 | |
dadaista | 0:14e5e829dffe | 54 | PmReturn_t |
dadaista | 0:14e5e829dffe | 55 | dict_clear(pPmObj_t pdict) |
dadaista | 0:14e5e829dffe | 56 | { |
dadaista | 0:14e5e829dffe | 57 | PmReturn_t retval = PM_RET_OK; |
dadaista | 0:14e5e829dffe | 58 | |
dadaista | 0:14e5e829dffe | 59 | C_ASSERT(pdict != C_NULL); |
dadaista | 0:14e5e829dffe | 60 | |
dadaista | 0:14e5e829dffe | 61 | /* Raise TypeError if arg is not a dict */ |
dadaista | 0:14e5e829dffe | 62 | if (OBJ_GET_TYPE(pdict) != OBJ_TYPE_DIC) |
dadaista | 0:14e5e829dffe | 63 | { |
dadaista | 0:14e5e829dffe | 64 | PM_RAISE(retval, PM_RET_EX_TYPE); |
dadaista | 0:14e5e829dffe | 65 | return retval; |
dadaista | 0:14e5e829dffe | 66 | } |
dadaista | 0:14e5e829dffe | 67 | |
dadaista | 0:14e5e829dffe | 68 | /* clear length */ |
dadaista | 0:14e5e829dffe | 69 | ((pPmDict_t)pdict)->length = 0; |
dadaista | 0:14e5e829dffe | 70 | |
dadaista | 0:14e5e829dffe | 71 | /* Free the keys and values seglists if needed */ |
dadaista | 0:14e5e829dffe | 72 | if (((pPmDict_t)pdict)->d_keys != C_NULL) |
dadaista | 0:14e5e829dffe | 73 | { |
dadaista | 0:14e5e829dffe | 74 | PM_RETURN_IF_ERROR(seglist_clear(((pPmDict_t)pdict)->d_keys)); |
dadaista | 0:14e5e829dffe | 75 | PM_RETURN_IF_ERROR(heap_freeChunk((pPmObj_t) |
dadaista | 0:14e5e829dffe | 76 | ((pPmDict_t)pdict)->d_keys)); |
dadaista | 0:14e5e829dffe | 77 | ((pPmDict_t)pdict)->d_keys = C_NULL; |
dadaista | 0:14e5e829dffe | 78 | } |
dadaista | 0:14e5e829dffe | 79 | if (((pPmDict_t)pdict)->d_vals != C_NULL) |
dadaista | 0:14e5e829dffe | 80 | { |
dadaista | 0:14e5e829dffe | 81 | PM_RETURN_IF_ERROR(seglist_clear(((pPmDict_t)pdict)->d_vals)); |
dadaista | 0:14e5e829dffe | 82 | retval = heap_freeChunk((pPmObj_t)((pPmDict_t)pdict)->d_vals); |
dadaista | 0:14e5e829dffe | 83 | ((pPmDict_t)pdict)->d_vals = C_NULL; |
dadaista | 0:14e5e829dffe | 84 | } |
dadaista | 0:14e5e829dffe | 85 | return retval; |
dadaista | 0:14e5e829dffe | 86 | } |
dadaista | 0:14e5e829dffe | 87 | |
dadaista | 0:14e5e829dffe | 88 | |
dadaista | 0:14e5e829dffe | 89 | /* |
dadaista | 0:14e5e829dffe | 90 | * Sets a value in the dict using the given key. |
dadaista | 0:14e5e829dffe | 91 | * |
dadaista | 0:14e5e829dffe | 92 | * Scans dict for the key. If key val found, replace old |
dadaista | 0:14e5e829dffe | 93 | * with new val. If no key found, add key/val pair to dict. |
dadaista | 0:14e5e829dffe | 94 | */ |
dadaista | 0:14e5e829dffe | 95 | PmReturn_t |
dadaista | 0:14e5e829dffe | 96 | dict_setItem(pPmObj_t pdict, pPmObj_t pkey, pPmObj_t pval) |
dadaista | 0:14e5e829dffe | 97 | { |
dadaista | 0:14e5e829dffe | 98 | PmReturn_t retval = PM_RET_OK; |
dadaista | 0:14e5e829dffe | 99 | int16_t indx; |
dadaista | 0:14e5e829dffe | 100 | |
dadaista | 0:14e5e829dffe | 101 | C_ASSERT(pdict != C_NULL); |
dadaista | 0:14e5e829dffe | 102 | C_ASSERT(pkey != C_NULL); |
dadaista | 0:14e5e829dffe | 103 | C_ASSERT(pval != C_NULL); |
dadaista | 0:14e5e829dffe | 104 | |
dadaista | 0:14e5e829dffe | 105 | /* If it's not a dict, raise TypeError */ |
dadaista | 0:14e5e829dffe | 106 | if (OBJ_GET_TYPE(pdict) != OBJ_TYPE_DIC) |
dadaista | 0:14e5e829dffe | 107 | { |
dadaista | 0:14e5e829dffe | 108 | PM_RAISE(retval, PM_RET_EX_TYPE); |
dadaista | 0:14e5e829dffe | 109 | return retval; |
dadaista | 0:14e5e829dffe | 110 | } |
dadaista | 0:14e5e829dffe | 111 | |
dadaista | 0:14e5e829dffe | 112 | /* #112: Force Dict keys to be of hashable type */ |
dadaista | 0:14e5e829dffe | 113 | /* If key is not hashable, raise TypeError */ |
dadaista | 0:14e5e829dffe | 114 | if (OBJ_GET_TYPE(pkey) > OBJ_TYPE_HASHABLE_MAX) |
dadaista | 0:14e5e829dffe | 115 | { |
dadaista | 0:14e5e829dffe | 116 | PM_RAISE(retval, PM_RET_EX_TYPE); |
dadaista | 0:14e5e829dffe | 117 | return retval; |
dadaista | 0:14e5e829dffe | 118 | } |
dadaista | 0:14e5e829dffe | 119 | |
dadaista | 0:14e5e829dffe | 120 | /* #147: Change boolean keys to integers */ |
dadaista | 0:14e5e829dffe | 121 | if (pkey == PM_TRUE) |
dadaista | 0:14e5e829dffe | 122 | { |
dadaista | 0:14e5e829dffe | 123 | pkey = PM_ONE; |
dadaista | 0:14e5e829dffe | 124 | } |
dadaista | 0:14e5e829dffe | 125 | else if (pkey == PM_FALSE) |
dadaista | 0:14e5e829dffe | 126 | { |
dadaista | 0:14e5e829dffe | 127 | pkey = PM_ZERO; |
dadaista | 0:14e5e829dffe | 128 | } |
dadaista | 0:14e5e829dffe | 129 | |
dadaista | 0:14e5e829dffe | 130 | /* |
dadaista | 0:14e5e829dffe | 131 | * #115: If this is the first key/value pair to be added to the Dict, |
dadaista | 0:14e5e829dffe | 132 | * allocate the key and value seglists that hold those items |
dadaista | 0:14e5e829dffe | 133 | */ |
dadaista | 0:14e5e829dffe | 134 | if (((pPmDict_t)pdict)->length == 0) |
dadaista | 0:14e5e829dffe | 135 | { |
dadaista | 0:14e5e829dffe | 136 | retval = seglist_new(&((pPmDict_t)pdict)->d_keys); |
dadaista | 0:14e5e829dffe | 137 | PM_RETURN_IF_ERROR(retval); |
dadaista | 0:14e5e829dffe | 138 | retval = seglist_new(&((pPmDict_t)pdict)->d_vals); |
dadaista | 0:14e5e829dffe | 139 | PM_RETURN_IF_ERROR(retval); |
dadaista | 0:14e5e829dffe | 140 | } |
dadaista | 0:14e5e829dffe | 141 | else |
dadaista | 0:14e5e829dffe | 142 | { |
dadaista | 0:14e5e829dffe | 143 | /* Check for matching key */ |
dadaista | 0:14e5e829dffe | 144 | indx = 0; |
dadaista | 0:14e5e829dffe | 145 | retval = seglist_findEqual(((pPmDict_t)pdict)->d_keys, pkey, &indx); |
dadaista | 0:14e5e829dffe | 146 | |
dadaista | 0:14e5e829dffe | 147 | /* If found a matching key, replace val obj */ |
dadaista | 0:14e5e829dffe | 148 | if (retval == PM_RET_OK) |
dadaista | 0:14e5e829dffe | 149 | { |
dadaista | 0:14e5e829dffe | 150 | retval = seglist_setItem(((pPmDict_t)pdict)->d_vals, pval, indx); |
dadaista | 0:14e5e829dffe | 151 | return retval; |
dadaista | 0:14e5e829dffe | 152 | } |
dadaista | 0:14e5e829dffe | 153 | } |
dadaista | 0:14e5e829dffe | 154 | |
dadaista | 0:14e5e829dffe | 155 | /* Otherwise, insert the key,val pair */ |
dadaista | 0:14e5e829dffe | 156 | retval = seglist_insertItem(((pPmDict_t)pdict)->d_keys, pkey, 0); |
dadaista | 0:14e5e829dffe | 157 | PM_RETURN_IF_ERROR(retval); |
dadaista | 0:14e5e829dffe | 158 | retval = seglist_insertItem(((pPmDict_t)pdict)->d_vals, pval, 0); |
dadaista | 0:14e5e829dffe | 159 | ((pPmDict_t)pdict)->length++; |
dadaista | 0:14e5e829dffe | 160 | |
dadaista | 0:14e5e829dffe | 161 | return retval; |
dadaista | 0:14e5e829dffe | 162 | } |
dadaista | 0:14e5e829dffe | 163 | |
dadaista | 0:14e5e829dffe | 164 | |
dadaista | 0:14e5e829dffe | 165 | PmReturn_t |
dadaista | 0:14e5e829dffe | 166 | dict_getItem(pPmObj_t pdict, pPmObj_t pkey, pPmObj_t *r_pobj) |
dadaista | 0:14e5e829dffe | 167 | { |
dadaista | 0:14e5e829dffe | 168 | PmReturn_t retval = PM_RET_OK; |
dadaista | 0:14e5e829dffe | 169 | int16_t indx = 0; |
dadaista | 0:14e5e829dffe | 170 | |
dadaista | 0:14e5e829dffe | 171 | /* C_ASSERT(pdict != C_NULL);*/ |
dadaista | 0:14e5e829dffe | 172 | |
dadaista | 0:14e5e829dffe | 173 | /* if it's not a dict, raise TypeError */ |
dadaista | 0:14e5e829dffe | 174 | if (OBJ_GET_TYPE(pdict) != OBJ_TYPE_DIC) |
dadaista | 0:14e5e829dffe | 175 | { |
dadaista | 0:14e5e829dffe | 176 | PM_RAISE(retval, PM_RET_EX_TYPE); |
dadaista | 0:14e5e829dffe | 177 | return retval; |
dadaista | 0:14e5e829dffe | 178 | } |
dadaista | 0:14e5e829dffe | 179 | |
dadaista | 0:14e5e829dffe | 180 | /* if dict is empty, raise KeyError */ |
dadaista | 0:14e5e829dffe | 181 | if (((pPmDict_t)pdict)->length <= 0) |
dadaista | 0:14e5e829dffe | 182 | { |
dadaista | 0:14e5e829dffe | 183 | PM_RAISE(retval, PM_RET_EX_KEY); |
dadaista | 0:14e5e829dffe | 184 | return retval; |
dadaista | 0:14e5e829dffe | 185 | } |
dadaista | 0:14e5e829dffe | 186 | |
dadaista | 0:14e5e829dffe | 187 | /* #147: Change boolean keys to integers */ |
dadaista | 0:14e5e829dffe | 188 | if (pkey == PM_TRUE) |
dadaista | 0:14e5e829dffe | 189 | { |
dadaista | 0:14e5e829dffe | 190 | pkey = PM_ONE; |
dadaista | 0:14e5e829dffe | 191 | } |
dadaista | 0:14e5e829dffe | 192 | else if (pkey == PM_FALSE) |
dadaista | 0:14e5e829dffe | 193 | { |
dadaista | 0:14e5e829dffe | 194 | pkey = PM_ZERO; |
dadaista | 0:14e5e829dffe | 195 | } |
dadaista | 0:14e5e829dffe | 196 | |
dadaista | 0:14e5e829dffe | 197 | /* check for matching key */ |
dadaista | 0:14e5e829dffe | 198 | retval = seglist_findEqual(((pPmDict_t)pdict)->d_keys, pkey, &indx); |
dadaista | 0:14e5e829dffe | 199 | /* if key not found, raise KeyError */ |
dadaista | 0:14e5e829dffe | 200 | if (retval == PM_RET_NO) |
dadaista | 0:14e5e829dffe | 201 | { |
dadaista | 0:14e5e829dffe | 202 | PM_RAISE(retval, PM_RET_EX_KEY); |
dadaista | 0:14e5e829dffe | 203 | } |
dadaista | 0:14e5e829dffe | 204 | /* return any other error */ |
dadaista | 0:14e5e829dffe | 205 | PM_RETURN_IF_ERROR(retval); |
dadaista | 0:14e5e829dffe | 206 | |
dadaista | 0:14e5e829dffe | 207 | /* key was found, get obj from vals */ |
dadaista | 0:14e5e829dffe | 208 | retval = seglist_getItem(((pPmDict_t)pdict)->d_vals, indx, r_pobj); |
dadaista | 0:14e5e829dffe | 209 | return retval; |
dadaista | 0:14e5e829dffe | 210 | } |
dadaista | 0:14e5e829dffe | 211 | |
dadaista | 0:14e5e829dffe | 212 | |
dadaista | 0:14e5e829dffe | 213 | #ifdef HAVE_DEL |
dadaista | 0:14e5e829dffe | 214 | PmReturn_t |
dadaista | 0:14e5e829dffe | 215 | dict_delItem(pPmObj_t pdict, pPmObj_t pkey) |
dadaista | 0:14e5e829dffe | 216 | { |
dadaista | 0:14e5e829dffe | 217 | PmReturn_t retval = PM_RET_OK; |
dadaista | 0:14e5e829dffe | 218 | int16_t indx = 0; |
dadaista | 0:14e5e829dffe | 219 | |
dadaista | 0:14e5e829dffe | 220 | C_ASSERT(pdict != C_NULL); |
dadaista | 0:14e5e829dffe | 221 | |
dadaista | 0:14e5e829dffe | 222 | /* Check for matching key */ |
dadaista | 0:14e5e829dffe | 223 | retval = seglist_findEqual(((pPmDict_t)pdict)->d_keys, pkey, &indx); |
dadaista | 0:14e5e829dffe | 224 | |
dadaista | 0:14e5e829dffe | 225 | /* Raise KeyError if key is not found */ |
dadaista | 0:14e5e829dffe | 226 | if (retval == PM_RET_NO) |
dadaista | 0:14e5e829dffe | 227 | { |
dadaista | 0:14e5e829dffe | 228 | PM_RAISE(retval, PM_RET_EX_KEY); |
dadaista | 0:14e5e829dffe | 229 | } |
dadaista | 0:14e5e829dffe | 230 | |
dadaista | 0:14e5e829dffe | 231 | /* Return any other error */ |
dadaista | 0:14e5e829dffe | 232 | PM_RETURN_IF_ERROR(retval); |
dadaista | 0:14e5e829dffe | 233 | |
dadaista | 0:14e5e829dffe | 234 | /* Remove the key and value */ |
dadaista | 0:14e5e829dffe | 235 | retval = seglist_removeItem(((pPmDict_t)pdict)->d_keys, indx); |
dadaista | 0:14e5e829dffe | 236 | PM_RETURN_IF_ERROR(retval); |
dadaista | 0:14e5e829dffe | 237 | retval = seglist_removeItem(((pPmDict_t)pdict)->d_vals, indx); |
dadaista | 0:14e5e829dffe | 238 | |
dadaista | 0:14e5e829dffe | 239 | /* Reduce the item count */ |
dadaista | 0:14e5e829dffe | 240 | ((pPmDict_t)pdict)->length--; |
dadaista | 0:14e5e829dffe | 241 | |
dadaista | 0:14e5e829dffe | 242 | return retval; |
dadaista | 0:14e5e829dffe | 243 | } |
dadaista | 0:14e5e829dffe | 244 | #endif /* HAVE_DEL */ |
dadaista | 0:14e5e829dffe | 245 | |
dadaista | 0:14e5e829dffe | 246 | |
dadaista | 0:14e5e829dffe | 247 | #ifdef HAVE_PRINT |
dadaista | 0:14e5e829dffe | 248 | PmReturn_t |
dadaista | 0:14e5e829dffe | 249 | dict_print(pPmObj_t pdict) |
dadaista | 0:14e5e829dffe | 250 | { |
dadaista | 0:14e5e829dffe | 251 | PmReturn_t retval = PM_RET_OK; |
dadaista | 0:14e5e829dffe | 252 | int16_t index; |
dadaista | 0:14e5e829dffe | 253 | pSeglist_t keys, |
dadaista | 0:14e5e829dffe | 254 | vals; |
dadaista | 0:14e5e829dffe | 255 | pPmObj_t pobj1; |
dadaista | 0:14e5e829dffe | 256 | |
dadaista | 0:14e5e829dffe | 257 | C_ASSERT(pdict != C_NULL); |
dadaista | 0:14e5e829dffe | 258 | |
dadaista | 0:14e5e829dffe | 259 | /* if it's not a dict, raise TypeError */ |
dadaista | 0:14e5e829dffe | 260 | if (OBJ_GET_TYPE(pdict) != OBJ_TYPE_DIC) |
dadaista | 0:14e5e829dffe | 261 | { |
dadaista | 0:14e5e829dffe | 262 | PM_RAISE(retval, PM_RET_EX_TYPE); |
dadaista | 0:14e5e829dffe | 263 | return retval; |
dadaista | 0:14e5e829dffe | 264 | } |
dadaista | 0:14e5e829dffe | 265 | |
dadaista | 0:14e5e829dffe | 266 | plat_putByte('{'); |
dadaista | 0:14e5e829dffe | 267 | |
dadaista | 0:14e5e829dffe | 268 | keys = ((pPmDict_t)pdict)->d_keys; |
dadaista | 0:14e5e829dffe | 269 | vals = ((pPmDict_t)pdict)->d_vals; |
dadaista | 0:14e5e829dffe | 270 | |
dadaista | 0:14e5e829dffe | 271 | /* if dict is empty, raise KeyError */ |
dadaista | 0:14e5e829dffe | 272 | for (index = 0; index < ((pPmDict_t)pdict)->length; index++) |
dadaista | 0:14e5e829dffe | 273 | { |
dadaista | 0:14e5e829dffe | 274 | if (index != 0) |
dadaista | 0:14e5e829dffe | 275 | { |
dadaista | 0:14e5e829dffe | 276 | plat_putByte(','); |
dadaista | 0:14e5e829dffe | 277 | plat_putByte(' '); |
dadaista | 0:14e5e829dffe | 278 | } |
dadaista | 0:14e5e829dffe | 279 | retval = seglist_getItem(keys, index, &pobj1); |
dadaista | 0:14e5e829dffe | 280 | PM_RETURN_IF_ERROR(retval); |
dadaista | 0:14e5e829dffe | 281 | retval = obj_print(pobj1, 1); |
dadaista | 0:14e5e829dffe | 282 | PM_RETURN_IF_ERROR(retval); |
dadaista | 0:14e5e829dffe | 283 | |
dadaista | 0:14e5e829dffe | 284 | plat_putByte(':'); |
dadaista | 0:14e5e829dffe | 285 | retval = seglist_getItem(vals, index, &pobj1); |
dadaista | 0:14e5e829dffe | 286 | PM_RETURN_IF_ERROR(retval); |
dadaista | 0:14e5e829dffe | 287 | retval = obj_print(pobj1, 1); |
dadaista | 0:14e5e829dffe | 288 | PM_RETURN_IF_ERROR(retval); |
dadaista | 0:14e5e829dffe | 289 | } |
dadaista | 0:14e5e829dffe | 290 | |
dadaista | 0:14e5e829dffe | 291 | return plat_putByte('}'); |
dadaista | 0:14e5e829dffe | 292 | } |
dadaista | 0:14e5e829dffe | 293 | #endif /* HAVE_PRINT */ |
dadaista | 0:14e5e829dffe | 294 | |
dadaista | 0:14e5e829dffe | 295 | PmReturn_t |
dadaista | 0:14e5e829dffe | 296 | dict_update(pPmObj_t pdestdict, pPmObj_t psourcedict) |
dadaista | 0:14e5e829dffe | 297 | { |
dadaista | 0:14e5e829dffe | 298 | PmReturn_t retval = PM_RET_OK; |
dadaista | 0:14e5e829dffe | 299 | int16_t i; |
dadaista | 0:14e5e829dffe | 300 | pPmObj_t pkey; |
dadaista | 0:14e5e829dffe | 301 | pPmObj_t pval; |
dadaista | 0:14e5e829dffe | 302 | |
dadaista | 0:14e5e829dffe | 303 | C_ASSERT(pdestdict != C_NULL); |
dadaista | 0:14e5e829dffe | 304 | C_ASSERT(psourcedict != C_NULL); |
dadaista | 0:14e5e829dffe | 305 | |
dadaista | 0:14e5e829dffe | 306 | /* If it's not a dict, raise TypeError */ |
dadaista | 0:14e5e829dffe | 307 | if (OBJ_GET_TYPE(pdestdict) != OBJ_TYPE_DIC) |
dadaista | 0:14e5e829dffe | 308 | { |
dadaista | 0:14e5e829dffe | 309 | PM_RAISE(retval, PM_RET_EX_TYPE); |
dadaista | 0:14e5e829dffe | 310 | return retval; |
dadaista | 0:14e5e829dffe | 311 | } |
dadaista | 0:14e5e829dffe | 312 | |
dadaista | 0:14e5e829dffe | 313 | /* If it's not a dict, raise TypeError */ |
dadaista | 0:14e5e829dffe | 314 | if (OBJ_GET_TYPE(psourcedict) != OBJ_TYPE_DIC) |
dadaista | 0:14e5e829dffe | 315 | { |
dadaista | 0:14e5e829dffe | 316 | PM_RAISE(retval, PM_RET_EX_TYPE); |
dadaista | 0:14e5e829dffe | 317 | return retval; |
dadaista | 0:14e5e829dffe | 318 | } |
dadaista | 0:14e5e829dffe | 319 | |
dadaista | 0:14e5e829dffe | 320 | /* Iterate over the add-on dict */ |
dadaista | 0:14e5e829dffe | 321 | for (i = 0; i < ((pPmDict_t)psourcedict)->length; i++) |
dadaista | 0:14e5e829dffe | 322 | { |
dadaista | 0:14e5e829dffe | 323 | /* Get the key,val from the add-on dict */ |
dadaista | 0:14e5e829dffe | 324 | retval = seglist_getItem(((pPmDict_t)psourcedict)->d_keys, i, &pkey); |
dadaista | 0:14e5e829dffe | 325 | PM_RETURN_IF_ERROR(retval); |
dadaista | 0:14e5e829dffe | 326 | retval = seglist_getItem(((pPmDict_t)psourcedict)->d_vals, i, &pval); |
dadaista | 0:14e5e829dffe | 327 | PM_RETURN_IF_ERROR(retval); |
dadaista | 0:14e5e829dffe | 328 | |
dadaista | 0:14e5e829dffe | 329 | /* Set the key,val to the destination dict */ |
dadaista | 0:14e5e829dffe | 330 | retval = dict_setItem(pdestdict, pkey, pval); |
dadaista | 0:14e5e829dffe | 331 | PM_RETURN_IF_ERROR(retval); |
dadaista | 0:14e5e829dffe | 332 | } |
dadaista | 0:14e5e829dffe | 333 | |
dadaista | 0:14e5e829dffe | 334 | return retval; |
dadaista | 0:14e5e829dffe | 335 | } |