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__ 0x0F
dadaista 0:14e5e829dffe 18
dadaista 0:14e5e829dffe 19
dadaista 0:14e5e829dffe 20 /**
dadaista 0:14e5e829dffe 21 * \file
dadaista 0:14e5e829dffe 22 * \brief Object Type
dadaista 0:14e5e829dffe 23 *
dadaista 0:14e5e829dffe 24 * 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 obj_loadFromImg(PmMemSpace_t memspace,
dadaista 0:14e5e829dffe 33 uint8_t const **paddr, pPmObj_t *r_pobj)
dadaista 0:14e5e829dffe 34 {
dadaista 0:14e5e829dffe 35 PmReturn_t retval = PM_RET_OK;
dadaista 0:14e5e829dffe 36 PmObj_t obj;
dadaista 0:14e5e829dffe 37
dadaista 0:14e5e829dffe 38
dadaista 0:14e5e829dffe 39 /* Get the object descriptor */
dadaista 0:14e5e829dffe 40 obj.od = (PmObjDesc_t)0x0000;
dadaista 0:14e5e829dffe 41 OBJ_SET_TYPE(&obj, mem_getByte(memspace, paddr));
dadaista 0:14e5e829dffe 42
dadaista 0:14e5e829dffe 43 switch (OBJ_GET_TYPE(&obj))
dadaista 0:14e5e829dffe 44 {
dadaista 0:14e5e829dffe 45 case OBJ_TYPE_NON:
dadaista 0:14e5e829dffe 46 /* If it's the None object, return global None */
dadaista 0:14e5e829dffe 47 *r_pobj = PM_NONE;
dadaista 0:14e5e829dffe 48 break;
dadaista 0:14e5e829dffe 49
dadaista 0:14e5e829dffe 50 case OBJ_TYPE_INT:
dadaista 0:14e5e829dffe 51 /* Read an integer and create an integer object with the value */
dadaista 0:14e5e829dffe 52 retval = int_new(mem_getInt(memspace, paddr), r_pobj);
dadaista 0:14e5e829dffe 53 break;
dadaista 0:14e5e829dffe 54
dadaista 0:14e5e829dffe 55 #ifdef HAVE_FLOAT
dadaista 0:14e5e829dffe 56 case OBJ_TYPE_FLT:
dadaista 0:14e5e829dffe 57 /* Read a float and create an float object with the value */
dadaista 0:14e5e829dffe 58 retval = float_new(mem_getFloat(memspace, paddr), r_pobj);
dadaista 0:14e5e829dffe 59 break;
dadaista 0:14e5e829dffe 60 #endif /* HAVE_FLOAT */
dadaista 0:14e5e829dffe 61
dadaista 0:14e5e829dffe 62 case OBJ_TYPE_STR:
dadaista 0:14e5e829dffe 63 retval = string_loadFromImg(memspace, paddr, r_pobj);
dadaista 0:14e5e829dffe 64 break;
dadaista 0:14e5e829dffe 65
dadaista 0:14e5e829dffe 66 case OBJ_TYPE_TUP:
dadaista 0:14e5e829dffe 67 retval = tuple_loadFromImg(memspace, paddr, r_pobj);
dadaista 0:14e5e829dffe 68 break;
dadaista 0:14e5e829dffe 69
dadaista 0:14e5e829dffe 70 case OBJ_TYPE_NIM:
dadaista 0:14e5e829dffe 71 /* If it's a native code img, load into a code obj */
dadaista 0:14e5e829dffe 72 retval = no_loadFromImg(memspace, paddr, r_pobj);
dadaista 0:14e5e829dffe 73 break;
dadaista 0:14e5e829dffe 74
dadaista 0:14e5e829dffe 75 case OBJ_TYPE_CIM:
dadaista 0:14e5e829dffe 76 /* If it's a code img, load into a code obj */
dadaista 0:14e5e829dffe 77 retval = co_loadFromImg(memspace, paddr, r_pobj);
dadaista 0:14e5e829dffe 78 break;
dadaista 0:14e5e829dffe 79
dadaista 0:14e5e829dffe 80 default:
dadaista 0:14e5e829dffe 81 /* All other types should not be in an img obj */
dadaista 0:14e5e829dffe 82 PM_RAISE(retval, PM_RET_EX_SYS);
dadaista 0:14e5e829dffe 83 break;
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 PmReturn_t
dadaista 0:14e5e829dffe 90 obj_loadFromImgObj(pPmObj_t pimg, pPmObj_t *r_pobj)
dadaista 0:14e5e829dffe 91 {
dadaista 0:14e5e829dffe 92 uint8_t const *imgaddr;
dadaista 0:14e5e829dffe 93 PmReturn_t retval;
dadaista 0:14e5e829dffe 94
dadaista 0:14e5e829dffe 95 C_ASSERT(OBJ_GET_TYPE(pimg) == OBJ_TYPE_CIO);
dadaista 0:14e5e829dffe 96 imgaddr = (uint8_t const *)&(((pPmCodeImgObj_t)pimg)->val);
dadaista 0:14e5e829dffe 97
dadaista 0:14e5e829dffe 98 retval = obj_loadFromImg(MEMSPACE_RAM, &imgaddr, r_pobj);
dadaista 0:14e5e829dffe 99 C_ASSERT(OBJ_GET_TYPE(*r_pobj) == OBJ_TYPE_COB);
dadaista 0:14e5e829dffe 100
dadaista 0:14e5e829dffe 101 /* The CO must reference the top of the code img obj */
dadaista 0:14e5e829dffe 102 ((pPmCo_t)*r_pobj)->co_codeimgaddr = (uint8_t const *)pimg;
dadaista 0:14e5e829dffe 103
dadaista 0:14e5e829dffe 104 return retval;
dadaista 0:14e5e829dffe 105 }
dadaista 0:14e5e829dffe 106
dadaista 0:14e5e829dffe 107
dadaista 0:14e5e829dffe 108 /* Returns true if the obj is false */
dadaista 0:14e5e829dffe 109 int8_t
dadaista 0:14e5e829dffe 110 obj_isFalse(pPmObj_t pobj)
dadaista 0:14e5e829dffe 111 {
dadaista 0:14e5e829dffe 112 C_ASSERT(pobj != C_NULL);
dadaista 0:14e5e829dffe 113
dadaista 0:14e5e829dffe 114 switch (OBJ_GET_TYPE(pobj))
dadaista 0:14e5e829dffe 115 {
dadaista 0:14e5e829dffe 116 case OBJ_TYPE_NON:
dadaista 0:14e5e829dffe 117 /* None evaluates to false, so return true */
dadaista 0:14e5e829dffe 118 return C_TRUE;
dadaista 0:14e5e829dffe 119
dadaista 0:14e5e829dffe 120 case OBJ_TYPE_INT:
dadaista 0:14e5e829dffe 121 /* Only the integer zero is false */
dadaista 0:14e5e829dffe 122 return ((pPmInt_t)pobj)->val == 0;
dadaista 0:14e5e829dffe 123
dadaista 0:14e5e829dffe 124 #ifdef HAVE_FLOAT
dadaista 0:14e5e829dffe 125 case OBJ_TYPE_FLT:
dadaista 0:14e5e829dffe 126 /* The floats 0.0 and -0.0 are false */
dadaista 0:14e5e829dffe 127 return (((pPmFloat_t) pobj)->val == 0.0)
dadaista 0:14e5e829dffe 128 || (((pPmFloat_t) pobj)->val == -0.0);
dadaista 0:14e5e829dffe 129 #endif /* HAVE_FLOAT */
dadaista 0:14e5e829dffe 130
dadaista 0:14e5e829dffe 131 case OBJ_TYPE_STR:
dadaista 0:14e5e829dffe 132 /* An empty string is false */
dadaista 0:14e5e829dffe 133 return ((pPmString_t)pobj)->length == 0;
dadaista 0:14e5e829dffe 134
dadaista 0:14e5e829dffe 135 case OBJ_TYPE_TUP:
dadaista 0:14e5e829dffe 136 /* An empty tuple is false */
dadaista 0:14e5e829dffe 137 return ((pPmTuple_t)pobj)->length == 0;
dadaista 0:14e5e829dffe 138
dadaista 0:14e5e829dffe 139 case OBJ_TYPE_LST:
dadaista 0:14e5e829dffe 140 /* An empty list is false */
dadaista 0:14e5e829dffe 141 return ((pPmList_t)pobj)->length == 0;
dadaista 0:14e5e829dffe 142
dadaista 0:14e5e829dffe 143 case OBJ_TYPE_DIC:
dadaista 0:14e5e829dffe 144 /* An empty dict is false */
dadaista 0:14e5e829dffe 145 return ((pPmDict_t)pobj)->length == 0;
dadaista 0:14e5e829dffe 146
dadaista 0:14e5e829dffe 147 case OBJ_TYPE_BOOL:
dadaista 0:14e5e829dffe 148 /* C int zero means false */
dadaista 0:14e5e829dffe 149 return ((pPmBoolean_t) pobj)->val == 0;
dadaista 0:14e5e829dffe 150
dadaista 0:14e5e829dffe 151 default:
dadaista 0:14e5e829dffe 152 /*
dadaista 0:14e5e829dffe 153 * The following types are always not false:
dadaista 0:14e5e829dffe 154 * CodeObj, Function, Module, Class, ClassInstance.
dadaista 0:14e5e829dffe 155 */
dadaista 0:14e5e829dffe 156 return C_FALSE;
dadaista 0:14e5e829dffe 157 }
dadaista 0:14e5e829dffe 158 }
dadaista 0:14e5e829dffe 159
dadaista 0:14e5e829dffe 160
dadaista 0:14e5e829dffe 161 /* Returns true if the item is in the container object */
dadaista 0:14e5e829dffe 162 PmReturn_t
dadaista 0:14e5e829dffe 163 obj_isIn(pPmObj_t pobj, pPmObj_t pitem)
dadaista 0:14e5e829dffe 164 {
dadaista 0:14e5e829dffe 165 PmReturn_t retval = PM_RET_NO;
dadaista 0:14e5e829dffe 166 pPmObj_t ptestItem;
dadaista 0:14e5e829dffe 167 int16_t i;
dadaista 0:14e5e829dffe 168 uint8_t c;
dadaista 0:14e5e829dffe 169
dadaista 0:14e5e829dffe 170 switch (OBJ_GET_TYPE(pobj))
dadaista 0:14e5e829dffe 171 {
dadaista 0:14e5e829dffe 172 case OBJ_TYPE_TUP:
dadaista 0:14e5e829dffe 173 /* Iterate over tuple to find item */
dadaista 0:14e5e829dffe 174 for (i = 0; i < ((pPmTuple_t)pobj)->length; i++)
dadaista 0:14e5e829dffe 175 {
dadaista 0:14e5e829dffe 176 PM_RETURN_IF_ERROR(tuple_getItem(pobj, i, &ptestItem));
dadaista 0:14e5e829dffe 177
dadaista 0:14e5e829dffe 178 if (obj_compare(pitem, ptestItem) == C_SAME)
dadaista 0:14e5e829dffe 179 {
dadaista 0:14e5e829dffe 180 retval = PM_RET_OK;
dadaista 0:14e5e829dffe 181 break;
dadaista 0:14e5e829dffe 182 }
dadaista 0:14e5e829dffe 183 }
dadaista 0:14e5e829dffe 184 break;
dadaista 0:14e5e829dffe 185
dadaista 0:14e5e829dffe 186 case OBJ_TYPE_STR:
dadaista 0:14e5e829dffe 187 /* Raise a TypeError if item is not a string */
dadaista 0:14e5e829dffe 188 if ((OBJ_GET_TYPE(pitem) != OBJ_TYPE_STR))
dadaista 0:14e5e829dffe 189 {
dadaista 0:14e5e829dffe 190 retval = PM_RET_EX_TYPE;
dadaista 0:14e5e829dffe 191 break;
dadaista 0:14e5e829dffe 192 }
dadaista 0:14e5e829dffe 193
dadaista 0:14e5e829dffe 194 /* Empty string is alway present */
dadaista 0:14e5e829dffe 195 if (((pPmString_t)pitem)->length == 0)
dadaista 0:14e5e829dffe 196 {
dadaista 0:14e5e829dffe 197 retval = PM_RET_OK;
dadaista 0:14e5e829dffe 198 break;
dadaista 0:14e5e829dffe 199 }
dadaista 0:14e5e829dffe 200
dadaista 0:14e5e829dffe 201 /* Raise a ValueError if the string is more than 1 char */
dadaista 0:14e5e829dffe 202 else if (((pPmString_t)pitem)->length != 1)
dadaista 0:14e5e829dffe 203 {
dadaista 0:14e5e829dffe 204 retval = PM_RET_EX_VAL;
dadaista 0:14e5e829dffe 205 break;
dadaista 0:14e5e829dffe 206 }
dadaista 0:14e5e829dffe 207
dadaista 0:14e5e829dffe 208 /* Iterate over string to find char */
dadaista 0:14e5e829dffe 209 c = ((pPmString_t)pitem)->val[0];
dadaista 0:14e5e829dffe 210 for (i = 0; i < ((pPmString_t)pobj)->length; i++)
dadaista 0:14e5e829dffe 211 {
dadaista 0:14e5e829dffe 212 if (c == ((pPmString_t)pobj)->val[i])
dadaista 0:14e5e829dffe 213 {
dadaista 0:14e5e829dffe 214 retval = PM_RET_OK;
dadaista 0:14e5e829dffe 215 break;
dadaista 0:14e5e829dffe 216 }
dadaista 0:14e5e829dffe 217 }
dadaista 0:14e5e829dffe 218 break;
dadaista 0:14e5e829dffe 219
dadaista 0:14e5e829dffe 220 case OBJ_TYPE_LST:
dadaista 0:14e5e829dffe 221 /* Iterate over list to find item */
dadaista 0:14e5e829dffe 222 for (i = 0; i < ((pPmList_t)pobj)->length; i++)
dadaista 0:14e5e829dffe 223 {
dadaista 0:14e5e829dffe 224 PM_RETURN_IF_ERROR(list_getItem(pobj, i, &ptestItem));
dadaista 0:14e5e829dffe 225
dadaista 0:14e5e829dffe 226 if (obj_compare(pitem, ptestItem) == C_SAME)
dadaista 0:14e5e829dffe 227 {
dadaista 0:14e5e829dffe 228 retval = PM_RET_OK;
dadaista 0:14e5e829dffe 229 break;
dadaista 0:14e5e829dffe 230 }
dadaista 0:14e5e829dffe 231 }
dadaista 0:14e5e829dffe 232 break;
dadaista 0:14e5e829dffe 233
dadaista 0:14e5e829dffe 234 case OBJ_TYPE_DIC:
dadaista 0:14e5e829dffe 235 /* Check if the item is one of the keys of the dict */
dadaista 0:14e5e829dffe 236 retval = dict_getItem(pobj, pitem, &ptestItem);
dadaista 0:14e5e829dffe 237 if (retval == PM_RET_EX_KEY)
dadaista 0:14e5e829dffe 238 {
dadaista 0:14e5e829dffe 239 retval = PM_RET_NO;
dadaista 0:14e5e829dffe 240 }
dadaista 0:14e5e829dffe 241 break;
dadaista 0:14e5e829dffe 242
dadaista 0:14e5e829dffe 243 default:
dadaista 0:14e5e829dffe 244 retval = PM_RET_EX_TYPE;
dadaista 0:14e5e829dffe 245 break;
dadaista 0:14e5e829dffe 246 }
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 int8_t
dadaista 0:14e5e829dffe 253 obj_compare(pPmObj_t pobj1, pPmObj_t pobj2)
dadaista 0:14e5e829dffe 254 {
dadaista 0:14e5e829dffe 255 #ifdef HAVE_BYTEARRAY
dadaista 0:14e5e829dffe 256 PmReturn_t retval;
dadaista 0:14e5e829dffe 257 pPmObj_t pobj;
dadaista 0:14e5e829dffe 258 #endif /* HAVE_BYTEARRAY */
dadaista 0:14e5e829dffe 259
dadaista 0:14e5e829dffe 260 C_ASSERT(pobj1 != C_NULL);
dadaista 0:14e5e829dffe 261 C_ASSERT(pobj2 != C_NULL);
dadaista 0:14e5e829dffe 262
dadaista 0:14e5e829dffe 263 /* Check if pointers are same */
dadaista 0:14e5e829dffe 264 if (pobj1 == pobj2)
dadaista 0:14e5e829dffe 265 {
dadaista 0:14e5e829dffe 266 return C_SAME;
dadaista 0:14e5e829dffe 267 }
dadaista 0:14e5e829dffe 268
dadaista 0:14e5e829dffe 269 /* If types are different, objs must differ */
dadaista 0:14e5e829dffe 270 if (OBJ_GET_TYPE(pobj1) != OBJ_GET_TYPE(pobj2))
dadaista 0:14e5e829dffe 271 {
dadaista 0:14e5e829dffe 272 return C_DIFFER;
dadaista 0:14e5e829dffe 273 }
dadaista 0:14e5e829dffe 274
dadaista 0:14e5e829dffe 275 #ifdef HAVE_BYTEARRAY
dadaista 0:14e5e829dffe 276 /* If object is an instance, get the thing it contains */
dadaista 0:14e5e829dffe 277 if (OBJ_GET_TYPE(pobj1) == OBJ_TYPE_CLI)
dadaista 0:14e5e829dffe 278 {
dadaista 0:14e5e829dffe 279 retval = dict_getItem((pPmObj_t)((pPmInstance_t)pobj1)->cli_attrs,
dadaista 0:14e5e829dffe 280 PM_NONE,
dadaista 0:14e5e829dffe 281 &pobj);
dadaista 0:14e5e829dffe 282 PM_RETURN_IF_ERROR(retval);
dadaista 0:14e5e829dffe 283 pobj1 = pobj;
dadaista 0:14e5e829dffe 284 }
dadaista 0:14e5e829dffe 285 if (OBJ_GET_TYPE(pobj2) == OBJ_TYPE_CLI)
dadaista 0:14e5e829dffe 286 {
dadaista 0:14e5e829dffe 287 retval = dict_getItem((pPmObj_t)((pPmInstance_t)pobj2)->cli_attrs,
dadaista 0:14e5e829dffe 288 PM_NONE,
dadaista 0:14e5e829dffe 289 &pobj);
dadaista 0:14e5e829dffe 290 PM_RETURN_IF_ERROR(retval);
dadaista 0:14e5e829dffe 291 pobj2 = pobj;
dadaista 0:14e5e829dffe 292 }
dadaista 0:14e5e829dffe 293
dadaista 0:14e5e829dffe 294 /* If types are different, objs must differ */
dadaista 0:14e5e829dffe 295 if (OBJ_GET_TYPE(pobj1) != OBJ_GET_TYPE(pobj2))
dadaista 0:14e5e829dffe 296 {
dadaista 0:14e5e829dffe 297 return C_DIFFER;
dadaista 0:14e5e829dffe 298 }
dadaista 0:14e5e829dffe 299 #endif /* HAVE_BYTEARRAY */
dadaista 0:14e5e829dffe 300
dadaista 0:14e5e829dffe 301 /* Otherwise handle types individually */
dadaista 0:14e5e829dffe 302 switch (OBJ_GET_TYPE(pobj1))
dadaista 0:14e5e829dffe 303 {
dadaista 0:14e5e829dffe 304 case OBJ_TYPE_NON:
dadaista 0:14e5e829dffe 305 return C_SAME;
dadaista 0:14e5e829dffe 306
dadaista 0:14e5e829dffe 307 case OBJ_TYPE_INT:
dadaista 0:14e5e829dffe 308 return ((pPmInt_t)pobj1)->val ==
dadaista 0:14e5e829dffe 309 ((pPmInt_t)pobj2)->val ? C_SAME : C_DIFFER;
dadaista 0:14e5e829dffe 310
dadaista 0:14e5e829dffe 311 #ifdef HAVE_FLOAT
dadaista 0:14e5e829dffe 312 case OBJ_TYPE_FLT:
dadaista 0:14e5e829dffe 313 {
dadaista 0:14e5e829dffe 314 pPmObj_t r_pobj;
dadaista 0:14e5e829dffe 315
dadaista 0:14e5e829dffe 316 float_compare(pobj1, pobj2, &r_pobj, COMP_EQ);
dadaista 0:14e5e829dffe 317 return (r_pobj == PM_TRUE) ? C_SAME : C_DIFFER;
dadaista 0:14e5e829dffe 318 }
dadaista 0:14e5e829dffe 319 #endif /* HAVE_FLOAT */
dadaista 0:14e5e829dffe 320
dadaista 0:14e5e829dffe 321 case OBJ_TYPE_STR:
dadaista 0:14e5e829dffe 322 return string_compare((pPmString_t)pobj1, (pPmString_t)pobj2);
dadaista 0:14e5e829dffe 323
dadaista 0:14e5e829dffe 324 case OBJ_TYPE_TUP:
dadaista 0:14e5e829dffe 325 case OBJ_TYPE_LST:
dadaista 0:14e5e829dffe 326 #ifdef HAVE_BYTEARRAY
dadaista 0:14e5e829dffe 327 case OBJ_TYPE_BYA:
dadaista 0:14e5e829dffe 328 #endif /* HAVE_BYTEARRAY */
dadaista 0:14e5e829dffe 329 return seq_compare(pobj1, pobj2);
dadaista 0:14e5e829dffe 330
dadaista 0:14e5e829dffe 331 case OBJ_TYPE_DIC:
dadaista 0:14e5e829dffe 332 /* #17: PyMite does not support Dict comparisons (yet) */
dadaista 0:14e5e829dffe 333 default:
dadaista 0:14e5e829dffe 334 break;
dadaista 0:14e5e829dffe 335 }
dadaista 0:14e5e829dffe 336
dadaista 0:14e5e829dffe 337 /* All other types would need same pointer to be true */
dadaista 0:14e5e829dffe 338 return C_DIFFER;
dadaista 0:14e5e829dffe 339 }
dadaista 0:14e5e829dffe 340
dadaista 0:14e5e829dffe 341
dadaista 0:14e5e829dffe 342 #ifdef HAVE_PRINT
dadaista 0:14e5e829dffe 343 PmReturn_t
dadaista 0:14e5e829dffe 344 obj_print(pPmObj_t pobj, uint8_t marshallString)
dadaista 0:14e5e829dffe 345 {
dadaista 0:14e5e829dffe 346 PmReturn_t retval = PM_RET_OK;
dadaista 0:14e5e829dffe 347
dadaista 0:14e5e829dffe 348 C_ASSERT(pobj != C_NULL);
dadaista 0:14e5e829dffe 349
dadaista 0:14e5e829dffe 350 switch (OBJ_GET_TYPE(pobj))
dadaista 0:14e5e829dffe 351 {
dadaista 0:14e5e829dffe 352 case OBJ_TYPE_NON:
dadaista 0:14e5e829dffe 353 if (marshallString)
dadaista 0:14e5e829dffe 354 {
dadaista 0:14e5e829dffe 355 plat_putByte('N');
dadaista 0:14e5e829dffe 356 plat_putByte('o');
dadaista 0:14e5e829dffe 357 plat_putByte('n');
dadaista 0:14e5e829dffe 358 retval = plat_putByte('e');
dadaista 0:14e5e829dffe 359 }
dadaista 0:14e5e829dffe 360 break;
dadaista 0:14e5e829dffe 361 case OBJ_TYPE_INT:
dadaista 0:14e5e829dffe 362 retval = int_print(pobj);
dadaista 0:14e5e829dffe 363 break;
dadaista 0:14e5e829dffe 364 #ifdef HAVE_FLOAT
dadaista 0:14e5e829dffe 365 case OBJ_TYPE_FLT:
dadaista 0:14e5e829dffe 366 retval = float_print(pobj);
dadaista 0:14e5e829dffe 367 break;
dadaista 0:14e5e829dffe 368 #endif /* HAVE_FLOAT */
dadaista 0:14e5e829dffe 369 case OBJ_TYPE_STR:
dadaista 0:14e5e829dffe 370 retval = string_print(pobj, marshallString);
dadaista 0:14e5e829dffe 371 break;
dadaista 0:14e5e829dffe 372 case OBJ_TYPE_TUP:
dadaista 0:14e5e829dffe 373 retval = tuple_print(pobj);
dadaista 0:14e5e829dffe 374 break;
dadaista 0:14e5e829dffe 375 case OBJ_TYPE_LST:
dadaista 0:14e5e829dffe 376 retval = list_print(pobj);
dadaista 0:14e5e829dffe 377 break;
dadaista 0:14e5e829dffe 378 case OBJ_TYPE_DIC:
dadaista 0:14e5e829dffe 379 retval = dict_print(pobj);
dadaista 0:14e5e829dffe 380 break;
dadaista 0:14e5e829dffe 381 case OBJ_TYPE_BOOL:
dadaista 0:14e5e829dffe 382 if (((pPmBoolean_t) pobj)->val == C_TRUE)
dadaista 0:14e5e829dffe 383 {
dadaista 0:14e5e829dffe 384 plat_putByte('T');
dadaista 0:14e5e829dffe 385 plat_putByte('r');
dadaista 0:14e5e829dffe 386 plat_putByte('u');
dadaista 0:14e5e829dffe 387 }
dadaista 0:14e5e829dffe 388 else
dadaista 0:14e5e829dffe 389 {
dadaista 0:14e5e829dffe 390 plat_putByte('F');
dadaista 0:14e5e829dffe 391 plat_putByte('a');
dadaista 0:14e5e829dffe 392 plat_putByte('l');
dadaista 0:14e5e829dffe 393 plat_putByte('s');
dadaista 0:14e5e829dffe 394 }
dadaista 0:14e5e829dffe 395 retval = plat_putByte('e');
dadaista 0:14e5e829dffe 396 break;
dadaista 0:14e5e829dffe 397
dadaista 0:14e5e829dffe 398 case OBJ_TYPE_CLI:
dadaista 0:14e5e829dffe 399 #ifdef HAVE_BYTEARRAY
dadaista 0:14e5e829dffe 400 {
dadaista 0:14e5e829dffe 401 pPmObj_t pobj2;
dadaista 0:14e5e829dffe 402
dadaista 0:14e5e829dffe 403 retval = dict_getItem((pPmObj_t)((pPmInstance_t)pobj)->cli_attrs,
dadaista 0:14e5e829dffe 404 PM_NONE,
dadaista 0:14e5e829dffe 405 (pPmObj_t *)&pobj2);
dadaista 0:14e5e829dffe 406 if ((retval == PM_RET_OK)
dadaista 0:14e5e829dffe 407 && (OBJ_GET_TYPE(pobj2) == OBJ_TYPE_BYA))
dadaista 0:14e5e829dffe 408 {
dadaista 0:14e5e829dffe 409 retval = bytearray_print(pobj2);
dadaista 0:14e5e829dffe 410 break;
dadaista 0:14e5e829dffe 411 }
dadaista 0:14e5e829dffe 412 }
dadaista 0:14e5e829dffe 413 #endif /* HAVE_BYTEARRAY */
dadaista 0:14e5e829dffe 414
dadaista 0:14e5e829dffe 415 case OBJ_TYPE_COB:
dadaista 0:14e5e829dffe 416 case OBJ_TYPE_MOD:
dadaista 0:14e5e829dffe 417 case OBJ_TYPE_CLO:
dadaista 0:14e5e829dffe 418 case OBJ_TYPE_FXN:
dadaista 0:14e5e829dffe 419 case OBJ_TYPE_CIM:
dadaista 0:14e5e829dffe 420 case OBJ_TYPE_NIM:
dadaista 0:14e5e829dffe 421 case OBJ_TYPE_NOB:
dadaista 0:14e5e829dffe 422 case OBJ_TYPE_THR:
dadaista 0:14e5e829dffe 423 case OBJ_TYPE_CIO:
dadaista 0:14e5e829dffe 424 case OBJ_TYPE_MTH:
dadaista 0:14e5e829dffe 425 case OBJ_TYPE_SQI:
dadaista 0:14e5e829dffe 426 if (marshallString)
dadaista 0:14e5e829dffe 427 {
dadaista 0:14e5e829dffe 428 retval = plat_putByte('\'');
dadaista 0:14e5e829dffe 429 PM_RETURN_IF_ERROR(retval);
dadaista 0:14e5e829dffe 430 }
dadaista 0:14e5e829dffe 431 plat_putByte('<');
dadaista 0:14e5e829dffe 432 plat_putByte('o');
dadaista 0:14e5e829dffe 433 plat_putByte('b');
dadaista 0:14e5e829dffe 434 plat_putByte('j');
dadaista 0:14e5e829dffe 435 plat_putByte(' ');
dadaista 0:14e5e829dffe 436 plat_putByte('t');
dadaista 0:14e5e829dffe 437 plat_putByte('y');
dadaista 0:14e5e829dffe 438 plat_putByte('p');
dadaista 0:14e5e829dffe 439 plat_putByte('e');
dadaista 0:14e5e829dffe 440 plat_putByte(' ');
dadaista 0:14e5e829dffe 441 plat_putByte('0');
dadaista 0:14e5e829dffe 442 plat_putByte('x');
dadaista 0:14e5e829dffe 443 int_printHexByte(OBJ_GET_TYPE(pobj));
dadaista 0:14e5e829dffe 444 plat_putByte(' ');
dadaista 0:14e5e829dffe 445 plat_putByte('@');
dadaista 0:14e5e829dffe 446 plat_putByte(' ');
dadaista 0:14e5e829dffe 447 plat_putByte('0');
dadaista 0:14e5e829dffe 448 plat_putByte('x');
dadaista 0:14e5e829dffe 449 _int_printHex((intptr_t)pobj);
dadaista 0:14e5e829dffe 450 retval = plat_putByte('>');
dadaista 0:14e5e829dffe 451 if (marshallString)
dadaista 0:14e5e829dffe 452 {
dadaista 0:14e5e829dffe 453 retval = plat_putByte('\'');
dadaista 0:14e5e829dffe 454 }
dadaista 0:14e5e829dffe 455 break;
dadaista 0:14e5e829dffe 456
dadaista 0:14e5e829dffe 457 default:
dadaista 0:14e5e829dffe 458 /* Otherwise raise a TypeError */
dadaista 0:14e5e829dffe 459 PM_RAISE(retval, PM_RET_EX_TYPE);
dadaista 0:14e5e829dffe 460 break;
dadaista 0:14e5e829dffe 461 }
dadaista 0:14e5e829dffe 462 return retval;
dadaista 0:14e5e829dffe 463 }
dadaista 0:14e5e829dffe 464 #endif /* HAVE_PRINT */
dadaista 0:14e5e829dffe 465
dadaista 0:14e5e829dffe 466
dadaista 0:14e5e829dffe 467 #ifdef HAVE_BACKTICK
dadaista 0:14e5e829dffe 468 PmReturn_t
dadaista 0:14e5e829dffe 469 obj_repr(pPmObj_t pobj, pPmObj_t *r_pstr)
dadaista 0:14e5e829dffe 470 {
dadaista 0:14e5e829dffe 471 uint8_t tBuffer[32];
dadaista 0:14e5e829dffe 472 uint8_t bytesWritten = 0;
dadaista 0:14e5e829dffe 473 PmReturn_t retval = PM_RET_OK;
dadaista 0:14e5e829dffe 474 uint8_t const *pcstr = (uint8_t *)tBuffer;;
dadaista 0:14e5e829dffe 475
dadaista 0:14e5e829dffe 476 C_ASSERT(pobj != C_NULL);
dadaista 0:14e5e829dffe 477
dadaista 0:14e5e829dffe 478 switch (OBJ_GET_TYPE(pobj))
dadaista 0:14e5e829dffe 479 {
dadaista 0:14e5e829dffe 480 case OBJ_TYPE_INT:
dadaista 0:14e5e829dffe 481 bytesWritten = snprintf((char *)&tBuffer, sizeof(tBuffer), "%li",
dadaista 0:14e5e829dffe 482 (long)((pPmInt_t)pobj)->val);
dadaista 0:14e5e829dffe 483 retval = string_new(&pcstr, r_pstr);
dadaista 0:14e5e829dffe 484 break;
dadaista 0:14e5e829dffe 485
dadaista 0:14e5e829dffe 486 #ifdef HAVE_FLOAT
dadaista 0:14e5e829dffe 487 case OBJ_TYPE_FLT:
dadaista 0:14e5e829dffe 488 bytesWritten = snprintf((char *)&tBuffer, sizeof(tBuffer), "%f",
dadaista 0:14e5e829dffe 489 ((pPmFloat_t)pobj)->val);
dadaista 0:14e5e829dffe 490 retval = string_new(&pcstr, r_pstr);
dadaista 0:14e5e829dffe 491 break;
dadaista 0:14e5e829dffe 492 #endif /* HAVE_FLOAT */
dadaista 0:14e5e829dffe 493
dadaista 0:14e5e829dffe 494 default:
dadaista 0:14e5e829dffe 495 /* Otherwise raise a TypeError */
dadaista 0:14e5e829dffe 496 PM_RAISE(retval, PM_RET_EX_TYPE);
dadaista 0:14e5e829dffe 497 break;
dadaista 0:14e5e829dffe 498 }
dadaista 0:14e5e829dffe 499
dadaista 0:14e5e829dffe 500 /* Sanity check */
dadaista 0:14e5e829dffe 501 C_ASSERT(bytesWritten < sizeof(tBuffer));
dadaista 0:14e5e829dffe 502
dadaista 0:14e5e829dffe 503 return retval;
dadaista 0:14e5e829dffe 504 }
dadaista 0:14e5e829dffe 505 #endif /* HAVE_BACKTICK */