annotate th_ioctx.c @ 678:7e207f1023d9

Split stdio and memio stuff to separate files from th_stdio.c
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 29 Feb 2020 12:19:02 +0200
parents fb4093ad1f7b
children dfc2c9f0577f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
67
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1 /*
211
a2b2106943a8 Update header comment.
Matti Hamalainen <ccr@tnsp.org>
parents: 209
diff changeset
2 * Simple I/O abstraction and context handling layer
67
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3 * Programmed and designed by Matti 'ccr' Hamalainen
553
3a852e9f70a6 Bump copyright years.
Matti Hamalainen <ccr@tnsp.org>
parents: 519
diff changeset
4 * (C) Copyright 2012-2020 Tecnic Software productions (TNSP)
67
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
5 *
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
6 * Please read file 'COPYING' for information on license and distribution.
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
7 */
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
8 #include "th_ioctx.h"
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
9 #include "th_string.h"
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
10 #include "th_endian.h"
67
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
11
72
43df05a632cb Break I/O context API, add function pointers to init/open/new functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 71
diff changeset
12
461
04320ca79407 Actually, use a inline function for ioctx atime updates.
Matti Hamalainen <ccr@tnsp.org>
parents: 460
diff changeset
13 static void th_io_update_atime(th_ioctx *ctx)
04320ca79407 Actually, use a inline function for ioctx atime updates.
Matti Hamalainen <ccr@tnsp.org>
parents: 460
diff changeset
14 {
04320ca79407 Actually, use a inline function for ioctx atime updates.
Matti Hamalainen <ccr@tnsp.org>
parents: 460
diff changeset
15 ctx->atime = time(NULL);
04320ca79407 Actually, use a inline function for ioctx atime updates.
Matti Hamalainen <ccr@tnsp.org>
parents: 460
diff changeset
16 }
460
0a1a65503e0b Use a macro for updating atime.
Matti Hamalainen <ccr@tnsp.org>
parents: 457
diff changeset
17
0a1a65503e0b Use a macro for updating atime.
Matti Hamalainen <ccr@tnsp.org>
parents: 457
diff changeset
18
650
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
19 static void th_io_init(th_ioctx *ctx)
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
20 {
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
21 memset(ctx, 0, sizeof(th_ioctx));
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
22 ctx->line = 1;
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
23 }
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
24
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
25
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
26 void th_io_init_stdio(th_ioctx *ctx, FILE *fh)
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
27 {
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
28 th_io_init(ctx);
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
29
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
30 ctx->fops = &th_stdio_io_ops;
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
31 ctx->data = (void *) fh;
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
32 }
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
33
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
34
477
96d137a6b392 Improve ioctx API. This breaks backwards compatibility of th_io_fopen().
Matti Hamalainen <ccr@tnsp.org>
parents: 461
diff changeset
35 th_ioctx * th_io_new(const th_ioctx_ops *fops, const char *filename)
67
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
36 {
650
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
37 th_ioctx *ctx = th_malloc(sizeof(th_ioctx));
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
38 if (ctx == NULL)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
39 return NULL;
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
40
650
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
41 th_io_init(ctx);
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
42
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
43 ctx->allocated = TRUE;
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
44 ctx->fops = fops;
650
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
45
209
462b837ea492 Change io context API. Again.
Matti Hamalainen <ccr@tnsp.org>
parents: 208
diff changeset
46 ctx->filename = th_strdup(filename);
650
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
47 ctx->fallocated = TRUE;
477
96d137a6b392 Improve ioctx API. This breaks backwards compatibility of th_io_fopen().
Matti Hamalainen <ccr@tnsp.org>
parents: 461
diff changeset
48 if (filename != NULL && ctx->filename == NULL)
96d137a6b392 Improve ioctx API. This breaks backwards compatibility of th_io_fopen().
Matti Hamalainen <ccr@tnsp.org>
parents: 461
diff changeset
49 goto err;
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
50
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
51 return ctx;
477
96d137a6b392 Improve ioctx API. This breaks backwards compatibility of th_io_fopen().
Matti Hamalainen <ccr@tnsp.org>
parents: 461
diff changeset
52
96d137a6b392 Improve ioctx API. This breaks backwards compatibility of th_io_fopen().
Matti Hamalainen <ccr@tnsp.org>
parents: 461
diff changeset
53 err:
650
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
54 th_io_close(ctx);
477
96d137a6b392 Improve ioctx API. This breaks backwards compatibility of th_io_fopen().
Matti Hamalainen <ccr@tnsp.org>
parents: 461
diff changeset
55 return NULL;
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
56 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
57
67
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
58
209
462b837ea492 Change io context API. Again.
Matti Hamalainen <ccr@tnsp.org>
parents: 208
diff changeset
59 int th_io_open(th_ioctx *ctx, const char *mode)
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
60 {
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
61 if (ctx == NULL)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
62 return THERR_NULLPTR;
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
63
650
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
64 if (mode != NULL && (ctx->mode = th_strdup(mode)) == NULL)
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
65 return THERR_MALLOC;
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
66
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
67 ctx->mallocated = TRUE;
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
68
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
69 if (ctx->fops->fopen != NULL)
219
faeeac291a6c Oops, using "errno" as io_ctx struct member causes problems on some
Matti Hamalainen <ccr@tnsp.org>
parents: 218
diff changeset
70 ctx->status = ctx->fops->fopen(ctx);
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
71
219
faeeac291a6c Oops, using "errno" as io_ctx struct member causes problems on some
Matti Hamalainen <ccr@tnsp.org>
parents: 218
diff changeset
72 return ctx->status;
67
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
73 }
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
74
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
75
477
96d137a6b392 Improve ioctx API. This breaks backwards compatibility of th_io_fopen().
Matti Hamalainen <ccr@tnsp.org>
parents: 461
diff changeset
76 int th_io_fopen(th_ioctx **pctx, const th_ioctx_ops *fops, const char *filename, const char *mode)
204
55f429dff750 Add th_io_fopen() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 202
diff changeset
77 {
477
96d137a6b392 Improve ioctx API. This breaks backwards compatibility of th_io_fopen().
Matti Hamalainen <ccr@tnsp.org>
parents: 461
diff changeset
78 th_ioctx *ctx;
96d137a6b392 Improve ioctx API. This breaks backwards compatibility of th_io_fopen().
Matti Hamalainen <ccr@tnsp.org>
parents: 461
diff changeset
79 int res;
96d137a6b392 Improve ioctx API. This breaks backwards compatibility of th_io_fopen().
Matti Hamalainen <ccr@tnsp.org>
parents: 461
diff changeset
80
96d137a6b392 Improve ioctx API. This breaks backwards compatibility of th_io_fopen().
Matti Hamalainen <ccr@tnsp.org>
parents: 461
diff changeset
81 if ((*pctx = ctx = th_io_new(fops, filename)) == NULL)
96d137a6b392 Improve ioctx API. This breaks backwards compatibility of th_io_fopen().
Matti Hamalainen <ccr@tnsp.org>
parents: 461
diff changeset
82 return THERR_MALLOC;
204
55f429dff750 Add th_io_fopen() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 202
diff changeset
83
477
96d137a6b392 Improve ioctx API. This breaks backwards compatibility of th_io_fopen().
Matti Hamalainen <ccr@tnsp.org>
parents: 461
diff changeset
84 if ((res = th_io_open(ctx, mode)) != THERR_OK)
96d137a6b392 Improve ioctx API. This breaks backwards compatibility of th_io_fopen().
Matti Hamalainen <ccr@tnsp.org>
parents: 461
diff changeset
85 goto err;
96d137a6b392 Improve ioctx API. This breaks backwards compatibility of th_io_fopen().
Matti Hamalainen <ccr@tnsp.org>
parents: 461
diff changeset
86
96d137a6b392 Improve ioctx API. This breaks backwards compatibility of th_io_fopen().
Matti Hamalainen <ccr@tnsp.org>
parents: 461
diff changeset
87 return THERR_OK;
204
55f429dff750 Add th_io_fopen() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 202
diff changeset
88
477
96d137a6b392 Improve ioctx API. This breaks backwards compatibility of th_io_fopen().
Matti Hamalainen <ccr@tnsp.org>
parents: 461
diff changeset
89 err:
650
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
90 th_io_close(ctx);
477
96d137a6b392 Improve ioctx API. This breaks backwards compatibility of th_io_fopen().
Matti Hamalainen <ccr@tnsp.org>
parents: 461
diff changeset
91 *pctx = NULL;
96d137a6b392 Improve ioctx API. This breaks backwards compatibility of th_io_fopen().
Matti Hamalainen <ccr@tnsp.org>
parents: 461
diff changeset
92 return res;
204
55f429dff750 Add th_io_fopen() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 202
diff changeset
93 }
55f429dff750 Add th_io_fopen() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 202
diff changeset
94
55f429dff750 Add th_io_fopen() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 202
diff changeset
95
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
96 void th_io_close(th_ioctx *ctx)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
97 {
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
98 if (ctx != NULL)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
99 {
650
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
100 if (ctx->fops != NULL && ctx->fops->fclose != NULL)
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
101 ctx->fops->fclose(ctx);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
102
650
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
103 if (ctx->fallocated)
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
104 th_free_r(&ctx->filename);
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
105
650
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
106 if (ctx->mallocated)
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
107 th_free_r(&ctx->mode);
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
108
650
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
109 if (ctx->allocated)
24cbab6e88c6 Remove th_io_free(), merge the functionality to th_io_close(). Add flags
Matti Hamalainen <ccr@tnsp.org>
parents: 556
diff changeset
110 th_free(ctx);
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
111 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
112 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
113
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
114
457
85fa3d333556 Actually, revert the boolean changes .. meh.
Matti Hamalainen <ccr@tnsp.org>
parents: 454
diff changeset
115 BOOL th_io_set_handlers(th_ioctx *ctx,
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
116 void (*error)(th_ioctx *, const int, const char *msg),
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
117 void (*msg)(th_ioctx *, const int, const char *msg))
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
118 {
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
119 if (ctx == NULL)
457
85fa3d333556 Actually, revert the boolean changes .. meh.
Matti Hamalainen <ccr@tnsp.org>
parents: 454
diff changeset
120 return FALSE;
67
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
121
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
122 ctx->error = error;
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
123 ctx->msg = msg;
67
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
124
457
85fa3d333556 Actually, revert the boolean changes .. meh.
Matti Hamalainen <ccr@tnsp.org>
parents: 454
diff changeset
125 return TRUE;
67
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
126 }
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
127
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
128
519
e1b15fb56ddf Change return value of th_io_error() and th_io_error_v() to int, and return the error code.
Matti Hamalainen <ccr@tnsp.org>
parents: 481
diff changeset
129 int th_io_error_v(th_ioctx *ctx, const int err, const char *fmt, va_list ap)
67
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
130 {
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
131 char *msg = th_strdup_vprintf(fmt, ap);
67
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
132
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
133 if (ctx->error != NULL)
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
134 ctx->error((struct th_ioctx *) ctx, err, msg);
67
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
135 else
395
bffd3caf2d2c Rename TH_PRI{u,d,x}* macros to match with standard ISO C99 inttypes.h PRI*.
Matti Hamalainen <ccr@tnsp.org>
parents: 219
diff changeset
136 THERR("'%s' #%" PRIu_SIZE_T ": %s\n", ctx->filename, ctx->line, msg);
67
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
137
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
138 th_free(msg);
519
e1b15fb56ddf Change return value of th_io_error() and th_io_error_v() to int, and return the error code.
Matti Hamalainen <ccr@tnsp.org>
parents: 481
diff changeset
139 return err;
67
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
140 }
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
141
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
142
519
e1b15fb56ddf Change return value of th_io_error() and th_io_error_v() to int, and return the error code.
Matti Hamalainen <ccr@tnsp.org>
parents: 481
diff changeset
143 int th_io_error(th_ioctx *ctx, const int err, const char *fmt, ...)
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
144 {
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
145 va_list ap;
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
146 va_start(ap, fmt);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
147 th_io_error_v(ctx, err, fmt, ap);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
148 va_end(ap);
519
e1b15fb56ddf Change return value of th_io_error() and th_io_error_v() to int, and return the error code.
Matti Hamalainen <ccr@tnsp.org>
parents: 481
diff changeset
149 return err;
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
150 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
151
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
152
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
153 void th_io_msg_v(th_ioctx *ctx, const int level, const char *fmt, va_list ap)
67
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
154 {
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
155 if (ctx->msg != NULL)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
156 {
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
157 char *msg = th_strdup_vprintf(fmt, ap);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
158 ctx->msg((struct th_ioctx *) ctx, level, msg);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
159 th_free(msg);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
160 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
161 else
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
162 THMSG_V(level, fmt, ap);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
163 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
164
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
165
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
166 void th_io_msg(th_ioctx *ctx, const int level, const char *fmt, ...)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
167 {
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
168 va_list ap;
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
169 va_start(ap, fmt);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
170 th_io_msg_v(ctx, level, fmt, ap);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
171 va_end(ap);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
172 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
173
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
174
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
175 int thfreset(th_ioctx *ctx)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
176 {
67
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
177 if (ctx == NULL)
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
178 return THERR_NULLPTR;
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
179
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
180 if (ctx->fops == NULL || ctx->fops->freset == NULL)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
181 return THERR_OK;
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
182
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
183 return ctx->fops->freset(ctx);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
184 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
185
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
186
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
187 int thferror(th_ioctx *ctx)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
188 {
461
04320ca79407 Actually, use a inline function for ioctx atime updates.
Matti Hamalainen <ccr@tnsp.org>
parents: 460
diff changeset
189 th_io_update_atime(ctx);
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
190 return ctx->fops->ferror(ctx);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
191 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
192
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
193
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
194 int thfseek(th_ioctx *ctx, const off_t offset, int whence)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
195 {
461
04320ca79407 Actually, use a inline function for ioctx atime updates.
Matti Hamalainen <ccr@tnsp.org>
parents: 460
diff changeset
196 th_io_update_atime(ctx);
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
197 return ctx->fops->fseek(ctx, offset, whence);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
198 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
199
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
200
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
201 off_t thfsize(th_ioctx *ctx)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
202 {
461
04320ca79407 Actually, use a inline function for ioctx atime updates.
Matti Hamalainen <ccr@tnsp.org>
parents: 460
diff changeset
203 th_io_update_atime(ctx);
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
204 return ctx->fops->fsize(ctx);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
205 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
206
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
207
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
208 off_t thftell(th_ioctx *ctx)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
209 {
461
04320ca79407 Actually, use a inline function for ioctx atime updates.
Matti Hamalainen <ccr@tnsp.org>
parents: 460
diff changeset
210 th_io_update_atime(ctx);
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
211 return ctx->fops->ftell(ctx);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
212 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
213
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
214
457
85fa3d333556 Actually, revert the boolean changes .. meh.
Matti Hamalainen <ccr@tnsp.org>
parents: 454
diff changeset
215 BOOL thfeof(th_ioctx *ctx)
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
216 {
461
04320ca79407 Actually, use a inline function for ioctx atime updates.
Matti Hamalainen <ccr@tnsp.org>
parents: 460
diff changeset
217 th_io_update_atime(ctx);
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
218 return ctx->fops->feof(ctx);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
219 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
220
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
221
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
222 int thfgetc(th_ioctx *ctx)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
223 {
461
04320ca79407 Actually, use a inline function for ioctx atime updates.
Matti Hamalainen <ccr@tnsp.org>
parents: 460
diff changeset
224 th_io_update_atime(ctx);
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
225 return ctx->fops->fgetc(ctx);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
226 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
227
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
228
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
229 int thfputc(int v, th_ioctx *ctx)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
230 {
461
04320ca79407 Actually, use a inline function for ioctx atime updates.
Matti Hamalainen <ccr@tnsp.org>
parents: 460
diff changeset
231 th_io_update_atime(ctx);
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
232 return ctx->fops->fputc(v, ctx);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
233 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
234
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
235
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
236 size_t thfread(void *ptr, size_t size, size_t nmemb, th_ioctx *ctx)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
237 {
461
04320ca79407 Actually, use a inline function for ioctx atime updates.
Matti Hamalainen <ccr@tnsp.org>
parents: 460
diff changeset
238 th_io_update_atime(ctx);
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
239 return ctx->fops->fread(ptr, size, nmemb, ctx);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
240 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
241
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
242
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
243 size_t thfwrite(const void *ptr, size_t size, size_t nmemb, th_ioctx *ctx)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
244 {
461
04320ca79407 Actually, use a inline function for ioctx atime updates.
Matti Hamalainen <ccr@tnsp.org>
parents: 460
diff changeset
245 th_io_update_atime(ctx);
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
246 return ctx->fops->fwrite(ptr, size, nmemb, ctx);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
247 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
248
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
249
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
250 char *thfgets(char *str, int size, th_ioctx *ctx)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
251 {
206
c2193323736d Fix thfgets().
Matti Hamalainen <ccr@tnsp.org>
parents: 204
diff changeset
252 char *ptr = str, *end = str + size - 1;
c2193323736d Fix thfgets().
Matti Hamalainen <ccr@tnsp.org>
parents: 204
diff changeset
253 int c;
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
254
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
255 if (size <= 0)
67
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
256 return NULL;
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
257
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
258 while (ptr < end && (c = ctx->fops->fgetc(ctx)) != EOF)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
259 {
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
260 *ptr++ = c;
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
261 if (c == '\n')
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
262 break;
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
263 }
206
c2193323736d Fix thfgets().
Matti Hamalainen <ccr@tnsp.org>
parents: 204
diff changeset
264 *ptr = 0;
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
265
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
266 return (ptr > str) ? str : NULL;
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
267 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
268
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
269
208
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
270 int thfputs(const char *ptr, th_ioctx *ctx)
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
271 {
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
272 if (ctx->fops->fputs != NULL)
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
273 return ctx->fops->fputs(ptr, ctx);
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
274
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
275 const char *p = ptr;
675
fb4093ad1f7b Add MemIO ioctx functionality.
Matti Hamalainen <ccr@tnsp.org>
parents: 650
diff changeset
276 int rval = 0;
fb4093ad1f7b Add MemIO ioctx functionality.
Matti Hamalainen <ccr@tnsp.org>
parents: 650
diff changeset
277 while (*p && (rval = ctx->fops->fputc(*p, ctx)) != EOF) p++;
fb4093ad1f7b Add MemIO ioctx functionality.
Matti Hamalainen <ccr@tnsp.org>
parents: 650
diff changeset
278 return rval;
208
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
279 }
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
280
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
281
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
282 int thvfprintf(th_ioctx *ctx, const char *fmt, va_list ap)
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
283 {
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
284 if (ctx->fops->vfprintf != NULL)
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
285 return ctx->fops->vfprintf(ctx, fmt, ap);
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
286 else
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
287 {
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
288 char *msg = th_strdup_printf(fmt, ap);
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
289 int rval = thfputs(msg, ctx);
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
290 th_free(msg);
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
291 return rval;
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
292 }
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
293 }
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
294
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
295
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
296 int thfprintf(th_ioctx *ctx, const char *fmt, ...)
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
297 {
675
fb4093ad1f7b Add MemIO ioctx functionality.
Matti Hamalainen <ccr@tnsp.org>
parents: 650
diff changeset
298 int rval;
208
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
299 va_list ap;
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
300 va_start(ap, fmt);
675
fb4093ad1f7b Add MemIO ioctx functionality.
Matti Hamalainen <ccr@tnsp.org>
parents: 650
diff changeset
301 rval = thvfprintf(ctx, fmt, ap);
208
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
302 va_end(ap);
675
fb4093ad1f7b Add MemIO ioctx functionality.
Matti Hamalainen <ccr@tnsp.org>
parents: 650
diff changeset
303 return rval;
208
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
304 }
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
305
3635415a2d03 More work on th_ioctx stuff and wrappers.
Matti Hamalainen <ccr@tnsp.org>
parents: 206
diff changeset
306
457
85fa3d333556 Actually, revert the boolean changes .. meh.
Matti Hamalainen <ccr@tnsp.org>
parents: 454
diff changeset
307 BOOL thfread_str(th_ioctx *ctx, void *ptr, const size_t len)
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
308 {
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
309 return (thfread(ptr, sizeof(uint8_t), len, ctx) == len);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
310 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
311
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
312
457
85fa3d333556 Actually, revert the boolean changes .. meh.
Matti Hamalainen <ccr@tnsp.org>
parents: 454
diff changeset
313 BOOL thfread_u8(th_ioctx *ctx, uint8_t *val)
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
314 {
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
315 return (thfread(val, sizeof(uint8_t), 1, ctx) == 1);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
316 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
317
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
318
457
85fa3d333556 Actually, revert the boolean changes .. meh.
Matti Hamalainen <ccr@tnsp.org>
parents: 454
diff changeset
319 BOOL thfwrite_str(th_ioctx *ctx, const void *ptr, const size_t len)
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
320 {
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
321 return (thfwrite(ptr, sizeof(uint8_t), len, ctx) == len);
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
322 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
323
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
324
457
85fa3d333556 Actually, revert the boolean changes .. meh.
Matti Hamalainen <ccr@tnsp.org>
parents: 454
diff changeset
325 BOOL thfwrite_u8(th_ioctx *ctx, const uint8_t val)
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
326 {
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
327 return (thfwrite(&val, sizeof(uint8_t), 1, ctx) == 1);
67
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
328 }
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
329
d94af48cef7b Added new module, a simple I/O context helper.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
330
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
331 //
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
332 // File routines for endian-dependant data
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
333 //
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
334 #define TH_DEFINE_FUNC(xname, xtype, xmacro) \
457
85fa3d333556 Actually, revert the boolean changes .. meh.
Matti Hamalainen <ccr@tnsp.org>
parents: 454
diff changeset
335 BOOL thfread_ ## xname (th_ioctx *ctx, xtype *v) \
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
336 { \
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
337 xtype result; \
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
338 if (thfread(&result, sizeof( xtype ), 1, ctx) != 1) \
457
85fa3d333556 Actually, revert the boolean changes .. meh.
Matti Hamalainen <ccr@tnsp.org>
parents: 454
diff changeset
339 return FALSE; \
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
340 *v = TH_ ## xmacro ## _TO_NATIVE (result); \
457
85fa3d333556 Actually, revert the boolean changes .. meh.
Matti Hamalainen <ccr@tnsp.org>
parents: 454
diff changeset
341 return TRUE; \
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
342 } \
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
343 \
457
85fa3d333556 Actually, revert the boolean changes .. meh.
Matti Hamalainen <ccr@tnsp.org>
parents: 454
diff changeset
344 BOOL thfwrite_ ## xname (th_ioctx *ctx, const xtype v) \
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
345 { \
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
346 xtype result = TH_NATIVE_TO_ ## xmacro (v); \
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
347 if (thfwrite(&result, sizeof( xtype ), 1, ctx) != 1) \
457
85fa3d333556 Actually, revert the boolean changes .. meh.
Matti Hamalainen <ccr@tnsp.org>
parents: 454
diff changeset
348 return FALSE; \
85fa3d333556 Actually, revert the boolean changes .. meh.
Matti Hamalainen <ccr@tnsp.org>
parents: 454
diff changeset
349 return TRUE; \
202
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
350 }
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
351
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
352
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
353 TH_DEFINE_FUNC(le16, uint16_t, LE16)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
354 TH_DEFINE_FUNC(le32, uint32_t, LE32)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
355
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
356 TH_DEFINE_FUNC(be16, uint16_t, BE16)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
357 TH_DEFINE_FUNC(be32, uint32_t, BE32)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
358
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
359 TH_DEFINE_FUNC(le64, uint64_t, LE64)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
360 TH_DEFINE_FUNC(be64, uint64_t, BE64)
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
361
b392293047da Refactor I/O contexts. Breaks API and all that.
Matti Hamalainen <ccr@tnsp.org>
parents: 166
diff changeset
362 #undef TH_DEFINE_FUNC