diff options
author | marcel <marcel@FreeBSD.org> | 2005-05-15 06:26:59 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2005-05-15 06:26:59 +0000 |
commit | bd9685053c859ebeb3b57e83a946081de6f179f1 (patch) | |
tree | b49e3841106472a50c1fbac5a9430b35cb98103e /usr.bin/file2c | |
parent | 09647ee931869435d500b0f24b91d25af5145f6f (diff) | |
download | FreeBSD-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/Makefile | 2 | ||||
-rw-r--r-- | usr.bin/file2c/file2c.1 | 47 | ||||
-rw-r--r-- | usr.bin/file2c/file2c.c | 72 |
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); } |