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