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:
parent
433d61bb56
commit
77a77c66d1
@ -1,5 +1,5 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG= file2c
|
||||
|
||||
WARNS?= 6
|
||||
.include <bsd.prog.mk>
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user