📄 rpl_t22u.c
字号:
/*unicode/text格式,前者,始0xff,0xfe,2字节存ASCII
1啊2亍:国标2312,"啊":头,16区1位,2级头"亍":56区1位,u/t存成31,0,4a,55,32,0,8d,4e/31,b0,a1,32,d8,a1
各国煜用符表示码页.日语,表为8或16位多字节;其他语,表为16位u宽符
wcstombs:宽->多字节,mbstowcs相反.置936转汉字页setlocale*/
#include <conio.h>
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <memory.h>
#include <mbstring.h>
#include <sys/stat.h>
#define rpt(h,F,C,c) fprintf(F,"%c%08x%c%c",h,_c0.u[5]-old_sz,C,c);
union{
struct _stat stat;
char*LP_ch[6];
FILE*LP_io[6];
size_t u[6];
}_c0;
size_t old_sz,new_sz=0;
__inline void heap(size_t n){
if(!(_c0.LP_ch[3]=malloc(n)))
exit(0);
}
void Open(FILE**a,char*c,char*m){
if(!(*a=fopen(c,m))){
printf("\n%s fail",c);
_fcloseall();
exit(0);
}
}
typedef union{
char*p;
size_t u;
wchar_t S[2];
}O4;
#define v_bid "v:\\bid"
void main(int ac,O4 av[]){
printf("\
s(uppress_rpl_ask)|t(ext)|u(nicode)=av1,av2/3=old/new_data,may_2_1st_ch=memicmp)\
av4=Hex_rpl_bias(eg,2f);v:\\bid=convert_format;Hex_pry_bias|replace_data(in these\
:hdr exit 1,IF not errorlevel 1 GOTO hdr)av!=dev(TYPE nul>n);eg,sh.20 ton I:cwt");
switch(ac){
case 2:
_stat(av[1].p,&_c0.stat);
old_sz=_c0.stat.st_size;
Open(&_c0.LP_io[1],av[1].p,"rb");
setlocale(LC_CTYPE,".OCP");
if('u'==*av[1].p){
if(!(_c0.LP_ch[0]=malloc(old_sz)))
exit(0);
fseek(_c0.LP_io[1],sizeof(wchar_t),SEEK_SET);//跳u头
old_sz-=sizeof(wchar_t);
fread(_c0.LP_ch[0],1,old_sz,_c0.LP_io[1]);
fclose(_c0.LP_io[1]);
heap(old_sz);
/*
mov eax, DWORD PTR _old_sz
push eax
call _heap
add esp, 4
; 28 : __inline void heap(size_t n){
push ebp
mov ebp, esp
sub esp, 64 ; 00000040H
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-64]
mov ecx, 16 ; 00000010H
mov eax, -858993460 ; ccccccccH
rep stosd
; 29 : _c0.LP_ch[3]=malloc(n);
mov eax, DWORD PTR _n$[ebp]
push eax
call _malloc
add esp, 4
mov DWORD PTR __c0+12, eax
-/ZI +Ob1
mov ecx, DWORD PTR _old_sz
mov DWORD PTR $T1152[ebp], ecx
mov edx, DWORD PTR $T1152[ebp]
push edx
call _malloc
add esp, 4
*/
*(wchar_t*)(_c0.LP_ch[0]+old_sz)=L'\0';
new_sz=wcstombs(_c0.LP_ch[3],(wchar_t*)_c0.LP_ch[0],old_sz);
}else
if('t'==*av[1].p){
heap(old_sz+1);
fread(_c0.LP_ch[3],1,old_sz,_c0.LP_io[1]);
fclose(_c0.LP_io[1]);
*(_c0.LP_ch[3]+old_sz)=0;
old_sz=_mbslen(_c0.LP_ch[3]);//!validity
printf("\n_mbslen got the number of multibyte characters:0x%08x",old_sz);
if(!(_c0.LP_ch[0]=malloc(old_sz*2)))
exit(0);
new_sz=mbstowcs((wchar_t*)_c0.LP_ch[0],_c0.LP_ch[3],old_sz);
}else
exit(0);
if(new_sz!=-1){//0前wchar_t数
Open(&_c0.LP_io[4],v_bid,"wb");
if('t'==*av[1].p){
fwprintf(_c0.LP_io[4],L"%c",0xfeff);//添u头
_c0.LP_ch[3]=_c0.LP_ch[0];
new_sz<<=1;
}
fwrite(_c0.LP_ch[3],1,new_sz,_c0.LP_io[4]);
fclose(_c0.LP_io[4]);
}else
printf("\n%s no convert",av[1].p);
exit(0);
case 3:
goto pry_rpl;
case 4:case 5:
_stat(av[3].p,&_c0.stat);//new
new_sz=_c0.stat.st_size;
pry_rpl: _stat(av[2].p,&_c0.stat);//old
heap((old_sz=_c0.stat.st_size)*2+new_sz);
Open(&_c0.LP_io[1],av[2].p,"rb");
fread(_c0.LP_ch[3]+old_sz,1,old_sz,_c0.LP_io[1]);
fclose(_c0.LP_io[1]);
if(3<ac){
if(new_sz){
Open(&_c0.LP_io[1],av[3].p,"rb");
fread(_c0.LP_ch[3]+old_sz*2,1,new_sz,_c0.LP_io[1]);
fclose(_c0.LP_io[1]);
}
if(4<ac)
av[3].u=strtoul(av[4].p,NULL,16);
if('s'==*av[1].p)
_c0.u[2]='Y';
else
_c0.u[2]=32;
}
Open(&_c0.LP_io[1],av[1].p,"rb");//src
Open(&_c0.LP_io[4],v_bid,"wb");
_c0.u[5]=av[0].u=0;
while(1){
if(old_sz!=(_c0.u[0]=fread(_c0.LP_ch[3],1,old_sz,_c0.LP_io[1]))){
if(4>ac)
printf("\npry_cnt=0x%x",av[0].u);
else
if(_c0.u[0])
fwrite(_c0.LP_ch[3],1,_c0.u[0],_c0.LP_io[4]);
bye: _fcloseall();
exit(_c0.u[2]&128?1:0);//pry,rpl
}
_c0.u[5]+=_c0.u[0];
if('m'==*av[2].p&&_memicmp(_c0.LP_ch[3],_c0.LP_ch[3]+old_sz,old_sz)||\
'm'!=*av[2].p&&memcmp(_c0.LP_ch[3],_c0.LP_ch[3]+old_sz,old_sz)){
if(old_sz>(_c0.u[0]=1))
if('m'==*av[2].p)//A即a
goto ftell;
else
while(old_sz!=_c0.u[0]){
if(*(_c0.LP_ch[3]+_c0.u[0])==*(_c0.LP_ch[3]+old_sz)){
ftell: _c0.u[5]+=_c0.u[0]-old_sz;
fseek(_c0.LP_io[1],_c0.u[0]-old_sz,SEEK_CUR);
break;
}
_c0.u[0]++;
}
if(3<ac)
fwrite(_c0.LP_ch[3],1,_c0.u[0],_c0.LP_io[4]);
}else
if(4>ac){
av[0].u++;
rpt('H',_c0.LP_io[4],'\r','\n')
goto ge_n;
}else{
if(4<ac&&av[3].u!=_c0.u[5]-old_sz)
goto asis;
if(_c0.u[2]&32){//!N&&!Y
rpt('\n',stdout,':',0)
printf("rpl(n(o_now),yes|No(from now on),Yes|^C)");
if(3==(_c0.u[2]=_getche()))
goto bye;
}
if(_c0.u[2]&1){//Y||y
if(new_sz)
fwrite(_c0.LP_ch[3]+old_sz*2,1,new_sz,_c0.LP_io[4]);
ge_n: _c0.u[2]|=128;
continue;
}
asis: fwrite(_c0.LP_ch[3],1,old_sz,_c0.LP_io[4]);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -