/** * @param readers Probably should be an empty list. */ list *find_all_readers(struct list *readers) { int rc; struct ftdi_device_list *devlist; struct ftdi_context ftdi; ftdi_init(&ftdi); rc = ftdi_usb_find_all(&ftdi, &devlist, RFID1_VID, RFID1_PID); ftdi_deinit(&ftdi); if(rc < 0) return NULL; struct ftdi_device_list *dp = devlist; while(dp){ struct ftdi_context *c = malloc(sizeof(struct ftdi_context)); if(c == NULL){ // Out of memory !! // TODO: Clean up return NULL; } ftdi_init(c); struct reader *r = reader_create(); reader_init(r, c, dp->dev); list_push(readers, r); dp = dp->next; } ftdi_list_free(&dp); return readers; }
preader* preader_create2(char* fname) { preader* pr = malloc(sizeof(preader)); pr->g = NULL; pr->r = reader_create(fname); return pr; }
object_t *lisp_read_string (object_t * lst) { DOC ("Parse a string into a sexp or list object."); REQ (lst, 1, c_sym ("eval-string")); object_t *stro = CAR (lst); if (!STRINGP (stro)) THROW (wrong_type, UPREF (stro)); char *str = OSTR (stro); reader_t *r = reader_create (NULL, str, "eval-string", 0); object_t *sexp = read_sexp (r); reader_destroy (r); if (sexp == err_symbol) THROW (c_sym ("parse-error"), UPREF (stro)); return sexp; }
static int new_reader(lua_State* L) { void* handle; reader_api api; int type = lua_type(L, 1); switch(type) { case LUA_TUSERDATA: handle = luaL_testudata(L, 1, IN_MEMORY_STREAM); if(handle) { api.read = (stream_write_t)&inmemory_stream_read; api.close = (stream_close_t)&inmemory_stream_close; break; } handle = luaL_testudata(L, 1, LUA_FILEHANDLE); if(handle) { luaL_Stream* stream = handle; handle = stream->f; api.read = (stream_read_t)&fread; api.close = (stream_close_t)&fclose; break; } luaL_error(L, "Inputstream expected"); case LUA_TTABLE: luaL_error(L, "Cannot yet use lua table writers"); break; default: luaL_error(L, "Inputstream expected"); break; } char* udata = create_userdata(L, sizeof(reader_t) + 4096, READER_META_TABLE); reader_t* reader = (reader_t*)udata; uint8_t* buffer = (uint8_t*)(udata + sizeof(reader_t)); *reader = reader_create(handle, api, buffer, 4096); return 1; }
/* Use the core functions above to eval each sexp in a file. */ int load_file (FILE * fid, char *filename, int interactive) { if (fid == NULL) { fid = fopen (filename, "r"); if (fid == NULL) return 0; } reader_t *r = reader_create (fid, NULL, filename, interactive); while (!r->eof) { object_t *sexp = read_sexp (r); if (sexp != err_symbol) { object_t *ret = top_eval (sexp); if (r->interactive && ret != err_symbol) obj_print (ret, 1); obj_destroy (sexp); obj_destroy (ret); } } reader_destroy (r); return 1; }