]> git.jsancho.org Git - lugaru.git/blob - Source/pack.c
e0b26c9fa592b651940d2c11dfe30d83a67032a7
[lugaru.git] / Source / pack.c
1 #include <stdlib.h>
2
3 #include "binio.h"
4 #include "private.h"
5 #include "pack_private.h"
6
7 extern void packf(const char *format, ...)
8 {
9     va_list args;
10     va_start(args, format);
11     vfpackf(stdout, format, args);
12     va_end(args);
13 }
14
15 extern void spackf(void *buffer, const char *format, ...)
16 {
17     va_list args;
18     va_start(args, format);
19     vspackf(buffer, format, args);
20     va_end(args);
21 }
22
23 extern void fpackf(FILE *file, const char *format, ...)
24 {
25     va_list args;
26     va_start(args, format);
27     vfpackf(file, format, args);
28     va_end(args);
29 }
30
31 extern void vspackf(void *buffer, const char *format, va_list args)
32 {
33     struct BinIOFormatCursor cursor;
34     struct BinIOPackContext context;
35
36     BinIOInitFormatCursor(&cursor, format);
37
38     context.buffer = (unsigned char *)buffer;
39     va_copy(context.args, args);
40
41     while (BinIONextChar(&context, &cursor, BinIOPack)) {}
42
43     va_end(context.args);
44 }
45
46 extern void vfpackf(FILE *file, const char *format, va_list args)
47 {
48     size_t n_bytes = BinIOFormatByteCount(format);
49     void* buffer = malloc(n_bytes);
50     
51     vspackf(buffer, format, args);
52     
53     fwrite(buffer, n_bytes, 1, file);
54     free(buffer);
55 }