o Add option -n. The -n option takes a count and breaks the line

after that many values have been printed. The line length is not
   considered anymore.
o  Add option -x. The -x option will cause the byte values to be
   printed in hexadecimal instead of decimal.
o  Bump WARNS to 6.
o  Update the manpage accordingly.
This commit is contained in:
Marcel Moolenaar 2005-05-15 06:26:59 +00:00
parent 433d61bb56
commit 77a77c66d1
3 changed files with 90 additions and 31 deletions

View File

@ -1,5 +1,5 @@
# $FreeBSD$
PROG= file2c
WARNS?= 6
.include <bsd.prog.mk>

View File

@ -7,7 +7,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd January 28, 1995
.Dd May 14, 2005
.Dt FILE2C 1
.Os
.Sh NAME
@ -15,22 +15,47 @@
.Nd convert file to c-source
.Sh SYNOPSIS
.Nm
.Op "string"
.Op "string"
.Op Fl n Ar count
.Op Fl x
.Op Ar prefix Op Ar suffix
.Sh DESCRIPTION
The
.Nm
utility reads a file from stdin and writes it to stdout, converting each
byte to its decimal representation on the fly.
byte to its decimal or hexadecimal representation on the fly.
The byte values are seperated by a comma.
This also means that the last byte value is not followed by a comma.
By default the byte values are printed in decimal, but when the
.Fl x
option is given, the values will be printed in hexadecimal.
.Pp
If the first
.Op string
is present, it is printed before the data; if the second
.Op string
is present, it is printed after the data.
If more than 70 characters are printed on the same line, that line is
ended and the output continues on the next line.
With the
.Fl n
option this can be made to happen after the specified number of
byte values have been printed.
The length of the line will not be considered anymore.
To have all the byte values printed on the same line, give the
.Fl n
option a negative number.
.Pp
This program is used to embed binary or other files into C source files,
for instance as a char[].
A prefix and suffix strings can be printed before and after the byte values
(resp.)
If a suffix is to be printed, a prefix must also be specified.
The first non-option word is the prefix, which may optionally be followed
by a word that is to be used as the suffix.
.Pp
This program is typically used to embed binary files into C source files.
The prefix is used to define an array type and the suffix is used to end
the C statement.
The
.Fl x
and
.Fl n
options are useful when the binary data represents a bitmap and the output
needs to remain readable and/or editable.
Fonts, for example, are a good example of this.
.Sh EXAMPLES
The command:
.Bd -literal -offset indent

View File

@ -10,36 +10,70 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
static void
usage(void)
{
fprintf(stderr, "usage: %s [-n count] [-x] [prefix [suffix]]\n",
getprogname());
exit(1);
}
int
main(int argc, char *argv[])
{
int i, j, k;
int c, count, linepos, maxcount, radix;
if (argc > 1)
printf("%s\n", argv[1]);
k = 0;
j = 0;
while((i = getchar()) != EOF) {
if (k++) {
maxcount = 0;
radix = 10;
while ((c = getopt(argc, argv, "n:x")) != -1) {
switch (c) {
case 'n': /* Max. number of bytes per line. */
maxcount = strtol(optarg, NULL, 10);
break;
case 'x': /* Print hexadecimal numbers. */
radix = 16;
break;
case '?':
default:
usage();
}
}
argc -= optind;
argv += optind;
if (argc > 0)
printf("%s\n", argv[0]);
count = linepos = 0;
while((c = getchar()) != EOF) {
if (count) {
putchar(',');
j++;
linepos++;
}
if (j > 70) {
if ((maxcount == 0 && linepos > 70) ||
(maxcount > 0 && count >= maxcount)) {
putchar('\n');
j = 0;
count = linepos = 0;
}
printf("%d", i);
if (i > 99)
j += 3;
else if (i > 9)
j += 2;
else
j++;
switch (radix) {
case 10:
linepos += printf("%d", c);
break;
case 16:
linepos += printf("0x%02x", c);
break;
default:
abort();
}
count++;
}
putchar('\n');
if (argc > 2)
printf("%s\n", argv[2]);
if (argc > 1)
printf("%s\n", argv[1]);
return (0);
}