diff --git a/Makefile b/Makefile index aebbbe4..b04f625 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ HDRS= OBJS= $(SRCS:.c=.o) CC=gcc #CC=mipsel-linux-gcc -CFLAGS=-g +CFLAGS=-g -std=c99 -D_XOPEN_SOURCE=700 INCS= LIBS=-lsqlite3 WARN=-pedantic -Wall -W -Wnested-externs -Wpointer-arith -Wno-long-long diff --git a/tvdb.c b/tvdb.c index 7e68e56..ab3922c 100644 --- a/tvdb.c +++ b/tvdb.c @@ -51,23 +51,31 @@ unescape(char *txt) char *p = txt; int l = strlen(txt); - while ((p = strchr(p, '&'))) + for (; (p = strchr(p, '&')); p++) { - HANDLE(""", '"', 5); - HANDLE("&", '&', 4); - HANDLE(" ", '\n', 4); - HANDLE(" ", '\r', 4); - p++; + int ll = 0; + unsigned char icode; + /* sscanf -> 1: the code was read; ll>0: ';' came next */ + if ((1 == sscanf( p, "&#%hhu;%n", &icode, &ll) || + 1 == sscanf( p, "&#%*[xX]%hhx;%n", &icode, &ll)) && + ll > 0) { + /* &#x;, &#; */ + HANDLE(p, (char)icode, ll-1); + } else { + HANDLE("&", '&', 4); + HANDLE(""", '"', 5); + HANDLE("'", '\'', 5); + HANDLE("<", '<', 3); + HANDLE(">", '>', 3); + } } - p = txt; - while ((p = memchr(p, '\xe2', l - (p - txt)))) - { + for (p = txt; (p = memchr(p, '\xe2', l - (p - txt))); p++) + { /* curly apostrophe, en dash, curly quotes */ HANDLE("\xe2\x80\x99", '\'', 2); HANDLE("\xe2\x80\x93", '-', 2); HANDLE("\xe2\x80\x9c", '"', 2); HANDLE("\xe2\x80\x9d", '"', 2); - p++; } if ((p = strpbrk(txt, "\n\r")))