sfeed

Simple RSS and Atom feed parser
git clone https://git.sinitax.com/codemadness/sfeed
Log | Files | Refs | README | LICENSE | Upstream | sfeed.txt

commit 880256b8bfde746cd54993f3abcb4dc648895af7
parent a58fa45f25da4f18d7b8c1a815884f67b965406f
Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date:   Mon, 28 Mar 2022 18:36:20 +0200

compatibility: replace iscntrl with own ISCNTRL macro

It is unspecified if the C locale iscntrl is compatible with ASCII or not.

Noticed when testing on OpenBSD 3.8 which uses extended ASCII and also uses the
C1 range for control-characters.  This breaks support with UTF-8.

Reference:
https://en.wikipedia.org/wiki/C0_and_C1_control_codes#C1_control_codes_for_general_use
C1 table.

Force an own definition of an ASCII-compatible control-character range since
sfeed expects input to be UTF-8 (or converted from iconv) and so output to be
UTF-8 aswell.

Diffstat:
Msfeed.c | 4++--
Msfeed_opml_import.c | 2+-
Msfeed_web.c | 2+-
Mutil.h | 3+++
4 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/sfeed.c b/sfeed.c @@ -326,7 +326,7 @@ string_print_encoded(String *s) case '\t': putchar('\\'); putchar('t'); break; default: /* ignore control chars */ - if (!iscntrl((unsigned char)*p)) + if (!ISCNTRL((unsigned char)*p)) putchar(*p); break; } @@ -343,7 +343,7 @@ printtrimmed(const char *s) for (; *p && p != e; p++) { if (isspace((unsigned char)*p)) putchar(' '); /* any whitespace to space */ - else if (!iscntrl((unsigned char)*p)) + else if (!ISCNTRL((unsigned char)*p)) /* ignore other control chars */ putchar(*p); } diff --git a/sfeed_opml_import.c b/sfeed_opml_import.c @@ -12,7 +12,7 @@ static void printsafe(const char *s) { for (; *s; s++) { - if (iscntrl((unsigned char)*s)) + if (ISCNTRL((unsigned char)*s)) continue; else if (*s == '\\') fputs("\\\\", stdout); diff --git a/sfeed_web.c b/sfeed_web.c @@ -16,7 +16,7 @@ static void printvalue(const char *s) { for (; *s; s++) - if (!iscntrl((unsigned char)*s)) + if (!ISCNTRL((unsigned char)*s)) putchar(*s); } diff --git a/util.h b/util.h @@ -8,6 +8,9 @@ #define unveil(p1,p2) 0 #endif +/* control-character in the ASCII range 0-127: compatible with UTF-8 */ +#define ISCNTRL(c) ((c) < ' ' || (c) == 0x7f) + #undef strcasestr char *strcasestr(const char *, const char *); #undef strlcat