davide carboni / Mbed 2 deprecated pymite_http_get

Dependencies:   mbed

Committer:
dadaista
Date:
Mon Jul 26 15:33:32 2010 +0000
Revision:
1:979fdbf19fdf
Parent:
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 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 */