Blame
Date:
Tue Feb 8 22:43:32 2022 UTC
Message:
prettify pagebundler output
001
2021-07-18
op
/*
002
2022-02-08
op
* Copyright (c) 2022, 2021 Omar Polo <op@omarpolo.com>
003
2021-07-18
op
*
004
2021-07-18
op
* Permission to use, copy, modify, and distribute this software for any
005
2021-07-18
op
* purpose with or without fee is hereby granted, provided that the above
006
2021-07-18
op
* copyright notice and this permission notice appear in all copies.
007
2021-07-18
op
*
008
2021-07-18
op
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
009
2021-07-18
op
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
010
2021-07-18
op
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
011
2021-07-18
op
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
012
2021-07-18
op
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
013
2021-07-18
op
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
014
2021-07-18
op
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
015
2021-07-18
op
*/
016
2021-07-18
op
017
2021-07-18
op
/*
018
2021-07-18
op
* pagebundler converts the given file into a valid C program that can
019
2021-07-18
op
* be compiled. The generated code provides a variable that holds the
020
2021-07-18
op
* content of the original file and a _len variable with the size.
021
2021-07-18
op
*
022
2022-02-08
op
* Usage: pagebundler file > outfile
023
2021-07-18
op
*/
024
2021-07-18
op
025
2022-02-08
op
#include <ctype.h>
026
2021-07-18
op
#include <errno.h>
027
2022-02-08
op
#include <limits.h>
028
2021-07-18
op
#include <stdint.h>
029
2021-07-18
op
#include <stdio.h>
030
2022-02-08
op
#include <stdlib.h>
031
2021-07-18
op
#include <string.h>
032
2021-07-18
op
#include <unistd.h>
033
2021-07-18
op
034
2022-02-08
op
static void
035
2022-02-08
op
setfname(const char *fname, char *buf, size_t siz)
036
2022-02-08
op
{
037
2022-02-08
op
const char *c, *d;
038
2022-02-08
op
size_t len;
039
2021-07-18
op
040
2022-02-08
op
if ((c = strrchr(fname, '/')) != NULL)
041
2022-02-08
op
c++;
042
2022-02-08
op
else
043
2022-02-08
op
c = fname;
044
2022-02-08
op
045
2022-02-08
op
if ((d = strrchr(fname, '.')) == NULL || c > d)
046
2022-02-08
op
d = strchr(fname, '\0');
047
2022-02-08
op
048
2022-02-08
op
len = d - c;
049
2022-02-08
op
if (len >= siz) {
050
2022-02-08
op
fprintf(stderr, "file name too long: %s\n", fname);
051
2022-02-08
op
exit(1);
052
2022-02-08
op
}
053
2022-02-08
op
054
2022-02-08
op
memcpy(buf, c, len);
055
2022-02-08
op
buf[len] = '\0';
056
2022-02-08
op
}
057
2022-02-08
op
058
2022-02-08
op
static int
059
2022-02-08
op
validc(int c)
060
2022-02-08
op
{
061
2022-02-08
op
return isprint(c) && c != '\\' && c != '\'' && c != '\n';
062
2022-02-08
op
}
063
2022-02-08
op
064
2021-07-18
op
int
065
2021-07-18
op
main(int argc, char **argv)
066
2021-07-18
op
{
067
2022-02-08
op
size_t len, r, i, n;
068
2022-02-08
op
int did;
069
2022-02-08
op
FILE *f;
070
2022-02-08
op
uint8_t buf[BUFSIZ];
071
2022-02-08
op
char varname[PATH_MAX];
072
2021-07-18
op
073
2022-02-08
op
if (argc != 2) {
074
2022-02-08
op
fprintf(stderr, "usage: %s file\n", *argv);
075
2021-07-18
op
return 1;
076
2021-07-18
op
}
077
2021-07-18
op
078
2022-02-08
op
setfname(argv[1], varname, sizeof(varname));
079
2022-02-08
op
080
2022-02-08
op
if ((f = fopen(argv[1], "r")) == NULL) {
081
2021-07-18
op
fprintf(stderr, "%s: can't open %s: %s",
082
2022-02-08
op
argv[0], argv[1], strerror(errno));
083
2021-07-18
op
return 1;
084
2021-07-18
op
}
085
2021-07-18
op
086
2022-02-08
op
printf("const uint8_t %s[] = {", varname);
087
2021-07-18
op
088
2021-07-18
op
did = 0;
089
2021-07-18
op
len = 0;
090
2022-02-08
op
n = 0;
091
2021-08-26
op
for (;;) {
092
2021-07-18
op
r = fread(buf, 1, sizeof(buf), f);
093
2021-07-18
op
len += r;
094
2021-07-18
op
095
2021-07-18
op
if (r != 0)
096
2021-07-18
op
did = 1;
097
2021-07-18
op
098
2022-02-08
op
for (i = 0; i < r; ++i, ++n) {
099
2022-02-08
op
if (n % 12 == 0)
100
2022-02-08
op
printf("\n\t");
101
2022-02-08
op
else
102
2022-02-08
op
printf(" ");
103
2022-02-08
op
104
2022-02-08
op
if (validc(buf[i]))
105
2022-02-08
op
printf("'%c',", buf[i]);
106
2022-02-08
op
else if (buf[i] == '\n')
107
2022-02-08
op
printf("'\\n',");
108
2022-02-08
op
else
109
2022-02-08
op
printf("0x%x,", buf[i]);
110
2021-07-18
op
}
111
2021-07-18
op
printf("\n");
112
2021-07-18
op
113
2021-07-18
op
if (r != sizeof(buf))
114
2021-07-18
op
break;
115
2021-07-18
op
}
116
2021-07-18
op
117
2021-07-18
op
if (!did) {
118
2021-07-18
op
/*
119
2021-07-18
op
* if nothing was emitted, add a NUL byte. This was
120
2021-07-18
op
* still produce an exact copy of the file because
121
2021-07-18
op
* `len' doesn't count this NUL byte. It prevents the
122
2021-07-18
op
* "use of GNU empty initializer extension" warning
123
2021-07-18
op
* when bundling pages/about_empty.gmi
124
2021-07-18
op
*/
125
2021-07-18
op
printf("\t0x0\n");
126
2021-07-18
op
}
127
2021-07-18
op
128
2021-07-18
op
printf("}; /* %s */\n", varname);
129
2021-07-18
op
130
2021-07-18
op
printf("size_t %s_len = %zu;\n", varname, len);
131
2021-07-18
op
132
2021-07-18
op
fclose(f);
133
2021-07-18
op
return 0;
134
2021-07-18
op
}
Omar Polo