blob: 0a3cf00d88ee7c2867fc28975b9ed200b71b5993 [file] [log] [blame]
Gavin Howardf8333992018-02-19 13:55:25 -07001/*
Gavin Howardb5904bf2018-02-20 13:28:18 -07002 * *****************************************************************************
Gavin Howardf8333992018-02-19 13:55:25 -07003 *
Gavin Howardb5904bf2018-02-20 13:28:18 -07004 * Copyright 2018 Gavin D. Howard
Gavin Howardf8333992018-02-19 13:55:25 -07005 *
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11 * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
14 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15 * PERFORMANCE OF THIS SOFTWARE.
16 *
Gavin Howardb5904bf2018-02-20 13:28:18 -070017 * *****************************************************************************
Gavin Howardf8333992018-02-19 13:55:25 -070018 *
19 * Generates a const array from a bc script.
20 *
21 */
22
23#include <stdio.h>
Gavin Howard207053c2018-02-20 11:12:43 -070024#include <stdlib.h>
25#include <string.h>
26
27#include <libgen.h>
Gavin Howardf8333992018-02-19 13:55:25 -070028
Gavin Howard1ba6bee2018-03-08 11:52:45 -070029static const char *bc_gen_usage = "usage: gen bc_script output [header]\n";
Gavin Howardfe2351d2018-02-19 14:10:15 -070030
31#define INVALID_PARAMS (1)
Gavin Howard207053c2018-02-20 11:12:43 -070032#define MALLOC_FAIL (2)
33#define INVALID_INPUT_FILE (3)
34#define INVALID_OUTPUT_FILE (4)
Gavin Howard1ba6bee2018-03-08 11:52:45 -070035#define INVALID_HEADER_FILE (5)
36#define IO_ERR (6)
Gavin Howardf8333992018-02-19 13:55:25 -070037
Gavin Howard8d1f1db2018-02-23 11:29:41 -070038int main(int argc, char *argv[]) {
Gavin Howardf8333992018-02-19 13:55:25 -070039
Gavin Howard1ba6bee2018-03-08 11:52:45 -070040 FILE *in;
41 FILE *out;
42 FILE *header;
43 char *header_name;
44 char *header_buf;
Gavin Howardf8333992018-02-19 13:55:25 -070045 int c;
46 int count;
Gavin Howard1ba6bee2018-03-08 11:52:45 -070047 char *buffer;
48 size_t len, read;
Gavin Howard8d1f1db2018-02-23 11:29:41 -070049 char *buf;
50 char *base;
Gavin Howardd571acf2018-02-20 17:13:07 -070051 int err;
52
53 err = 0;
Gavin Howardf8333992018-02-19 13:55:25 -070054
Gavin Howard1ba6bee2018-03-08 11:52:45 -070055 if (argc < 3) {
Gavin Howardd8a2b502018-02-24 13:26:48 -070056 printf("%s", bc_gen_usage);
Gavin Howardfe2351d2018-02-19 14:10:15 -070057 return INVALID_PARAMS;
Gavin Howardf8333992018-02-19 13:55:25 -070058 }
59
Gavin Howard207053c2018-02-20 11:12:43 -070060 buf = malloc(strlen(argv[1]) + 1);
61
62 if (!buf) return MALLOC_FAIL;
63
64 strcpy(buf, argv[1]);
65
66 base = basename(buf);
67
Gavin Howardf8333992018-02-19 13:55:25 -070068 in = fopen(argv[1], "r");
69
Gavin Howardd571acf2018-02-20 17:13:07 -070070 if (!in) {
71 err = INVALID_INPUT_FILE;
72 goto in_err;
73 }
Gavin Howardf8333992018-02-19 13:55:25 -070074
75 out = fopen(argv[2], "w");
76
Gavin Howardd571acf2018-02-20 17:13:07 -070077 if (!out) {
78 err = INVALID_OUTPUT_FILE;
79 goto out_err;
80 }
Gavin Howardf8333992018-02-19 13:55:25 -070081
Gavin Howard1ba6bee2018-03-08 11:52:45 -070082 if (argc >= 4) header_name = argv[3];
83 else header_name = "src/lib/header.c";
84
85 header = fopen(header_name, "r");
86
87 if (!header) {
88 err = INVALID_HEADER_FILE;
89 goto header_err;
90 }
91
92 fseek(header, 0, SEEK_END);
93 len = ftell(header);
94 fseek(header, 0, SEEK_SET);
95
96 buffer = malloc(len + 1);
97
98 if (!buffer) {
99 err = MALLOC_FAIL;
100 goto buffer_err;
101 }
102
103 read = fread(buffer, 1, len, header);
104
105 if (read != len) {
106 err = IO_ERR;
107 goto header_buf_err;
108 }
109
110 buffer[len] = '\0';
111
112 header_buf = malloc(len + strlen(base) + 1);
113
114 if (!header_buf) {
115 err= MALLOC_FAIL;
116 goto header_buf_err;
117 }
118
119 if (sprintf(header_buf, buffer, base) < 0) {
120 err = IO_ERR;
121 goto error;
122 }
123
Gavin Howardf8333992018-02-19 13:55:25 -0700124 count = 0;
125
Gavin Howard1ba6bee2018-03-08 11:52:45 -0700126 if (fputs(header_buf, out) == EOF) {
Gavin Howardd571acf2018-02-20 17:13:07 -0700127 err = IO_ERR;
128 goto error;
129 }
Gavin Howard207053c2018-02-20 11:12:43 -0700130
Gavin Howard8d1f1db2018-02-23 11:29:41 -0700131 if (fprintf(out, "const char *bc_lib_name = \"%s\";\n\n", base) < 0) {
Gavin Howardd571acf2018-02-20 17:13:07 -0700132 err = IO_ERR;
133 goto error;
134 }
Gavin Howardfe2351d2018-02-19 14:10:15 -0700135
Gavin Howardd571acf2018-02-20 17:13:07 -0700136 if (fprintf(out, "const unsigned char bc_lib[] = {\n") < 0) {
137 err = IO_ERR;
138 goto error;
139 }
Gavin Howardf8333992018-02-19 13:55:25 -0700140
141 while ((c = fgetc(in)) >= 0) {
142
Gavin Howardfe2351d2018-02-19 14:10:15 -0700143 int val;
Gavin Howardf8333992018-02-19 13:55:25 -0700144
Gavin Howardfe2351d2018-02-19 14:10:15 -0700145 if (!count) {
Gavin Howardd571acf2018-02-20 17:13:07 -0700146 if (fprintf(out, " ") < 0) {
147 err = IO_ERR;
148 goto error;
149 }
Gavin Howardfe2351d2018-02-19 14:10:15 -0700150 }
151
152 val = fprintf(out, "%d,", c);
153
Gavin Howardd571acf2018-02-20 17:13:07 -0700154 if (val < 0) {
155 err = IO_ERR;
156 goto error;
157 }
Gavin Howardfe2351d2018-02-19 14:10:15 -0700158
159 count += val;
Gavin Howardf8333992018-02-19 13:55:25 -0700160
161 if (count > 72) {
Gavin Howardd571acf2018-02-20 17:13:07 -0700162
Gavin Howardf8333992018-02-19 13:55:25 -0700163 count = 0;
Gavin Howardd571acf2018-02-20 17:13:07 -0700164
165 if (fputc('\n', out) == EOF) {
166 err = IO_ERR;
167 goto error;
168 }
Gavin Howardf8333992018-02-19 13:55:25 -0700169 }
170 }
171
Gavin Howard8bdbb1f2018-02-20 16:17:16 -0700172 if (!count) {
Gavin Howardd571acf2018-02-20 17:13:07 -0700173 if (fputc('\n', out) == EOF) {
174 err = IO_ERR;
175 goto error;
176 }
Gavin Howardfe2351d2018-02-19 14:10:15 -0700177 }
Gavin Howardf8333992018-02-19 13:55:25 -0700178
Gavin Howardd571acf2018-02-20 17:13:07 -0700179 if (fprintf(out, "0\n};\n") < 0) {
180 err = IO_ERR;
181 goto error;
182 }
Gavin Howardf8333992018-02-19 13:55:25 -0700183
Gavin Howardd571acf2018-02-20 17:13:07 -0700184error:
185
Gavin Howard1ba6bee2018-03-08 11:52:45 -0700186 free(header_buf);
187
188header_buf_err:
189
190 free(buffer);
191
192buffer_err:
193
194 fclose(header);
195
196header_err:
197
Gavin Howardf8333992018-02-19 13:55:25 -0700198 fclose(out);
199
Gavin Howardd571acf2018-02-20 17:13:07 -0700200out_err:
201
202 fclose(in);
203
204in_err:
205
206 free(buf);
207
208 return err;
Gavin Howardf8333992018-02-19 13:55:25 -0700209}