VirtualBox

source: vbox/trunk/src/bldprogs/bin2c.c@ 21604

Last change on this file since 21604 was 21295, checked in by vboxsync, 15 years ago

svn:eol-style native

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 7.6 KB
Line 
1/* $Id: bin2c.c 21295 2009-07-07 08:02:28Z vboxsync $ */
2/** @file
3 * bin2c - Binary 2 C Structure Converter.
4 */
5
6/*
7 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
19 * additional information or have any questions.
20 */
21
22/*******************************************************************************
23* Header Files *
24*******************************************************************************/
25#include <ctype.h>
26#include <stdio.h>
27#include <string.h>
28#include <stdlib.h>
29#include <sys/types.h>
30
31
32/**
33 * File size.
34 *
35 * @returns file size in bytes.
36 * @returns 0 on failure.
37 * @param pFile File to size.
38 */
39static size_t fsize(FILE *pFile)
40{
41 long cbFile;
42 off_t Pos = ftell(pFile);
43 if ( Pos >= 0
44 && !fseek(pFile, 0, SEEK_END))
45 {
46 cbFile = ftell(pFile);
47 if ( cbFile >= 0
48 && !fseek(pFile, 0, SEEK_SET))
49 return cbFile;
50 }
51 return 0;
52}
53
54static int usage(const char *argv0)
55{
56 fprintf(stderr,
57 "Syntax: %s [options] <arrayname> <binaryfile> <outname>\n"
58 " -min <n> check if <binaryfile> is not smaller than <n>KB\n"
59 " -max <n> check if <binaryfile> is not bigger than <n>KB\n"
60 " -mask <n> check if size of binaryfile is <n>-aligned\n"
61 " -width <n> number of bytes per line (default: 16)\n"
62 " -break <n> break every <n> lines (default: -1)\n"
63 " -ascii show ASCII representation of binary as comment\n",
64 argv0);
65
66 return 1;
67}
68
69int main(int argc, char *argv[])
70{
71 FILE *pFileIn;
72 FILE *pFileOut;
73 int i;
74 size_t cbMin = 0;
75 size_t cbMax = ~0U;
76 size_t uMask = 0;
77 int fAscii = 0;
78 int fExport = 0;
79 long iBreakEvery = -1;
80 unsigned char abLine[32];
81 size_t cbLine = 16;
82 size_t off;
83 size_t cbRead;
84 size_t cbBin;
85 int rc = 1; /* assume the worst... */
86
87 if (argc < 2)
88 return usage(argv[0]);
89
90 for (i = 1; i < argc; i++)
91 {
92 if (!strcmp(argv[i], "-min"))
93 {
94 if (++i >= argc)
95 return usage(argv[0]);
96 cbMin = 1024 * strtoul(argv[i], NULL, 0);
97 }
98 else if (!strcmp(argv[i], "-max"))
99 {
100 if (++i >= argc)
101 return usage(argv[0]);
102 cbMax = 1024 * strtoul(argv[i], NULL, 0);
103 }
104 else if (!strcmp(argv[i], "-mask"))
105 {
106 if (++i >= argc)
107 return usage(argv[0]);
108 uMask = strtoul(argv[i], NULL, 0);
109 }
110 else if (!strcmp(argv[i], "-ascii"))
111 {
112 fAscii = 1;
113 }
114 else if (!strcmp(argv[i], "-export"))
115 {
116 fExport = 1;
117 }
118 else if (!strcmp(argv[i], "-width"))
119 {
120 if (++i >= argc)
121 return usage(argv[0]);
122 cbLine = strtoul(argv[i], NULL, 0);
123 if (cbLine == 0 || cbLine > sizeof(abLine))
124 {
125 fprintf(stderr, "%s: '%s' is too wide, max %u\n",
126 argv[0], argv[i], (unsigned)sizeof(abLine));
127 return 1;
128 }
129 }
130 else if (!strcmp(argv[i], "-break"))
131 {
132 if (++i >= argc)
133 return usage(argv[0]);
134 iBreakEvery = strtol(argv[i], NULL, 0);
135 if (iBreakEvery <= 0 && iBreakEvery != -1)
136 {
137 fprintf(stderr, "%s: -break value '%s' is not >= 1 or -1.\n",
138 argv[0], argv[i]);
139 return 1;
140 }
141 }
142 else if (i == argc - 3)
143 break;
144 else
145 {
146 fprintf(stderr, "%s: syntax error: Unknown argument '%s'\n",
147 argv[0], argv[i]);
148 return usage(argv[0]);
149 }
150 }
151
152 pFileIn = fopen(argv[i+1], "rb");
153 if (!pFileIn)
154 {
155 fprintf(stderr, "Error: failed to open input file '%s'!\n", argv[i+1]);
156 return 1;
157 }
158
159 pFileOut = fopen(argv[i+2], "wb");
160 if (!pFileOut)
161 {
162 fprintf(stderr, "Error: failed to open output file '%s'!\n", argv[i+2]);
163 fclose(pFileIn);
164 return 1;
165 }
166
167 cbBin = fsize(pFileIn);
168
169 fprintf(pFileOut,
170 "/*\n"
171 " * This file was automatically generated\n"
172 " * from %s\n"
173 " * by %s.\n"
174 " */\n"
175 "\n"
176 "#include <iprt/cdefs.h>\n"
177 "\n"
178 "%sconst unsigned char%s g_ab%s[] =\n"
179 "{\n",
180 argv[i+1], argv[0], fExport ? "DECLEXPORT(" : "", fExport ? ")" : "", argv[i]);
181
182 /* check size restrictions */
183 if (uMask && (cbBin & uMask))
184 fprintf(stderr, "%s: size=%ld - Not aligned!\n", argv[0], (long)cbBin);
185 else if (cbBin < cbMin || cbBin > cbMax)
186 fprintf(stderr, "%s: size=%ld - Not %ld-%ldb in size!\n",
187 argv[0], (long)cbBin, (long)cbMin, (long)cbMax);
188 else
189 {
190 /* the binary data */
191 off = 0;
192 while ((cbRead = fread(&abLine[0], 1, cbLine, pFileIn)) > 0)
193 {
194 size_t i;
195
196 if ( iBreakEvery > 0
197 && off
198 && (off / cbLine) % iBreakEvery == 0)
199 fprintf(pFileOut, "\n");
200
201 fprintf(pFileOut, " ");
202 for (i = 0; i < cbRead; i++)
203 fprintf(pFileOut, " 0x%02x,", abLine[i]);
204 for (; i < cbLine; i++)
205 fprintf(pFileOut, " ");
206 if (fAscii)
207 {
208 fprintf(pFileOut, " /* 0x%08lx: ", (long)off);
209 for (i = 0; i < cbRead; i++)
210 /* be careful with '/' prefixed/followed by a '*'! */
211 fprintf(pFileOut, "%c",
212 isprint(abLine[i]) && abLine[i] != '/' ? abLine[i] : '.');
213 for (; i < cbLine; i++)
214 fprintf(pFileOut, " ");
215 fprintf(pFileOut, " */");
216 }
217 fprintf(pFileOut, "\n");
218
219 off += cbRead;
220 }
221
222 /* check for errors */
223 if (ferror(pFileIn) && !feof(pFileIn))
224 fprintf(stderr, "%s: read error\n", argv[0]);
225 else if (off != cbBin)
226 fprintf(stderr, "%s: read error off=%ld cbBin=%ld\n", argv[0], (long)off, (long)cbBin);
227 else
228 {
229 /* no errors, finish the structure. */
230 fprintf(pFileOut,
231 "};\n"
232 "\n"
233 "%sconst unsigned%s g_cb%s = sizeof(g_ab%s);\n"
234 "/* end of file */\n",
235 fExport ? "DECLEXPORT(" : "", fExport ? ")" : "", argv[i], argv[i]);
236
237 /* flush output and check for error. */
238 fflush(pFileOut);
239 if (ferror(pFileOut))
240 fprintf(stderr, "%s: write error\n", argv[0]);
241 else
242 rc = 0; /* success! */
243 }
244 }
245
246 /* cleanup, delete the output file on failure. */
247 fclose(pFileOut);
248 fclose(pFileIn);
249 if (rc)
250 remove(argv[i+2]);
251
252 return rc;
253}
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette