annotate tools/molko-bcc.c @ 107:62aeb864093f

molko-bcc: initial import
author David Demelier <markand@malikania.fr>
date Wed, 01 Apr 2020 20:05:00 +0200
parents
children 5e38f88cb9ab
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
107
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * molko-bcc.c -- simple binary compiler
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <errno.h>
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <stdarg.h>
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <stdbool.h>
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <stdio.h>
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <stdlib.h>
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <stdnoreturn.h>
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <string.h>
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include <unistd.h>
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
27
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 static bool fstatic;
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 noreturn static void
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 usage(void)
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 {
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 fprintf(stderr, "usage: molko-bcc [-s] input varname\n");
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 exit(1);
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 }
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
36
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 noreturn static void
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 die(const char *fmt, ...)
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 {
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 va_list ap;
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
41
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 va_start(ap, fmt);
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 fputs("abort: ", stderr);
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 vfprintf(stderr, fmt, ap);
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 va_end(ap);
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 exit(1);
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 }
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 static void
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 process(const char *input, const char *variable)
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 {
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 FILE *fp;
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 int ch, idx = 0;
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
54
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 if (strcmp(input, "-") == 0)
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 fp = stdin;
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 else if (!(fp = fopen(input, "rb")))
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 die("%s: %s\n", input, strerror(errno));
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
59
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 if (fstatic)
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 printf("static ");
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
62
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 printf("const unsigned char %s[] = {\n", variable);
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
64
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 while ((ch = fgetc(fp)) != EOF) {
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 if (idx == 0)
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 putchar('\t');
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
68
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 printf("0x%02x", (unsigned char)ch);
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 if (!feof(fp))
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 printf(", ");
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
73
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 if (++idx == 4) {
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 idx = 0;
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 putchar('\n');
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 }
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 }
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
79
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 if (idx != 0)
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 printf("\n");
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
82
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 puts("};");
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 fclose(fp);
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 }
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
86
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 int
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 main(int argc, char **argv)
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 {
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 int ch;
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
91
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 while ((ch = getopt(argc, argv, "s")) != -1) {
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 switch (ch) {
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 case 's':
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 fstatic = true;
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 break;
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 default:
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 break;
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 }
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 }
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
101
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 argc -= optind;
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 argv += optind;
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
104
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 if (argc < 2)
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 usage();
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
107
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 process(argv[0], argv[1]);
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 }