feat: M6.10–M6.19 批量收编 + M6.19 推卡验收

- M7 launcher 重写 5 期(虚拟化宫格/meow_theme 单一权威/横幅动画/自定义 PIN 键盘)
- OOM 通用化(cachegov 上收 SDK)、自动切歌根治、meowpanel jv_free 泄漏修复、Hello 滚动卡顿修复
- ncm 歌词 UI / 媒体通知封面 / 封面分辨率 640
- 5 bug 修复:ncm 后台化 UI 叠层+点击穿透、再进 ncm 桌面叠层、播放页新旧 UI 叠层抢刷脏区(meow_ui_gfx 恢复边沿整帧重画)、PIN 亮屏亮度跳(keys.c meow_panel_on 按 settings_brightness_clamped 恢复)、通知中心封面显歌单封面(cover.c save_cover_raw 加 is_song + 命中块守卫)
- 四 App 统一重链新 meow_ui.a 51caee4a;M6.19=0.8.19 固件 2d2331f2 推卡自刷验收全绿
This commit is contained in:
AskaEth committed 2026-09-03 12:16:01 +08:00
1 parent c2ee7626a4
commit 3d70a3dd2c
176 files changed
+15507 -597

No files matched your search

+57 -1
View File
@@ -266,10 +266,66 @@ static void t10(void)
remove(path);
}
/* t11 — Big5→UTF-8 解码金标准(R3:big5_2byte 码表;对照 python `big5` codec)。 */
static void t11(void)
{
/* "你好世界" Big5 = a741 a66e a540 acc9 → UTF-8 你好世界 */
const uint8_t in_nihao[] = { 0xA7, 0x41, 0xA6, 0x6E, 0xA5, 0x40, 0xAC, 0xC9 };
const uint8_t ex_nihao[] = "\xE4\xBD\xA0\xE5\xA5\xBD\xE4\xB8\x96\xE7\x95\x8C";
uint8_t out[256]; size_t olen = 0;
int rc = rd_big5_to_utf8(in_nihao, sizeof in_nihao, out, sizeof out, &olen);
CHECK(rc == RD_ENC_OK, "big5 decode ok");
CHECK(olen == sizeof ex_nihao - 1 && memcmp(out, ex_nihao, olen) == 0, "big5 golden 你好世界");
/* 经通用 rd_to_utf8(RD_ENC_BIG5) 路径 */
memset(out, 0, sizeof out); olen = 0;
CHECK(rd_to_utf8(RD_ENC_BIG5, in_nihao, sizeof in_nihao, out, sizeof out, &olen) == RD_ENC_OK &&
olen == sizeof ex_nihao - 1 && memcmp(out, ex_nihao, olen) == 0, "rd_to_utf8 big5");
/* 繁体长句(python 生成金标准) */
const uint8_t in_tr[] = { 0xB3,0x6F,0xAC,0x4F,0xC1,0x63,0xC5,0xE9,0xA4,0xA4,0xA4,0xE5,0xB4,0xFA,
0xB8,0xD5,0xA1,0x41,0xA5,0xCE,0xA9,0xF3,0xBD,0x73,0xBD,0x58,0xC0,0xCB,
0xB4,0xFA,0xA1,0x43 };
const uint8_t ex_tr[] = "\xE9\x80\x99\xE6\x98\xAF\xE7\xB9\x81\xE9\xAB\x94\xE4\xB8\xAD\xE6\x96\x87"
"\xE6\xB8\xAC\xE8\xA9\xA6\xEF\xBC\x8C\xE7\x94\xA8\xE6\x96\xBC\xE7\xB7\xA8"
"\xE7\xA2\xBC\xE6\xAA\xA2\xE6\xB8\xAC\xE3\x80\x82";
memset(out, 0, sizeof out); olen = 0;
CHECK(rd_big5_to_utf8(in_tr, sizeof in_tr, out, sizeof out, &olen) == RD_ENC_OK, "big5 trad decode");
CHECK(olen == sizeof ex_tr - 1 && memcmp(out, ex_tr, olen) == 0, "big5 golden trad");
/* 非法 Big5 双字节(trail 0x80..0xA0 非 Big5 尾节区)→ U+FFFD,不崩溃 */
const uint8_t in_bad[] = { 0xA7, 0x80, 'X' }; /* a7 + trail 0x80(Big5 非法)+ 孤立 0x80 */
memset(out, 0, sizeof out); olen = 0;
CHECK(rd_big5_to_utf8(in_bad, sizeof in_bad, out, sizeof out, &olen) == RD_ENC_OK, "big5 bad decode");
const uint8_t ex_bad[] = { 0xEF, 0xBF, 0xBD, 0xEF, 0xBF, 0xBD, 'X' }; /* FFFD(0xA7) FFFD(0x80) X */
CHECK(olen == sizeof ex_bad && memcmp(out, ex_bad, olen) == 0, "big5 bad → FFFD");
}
/* t12 — Big5 文件经 rdtxt 段读(info.enc 显式 Big5,模拟 UI 编码切换)。 */
static void t12(void)
{
const char *path = "/tmp/rdtxt_big5.txt";
FILE *f = fopen(path, "wb");
const uint8_t b5[] = { 0xA7,0x41,0xA6,0x6E, 0x0A, 0xA5,0x40,0xAC,0xC9, 0x0A }; /* 你好\n世界\n */
fwrite(b5, 1, sizeof b5, f);
fclose(f);
rdtxt_info info;
CHECK(rdtxt_probe(path, &info) == 0, "big5 probe");
info.enc = RD_ENC_BIG5; /* 手动指定 Big5(auto 会判 GB18030) */
rdtxt_reader *r = NULL;
CHECK(rdtxt_reader_open(path, &info, &r) == 0, "big5 open");
uint8_t buf[RDTXT_SEG_UTF8_MAX + 8];
size_t ul = 0, off = 0, flen = 0, total = 0;
while (rdtxt_reader_next(r, buf, sizeof buf, &ul, &off, &flen) == 0) total += ul;
rdtxt_reader_free(r);
/* 整文件为一段(< 48K 分段阈值):"你好\n世界\n" = 6+1+6+1 = 14 字节 */
CHECK(total == 14, "big5 segments sum");
remove(path);
}
int main(void)
{
t1(); t2(); t3(); t4(); t5();
t6(); t7(); t8(); t9(); t10();
t6(); t7(); t8(); t9(); t10(); t11(); t12();
printf("test_reader_core: %d pass, %d fail\n", g_pass, g_fail);
return g_fail ? 1 : 0;
}