annotate pack.c @ 116:268566dcc2c4

Fix failure in ini
author David Demelier <markand@malikania.fr>
date Thu, 16 Feb 2012 21:01:19 +0100
parents 1d0e5580d402
children 09fb5267c906
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 /*
98
b1a084c030c8 Happy new year
David Demelier <markand@malikania.fr>
parents: 80
diff changeset
2 * pack.c -- endian dependant binary file reader
b1a084c030c8 Happy new year
David Demelier <markand@malikania.fr>
parents: 80
diff changeset
3 *
b1a084c030c8 Happy new year
David Demelier <markand@malikania.fr>
parents: 80
diff changeset
4 * Copyright (c) 2011, 2012, David Demelier <markand@malikania.fr>
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * 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
7 * 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
8 * copyright notice and this permission notice appear in all copies.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * 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
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * 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
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * 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
15 * 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
16 * 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
17 */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <stdio.h>
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <stdlib.h>
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <stdint.h>
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <stdarg.h>
80
820426789f17 Fix array in pack.c
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
23 #include <string.h>
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <ctype.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 #include "pack.h"
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
27
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 * structure definitions
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
103
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
32 typedef void (*ConvertFn)(void *);
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
33
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 * prototypes
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 * -------------------------------------------------------- */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
37
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 static size_t pack_getsize(char);
103
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
39 static ConvertFn pack_getconvert_by_tok(char);
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
40 static ConvertFn pack_getconvert_by_size(size_t);
115
1d0e5580d402 Reduce code for cosmetic
David Demelier <markand@malikania.fr>
parents: 104
diff changeset
41 static void pack_convert16(uint16_t *);
1d0e5580d402 Reduce code for cosmetic
David Demelier <markand@malikania.fr>
parents: 104
diff changeset
42 static void pack_convert32(uint32_t *);
1d0e5580d402 Reduce code for cosmetic
David Demelier <markand@malikania.fr>
parents: 104
diff changeset
43 static void pack_convert64(uint64_t *);
103
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
44 static void pack_write_one(int, FILE *, uint64_t, size_t);
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
45 static void pack_write_multiple(int, FILE *, uint8_t *, int, size_t);
56
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 * private functions
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 #define LENGTH(x) (sizeof (x) / sizeof (x[0]))
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 * Associative structure, the `tok' member is used for the format
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 * and define the integer size. The convert function reverse the
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 * bytes if it is needed.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
58
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 static struct integer {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 char tok; /* format char */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 size_t tocopy; /* size */
103
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
62 ConvertFn convert; /* conversion function */
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 } sizes[] = {
115
1d0e5580d402 Reduce code for cosmetic
David Demelier <markand@malikania.fr>
parents: 104
diff changeset
64 { 'c', sizeof (uint8_t), NULL },
1d0e5580d402 Reduce code for cosmetic
David Demelier <markand@malikania.fr>
parents: 104
diff changeset
65 { 's', sizeof (uint16_t), (ConvertFn)pack_convert16 },
1d0e5580d402 Reduce code for cosmetic
David Demelier <markand@malikania.fr>
parents: 104
diff changeset
66 { 'i', sizeof (uint32_t), (ConvertFn)pack_convert32 },
1d0e5580d402 Reduce code for cosmetic
David Demelier <markand@malikania.fr>
parents: 104
diff changeset
67 { 'l', sizeof (uint64_t), (ConvertFn)pack_convert64 }
56
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 /*
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 * 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
72 */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
73
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 #define PACK_GETARG(i, ap, tok) \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 do { \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 switch ((tok)) { \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 case 'c': \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 case 's': \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 case 'i': \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 (i) = va_arg((ap), unsigned); \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 break; \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 case 'l': \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 (i) = va_arg((ap), uint64_t); \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 default: \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 break; \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 } \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 } while (/* CONSTCOND */ 0)
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 * 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
91 * 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
92 */
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 #define PACK_GETNELEM(nelem, p) \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 do { \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 if (p[1] == '[') { \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 if (p[2] != ']') \
115
1d0e5580d402 Reduce code for cosmetic
David Demelier <markand@malikania.fr>
parents: 104
diff changeset
98 nelem = (int)strtol(p + 2, NULL, 10); \
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 else if (p[2] == ']') \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 nelem = va_arg(ap, int); \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 /* Go to the end of fmt and find ']' */ \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 while (*p != ']' && *p != '\0') \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 ++p; \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 } else \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 nelem = 1; \
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 } while (/* CONSTCOND */ 0)
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 /*
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 * Get the appropriate size associated with the `tok' character. If
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 * the token is not found the result is 0.
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
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 static size_t
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 pack_getsize(char tok)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 struct integer *s;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 unsigned int i;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
119
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 for (s = sizes, i = 0; i < LENGTH(sizes); ++s, ++i)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 if (s->tok == tok)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 return s->tocopy;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
123
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 return 0;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
126
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 /*
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 * Return the conversion function.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
130
103
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
131 static ConvertFn
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
132 pack_getconvert_by_tok(char tok)
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 struct integer *s;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 unsigned int i;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
136
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 for (s = sizes, i = 0; i < LENGTH(sizes); ++s, ++i)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 if (s->tok == tok)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 return s->convert;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
140
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 return NULL;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 }
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 /*
103
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
145 * Same but by size.
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
146 */
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
147
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
148 static ConvertFn
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
149 pack_getconvert_by_size(size_t size)
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
150 {
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
151 struct integer *s;
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
152 unsigned int i;
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
153
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
154 for (s = sizes, i = 0; i < LENGTH(sizes); ++s, ++i)
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
155 if (s->tocopy == size)
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
156 return s->convert;
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
157
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
158 return NULL;
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
159 }
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
160
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
161 /*
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 * Conversion functions. They reverse the bytes without any
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 * check.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 */
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 static void
115
1d0e5580d402 Reduce code for cosmetic
David Demelier <markand@malikania.fr>
parents: 104
diff changeset
167 pack_convert16(uint16_t *x)
56
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 *x = pack_swap16(*x);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
171
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 static void
115
1d0e5580d402 Reduce code for cosmetic
David Demelier <markand@malikania.fr>
parents: 104
diff changeset
173 pack_convert32(uint32_t *x)
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 *x = pack_swap32(*x);
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
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 static void
115
1d0e5580d402 Reduce code for cosmetic
David Demelier <markand@malikania.fr>
parents: 104
diff changeset
179 pack_convert64(uint64_t *x)
56
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 *x = pack_swap64(*x);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
183
103
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
184 static void
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
185 pack_write_one(int ptype, FILE *fp, uint64_t it, size_t size)
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 {
103
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
187 uint64_t cv = it;
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
188
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
189 if (ptype != PACK_HOST_BYTEORDER) {
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
190 ConvertFn conv = pack_getconvert_by_size(size);
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
191
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
192 if (conv != NULL)
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
193 conv(&cv);
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
194 }
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
195
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
196 fwrite(&cv, size, 1, fp);
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
197 }
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
198
103
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
199 static void
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
200 pack_write_multiple(int ptype, FILE *fp, uint8_t *arr, int length, size_t size)
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
201 {
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
202 uint64_t cv;
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
203 int i;
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
204 ConvertFn conv = NULL;
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
205
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
206 if (ptype != PACK_HOST_BYTEORDER)
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
207 conv = pack_getconvert_by_size(size);
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
208
103
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
209 for (i = 0; i < length; ++i) {
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
210 cv = arr[i * size];
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
211 if (conv != NULL)
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
212 conv(&cv);
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
213
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
214 fwrite(&cv, size, 1, fp);
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
215 }
56
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
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 /* --------------------------------------------------------
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 * public functions
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
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 * Function that writes everything to the file `path'. These functions
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 * 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
225 * variables use fpack instead.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 * Returns 0 on success or -1 on failure.
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 int
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
230 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
231 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 va_list ap;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 int status;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
234
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 va_start(ap, fmt);
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
236 status = pack_vwrite(ptype, path, fmt, ap);
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 va_end(ap);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
238
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 return status;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 }
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 int
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
243 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
244 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 FILE *fp;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 int status;
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 if ((fp = fopen(path, "w+b")) == NULL)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 return -1;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
250
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
251 status = pack_vfwrite(ptype, fp, fmt, ap);
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 fclose(fp);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
253
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 return status;
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
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 * 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
259 * fclose() so you need to do it yourself later.
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
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 int
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
263 pack_fwrite(int ptype, FILE *fp, const char *fmt, ...)
56
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 va_list ap;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 int status;
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 va_start(ap, fmt);
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
269 status = pack_vfwrite(ptype, fp, fmt, ap);
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
270 va_end(ap);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
271
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 return status;
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_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
277 {
103
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
278 int nelem;
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
279 size_t size;
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
280 char tok;
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
281 const char *p;
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
282
103
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
283 for (p = fmt; *p != '\0'; ++p) {
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
284 if (isspace(*p))
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
285 continue;
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
286
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
287 tok = *p;
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
288 size = pack_getsize(tok);
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
289
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
290 /* Bad character */
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
291 if (size == 0)
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
292 continue;
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
293
103
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
294 PACK_GETNELEM(nelem, p);
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
295 if (nelem == 0)
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
296 continue;
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
297
103
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
298 /*
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
299 * If i is 1, then we only have one integer, if it's more
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
300 * than one, user may have given an array of something else.
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
301 */
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
302 if (nelem == 1) {
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
303 uint64_t item;
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
304
103
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
305 PACK_GETARG(item, ap, tok);
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
306 pack_write_one(ptype, fp, item, size);
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
307 } else {
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
308 uint8_t *arr;
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
309
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
310 arr = va_arg(ap, uint8_t *);
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
311 pack_write_multiple(ptype, fp, arr, nelem, size);
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 }
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
103
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
315 return 0;
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
316 }
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 /*
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
319 * 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
320 * 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
321 * the values.
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
322 */
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 int
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
325 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
326 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
327 va_list ap;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
328 int status;
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 va_start(ap, fmt);
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
331 status = pack_vread(ptype, path, fmt, ap);
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
332 va_end(ap);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
333
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
334 return status;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
335 }
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 int
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
338 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
339 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
340 FILE *fp;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
341 int 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 if ((fp = fopen(path, "rb")) == NULL)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
344 return -1;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
345
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
346 status = pack_vfread(ptype, fp, fmt, ap);
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
347 fclose(fp);
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 return status;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
350
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
351 }
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 int
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
354 pack_fread(int ptype, FILE *fp, const char *fmt, ...)
56
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_list ap;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
357 int status;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
358
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
359 va_start(ap, fmt);
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
360 status = pack_vfread(ptype, fp, fmt, ap);
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
361 va_end(ap);
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 return status;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
364 }
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 int
57
311eaa9d004c Renamed pack_* fonction for our guidelines
David Demelier <markand@malikania.fr>
parents: 56
diff changeset
367 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
368 {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
369 const char *p;
104
c66fb578a7c4 Cosmetic
David Demelier <markand@malikania.fr>
parents: 103
diff changeset
370 uint8_t *ptr;
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
371 size_t tocopy;
103
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
372 ConvertFn convert;
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
373
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
374 for (p = fmt; *p != '\0'; ++p) {
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
375 char tok;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
376 int nelem, i;
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 if (isspace(*p))
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
379 continue;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
380
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
381 tok = *p;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
382 tocopy = pack_getsize(tok);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
383
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
384 /* Bad character */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
385 if (tocopy == 0)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
386 continue;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
387
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
388 /* Determine how many element to read and copy */
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
389 PACK_GETNELEM(nelem, p);
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
390 if (nelem == 0)
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
391 continue;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
392
104
c66fb578a7c4 Cosmetic
David Demelier <markand@malikania.fr>
parents: 103
diff changeset
393 if ((ptr = va_arg(ap, uint8_t *)) == NULL)
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
394 continue;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
395
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
396 for (i = 0; i < nelem; ++i) {
104
c66fb578a7c4 Cosmetic
David Demelier <markand@malikania.fr>
parents: 103
diff changeset
397 fread(&ptr[tocopy * i], tocopy, 1, fp);
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
398
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
399 /* Convert if needed */
103
7fefa3a34461 pack.c now directly write to the file
David Demelier <markand@malikania.fr>
parents: 98
diff changeset
400 convert = pack_getconvert_by_tok(tok);
56
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
401 if (ptype != PACK_HOST_BYTEORDER && convert != NULL)
115
1d0e5580d402 Reduce code for cosmetic
David Demelier <markand@malikania.fr>
parents: 104
diff changeset
402 convert((char *)ptr + (tocopy * i));
56
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 }
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
405
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
406 return 0;
770737295987 Added pack.c pack.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
407 }