annotate pack.c @ 88:6a9ff80949f5

Noreturn exists on microsoft too
author David Demelier <markand@malikania.fr>
date Wed, 30 Nov 2011 11:04:29 +0100
parents b2cd1fd33bb0
children 820426789f17
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * Copyright (c) 2011, David Demelier <markand@malikania.fr>
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Permission to use, copy, modify, and/or distribute this software for any
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 * purpose with or without fee is hereby granted, provided that the above
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * copyright notice and this permission notice appear in all copies.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 *
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
16
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 #include <sys/queue.h>
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
18 #include <stdio.h>
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <stdlib.h>
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <stdint.h>
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <stdarg.h>
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <ctype.h>
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include "pack.h"
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
25
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 /* --------------------------------------------------------
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 * structure definitions
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 * -------------------------------------------------------- */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 /*
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 * Conversion function pointer.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 typedef void (*convert_fn)(void *);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
34
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 /*
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 * Item structure store the integer into the largest data type
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 * uint64_t.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
39
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 struct item {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 size_t size; /* 8, 16, 32 or 64 bits? */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 uint64_t i; /* the data */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 convert_fn conv; /* conversion function */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 STAILQ_ENTRY(item) next;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 };
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
46
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 /*
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 * List of item structure.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
50
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 STAILQ_HEAD(item_list, item);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
52
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 /* --------------------------------------------------------
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 * prototypes
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 * -------------------------------------------------------- */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 static int pack_item_add(struct item_list *, const struct item *);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 static int pack_parse(struct item_list *, const char *, va_list);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 static size_t pack_getsize(char);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 static convert_fn pack_getconvert(char);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 static void pack_convert16(void *);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 static void pack_convert32(void *);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 static void pack_convert64(void *);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 static int pack_fatal(struct item_list *);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
65
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 /* --------------------------------------------------------
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 * private functions
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 * -------------------------------------------------------- */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
69
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 #define LENGTH(x) (sizeof (x) / sizeof (x[0]))
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
71
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 /*
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 * Associative structure, the `tok' member is used for the format
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 * and define the integer size. The convert function reverse the
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 * bytes if it is needed.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
77
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 static struct integer {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 char tok; /* format char */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 size_t tocopy; /* size */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 convert_fn convert; /* conversion function */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 } sizes[] = {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 { 'c', sizeof (uint8_t), NULL },
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 { 's', sizeof (uint16_t), &pack_convert16 },
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 { 'i', sizeof (uint32_t), &pack_convert32 },
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 { 'l', sizeof (uint64_t), &pack_convert64 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 };
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
88
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 /*
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 * Try to append a new item to the list. The function create a new item
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 * object since the pack_parse() use a stack'ed item and not an
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 * allocated object. Returns 0 or -1 on failure.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
94
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 static int
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 pack_item_add(struct item_list *list, const struct item *item)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 struct item *res;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
99
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 if ((res = malloc(sizeof (struct item))) == NULL)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 return -1;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
102
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 res->size = item->size;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 res->i = item->i;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 res->conv = item->conv;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
106
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 STAILQ_INSERT_TAIL(list, res, next);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
108
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 return 0;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
111
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 /*
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 * Parse the format, return 0 on success or -1 on failure.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
115
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 #define PACK_GETARG(i, ap, tok) \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 do { \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 switch ((tok)) { \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 case 'c': \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 case 's': \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 case 'i': \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 (i) = va_arg((ap), unsigned); \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 break; \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 case 'l': \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 (i) = va_arg((ap), uint64_t); \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 default: \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 break; \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 } \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 } while (/* CONSTCOND */ 0)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
130
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 /*
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 * Little helper to get number of element when the user wants a array of
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 * objects. Sets the nelem to 0 on array failure or 1 on normal count.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
135
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 #define PACK_GETNELEM(nelem, p) \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 do { \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 if (p[1] == '[') { \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 if (p[2] != ']') \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 nelem = (int) strtol(p + 2, NULL, 10); \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 else if (p[2] == ']') \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 nelem = va_arg(ap, int); \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 /* Go to the end of fmt and find ']' */ \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 while (*p != ']' && *p != '\0') \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 ++p; \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 } else \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 nelem = 1; \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 } while (/* CONSTCOND */ 0)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
150
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 static int
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 pack_parse(struct item_list *list, const char *fmt, va_list ap)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 const char *p;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 char tok;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 struct item item;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
157
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 STAILQ_INIT(list);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
159
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 for (p = fmt; *p != '\0'; ++p) {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 int i, nelem = 1;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
162
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 if (isspace(*p))
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 continue;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
165
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 tok = *p;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 item.size = pack_getsize(tok);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
168
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 /* Bad character */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 if (item.size == 0)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 continue;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
172
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 PACK_GETNELEM(nelem, p);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 if (nelem == 0)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 continue;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
176
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 for (i = 0; i < nelem; ++i) {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 PACK_GETARG(item.i, ap, tok);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 item.conv = pack_getconvert(tok);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
180
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 if (pack_item_add(list, &item) < 0)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 return pack_fatal(list);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
185
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 return 0;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
188
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 /*
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 * Get the appropriate size associated with the `tok' character. If
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 * the token is not found the result is 0.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
193
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 static size_t
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 pack_getsize(char tok)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 struct integer *s;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 unsigned int i;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
199
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 for (s = sizes, i = 0; i < LENGTH(sizes); ++s, ++i)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 if (s->tok == tok)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 return s->tocopy;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
203
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 return 0;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
206
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 /*
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 * Return the conversion function.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
210
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 static convert_fn
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 pack_getconvert(char tok)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 struct integer *s;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 unsigned int i;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
216
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 for (s = sizes, i = 0; i < LENGTH(sizes); ++s, ++i)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 if (s->tok == tok)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 return s->convert;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
220
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 return NULL;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
223
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 /*
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 * Conversion functions. They reverse the bytes without any
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 * check.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
228
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 static void
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 pack_convert16(void *obj)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 uint16_t *x = obj;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
233
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 *x = pack_swap16(*x);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
236
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 static void
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 pack_convert32(void *obj)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 uint32_t *x = obj;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
241
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 *x = pack_swap32(*x);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
244
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 static void
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 pack_convert64(void *obj)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 uint64_t *x = obj;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
249
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 *x = pack_swap64(*x);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
252
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 static int
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 pack_fatal(struct item_list *list)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 struct item *item, *tmp;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
257
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 STAILQ_FOREACH_SAFE(item, list, next, tmp)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 free(item);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
260
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 return -1;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
263
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 /* --------------------------------------------------------
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 * public functions
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 * -------------------------------------------------------- */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
267
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
268 /*
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 * Function that writes everything to the file `path'. These functions
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
270 * does not append to the file, so if you want successive call to append
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
271 * variables use fpack instead.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 * Returns 0 on success or -1 on failure.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
273 */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
274
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
275 int
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
276 pack_write(int ptype, const char *path, const char *fmt, ...)
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
277 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
278 va_list ap;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 int status;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
280
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 va_start(ap, fmt);
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
282 status = pack_vwrite(ptype, path, fmt, ap);
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 va_end(ap);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
284
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 return status;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
287
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 int
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
289 pack_vwrite(int ptype, const char *path, const char *fmt, va_list ap)
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 FILE *fp;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
292 int status;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
293
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
294 if ((fp = fopen(path, "w+b")) == NULL)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
295 return -1;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
296
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
297 status = pack_vfwrite(ptype, fp, fmt, ap);
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
298 fclose(fp);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
299
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
300 return status;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
301 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
302
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
303 /*
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
304 * Write to a file that is already open. The function does not call
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
305 * fclose() so you need to do it yourself later.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
306 */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
307
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
308 int
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
309 pack_fwrite(int ptype, FILE *fp, const char *fmt, ...)
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
310 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
311 va_list ap;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 int status;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
313
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
314 va_start(ap, fmt);
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
315 status = pack_vfwrite(ptype, fp, fmt, ap);
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
316 va_end(ap);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
317
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
318 return status;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
319 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
320
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
321 int
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
322 pack_vfwrite(int ptype, FILE *fp, const char *fmt, va_list ap)
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
323 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
324 struct item_list list;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
325 int status;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
326
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
327 if ((status = pack_parse(&list, fmt, ap)) == 0) {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
328 struct item *item, *tmp;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
329
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
330 STAILQ_FOREACH_SAFE(item, &list, next, tmp) {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
331 /* 8 bits does not need to be converted */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
332 if (ptype != PACK_HOST_BYTEORDER && item->conv != NULL)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
333 item->conv(&item->i);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
334
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
335 fwrite(&item->i, item->size, 1, fp);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
336
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
337 free(item);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
338 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
339 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
340
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
341 return status;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
342 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
343
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
344 /*
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
345 * Function that read the binary file and restore values to the same format
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
346 * as pack functions. Arguments must be pointer of enough space to store
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
347 * the values.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
348 */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
349
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
350 int
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
351 pack_read(int ptype, const char *path, const char *fmt, ...)
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
352 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
353 va_list ap;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
354 int status;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
355
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
356 va_start(ap, fmt);
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
357 status = pack_vread(ptype, path, fmt, ap);
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
358 va_end(ap);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
359
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
360 return status;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
361 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
362
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
363 int
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
364 pack_vread(int ptype, const char *path, const char *fmt, va_list ap)
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
365 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
366 FILE *fp;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
367 int status;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
368
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
369 if ((fp = fopen(path, "rb")) == NULL)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
370 return -1;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
371
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
372 status = pack_vfread(ptype, fp, fmt, ap);
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
373 fclose(fp);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
374
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
375 return status;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
376
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
377 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
378
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
379 int
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
380 pack_fread(int ptype, FILE *fp, const char *fmt, ...)
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
381 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
382 va_list ap;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
383 int status;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
384
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
385 va_start(ap, fmt);
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
386 status = pack_vfread(ptype, fp, fmt, ap);
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
387 va_end(ap);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
388
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
389 return status;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
390 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
391
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
392 int
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
393 pack_vfread(int ptype, FILE *fp, const char *fmt, va_list ap)
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
394 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
395 const char *p;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
396 void *ptr;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
397 size_t tocopy;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
398 convert_fn convert;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
399
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
400 for (p = fmt; *p != '\0'; ++p) {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
401 char tok;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
402 int nelem, i;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
403
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
404 if (isspace(*p))
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
405 continue;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
406
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
407 tok = *p;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
408 tocopy = pack_getsize(tok);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
409
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
410 /* Bad character */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
411 if (tocopy == 0)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
412 continue;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
413
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
414 /* Determine how many element to read and copy */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
415 PACK_GETNELEM(nelem, p);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
416 if (nelem == 0)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
417 continue;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
418
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
419 if ((ptr = va_arg(ap, void *)) == NULL)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
420 continue;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
421
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
422 for (i = 0; i < nelem; ++i) {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
423 fread((char *) ptr + (tocopy * i), tocopy, 1, fp);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
424
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
425 /* Convert if needed */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
426 convert = pack_getconvert(tok);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
427 if (ptype != PACK_HOST_BYTEORDER && convert != NULL)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
428 convert((char *) ptr + (tocopy * i));
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
429 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
430 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
431
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
432 return 0;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
433 }