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