35 if (*
s ==
'x' || *
s ==
'X') {
68 int (*cb)(
void *state,
const char *
s),
void *state) {
70 const char *
s = *current;
78 return cb(state,
"&");
83 return cb(state,
"<");
86 return cb(state,
">");
89 if (c ==
'-' &&
flags.dash)
90 return cb(state,
"-");
92 if (c ==
' ' && previous ==
' ' &&
flags.nbsp)
94 return cb(state,
" ");
97 return cb(state,
""");
100 return cb(state,
"'");
102 if (c ==
'\n' &&
flags.raw)
103 return cb(state,
" ");
105 if (c ==
'\r' &&
flags.raw)
106 return cb(state,
" ");
108 unsigned char uc = (
unsigned char)c;
109 if (uc > 0x7f &&
flags.utf8) {
123 size_t length = (uc >> 5) == 6 ? 2
124 : (uc >> 4) == 14 ? 3
125 : (uc >> 3) == 30 ? 4
129 bool is_invalid =
length == 0;
130 for (
size_t l = 1; !is_invalid &&
length > l; ++l)
131 is_invalid |=
s[l] ==
'\0';
135 fprintf(stderr,
"Error during conversion to \"UTF-8\". Quiting.\n");
141 uint32_t utf8_char = 0;
144 uint32_t low = ((uint32_t)
s[1]) & ((1 << 6) - 1);
145 uint32_t high = ((uint32_t)
s[0]) & ((1 << 5) - 1);
146 utf8_char = low | (high << 6);
150 uint32_t low = ((uint32_t)
s[2]) & ((1 << 6) - 1);
151 uint32_t mid = ((uint32_t)
s[1]) & ((1 << 6) - 1);
152 uint32_t high = ((uint32_t)
s[0]) & ((1 << 4) - 1);
153 utf8_char = low | (mid << 6) | (high << 12);
157 uint32_t low = ((uint32_t)
s[3]) & ((1 << 6) - 1);
158 uint32_t mid1 = ((uint32_t)
s[2]) & ((1 << 6) - 1);
159 uint32_t mid2 = ((uint32_t)
s[1]) & ((1 << 6) - 1);
160 uint32_t high = ((uint32_t)
s[0]) & ((1 << 3) - 1);
161 utf8_char = low | (mid1 << 6) | (mid2 << 12) | (high << 18);
169 char buffer[
sizeof(
"�")];
172 snprintf(buffer,
sizeof(buffer),
"&#x%" PRIx32
";", utf8_char);
177 return cb(state, buffer);
181 char buffer[2] = {c,
'\0'};
182 return cb(state, buffer);
186 int (*cb)(
void *state,
const char *
s),
void *state) {
187 char previous =
'\0';
204static int put(
void *stream,
const char *
s) {
return fputs(
s, stream); }
207int main(
int argc,
char **argv) {
212 for (i = 1; i < argc; ++i) {
213 if (strcmp(argv[i],
"--dash") == 0) {
215 }
else if (strcmp(argv[i],
"--nbsp") == 0) {
217 }
else if (strcmp(argv[i],
"--raw") == 0) {
219 }
else if (strcmp(argv[i],
"--utf8") == 0) {
221 }
else if (argv[i][0] ==
'-') {
222 fprintf(stderr,
"unrecognized argument %s\n", argv[i]);
232 "usage: %s [--dash] [--nbsp] [--raw] [--utf8] <input> <output>\n",
237 const char *
const in = argv[i];
238 const char *
const out = argv[i + 1];
241 char buffer[128] = {0};
243 FILE *
const f = fopen(
in,
"rb");
245 fprintf(stderr,
"failed to open %s: %s\n",
in, strerror(errno));
248 const size_t read = fread(buffer, 1,
sizeof(buffer), f);
250 if (
read == 0 ||
read ==
sizeof(buffer)) {
253 " bytes is supported, not %" PRISIZE_T " bytes\n",
254 sizeof(buffer) - 1,
read);
260 FILE *
const f = fopen(
out,
"wb");
262 fprintf(stderr,
"failed to open %s: %s\n",
out, strerror(errno));
static void out(agerrlevel_t level, const char *fmt, va_list args)
Report messages using a user-supplied or default write function.
static Extype_t length(Exid_t *rhs, Exdisc_t *disc)
static int in(Extype_t lhs, Exid_t *rhs, Exdisc_t *disc)
static int put(void *buffer, const char *s)
static NORETURN void graphviz_exit(int status)
replacements for ctype.h functions
static bool gv_isxdigit(int c)
static bool gv_isdigit(int c)
static bool gv_isalpha(int c)
options to tweak the behavior of XML escaping
int gv_xml_escape(const char *s, xml_flags_t flags, int(*cb)(void *state, const char *s), void *state)
static bool xml_isentity(const char *s)
static int xml_core(char previous, const char **current, xml_flags_t flags, int(*cb)(void *state, const char *s), void *state)
XML escaping functionality.