file2c.c revision 200420
1219820Sjeff/*
2272407Shselasky * ----------------------------------------------------------------------------
3219820Sjeff * "THE BEER-WARE LICENSE" (Revision 42):
4219820Sjeff * <phk@FreeBSD.org> wrote this file.  As long as you retain this notice you
5219820Sjeff * can do whatever you want with this stuff. If we meet some day, and you think
6219820Sjeff * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
7219820Sjeff * ----------------------------------------------------------------------------
8219820Sjeff */
9219820Sjeff
10219820Sjeff#include <sys/cdefs.h>
11219820Sjeff__FBSDID("$FreeBSD: head/usr.bin/file2c/file2c.c 200420 2009-12-11 23:35:38Z delphij $");
12219820Sjeff
13219820Sjeff#include <stdio.h>
14219820Sjeff#include <stdlib.h>
15219820Sjeff#include <unistd.h>
16219820Sjeff
17219820Sjeffstatic void
18219820Sjeffusage(void)
19219820Sjeff{
20219820Sjeff
21219820Sjeff	fprintf(stderr, "usage: %s [-sx] [-n count] [prefix [suffix]]\n",
22219820Sjeff	    getprogname());
23219820Sjeff	exit(1);
24219820Sjeff}
25219820Sjeff
26219820Sjeffint
27219820Sjeffmain(int argc, char *argv[])
28219820Sjeff{
29219820Sjeff	int c, count, linepos, maxcount, pretty, radix;
30219820Sjeff
31219820Sjeff	maxcount = 0;
32219820Sjeff	pretty = 0;
33219820Sjeff	radix = 10;
34219820Sjeff	while ((c = getopt(argc, argv, "n:sx")) != -1) {
35219820Sjeff		switch (c) {
36219820Sjeff		case 'n':	/* Max. number of bytes per line. */
37219820Sjeff			maxcount = strtol(optarg, NULL, 10);
38219820Sjeff			break;
39219820Sjeff		case 's':	/* Be more style(9) comliant. */
40219820Sjeff			pretty = 1;
41255932Salfred			break;
42255932Salfred		case 'x':	/* Print hexadecimal numbers. */
43219820Sjeff			radix = 16;
44219820Sjeff			break;
45219820Sjeff		case '?':
46219820Sjeff		default:
47219820Sjeff			usage();
48255932Salfred		}
49255932Salfred	}
50219820Sjeff	argc -= optind;
51219820Sjeff	argv += optind;
52219820Sjeff
53219820Sjeff	if (argc > 0)
54219820Sjeff		printf("%s\n", argv[0]);
55219820Sjeff	count = linepos = 0;
56272407Shselasky	while((c = getchar()) != EOF) {
57255932Salfred		if (count) {
58219820Sjeff			putchar(',');
59219820Sjeff			linepos++;
60219820Sjeff		}
61219820Sjeff		if ((maxcount == 0 && linepos > 70) ||
62219820Sjeff		    (maxcount > 0 && count >= maxcount)) {
63219820Sjeff			putchar('\n');
64219820Sjeff			count = linepos = 0;
65219820Sjeff		}
66219820Sjeff		if (pretty) {
67219820Sjeff			if (count) {
68219820Sjeff				putchar(' ');
69219820Sjeff				linepos++;
70219820Sjeff			} else {
71219820Sjeff				putchar('\t');
72219820Sjeff				linepos += 8;
73219820Sjeff			}
74219820Sjeff		}
75219820Sjeff		switch (radix) {
76219820Sjeff		case 10:
77219820Sjeff			linepos += printf("%d", c);
78219820Sjeff			break;
79219820Sjeff		case 16:
80219820Sjeff			linepos += printf("0x%02x", c);
81219820Sjeff			break;
82219820Sjeff		default:
83219820Sjeff			abort();
84219820Sjeff		}
85219820Sjeff		count++;
86219820Sjeff	}
87219820Sjeff	putchar('\n');
88219820Sjeff	if (argc > 1)
89219820Sjeff		printf("%s\n", argv[1]);
90219820Sjeff	return (0);
91219820Sjeff}
92219820Sjeff