pack.c - dedup - deduplicating backup program
HTML git clone git://bitreich.org/dedup/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dedup/
DIR Log
DIR Files
DIR Refs
DIR Tags
DIR README
DIR LICENSE
---
pack.c (2001B)
---
1 /*
2 * ISC License
3 *
4 * (c) 2019 Roberto E. Vargas Caballero <k0ga@shike2.com>
5 *
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 #include <ctype.h>
20 #include <stdarg.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23
24 static int
25 lpack(unsigned char *dst, char *fmt, va_list va)
26 {
27 unsigned char *bp, *cp;
28 unsigned s;
29 unsigned long l;
30 unsigned long long q;
31 int n;
32
33 bp = dst;
34 while (*fmt) {
35 switch (*fmt++) {
36 case '\'':
37 n = atoi(fmt);
38 while (isdigit(*fmt))
39 fmt++;
40 cp = va_arg(va, unsigned char *);
41 while (n--)
42 *bp++ = *cp++;
43 break;
44 case 'c':
45 *bp++ = va_arg(va, unsigned);
46 break;
47 case 's':
48 s = va_arg(va, unsigned);
49 *bp++ = s;
50 *bp++ = s >> 8;
51 break;
52 case 'l':
53 l = va_arg(va, unsigned long);
54 *bp++ = l;
55 *bp++ = l >> 8;
56 *bp++ = l >> 16;
57 *bp++ = l >> 24;
58 break;
59 case 'q':
60 q = va_arg(va, unsigned long long);
61 *bp++ = q;
62 *bp++ = q >> 8;
63 *bp++ = q >> 16;
64 *bp++ = q >> 24;
65 *bp++ = q >> 32;
66 *bp++ = q >> 40;
67 *bp++ = q >> 48;
68 *bp++ = q >> 56;
69 break;
70 default:
71 va_end(va);
72 return -1;
73 }
74 }
75
76 return bp - dst;
77 }
78
79 int
80 pack(unsigned char *dst, char *fmt, ...)
81 {
82 int r;
83 int (*fn)(unsigned char *dst, char *fmt, va_list va);
84 va_list va;
85
86 va_start(va, fmt);
87 fn = lpack;
88 r = (*fn)(dst, fmt, va);
89 va_end(va);
90
91 return r;
92 }