bin2blob.c revision 1.1.8.2 1 1.1.8.2 mjf /* $NetBSD: bin2blob.c,v 1.1.8.2 2008/06/02 13:23:35 mjf Exp $ */
2 1.1.8.2 mjf
3 1.1.8.2 mjf /*-
4 1.1.8.2 mjf * Copyright (c) 2008 The NetBSD Foundation, Inc.
5 1.1.8.2 mjf * All rights reserved.
6 1.1.8.2 mjf *
7 1.1.8.2 mjf * Redistribution and use in source and binary forms, with or without
8 1.1.8.2 mjf * modification, are permitted provided that the following conditions
9 1.1.8.2 mjf * are met:
10 1.1.8.2 mjf * 1. Redistributions of source code must retain the above copyright
11 1.1.8.2 mjf * notice, this list of conditions and the following disclaimer.
12 1.1.8.2 mjf * 2. Redistributions in binary form must reproduce the above copyright
13 1.1.8.2 mjf * notice, this list of conditions and the following disclaimer in the
14 1.1.8.2 mjf * documentation and/or other materials provided with the distribution.
15 1.1.8.2 mjf *
16 1.1.8.2 mjf * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17 1.1.8.2 mjf * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 1.1.8.2 mjf * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 1.1.8.2 mjf * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 1.1.8.2 mjf * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 1.1.8.2 mjf * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 1.1.8.2 mjf * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 1.1.8.2 mjf * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 1.1.8.2 mjf * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 1.1.8.2 mjf * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 1.1.8.2 mjf * POSSIBILITY OF SUCH DAMAGE.
27 1.1.8.2 mjf */
28 1.1.8.2 mjf
29 1.1.8.2 mjf /*
30 1.1.8.2 mjf * Reads data from stdin (must be a regular file so we can do stat()), and
31 1.1.8.2 mjf * outputs a 32-bit array of format:
32 1.1.8.2 mjf *
33 1.1.8.2 mjf * [0] signature: BLOB
34 1.1.8.2 mjf * [1] original, uncompressed length
35 1.1.8.2 mjf * [2] length of compressed data that follows, unpadded
36 1.1.8.2 mjf * [n] zlib compressed data, padded to 4 bytes
37 1.1.8.2 mjf */
38 1.1.8.2 mjf
39 1.1.8.2 mjf #include <sys/cdefs.h>
40 1.1.8.2 mjf #ifndef lint
41 1.1.8.2 mjf __RCSID("$NetBSD: bin2blob.c,v 1.1.8.2 2008/06/02 13:23:35 mjf Exp $");
42 1.1.8.2 mjf #endif /* !lint */
43 1.1.8.2 mjf
44 1.1.8.2 mjf #include <sys/module.h>
45 1.1.8.2 mjf #include <sys/stat.h>
46 1.1.8.2 mjf
47 1.1.8.2 mjf #include <stdio.h>
48 1.1.8.2 mjf #include <stdlib.h>
49 1.1.8.2 mjf #include <unistd.h>
50 1.1.8.2 mjf #include <string.h>
51 1.1.8.2 mjf #include <err.h>
52 1.1.8.2 mjf #include <zlib.h>
53 1.1.8.2 mjf
54 1.1.8.2 mjf int main(int, char **);
55 1.1.8.2 mjf
56 1.1.8.2 mjf #define SIG 0x424c4f42
57 1.1.8.2 mjf
58 1.1.8.2 mjf void
59 1.1.8.2 mjf put(uint32_t val)
60 1.1.8.2 mjf {
61 1.1.8.2 mjf static int n;
62 1.1.8.2 mjf
63 1.1.8.2 mjf switch (n) {
64 1.1.8.2 mjf case 6:
65 1.1.8.2 mjf putc('\n', stdout);
66 1.1.8.2 mjf n = 0;
67 1.1.8.2 mjf /* FALLTHROUGH */
68 1.1.8.2 mjf case 0:
69 1.1.8.2 mjf putc('\t', stdout);
70 1.1.8.2 mjf break;
71 1.1.8.2 mjf }
72 1.1.8.2 mjf printf("0x%08x,", val);
73 1.1.8.2 mjf n++;
74 1.1.8.2 mjf }
75 1.1.8.2 mjf
76 1.1.8.2 mjf int
77 1.1.8.2 mjf main(int argc, char **argv)
78 1.1.8.2 mjf {
79 1.1.8.2 mjf struct stat sb;
80 1.1.8.2 mjf uint8_t *src, *dst;
81 1.1.8.2 mjf u_long slen, dlen;
82 1.1.8.2 mjf uint32_t *dp;
83 1.1.8.2 mjf
84 1.1.8.2 mjf if (fstat(STDIN_FILENO, &sb) < 0)
85 1.1.8.2 mjf err(1, "stat(stdin)");
86 1.1.8.2 mjf
87 1.1.8.2 mjf src = malloc(sb.st_size);
88 1.1.8.2 mjf dlen = sb.st_size * 1002 / 1000 + 12 + 3 + 4*2;
89 1.1.8.2 mjf dst = malloc(dlen);
90 1.1.8.2 mjf if (src == NULL || dst == NULL)
91 1.1.8.2 mjf errx(1, "malloc");
92 1.1.8.2 mjf
93 1.1.8.2 mjf if (read(STDIN_FILENO, src, sb.st_size) != sb.st_size)
94 1.1.8.2 mjf errx(1, "read");
95 1.1.8.2 mjf
96 1.1.8.2 mjf slen = sb.st_size;
97 1.1.8.2 mjf memset(dst, 0, dlen);
98 1.1.8.2 mjf if (compress2(dst, &dlen, src, slen, 9) != Z_OK)
99 1.1.8.2 mjf errx(1, "compress2");
100 1.1.8.2 mjf
101 1.1.8.2 mjf printf("static const uint32_t blob[] = {\n");
102 1.1.8.2 mjf put(SIG);
103 1.1.8.2 mjf put(slen);
104 1.1.8.2 mjf put(dlen);
105 1.1.8.2 mjf dlen = ((dlen + 3) & ~3) >> 2;
106 1.1.8.2 mjf dp = (uint32_t *)dst;
107 1.1.8.2 mjf while (dlen--)
108 1.1.8.2 mjf put(*dp++);
109 1.1.8.2 mjf printf("\n};\n");
110 1.1.8.2 mjf
111 1.1.8.2 mjf exit(EXIT_SUCCESS);
112 1.1.8.2 mjf }
113