summaryrefslogtreecommitdiffstats
path: root/usr.bin/file2c
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2005-05-15 06:26:59 +0000
committermarcel <marcel@FreeBSD.org>2005-05-15 06:26:59 +0000
commitbd9685053c859ebeb3b57e83a946081de6f179f1 (patch)
treeb49e3841106472a50c1fbac5a9430b35cb98103e /usr.bin/file2c
parent09647ee931869435d500b0f24b91d25af5145f6f (diff)
downloadFreeBSD-src-bd9685053c859ebeb3b57e83a946081de6f179f1.zip
FreeBSD-src-bd9685053c859ebeb3b57e83a946081de6f179f1.tar.gz
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.
Diffstat (limited to 'usr.bin/file2c')
-rw-r--r--usr.bin/file2c/Makefile2
-rw-r--r--usr.bin/file2c/file2c.147
-rw-r--r--usr.bin/file2c/file2c.c72
3 files changed, 90 insertions, 31 deletions
diff --git a/usr.bin/file2c/Makefile b/usr.bin/file2c/Makefile
index e88a3bc..c3c6ddc 100644
--- a/usr.bin/file2c/Makefile
+++ b/usr.bin/file2c/Makefile
@@ -1,5 +1,5 @@
# $FreeBSD$
PROG= file2c
-
+WARNS?= 6
.include <bsd.prog.mk>
diff --git a/usr.bin/file2c/file2c.1 b/usr.bin/file2c/file2c.1
index e77bdfd..f247e42 100644
--- a/usr.bin/file2c/file2c.1
+++ b/usr.bin/file2c/file2c.1
@@ -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
diff --git a/usr.bin/file2c/file2c.c b/usr.bin/file2c/file2c.c
index 18c8be2..8e16bbb 100644
--- a/usr.bin/file2c/file2c.c
+++ b/usr.bin/file2c/file2c.c
@@ -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);
}
OpenPOWER on IntegriCloud