shithub: libtags

Download patch

ref: bde3359eb05ab492444a9ce87c05d855524c33b8
parent: 1ea45f339a2046b608a05417c2a124eedd82f384
author: Sigrid Solveig Haflínudóttir <ftrvxmtrx@gmail.com>
date: Thu Apr 29 15:40:08 EDT 2021

mod formats: use CP437 as the default encoding

binary files /dev/null b/437.c differ
--- a/it.c
+++ b/it.c
@@ -3,12 +3,13 @@
 int
 tagit(Tagctx *ctx)
 {
-	char d[4+26+1];
+	char d[4+26+1], o[26*UTFmax+1];
 
 	if(ctx->read(ctx, d, 4+26) != 4+26 || memcmp(d, "IMPM", 4) != 0)
 		return -1;
 	d[4+26] = 0;
-	txtcb(ctx, Ttitle, "", d+4);
+	cp437toutf8(o, sizeof(o), d+4, 26);
+	txtcb(ctx, Ttitle, "", o);
 
 	return 0;
 }
--- a/mkfile
+++ b/mkfile
@@ -2,6 +2,7 @@
 LIB=/$objtype/lib/libtags.a
 
 OFILES=\
+	437.$O\
 	8859.$O\
 	flac.$O\
 	id3genres.$O\
--- a/mod.c
+++ b/mod.c
@@ -1,7 +1,7 @@
 #include "tagspriv.h"
 
 /* insane. */
-static char* variants[] =
+static char *variants[] =
 {
 	"M.K.",
 	"M!K!",
@@ -24,23 +24,25 @@
 int
 tagmod(Tagctx *ctx)
 {
-	char d[20+1];
+	char d[20], o[20*UTFmax+1];
 	int i;
 
-	if (ctx->seek(ctx, 1080, 0) != 1080)
+	if(ctx->seek(ctx, 1080, 0) != 1080)
 		return -1;
-	if (ctx->read(ctx, d, 4) != 4)
+	if(ctx->read(ctx, d, 4) != 4)
 		return -1;
-	for (i = 0; ; i++)
-		if (variants[i] == nil)
+	for(i = 0; ; i++){
+		if(variants[i] == nil)
 			return -1;
-		else if (memcmp(d, variants[i], 4) == 0)
+		if(memcmp(d, variants[i], 4) == 0)
 			break;
-	memset(d, 0, sizeof d);
-	if (ctx->seek(ctx, 0, 0) != 0)
+	}
+	if(ctx->seek(ctx, 0, 0) != 0)
 		return -1;
-	if (ctx->read(ctx, d, 20) != 20)
+	if(ctx->read(ctx, d, 20) != 20)
 		return -1;
-	txtcb(ctx, Ttitle, "", d);
+	cp437toutf8(o, sizeof(o), d, 20);
+	txtcb(ctx, Ttitle, "", o);
+
 	return 0;
 }
--- a/s3m.c
+++ b/s3m.c
@@ -3,7 +3,7 @@
 int
 tags3m(Tagctx *ctx)
 {
-	char d[28+1+1], *s;
+	char d[28+1+1], o[28*UTFmax+1], *s;
 
 	if(ctx->read(ctx, d, 28+1+1) != 28+1+1 || (d[28] != 0x1a && d[28] != 0) || d[29] != 0x10)
 		return -1;
@@ -10,7 +10,8 @@
 	d[28] = 0;
 	for(s = d+27; s != d-1 && (*s == ' ' || *s == 0); s--);
 	s[1] = 0;
-	txtcb(ctx, Ttitle, "", d);
+	cp437toutf8(o, sizeof(o), d, s+1-d);
+	txtcb(ctx, Ttitle, "", o);
 
 	return 0;
 }
--- a/tagspriv.h
+++ b/tagspriv.h
@@ -41,6 +41,11 @@
 int utf16to8(uchar *out, int osz, const uchar *src, int sz);
 
 /*
+ * Same as utf16to8, but CP437 to UTF-8.
+ */
+int cp437toutf8(char *o, int osz, const char *s, int sz);
+
+/*
  * This one is common for both vorbis.c and flac.c
  * It maps a string k to tag type and executes the callback from ctx.
  * Returns 1 if callback was called, 0 otherwise.
--- a/xm.c
+++ b/xm.c
@@ -3,13 +3,14 @@
 int
 tagxm(Tagctx *ctx)
 {
-	char d[17+20+1], *s;
+	char d[17+20+1], o[20*UTFmax+1], *s;
 
 	if(ctx->read(ctx, d, 17+20) != 17+20 || memcmp(d, "Extended Module: ", 17) != 0)
 		return -1;
 	d[17+20] = 0;
 	for(s = d+17; *s == ' '; s++);
-	txtcb(ctx, Ttitle, "", s);
+	cp437toutf8(o, sizeof(o), d+17, 20);
+	txtcb(ctx, Ttitle, "", o);
 
 	return 0;
 }