26 #define CHUNK_ID_LEN 4
41 FILE* fd = fopen(path, (write ?
"w" :
"r"));
43 fprintf(stderr,
"%s\n", strerror(errno));
51 fwrite(&size,
sizeof(size), 1, fd);
58 fprintf(stderr,
"%s: error: not a RIFF file\n", path);
62 if (fread(&size,
sizeof(size), 1, fd) != 1) {
64 fprintf(stderr,
"%s: error: missing RIFF chunk size\n", path);
71 fprintf(stderr,
"%s: error: not an %s RIFF file\n",
84 #define WRITE(ptr, size, nmemb, stream) \
85 if (fwrite(ptr, size, nmemb, stream) != nmemb) { \
86 return RDFF_STATUS_UNKNOWN_ERROR; \
95 const uint32_t chunk_size =
sizeof(id) + len + 1;
97 WRITE(&chunk_size,
sizeof(chunk_size), 1, file->
fd);
98 WRITE(&
id,
sizeof(
id), 1, file->
fd);
99 WRITE(uri, len + 1, 1, file->
fd);
100 if ((chunk_size % 2)) {
103 file->
size += 8 + chunk_size;
111 uint32_t object_type,
112 uint32_t object_size,
115 const uint32_t chunk_size =
sizeof(RDFFTripleChunk) + object_size;
117 WRITE(&chunk_size,
sizeof(chunk_size), 1, file->
fd);
118 WRITE(&subject,
sizeof(subject), 1, file->
fd);
119 WRITE(&predicate,
sizeof(predicate), 1, file->
fd);
120 WRITE(&object_type,
sizeof(object_type), 1, file->
fd);
121 WRITE(&object_size,
sizeof(object_size), 1, file->
fd);
122 WRITE(
object, object_size, 1, file->
fd);
123 if ((object_size % 2)) {
126 file->
size += 8 + chunk_size;
137 #define READ(ptr, size, nmemb, stream) \
138 if (fread(ptr, size, nmemb, stream) != nmemb) { \
139 return RDFF_STATUS_CORRUPT; \
142 const uint32_t alloc_size = (*buf)->size;
144 READ((*buf)->type,
sizeof((*buf)->type), 1, file->
fd);
145 READ(&(*buf)->size,
sizeof((*buf)->size), 1, file->
fd);
146 if ((*buf)->size > alloc_size) {
147 *buf = realloc(*buf,
sizeof(RDFFChunk) + (*buf)->size);
149 READ((*buf)->data, (*buf)->size, 1, file->
fd);
150 if (((*buf)->size % 2)) {
152 READ(&pad, 1, 1, file->
fd);
175 fseek(file->
fd, 4, SEEK_SET);
176 if (fwrite(&file->
size,
sizeof(file->
size), 1, file->
fd) != 1) {
177 fprintf(stderr,
"failed to write RIFF header size\n");
189 main(
int argc,
char** argv)
192 fprintf(stderr,
"Usage: %s FILENAME\n", argv[0]);
196 const char*
const filename = argv[1];
202 static const int N_URIS = 16;
203 static const int N_RECORDS = 16;
206 for (
int i = 0; i < N_URIS; ++i) {
207 snprintf(uri,
sizeof(uri),
"http://example.org/uri%02d", i + 1);
212 for (
int i = 0; i < N_RECORDS; ++i) {
213 snprintf(val,
sizeof(val),
"VAL%02d", i);
228 RDFFChunk* chunk = malloc(
sizeof(RDFFChunk));
230 for (
int i = 0; i < N_URIS; ++i) {
233 fprintf(stderr,
"error: expected %s chunk\n",
CHUNK_URID);
236 RDFFURIChunk* body = (RDFFURIChunk*)chunk->data;
237 printf(
"URI: %s\n", body->uri);
240 for (
int i = 0; i < N_RECORDS; ++i) {
243 fprintf(stderr,
"error: expected %s chunk\n",
CHUNK_TRIP);
246 RDFFTripleChunk* body = (RDFFTripleChunk*)chunk->data;
247 printf(
"KEY %d = %s\n", body->predicate, body->object);
257 fprintf(stderr,
"Test failed\n");
bool rdff_chunk_is_triple(RDFFChunk *chunk)
bool rdff_chunk_is_uri(RDFFChunk *chunk)
#define WRITE(ptr, size, nmemb, stream)
int main(int argc, char *argv[])
static const char CHUNK_URID[CHUNK_ID_LEN]
RDFF rdff_open(const char *path, bool write)
RDFFStatus rdff_read_chunk(RDFF file, RDFFChunk **buf)
#define READ(ptr, size, nmemb, stream)
RDFFStatus rdff_write_triple(RDFF file, uint32_t subject, uint32_t predicate, uint32_t object_type, uint32_t object_size, const void *object)
RDFFStatus rdff_write_uri(RDFF file, uint32_t id, uint32_t len, const char *uri)
void rdff_close(RDFF file)
static const char FILE_TYPE[CHUNK_ID_LEN]
static const char CHUNK_TRIP[CHUNK_ID_LEN]