static mp_obj_t mod_socket_getaddrinfo(uint n_args, const mp_obj_t *args) { // TODO: Implement all args assert(n_args == 2); assert(MP_OBJ_IS_STR(args[0])); const char *host = mp_obj_str_get_str(args[0]); const char *serv = NULL; // getaddrinfo accepts port in string notation, so however // it may seem stupid, we need to convert int to str if (MP_OBJ_IS_SMALL_INT(args[1])) { int port = MP_OBJ_SMALL_INT_VALUE(args[1]); static char buf[20]; sprintf(buf, "%d", port); serv = buf; } else { serv = mp_obj_str_get_str(args[1]); } struct addrinfo hints; struct addrinfo *addr; memset(&hints, 0, sizeof(hints)); int res = getaddrinfo(host, serv, NULL/*&hints*/, &addr); if (res != 0) { nlr_jump(mp_obj_new_exception_msg_varg(MP_QSTR_OSError, "[addrinfo error %d]", res)); } assert(addr); mp_obj_t list = rt_build_list(0, NULL); for (; addr; addr = addr->ai_next) { mp_obj_tuple_t *t = mp_obj_new_tuple(5, NULL); t->items[0] = MP_OBJ_NEW_SMALL_INT((machine_int_t)addr->ai_family); t->items[1] = MP_OBJ_NEW_SMALL_INT((machine_int_t)addr->ai_socktype); t->items[2] = MP_OBJ_NEW_SMALL_INT((machine_int_t)addr->ai_protocol); // "canonname will be a string representing the canonical name of the host // if AI_CANONNAME is part of the flags argument; else canonname will be empty." ?? if (addr->ai_canonname) { t->items[3] = MP_OBJ_NEW_QSTR(qstr_from_str(addr->ai_canonname)); } else { t->items[3] = mp_const_none; } t->items[4] = mp_obj_new_bytearray(addr->ai_addrlen, addr->ai_addr); rt_list_append(list, t); } return list; }
mp_obj_t py_imlib_detect_objects(mp_obj_t image_obj, mp_obj_t cascade_obj) { struct image *image = NULL; struct cascade *cascade = NULL; struct array *objects_array=NULL; mp_obj_t objects_list = mp_const_none; /* sanity checks */ PY_ASSERT_TRUE(sensor.framesize <= FRAMESIZE_QQVGA); PY_ASSERT_TRUE(sensor.pixformat == PIXFORMAT_GRAYSCALE); /* get C image pointer */ image = py_image_cobj(image_obj); /* get C cascade pointer */ cascade = py_cascade_cobj(cascade_obj); /* detect objects */ objects_array = imlib_detect_objects(image, cascade); int size = array_length(objects_array); if (size) { int i; objects_list = rt_build_list(0, NULL); for (i=0; i<size; i++) { struct rectangle *r = array_at(objects_array, 0); mp_obj_t rec_obj[4]; rec_obj[0] = mp_obj_new_int(r->x); rec_obj[1] = mp_obj_new_int(r->y); rec_obj[2] = mp_obj_new_int(r->w); rec_obj[3] = mp_obj_new_int(r->h); rt_list_append(objects_list, rt_build_tuple(4, rec_obj)); } } /* free objects array */ array_free(objects_array); return objects_list; }