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/bytearray.c@1:979fdbf19fdf, 2010-07-26 (annotated)
- Committer:
- dadaista
- Date:
- Mon Jul 26 15:33:32 2010 +0000
- Revision:
- 1:979fdbf19fdf
- Parent:
- 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 2010 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__ 0x19 |
| dadaista | 0:14e5e829dffe | 18 | |
| dadaista | 0:14e5e829dffe | 19 | |
| dadaista | 0:14e5e829dffe | 20 | /** |
| dadaista | 0:14e5e829dffe | 21 | * \file |
| dadaista | 0:14e5e829dffe | 22 | * \brief VM Bytearray Type |
| dadaista | 0:14e5e829dffe | 23 | * |
| dadaista | 0:14e5e829dffe | 24 | * VM Bytearray object type operations. |
| dadaista | 0:14e5e829dffe | 25 | */ |
| dadaista | 0:14e5e829dffe | 26 | |
| dadaista | 0:14e5e829dffe | 27 | #include "pm.h" |
| dadaista | 0:14e5e829dffe | 28 | #ifdef HAVE_BYTEARRAY |
| dadaista | 0:14e5e829dffe | 29 | |
| dadaista | 0:14e5e829dffe | 30 | |
| dadaista | 0:14e5e829dffe | 31 | #define ROUND_UP_TO_MUL_OF_FOUR(n) n = (((n) + 3) & ~3) |
| dadaista | 0:14e5e829dffe | 32 | |
| dadaista | 0:14e5e829dffe | 33 | |
| dadaista | 0:14e5e829dffe | 34 | /* Returns a container that can hold at least n bytes */ |
| dadaista | 0:14e5e829dffe | 35 | static |
| dadaista | 0:14e5e829dffe | 36 | PmReturn_t |
| dadaista | 0:14e5e829dffe | 37 | bytes_new(int16_t n, pPmObj_t *r_pobj) |
| dadaista | 0:14e5e829dffe | 38 | { |
| dadaista | 0:14e5e829dffe | 39 | PmReturn_t retval = PM_RET_OK; |
| dadaista | 0:14e5e829dffe | 40 | pPmBytes_t pb = C_NULL; |
| dadaista | 0:14e5e829dffe | 41 | |
| dadaista | 0:14e5e829dffe | 42 | ROUND_UP_TO_MUL_OF_FOUR(n); |
| dadaista | 0:14e5e829dffe | 43 | |
| dadaista | 0:14e5e829dffe | 44 | /* Allocate a container */ |
| dadaista | 0:14e5e829dffe | 45 | retval = heap_getChunk(sizeof(PmBytes_t) + n, (uint8_t **)&pb); |
| dadaista | 0:14e5e829dffe | 46 | PM_RETURN_IF_ERROR(retval); |
| dadaista | 0:14e5e829dffe | 47 | OBJ_SET_TYPE(pb, OBJ_TYPE_BYS); |
| dadaista | 0:14e5e829dffe | 48 | pb->length = n; |
| dadaista | 0:14e5e829dffe | 49 | |
| dadaista | 0:14e5e829dffe | 50 | *r_pobj = (pPmObj_t)pb; |
| dadaista | 0:14e5e829dffe | 51 | return retval; |
| dadaista | 0:14e5e829dffe | 52 | } |
| dadaista | 0:14e5e829dffe | 53 | |
| dadaista | 0:14e5e829dffe | 54 | |
| dadaista | 0:14e5e829dffe | 55 | /* Returns the int or one-char string as a byte */ |
| dadaista | 0:14e5e829dffe | 56 | static |
| dadaista | 0:14e5e829dffe | 57 | PmReturn_t |
| dadaista | 0:14e5e829dffe | 58 | bytes_getByteFromObj(pPmObj_t pobj, uint8_t *b) |
| dadaista | 0:14e5e829dffe | 59 | { |
| dadaista | 0:14e5e829dffe | 60 | PmReturn_t retval = PM_RET_OK; |
| dadaista | 0:14e5e829dffe | 61 | |
| dadaista | 0:14e5e829dffe | 62 | if (OBJ_GET_TYPE(pobj) == OBJ_TYPE_INT) |
| dadaista | 0:14e5e829dffe | 63 | { |
| dadaista | 0:14e5e829dffe | 64 | if ((((pPmInt_t)pobj)->val > 255) || (((pPmInt_t)pobj)->val < 0)) |
| dadaista | 0:14e5e829dffe | 65 | { |
| dadaista | 0:14e5e829dffe | 66 | PM_RAISE(retval, PM_RET_EX_VAL); |
| dadaista | 0:14e5e829dffe | 67 | return retval; |
| dadaista | 0:14e5e829dffe | 68 | } |
| dadaista | 0:14e5e829dffe | 69 | |
| dadaista | 0:14e5e829dffe | 70 | *b = (uint8_t)((pPmInt_t)pobj)->val; |
| dadaista | 0:14e5e829dffe | 71 | } |
| dadaista | 0:14e5e829dffe | 72 | |
| dadaista | 0:14e5e829dffe | 73 | else if (OBJ_GET_TYPE(pobj) == OBJ_TYPE_STR) |
| dadaista | 0:14e5e829dffe | 74 | { |
| dadaista | 0:14e5e829dffe | 75 | if (((pPmString_t)pobj)->length != 1) |
| dadaista | 0:14e5e829dffe | 76 | { |
| dadaista | 0:14e5e829dffe | 77 | PM_RAISE(retval, PM_RET_EX_VAL); |
| dadaista | 0:14e5e829dffe | 78 | return retval; |
| dadaista | 0:14e5e829dffe | 79 | } |
| dadaista | 0:14e5e829dffe | 80 | *b = ((pPmString_t)pobj)->val[0]; |
| dadaista | 0:14e5e829dffe | 81 | } |
| dadaista | 0:14e5e829dffe | 82 | |
| dadaista | 0:14e5e829dffe | 83 | else |
| dadaista | 0:14e5e829dffe | 84 | { |
| dadaista | 0:14e5e829dffe | 85 | PM_RAISE(retval, PM_RET_EX_TYPE); |
| dadaista | 0:14e5e829dffe | 86 | } |
| dadaista | 0:14e5e829dffe | 87 | return retval; |
| dadaista | 0:14e5e829dffe | 88 | } |
| dadaista | 0:14e5e829dffe | 89 | |
| dadaista | 0:14e5e829dffe | 90 | |
| dadaista | 0:14e5e829dffe | 91 | PmReturn_t |
| dadaista | 0:14e5e829dffe | 92 | bytearray_new(pPmObj_t pobj, pPmObj_t *r_pobj) |
| dadaista | 0:14e5e829dffe | 93 | { |
| dadaista | 0:14e5e829dffe | 94 | PmReturn_t retval = PM_RET_OK; |
| dadaista | 0:14e5e829dffe | 95 | pPmBytearray_t pba = C_NULL; |
| dadaista | 0:14e5e829dffe | 96 | pPmBytes_t pb = C_NULL; |
| dadaista | 0:14e5e829dffe | 97 | pPmObj_t pitem; |
| dadaista | 0:14e5e829dffe | 98 | int32_t i; |
| dadaista | 0:14e5e829dffe | 99 | int16_t n; |
| dadaista | 0:14e5e829dffe | 100 | uint8_t b; |
| dadaista | 0:14e5e829dffe | 101 | |
| dadaista | 0:14e5e829dffe | 102 | /* If object is an instance, get the thing it is containing */ |
| dadaista | 0:14e5e829dffe | 103 | if (OBJ_GET_TYPE(pobj) == OBJ_TYPE_CLI) |
| dadaista | 0:14e5e829dffe | 104 | { |
| dadaista | 0:14e5e829dffe | 105 | retval = dict_getItem((pPmObj_t)((pPmInstance_t)pobj)->cli_attrs, |
| dadaista | 0:14e5e829dffe | 106 | PM_NONE, |
| dadaista | 0:14e5e829dffe | 107 | (pPmObj_t *)&pba); |
| dadaista | 0:14e5e829dffe | 108 | PM_RETURN_IF_ERROR(retval); |
| dadaista | 0:14e5e829dffe | 109 | pobj = (pPmObj_t)pba; |
| dadaista | 0:14e5e829dffe | 110 | } |
| dadaista | 0:14e5e829dffe | 111 | |
| dadaista | 0:14e5e829dffe | 112 | /* Get the requested length of the new bytearray */ |
| dadaista | 0:14e5e829dffe | 113 | switch (OBJ_GET_TYPE(pobj)) |
| dadaista | 0:14e5e829dffe | 114 | { |
| dadaista | 0:14e5e829dffe | 115 | case OBJ_TYPE_INT: |
| dadaista | 0:14e5e829dffe | 116 | i = ((pPmInt_t)pobj)->val; |
| dadaista | 0:14e5e829dffe | 117 | if ((i < 0) || (i > 65535)) |
| dadaista | 0:14e5e829dffe | 118 | { |
| dadaista | 0:14e5e829dffe | 119 | PM_RAISE(retval, PM_RET_EX_VAL); |
| dadaista | 0:14e5e829dffe | 120 | return retval; |
| dadaista | 0:14e5e829dffe | 121 | } |
| dadaista | 0:14e5e829dffe | 122 | n = i; |
| dadaista | 0:14e5e829dffe | 123 | break; |
| dadaista | 0:14e5e829dffe | 124 | |
| dadaista | 0:14e5e829dffe | 125 | case OBJ_TYPE_STR: |
| dadaista | 0:14e5e829dffe | 126 | n = ((pPmString_t)pobj)->length; |
| dadaista | 0:14e5e829dffe | 127 | break; |
| dadaista | 0:14e5e829dffe | 128 | |
| dadaista | 0:14e5e829dffe | 129 | case OBJ_TYPE_LST: |
| dadaista | 0:14e5e829dffe | 130 | n = ((pPmList_t)pobj)->length; |
| dadaista | 0:14e5e829dffe | 131 | break; |
| dadaista | 0:14e5e829dffe | 132 | |
| dadaista | 0:14e5e829dffe | 133 | case OBJ_TYPE_TUP: |
| dadaista | 0:14e5e829dffe | 134 | n = ((pPmTuple_t)pobj)->length; |
| dadaista | 0:14e5e829dffe | 135 | break; |
| dadaista | 0:14e5e829dffe | 136 | |
| dadaista | 0:14e5e829dffe | 137 | case OBJ_TYPE_BYA: |
| dadaista | 0:14e5e829dffe | 138 | n = ((pPmBytearray_t)pobj)->length; |
| dadaista | 0:14e5e829dffe | 139 | break; |
| dadaista | 0:14e5e829dffe | 140 | |
| dadaista | 0:14e5e829dffe | 141 | default: |
| dadaista | 0:14e5e829dffe | 142 | PM_RAISE(retval, PM_RET_EX_TYPE); |
| dadaista | 0:14e5e829dffe | 143 | return retval; |
| dadaista | 0:14e5e829dffe | 144 | } |
| dadaista | 0:14e5e829dffe | 145 | |
| dadaista | 0:14e5e829dffe | 146 | /* Allocate a bytearray */ |
| dadaista | 0:14e5e829dffe | 147 | retval = heap_getChunk(sizeof(PmBytearray_t), (uint8_t **)&pba); |
| dadaista | 0:14e5e829dffe | 148 | PM_RETURN_IF_ERROR(retval); |
| dadaista | 0:14e5e829dffe | 149 | OBJ_SET_TYPE(pba, OBJ_TYPE_BYA); |
| dadaista | 0:14e5e829dffe | 150 | pba->length = n; |
| dadaista | 0:14e5e829dffe | 151 | |
| dadaista | 0:14e5e829dffe | 152 | /* Allocate the bytes container */ |
| dadaista | 0:14e5e829dffe | 153 | retval = bytes_new(n, (pPmObj_t *)&pb); |
| dadaista | 0:14e5e829dffe | 154 | PM_RETURN_IF_ERROR(retval); |
| dadaista | 0:14e5e829dffe | 155 | pba->val = pb; |
| dadaista | 0:14e5e829dffe | 156 | |
| dadaista | 0:14e5e829dffe | 157 | /* Fill the bytes */ |
| dadaista | 0:14e5e829dffe | 158 | switch (OBJ_GET_TYPE(pobj)) |
| dadaista | 0:14e5e829dffe | 159 | { |
| dadaista | 0:14e5e829dffe | 160 | case OBJ_TYPE_INT: |
| dadaista | 0:14e5e829dffe | 161 | sli_memset((unsigned char *)&(pb->val), '\0', n); |
| dadaista | 0:14e5e829dffe | 162 | break; |
| dadaista | 0:14e5e829dffe | 163 | |
| dadaista | 0:14e5e829dffe | 164 | case OBJ_TYPE_BYA: |
| dadaista | 0:14e5e829dffe | 165 | pitem = (pPmObj_t)((pPmBytearray_t)pobj)->val; |
| dadaista | 0:14e5e829dffe | 166 | sli_memcpy(&(pb->val[0]), &(((pPmBytes_t)pitem)->val[0]), n); |
| dadaista | 0:14e5e829dffe | 167 | break; |
| dadaista | 0:14e5e829dffe | 168 | |
| dadaista | 0:14e5e829dffe | 169 | case OBJ_TYPE_STR: |
| dadaista | 0:14e5e829dffe | 170 | sli_memcpy(&(pb->val[0]), &(((pPmString_t)pobj)->val[0]), n); |
| dadaista | 0:14e5e829dffe | 171 | break; |
| dadaista | 0:14e5e829dffe | 172 | |
| dadaista | 0:14e5e829dffe | 173 | case OBJ_TYPE_LST: |
| dadaista | 0:14e5e829dffe | 174 | case OBJ_TYPE_TUP: |
| dadaista | 0:14e5e829dffe | 175 | for (i = 0; i < n; i++) |
| dadaista | 0:14e5e829dffe | 176 | { |
| dadaista | 0:14e5e829dffe | 177 | retval = seq_getSubscript(pobj, i, &pitem); |
| dadaista | 0:14e5e829dffe | 178 | PM_RETURN_IF_ERROR(retval); |
| dadaista | 0:14e5e829dffe | 179 | retval = bytes_getByteFromObj(pitem, &b); |
| dadaista | 0:14e5e829dffe | 180 | PM_RETURN_IF_ERROR(retval); |
| dadaista | 0:14e5e829dffe | 181 | pb->val[i] = b; |
| dadaista | 0:14e5e829dffe | 182 | } |
| dadaista | 0:14e5e829dffe | 183 | break; |
| dadaista | 0:14e5e829dffe | 184 | } |
| dadaista | 0:14e5e829dffe | 185 | |
| dadaista | 0:14e5e829dffe | 186 | *r_pobj = (pPmObj_t)pba; |
| dadaista | 0:14e5e829dffe | 187 | return retval; |
| dadaista | 0:14e5e829dffe | 188 | } |
| dadaista | 0:14e5e829dffe | 189 | |
| dadaista | 0:14e5e829dffe | 190 | |
| dadaista | 0:14e5e829dffe | 191 | PmReturn_t |
| dadaista | 0:14e5e829dffe | 192 | bytearray_getItem(pPmObj_t pobj, int16_t index, pPmObj_t *r_pobj) |
| dadaista | 0:14e5e829dffe | 193 | { |
| dadaista | 0:14e5e829dffe | 194 | PmReturn_t retval = PM_RET_OK; |
| dadaista | 0:14e5e829dffe | 195 | pPmBytearray_t pba; |
| dadaista | 0:14e5e829dffe | 196 | pPmBytes_t pb; |
| dadaista | 0:14e5e829dffe | 197 | int32_t n; |
| dadaista | 0:14e5e829dffe | 198 | |
| dadaista | 0:14e5e829dffe | 199 | pba = (pPmBytearray_t)pobj; |
| dadaista | 0:14e5e829dffe | 200 | |
| dadaista | 0:14e5e829dffe | 201 | /* Adjust a negative index */ |
| dadaista | 0:14e5e829dffe | 202 | if (index < 0) |
| dadaista | 0:14e5e829dffe | 203 | { |
| dadaista | 0:14e5e829dffe | 204 | index += pba->length; |
| dadaista | 0:14e5e829dffe | 205 | } |
| dadaista | 0:14e5e829dffe | 206 | |
| dadaista | 0:14e5e829dffe | 207 | /* Check the bounds of the index */ |
| dadaista | 0:14e5e829dffe | 208 | if ((index < 0) || (index >= pba->length)) |
| dadaista | 0:14e5e829dffe | 209 | { |
| dadaista | 0:14e5e829dffe | 210 | PM_RAISE(retval, PM_RET_EX_INDX); |
| dadaista | 0:14e5e829dffe | 211 | return retval; |
| dadaista | 0:14e5e829dffe | 212 | } |
| dadaista | 0:14e5e829dffe | 213 | |
| dadaista | 0:14e5e829dffe | 214 | /* Create int from byte at index */ |
| dadaista | 0:14e5e829dffe | 215 | pb = pba->val; |
| dadaista | 0:14e5e829dffe | 216 | n = (int32_t)pb->val[index]; |
| dadaista | 0:14e5e829dffe | 217 | retval = int_new(n, r_pobj); |
| dadaista | 0:14e5e829dffe | 218 | |
| dadaista | 0:14e5e829dffe | 219 | return retval; |
| dadaista | 0:14e5e829dffe | 220 | } |
| dadaista | 0:14e5e829dffe | 221 | |
| dadaista | 0:14e5e829dffe | 222 | |
| dadaista | 0:14e5e829dffe | 223 | PmReturn_t |
| dadaista | 0:14e5e829dffe | 224 | bytearray_setItem(pPmObj_t pba, int16_t index, pPmObj_t pobj) |
| dadaista | 0:14e5e829dffe | 225 | { |
| dadaista | 0:14e5e829dffe | 226 | PmReturn_t retval; |
| dadaista | 0:14e5e829dffe | 227 | pPmBytes_t pb; |
| dadaista | 0:14e5e829dffe | 228 | uint8_t b = 0; |
| dadaista | 0:14e5e829dffe | 229 | |
| dadaista | 0:14e5e829dffe | 230 | /* Adjust a negative index */ |
| dadaista | 0:14e5e829dffe | 231 | if (index < 0) |
| dadaista | 0:14e5e829dffe | 232 | { |
| dadaista | 0:14e5e829dffe | 233 | index += ((pPmBytearray_t)pba)->length; |
| dadaista | 0:14e5e829dffe | 234 | } |
| dadaista | 0:14e5e829dffe | 235 | |
| dadaista | 0:14e5e829dffe | 236 | /* Check the bounds of the index */ |
| dadaista | 0:14e5e829dffe | 237 | if ((index < 0) || (index >= ((pPmBytearray_t)pba)->length)) |
| dadaista | 0:14e5e829dffe | 238 | { |
| dadaista | 0:14e5e829dffe | 239 | PM_RAISE(retval, PM_RET_EX_INDX); |
| dadaista | 0:14e5e829dffe | 240 | return retval; |
| dadaista | 0:14e5e829dffe | 241 | } |
| dadaista | 0:14e5e829dffe | 242 | |
| dadaista | 0:14e5e829dffe | 243 | /* Set the item */ |
| dadaista | 0:14e5e829dffe | 244 | retval = bytes_getByteFromObj(pobj, &b); |
| dadaista | 0:14e5e829dffe | 245 | pb = ((pPmBytearray_t)pba)->val; |
| dadaista | 0:14e5e829dffe | 246 | pb->val[index] = b; |
| dadaista | 0:14e5e829dffe | 247 | |
| dadaista | 0:14e5e829dffe | 248 | return retval; |
| dadaista | 0:14e5e829dffe | 249 | } |
| dadaista | 0:14e5e829dffe | 250 | |
| dadaista | 0:14e5e829dffe | 251 | |
| dadaista | 0:14e5e829dffe | 252 | PmReturn_t |
| dadaista | 0:14e5e829dffe | 253 | bytearray_print(pPmObj_t pobj) |
| dadaista | 0:14e5e829dffe | 254 | { |
| dadaista | 0:14e5e829dffe | 255 | PmReturn_t retval; |
| dadaista | 0:14e5e829dffe | 256 | pPmBytes_t pb; |
| dadaista | 0:14e5e829dffe | 257 | uint8_t pclassname[] = "bytearray"; |
| dadaista | 0:14e5e829dffe | 258 | uint8_t *pc; |
| dadaista | 0:14e5e829dffe | 259 | |
| dadaista | 0:14e5e829dffe | 260 | pb = ((pPmBytearray_t)pobj)->val; |
| dadaista | 0:14e5e829dffe | 261 | |
| dadaista | 0:14e5e829dffe | 262 | pc = &pclassname[0]; |
| dadaista | 0:14e5e829dffe | 263 | while (*pc != C_NULL) |
| dadaista | 0:14e5e829dffe | 264 | { |
| dadaista | 0:14e5e829dffe | 265 | plat_putByte(*pc); |
| dadaista | 0:14e5e829dffe | 266 | pc++; |
| dadaista | 0:14e5e829dffe | 267 | } |
| dadaista | 0:14e5e829dffe | 268 | |
| dadaista | 0:14e5e829dffe | 269 | plat_putByte('('); |
| dadaista | 0:14e5e829dffe | 270 | plat_putByte('b'); |
| dadaista | 0:14e5e829dffe | 271 | retval = string_printFormattedBytes(&(pb->val[0]), |
| dadaista | 0:14e5e829dffe | 272 | C_TRUE, |
| dadaista | 0:14e5e829dffe | 273 | ((pPmBytearray_t)pobj)->length); |
| dadaista | 0:14e5e829dffe | 274 | plat_putByte(')'); |
| dadaista | 0:14e5e829dffe | 275 | return retval; |
| dadaista | 0:14e5e829dffe | 276 | } |
| dadaista | 0:14e5e829dffe | 277 | #endif /* HAVE_BYTEARRAY */ |