diff options
author | Tom Ryder <tom@sanctum.geek.nz> | 2019-12-22 19:49:56 +1300 |
---|---|---|
committer | Tom Ryder <tom@sanctum.geek.nz> | 2021-09-20 16:05:31 +1200 |
commit | 951834e774ae8510cdcdf5dcccc467f4e1b242fb (patch) | |
tree | 776e585b4b6ebaa92440ce1a49ec207e36bea22d | |
parent | Make some dense code a little less opaque (diff) | |
download | wtf8-951834e774ae8510cdcdf5dcccc467f4e1b242fb.tar.gz wtf8-951834e774ae8510cdcdf5dcccc467f4e1b242fb.zip |
Refactor for legibility
-rw-r--r-- | wtf8.c | 63 | ||||
-rw-r--r-- | wtf8.h | 4 |
2 files changed, 41 insertions, 26 deletions
@@ -1,31 +1,31 @@ #include "wtf8.h" /* - * Check if first two bits of the character are "10", meaning it's a UTF-8 + * Check if first two bits of the character are "10", meaning it'str a UTF-8 * continuation character */ -int is_utf8_cont(unsigned char c) { - return (c & 0xC0) == 0x80; +int is_utf8_cont(unsigned char chr) { + return (chr & 0xC0) == 0x80; } /* * Print each octet of a string of characters as lowercase hex followed by a * trailing space, ending with a newline */ -void print_octets(char *s) { - unsigned char c; +void print_octets(FILE *stream, char *str) { + unsigned char chr; /* * Iterate through the string, printing each octet, ending with a newline */ - while ((c = *s++)) { + while ((chr = *str++)) { char sep; - sep = is_utf8_cont(c) + sep = is_utf8_cont(chr) ? BYTE_SEP : CHAR_SEP; - printf("%c%02x", sep, c); + fprintf(stream, "%c%02x", sep, chr); } - putchar('\n'); + fputc('\n', stream); return; } @@ -35,37 +35,52 @@ void print_octets(char *s) { * print_octets(), with each character in line with the end of the octet that * terminates it, ending with a newline */ -void print_characters(char *s) { - - /* - * We need a short counter to find how long each character is - */ - unsigned char c; +void print_characters(FILE *stream, char *str) { /* * Iterate through the string */ - while (*s) { + while (*str) { + + /* + * We need a short counter to find how long each character is + */ + unsigned char chr; /* * Print blanks and increment a counter until we find how long this * character is */ - for (c = 1; is_utf8_cont(s[c]) && c <= UCHAR_MAX; c++) - printf(" "); + for (chr = 1; is_utf8_cont(str[chr]); chr++) { + + /* + * Print blanks + */ + fprintf(stream, " "); + + /* + * If we've hit UCHAR_MAX, this is probably a perverse + * string of bytes for fuzzing or exploitation; bail + * out + */ + if (chr == UCHAR_MAX) { + fprintf(stderr, "Perverse byte count, bailing\n"); + exit(1); + } + } /* * Print two spaces, and then the full character */ - printf(" "); - while (c--) - putchar(*s++); + fprintf(stream, " "); + while (chr--) + fputc(*str++, stream); } /* * End with a newline */ - putchar('\n'); + fputc('\n', stream); return; } @@ -84,8 +99,8 @@ int main(int argc, char **argv) { * Print the sole argument first as hex octets, then as characters, spaced * accordingly */ - print_octets(argv[1]); - print_characters(argv[1]); + print_octets(stdout, argv[1]); + print_characters(stdout, argv[1]); /* * Done! @@ -6,5 +6,5 @@ #define CHAR_SEP ' ' int is_utf8_cont(unsigned char); -void print_octets(char *); -void print_characters(char *); +void print_octets(FILE *, char *); +void print_characters(FILE *, char *); |