root/usr.bin/file2c/file2c.c
/*
 * ----------------------------------------------------------------------------
 * "THE BEER-WARE LICENSE" (Revision 42):
 * <phk@FreeBSD.org> wrote this file.  As long as you retain this notice you
 * can do whatever you want with this stuff. If we meet some day, and you think
 * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
 * ----------------------------------------------------------------------------
 */

#include <sys/cdefs.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

static void
usage(void)
{

        fprintf(stderr, "usage: %s [-sx] [-n count] [prefix [suffix]]\n",
            getprogname());
        exit(1);
}

int
main(int argc, char *argv[])
{
        int c, count, linepos, maxcount, pretty, radix;

        maxcount = 0;
        pretty = 0;
        radix = 10;
        while ((c = getopt(argc, argv, "n:sx")) != -1) {
                switch (c) {
                case 'n':       /* Max. number of bytes per line. */
                        maxcount = strtol(optarg, NULL, 10);
                        break;
                case 's':       /* Be more style(9) comliant. */
                        pretty = 1;
                        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(',');
                        linepos++;
                }
                if ((maxcount == 0 && linepos > 70) ||
                    (maxcount > 0 && count >= maxcount)) {
                        putchar('\n');
                        count = linepos = 0;
                }
                if (pretty) {
                        if (count) {
                                putchar(' ');
                                linepos++;
                        } else {
                                putchar('\t');
                                linepos += 8;
                        }
                }
                switch (radix) {
                case 10:
                        linepos += printf("%d", c);
                        break;
                case 16:
                        linepos += printf("0x%02x", c);
                        break;
                default:
                        abort();
                }
                count++;
        }
        putchar('\n');
        if (argc > 1)
                printf("%s\n", argv[1]);
        return (0);
}