一、把char改为uint8_t
为什么要这么改,先看在visual studio 2022执行以下这段代码。
char xchr2[2] = {128, 129};
int at1 = xchr2[ 0 ];
int at2 = xchr2[ 1 ];如果项目设置了“/J”选项,at1值是128,at2值是129。否则:at1值是-128,at2值是-127。
miktex是给加了“/J”选项,使得char视为无符号类型。但在launcher,没有加“/J”选项。须要修改这差别可能导致的方地方,都在pdftex.cc。
<miktex>\output\Programs\TeXAndFriends\pdftex\pdftex\pdftex.cc xchr[128] = -128; xchr[129] = -127; ... xchar[254] = -2; xchar[255] = -1; C4P_FOR_BEGIN (i, 128, <=, 255) xord[ xchr[ i ] ] = i; C4P_FOR_END (i, ++)
xchr[i]值会做为数组xord的下标,要确定这i在>127时,xchr都是正数,应而需要把xchar类型由char改为unsigned char。
char xchr[ 256 ]; 改为 unsigned char xchr[ 256 ];
类似原因,nameoffile类型是char*,但它也会做为数组下标。
pdftex.cc}pdfTeXProgram::makenamestring(void)
{
strpool[ poolptr ] = xord[ (nameoffile[ k - (1) ] ];
改为
strpool[ poolptr ] = xord[ (uint8_t)nameoffile[ k - (1) ] ];
}这里没把nameoffile改为uin8_t*,是考虑到nameoffile会当下标用的就这么一处,然类型,影响就大了。这里要是不改,会导致字符串池无法存储汉字文件名,因为汉字ut8f是会>=128的。
二、find_input_file中,判断文件是否存在,用SDL_IsFile代替access
<miktex>/Libraries/3rd/web2c/source/lib/texmfmp.c
------
string
find_input_file(integer s)
{
if (access(pathname, R_OK) == 0 && !dir_p (pathname)) {
改为
if (SDL_IsFile(pathname) && !dir_p (pathname)) {在android,会报找不到access、R_OK。如果加上#include <unistd.h>,又报ioctl声明与实现不一致。改为用SDL_IsFile去判断文件在否存在。
三、要避免调用的函数
bool SessionImpl::FindBinRelative(const PathName& relPath, PathName& path);
不再依赖“exe”确定目录,这函数要是不能避免,让立即返回false。
PathName SessionImpl::GetMyPrefix(bool canonicalized);
android会碰到,确定当前执行的 MiKTeX 程序所在的安装目录前缀。因为不再依赖“exe”确定目录,要避免调用这函数。