IoObject *IoTheoraDecodeContext_ycbcr(IoTheoraDecodeContext *self, IoObject *locals, IoMessage *m) { /*doc TheoraDecodecontext ycbcr Returns an object containing the YUV data from the decoded frame. */ th_ycbcr_buffer buffer; int ret = th_decode_ycbcr_out(DATA(self)->ctx, buffer); IOASSERT(ret == 0, "th_decode_ycbcr_out failed"); IoObject* yuv0 = IoObject_new(IOSTATE); IoObject* yuv1 = IoObject_new(IOSTATE); IoObject* yuv2 = IoObject_new(IOSTATE); IoObject_setSlot_to_(yuv0, IOSYMBOL("width"), IONUMBER(buffer[0].width)); IoObject_setSlot_to_(yuv0, IOSYMBOL("height"), IONUMBER(buffer[0].height)); IoObject_setSlot_to_(yuv0, IOSYMBOL("stride"), IONUMBER(buffer[0].stride)); IoObject_setSlot_to_(yuv0, IOSYMBOL("data"), IOSEQ(buffer[0].data, buffer[0].stride * buffer[0].height)); IoObject_setSlot_to_(yuv1, IOSYMBOL("width"), IONUMBER(buffer[1].width)); IoObject_setSlot_to_(yuv1, IOSYMBOL("height"), IONUMBER(buffer[1].height)); IoObject_setSlot_to_(yuv1, IOSYMBOL("stride"), IONUMBER(buffer[1].stride)); IoObject_setSlot_to_(yuv1, IOSYMBOL("data"), IOSEQ(buffer[1].data, buffer[1].stride * buffer[1].height)); IoObject_setSlot_to_(yuv2, IOSYMBOL("width"), IONUMBER(buffer[2].width)); IoObject_setSlot_to_(yuv2, IOSYMBOL("height"), IONUMBER(buffer[2].height)); IoObject_setSlot_to_(yuv2, IOSYMBOL("stride"), IONUMBER(buffer[2].stride)); IoObject_setSlot_to_(yuv2, IOSYMBOL("data"), IOSEQ(buffer[2].data, buffer[2].stride * buffer[2].height)); IoList* result = IoList_new(IOSTATE); IoList_rawAppend_(result, yuv0); IoList_rawAppend_(result, yuv1); IoList_rawAppend_(result, yuv2); return result; }
IO_METHOD(IoSandbox, doSandboxString) { /*doc Sandbox doSandboxString(aString) Evaluate aString inside the Sandbox. */ IoState *boxState = IoSandbox_boxState(self); char *s = IoMessage_locals_cStringArgAt_(m, locals, 0); IoObject *result = IoState_doSandboxCString_(boxState, s); if (ISSYMBOL(result)) { return IOSYMBOL(CSTRING(result)); } if (ISSEQ(result)) { return IOSEQ(IOSEQ_BYTES(result), IOSEQ_LENGTH(result)); } if (ISNUMBER(result)) { return IONUMBER(CNUMBER(result)); } return IONIL(self); }
IoObject *IoEditLine_readLine(IoEditLine *self, IoObject *locals, IoMessage *m) { int count = 0; const char *line = NULL; DATA(self)->prompt = IoMessage_locals_symbolArgAt_(m, locals, 0); line = el_gets(DATA(self)->editline, &count); if (line && count >= 0) return IOSEQ(line, (size_t)count); else return IONIL(self); }
IoObject *IoYajlGen_generate(IoYajlGen *self, IoObject *locals, IoMessage *m) { const unsigned char *jsonBuffer; unsigned int jsonBufferLength; yajl_gen_get_buf(DATA(self), &jsonBuffer, &jsonBufferLength); IoSeq *out = IOSEQ(jsonBuffer, jsonBufferLength); yajl_gen_free(DATA(self)); yajl_gen_config config = { 0, "" }; IoObject_setDataPointer_(self, yajl_gen_alloc(&config, NULL)); return out; }
IoObject *IoYajlGen_generate(IoYajlGen *self, IoObject *locals, IoMessage *m) { const unsigned char *jsonBuffer; size_t jsonBufferLength; yajl_gen_get_buf(DATA(self), &jsonBuffer, &jsonBufferLength); IoSeq *out = IOSEQ(jsonBuffer, jsonBufferLength); yajl_gen_free(DATA(self)); yajl_gen yg = yajl_gen_alloc(NULL); //yajl_gen_config(yg, yajl_gen_beautify, 0); IoObject_setDataPointer_(self, yg); return out; }
IO_METHOD(IoNumber, asString) { /*doc Number asString(optionalIntegerDigits, optionalFactionDigits) Returns a string representation of the receiver. For example: <pre> 1234.5678 asString(0, 2) </pre> would return: <pre> 1234.57 </pre> */ if (IoMessage_argCount(m) >= 1) { int whole = IoMessage_locals_intArgAt_(m, locals, 0); int part = 6; char *s; size_t length; IoObject *n; if (IoMessage_argCount(m) >= 2) { part = abs(IoMessage_locals_intArgAt_(m, locals, 1)); } part = abs(part); whole = abs(whole); // If whole == 0, printf might need an arbitary size string. Instead of // second guessing the size, pick a really big size: 1024. length = 1024; s = io_calloc(1, length); snprintf(s, length, "%*.*f", whole, part, DATA(self)); n = IOSEQ((unsigned char *)s, (size_t)strlen(s)); io_free(s); return n; } return IoNumber_justAsString(self, locals, m); }
IoObject *IoSHA1_hmac(IoSHA1 *self, IoObject *locals, IoMessage *m) { /*doc SHA1 hmac(key, data) Returns a hmac signature sequence or nil on error. */ IoSeq *key = IoMessage_locals_seqArgAt_(m, locals, 0); IoSeq *inSeq = IoMessage_locals_seqArgAt_(m, locals, 1); char resbuf[20]; int ok; memset(resbuf, 0x0, 20); ok = hmac_sha1( IOSEQ_BYTES(key), IOSEQ_LENGTH(key), IOSEQ_BYTES(inSeq), IOSEQ_LENGTH(inSeq), (void *)resbuf); if(ok != 0) return IONIL(self); return IOSEQ(resbuf, 20); }
IoObject* IoMySQL_query(IoObject* self, IoObject* locals, IoMessage* m) { /*doc MySQL query(aQueryString) Perform a SQL query and return a list of results. <pre> db query("SELECT * FROM accounts") foreach(println) </pre> */ IoObject * queryString = 0x0; bool useMap; MYSQL* conn = &DATA(self)->connection; MYSQL_RES* result; MYSQL_ROW row; MYSQL_FIELD* column; char** columnNames; unsigned c, colLength; unsigned long* colLengths; IoObject *list, *rowObject; //, *tmpObject; if(IoMessage_argCount(m) < 1 || !ISSEQ(queryString = IoMessage_locals_quickValueArgAt_(m, locals, 0))) IoState_error_(IOSTATE, m, "argument 0 to method 'query' must be a Sequence"); useMap = IoMessage_argCount(m) > 1 && ISTRUE(IoMessage_locals_quickValueArgAt_(m, locals, 1)); if(!DATA(self)->connected) //printf("not connected?\n"); IoState_error_(IOSTATE, m, "not connected yet"); if(mysql_real_query(conn, CSTRING(queryString), IOSEQ_LENGTH(queryString))) IoState_error_(IOSTATE, m, "query error(%d): %s", mysql_errno(&DATA(self)->connection), mysql_error(&DATA(self)->connection)); if((result = mysql_store_result(conn)) && (colLength = mysql_num_fields(result))) { list = IoList_new(IOSTATE); if(useMap) { columnNames = (char**) malloc(colLength * sizeof(char*)); for(c = 0; c < colLength && (column = mysql_fetch_field(result)); ++c) columnNames[c] = column->name; while((row = mysql_fetch_row(result))) { colLengths = mysql_fetch_lengths(result); rowObject = IoMap_new(IOSTATE); for(c = 0; c < colLength; ++c) IoMap_rawAtPut(rowObject, IOSYMBOL(columnNames[c]), IOSEQ((unsigned char *)row[c], (size_t)colLengths[c])); IoList_rawAppend_(list, rowObject); } free(columnNames); } else { while((row = mysql_fetch_row(result))) { colLengths = mysql_fetch_lengths(result); rowObject = IoList_new(IOSTATE); for(c = 0; c < colLength; ++c) IoList_rawAppend_(rowObject, IOSEQ((unsigned char *)row[c], (size_t)colLengths[c])); IoList_rawAppend_(list, rowObject); } } mysql_free_result(result); return list; } else return IONUMBER(mysql_affected_rows(conn)); }