davide carboni / Mbed 2 deprecated pymite_http_get

Dependencies:   mbed

Committer:
dadaista
Date:
Wed Jul 21 12:50:41 2010 +0000
Revision:
0:14e5e829dffe

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }