修改miktex

一、把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”确定目录,要避免调用这函数。

 

全部评论: 0

    写评论: