Bob Rudis
8 years ago
6 changed files with 30 additions and 184 deletions
Binary file not shown.
@ -1,148 +0,0 @@ |
|||||
|
|
||||
#include <stdint.h> |
|
||||
#include <sys/types.h> |
|
||||
#include <stdio.h> |
|
||||
|
|
||||
typedef enum rdata_type_e { |
|
||||
RDATA_TYPE_STRING, |
|
||||
RDATA_TYPE_INT32, |
|
||||
RDATA_TYPE_REAL, |
|
||||
RDATA_TYPE_LOGICAL, |
|
||||
RDATA_TYPE_TIMESTAMP |
|
||||
} rdata_type_t; |
|
||||
|
|
||||
typedef enum rdata_error_e { |
|
||||
RDATA_OK, |
|
||||
RDATA_ERROR_OPEN = 1, |
|
||||
RDATA_ERROR_SEEK, |
|
||||
RDATA_ERROR_READ, |
|
||||
RDATA_ERROR_MALLOC, |
|
||||
RDATA_ERROR_USER_ABORT, |
|
||||
RDATA_ERROR_PARSE, |
|
||||
RDATA_ERROR_WRITE, |
|
||||
RDATA_ERROR_FACTOR |
|
||||
} rdata_error_t; |
|
||||
|
|
||||
const char *rdata_error_message(rdata_error_t error_code); |
|
||||
|
|
||||
typedef int (*rdata_column_handler)(const char *name, rdata_type_t type, |
|
||||
void *data, long count, void *ctx); |
|
||||
typedef int (*rdata_table_handler)(const char *name, void *ctx); |
|
||||
typedef int (*rdata_text_value_handler)(const char *value, int index, void *ctx); |
|
||||
typedef int (*rdata_column_name_handler)(const char *value, int index, void *ctx); |
|
||||
typedef void (*rdata_error_handler)(const char *error_message, void *ctx); |
|
||||
typedef int (*rdata_progress_handler)(double progress, void *ctx); |
|
||||
|
|
||||
#if defined _WIN32 || defined __CYGWIN__ |
|
||||
typedef _off64_t rdata_off_t; |
|
||||
#elif defined _AIX |
|
||||
typedef off64_t rdata_off_t; |
|
||||
#else |
|
||||
typedef off_t rdata_off_t; |
|
||||
#endif |
|
||||
|
|
||||
typedef enum rdata_io_flags_e { |
|
||||
RDATA_SEEK_SET, |
|
||||
RDATA_SEEK_CUR, |
|
||||
RDATA_SEEK_END |
|
||||
} rdata_io_flags_t; |
|
||||
|
|
||||
typedef int (*rdata_open_handler)(const char *path, void *io_ctx); |
|
||||
typedef int (*rdata_close_handler)(void *io_ctx); |
|
||||
typedef rdata_off_t (*rdata_seek_handler)(rdata_off_t offset, rdata_io_flags_t whence, void *io_ctx); |
|
||||
typedef ssize_t (*rdata_read_handler)(void *buf, size_t nbyte, void *io_ctx); |
|
||||
typedef rdata_error_t (*rdata_update_handler)(long file_size, rdata_progress_handler progress_handler, void *user_ctx, void *io_ctx); |
|
||||
|
|
||||
typedef struct rdata_io_s { |
|
||||
rdata_open_handler open; |
|
||||
rdata_close_handler close; |
|
||||
rdata_seek_handler seek; |
|
||||
rdata_read_handler read; |
|
||||
rdata_update_handler update; |
|
||||
void *io_ctx; |
|
||||
int external_io; |
|
||||
} rdata_io_t; |
|
||||
|
|
||||
typedef struct rdata_parser_s { |
|
||||
rdata_table_handler table_handler; |
|
||||
rdata_column_handler column_handler; |
|
||||
rdata_column_name_handler column_name_handler; |
|
||||
rdata_text_value_handler text_value_handler; |
|
||||
rdata_text_value_handler value_label_handler; |
|
||||
rdata_error_handler error_handler; |
|
||||
rdata_io_t *io; |
|
||||
} rdata_parser_t; |
|
||||
|
|
||||
rdata_parser_t *rdata_parser_init(); |
|
||||
void rdata_parser_free(rdata_parser_t *parser); |
|
||||
|
|
||||
rdata_error_t rdata_set_table_handler(rdata_parser_t *parser, rdata_table_handler table_handler); |
|
||||
rdata_error_t rdata_set_column_handler(rdata_parser_t *parser, rdata_column_handler column_handler); |
|
||||
rdata_error_t rdata_set_column_name_handler(rdata_parser_t *parser, rdata_column_name_handler column_name_handler); |
|
||||
rdata_error_t rdata_set_text_value_handler(rdata_parser_t *parser, rdata_text_value_handler text_value_handler); |
|
||||
rdata_error_t rdata_set_value_label_handler(rdata_parser_t *parser, rdata_text_value_handler value_label_handler); |
|
||||
rdata_error_t rdata_set_error_handler(rdata_parser_t *parser, rdata_error_handler error_handler); |
|
||||
rdata_error_t rdata_set_open_handler(rdata_parser_t *parser, rdata_open_handler open_handler); |
|
||||
rdata_error_t rdata_set_close_handler(rdata_parser_t *parser, rdata_close_handler close_handler); |
|
||||
rdata_error_t rdata_set_seek_handler(rdata_parser_t *parser, rdata_seek_handler seek_handler); |
|
||||
rdata_error_t rdata_set_read_handler(rdata_parser_t *parser, rdata_read_handler read_handler); |
|
||||
rdata_error_t rdata_set_update_handler(rdata_parser_t *parser, rdata_update_handler update_handler); |
|
||||
rdata_error_t rdata_set_io_ctx(rdata_parser_t *parser, void *io_ctx); |
|
||||
/* rdata_parse works on RData and RDS. The table handler will be called once
|
|
||||
* per data frame in RData files, and zero times on RDS files. */ |
|
||||
rdata_error_t rdata_parse(rdata_parser_t *parser, const char *filename, void *user_ctx); |
|
||||
|
|
||||
|
|
||||
// Write API
|
|
||||
typedef ssize_t (*rdata_data_writer)(const void *data, size_t len, void *ctx); |
|
||||
|
|
||||
typedef struct rdata_column_s { |
|
||||
rdata_type_t type; |
|
||||
int index; |
|
||||
char name[256]; |
|
||||
char label[1024]; |
|
||||
|
|
||||
int32_t factor_count; |
|
||||
const char **factor; |
|
||||
} rdata_column_t; |
|
||||
|
|
||||
typedef struct rdata_writer_s { |
|
||||
rdata_data_writer data_writer; |
|
||||
size_t bytes_written; |
|
||||
|
|
||||
rdata_error_handler error_handler; |
|
||||
void *user_ctx; |
|
||||
|
|
||||
void *atom_table; |
|
||||
int bswap; |
|
||||
|
|
||||
rdata_column_t **columns; |
|
||||
int32_t columns_count; |
|
||||
int32_t columns_capacity; |
|
||||
|
|
||||
int32_t row_count; |
|
||||
} rdata_writer_t; |
|
||||
|
|
||||
rdata_writer_t *rdata_writer_init(rdata_data_writer write_callback); |
|
||||
void rdata_writer_free(rdata_writer_t *writer); |
|
||||
|
|
||||
rdata_column_t *rdata_add_column(rdata_writer_t *writer, const char *name, rdata_type_t type); |
|
||||
|
|
||||
rdata_error_t rdata_column_set_label(rdata_column_t *column, const char *label); |
|
||||
rdata_error_t rdata_column_add_factor(rdata_column_t *column, const char *factor); |
|
||||
|
|
||||
rdata_column_t *rdata_get_column(rdata_writer_t *writer, int32_t j); |
|
||||
|
|
||||
rdata_error_t rdata_begin_file(rdata_writer_t *writer, void *ctx); |
|
||||
rdata_error_t rdata_begin_table(rdata_writer_t *writer, const char *variable_name, int32_t row_count); |
|
||||
rdata_error_t rdata_begin_column(rdata_writer_t *writer, rdata_column_t *column); |
|
||||
|
|
||||
rdata_error_t rdata_append_real_value(rdata_writer_t *writer, double value); |
|
||||
rdata_error_t rdata_append_int32_value(rdata_writer_t *writer, int32_t value); |
|
||||
rdata_error_t rdata_append_timestamp_value(rdata_writer_t *writer, time_t value); |
|
||||
rdata_error_t rdata_append_logical_value(rdata_writer_t *writer, int value); |
|
||||
rdata_error_t rdata_append_string_value(rdata_writer_t *writer, const char *value); |
|
||||
|
|
||||
rdata_error_t rdata_end_column(rdata_writer_t *writer, rdata_column_t *column); |
|
||||
rdata_error_t rdata_end_table(rdata_writer_t *writer, const char *datalabel); |
|
||||
rdata_error_t rdata_end_file(rdata_writer_t *writer); |
|
@ -0,0 +1,7 @@ |
|||||
|
This is a macOS QuickLook Plugin for R data files. |
||||
|
|
||||
|
That means if you install this plugin (download and unzip `QuickLookR.qlgenerator.zip` and put `QuickLookR.qlgenerator` into `~/Library/QuickLook`) you can hit the spacebar on an R Data or saved RDS file (`.rdata`, `.rda`, `.rds` are currently supported extensions) and get a `str()` preview without firing up R/RStudio. |
||||
|
|
||||
|
It looks for `Rscript` in `/usr/local/bin` and (for now) requires a helper package [`rdatainfo`](https://github.com/hrbrmstr/rdatainfo). `devtools::install_github("hrbrmstr/rdatainfo")` to install that. |
||||
|
|
||||
|
For the moment, the QuickLook preview is rather plain, but I hope to improve the output and switch to reading the data files at the C-level by linking directly to `R.framework`. |
Loading…
Reference in new issue