📄 roswebparser.c
字号:
/*
* This is a standalone rc langues to xml parser
* do not use windows or linux specfiy syntax or functions
* use only pure ansi C, this program is also runing on
* linux apachie webserver and being use in ReactOS website
*
* CopyRight 20/9-2006 by Magnus Olsen (magnus@greatlord.com)
* Licen GPL version 2.0
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define true 1
#define false 0
int ansiCodePage(int codepage, unsigned char *inBuffer, unsigned char *outBuffer, int Lenght);
int paraser1(unsigned char *buf, long buf_size, unsigned char * output_text, unsigned char * output_resid, unsigned char * output_format, unsigned char *iso_type);
void find_str(unsigned char asc, unsigned char *buf, long *foundPos);
void find_str2(unsigned char *asc, unsigned char *buf, long *foundPos, unsigned char * output_resid, unsigned char *output_text );
void trim(unsigned char* buf);
void stringbugs(unsigned char *buf, int shift2);
void stringbugs2(unsigned char *buf, int shift2);
void ParserCMD1(unsigned char *text, unsigned char *output_resid, unsigned char *output_text, unsigned char *output_format);
void ParserCMD2(unsigned char *text, unsigned char *output_resid, unsigned char *output_text, unsigned char *output_format);
void ParserCMD3(unsigned char *text, unsigned char *output_resid, unsigned char *output_text, unsigned char *output_format);
void ParserComment(long *pos, unsigned char *buf, long buf_size, unsigned char * output_text, unsigned char * output_resid, unsigned char * output_format);
void ParserLang(unsigned char *text, unsigned char *output_resid, unsigned char *output_text, unsigned char *output_format);
void ParserString(long *pos, unsigned char *buf, long buf_size, unsigned char * output_text, unsigned char * output_resid, unsigned char * output_format);
void ParserDialog(unsigned char *text, long *pos, unsigned char *buf, long buf_size, unsigned char * output_text, unsigned char * output_resid, unsigned char * output_format);
void DialogCMDBuild1(unsigned char *output_resid, unsigned char *output_format, long pos, unsigned char * text);
void DialogCMDBuild2(unsigned char *output_resid, unsigned char *output_format, long pos, unsigned char * text);
void DialogCMDBuild3(unsigned char *output_resid, unsigned char *output_format, long pos, unsigned char * text);
void ParserAccelerators(long *pos, unsigned char *buf, long buf_size, unsigned char * output_text, unsigned char * output_resid, unsigned char * output_format);
void ParserMenu(unsigned char *text, long *pos, unsigned char *buf, long buf_size, unsigned char * output_text, unsigned char * output_resid, unsigned char * output_format);
/*
return -1 : No file found
return -2 : Fail open file
return -3 : Fail seek
return -4 : Fail get size
return -5 : Fail size of the file is 0 bytes
return -6 : Fail malloc memory
return -7 : Fail to read the file
return -8 : Fail to write to the file
return -9 : Fail to open write file
*/
int main(int argc, char * argv[])
{
FILE * fp;
FILE * Outfp;
unsigned char * buffer;
unsigned char * output_text;
unsigned char * output_resid;
unsigned char * output_format;
long buf_size;
long buf_size_calc = 0;
if (argc!=4)
{
printf("Help\n");
printf("%s inputfile iso-type\n\n",argv[0]);
printf("example %s sv.rc 28591 sv.xml\n\n",argv[0]);
printf("Contry table\n");
printf("se (Swedish = Windows-28591 (Latin1 ISO-8859-1)\n");
return -1;
}
if ((fp = fopen(argv[1],"rb"))==NULL)
{
printf("Fail open file %s by %s\n",argv[1],argv[0]);
return -2;
}
fseek(fp,0,SEEK_END);
if (ferror(fp) !=0)
{
fclose(fp);
printf("Fail seek\n");
return -3;
}
buf_size = ftell(fp);
if (ferror(fp) !=0)
{
fclose(fp);
printf("Fail get size\n");
return -4;
}
/*
We make sure it is least 4 times + 2K biger
for we can grow around 2-3 times biger
so it better to make safe assume how
much memory we need
*/
buf_size_calc = (buf_size*4) + 2048;
fseek(fp,0,SEEK_SET);
if (ferror(fp) !=0)
{
fclose(fp);
printf("Fail seek\n");
return -3;
}
if (buf_size==0)
{
fclose(fp);
printf("Fail size of the file is 0 bytes\n");
return -5;
}
buffer =(char *)malloc(buf_size_calc);
if (buffer == NULL)
{
fclose(fp);
printf("Fail malloc memory\n");
return -6;
}
output_text =(char *)malloc(buf_size_calc);
if (output_text == NULL)
{
free(buffer);
fclose(fp);
printf("Fail malloc memory\n");
return -6;
}
output_resid =(char *)malloc(buf_size_calc);
if (output_resid == NULL)
{
free(buffer);
free(output_text);
fclose(fp);
printf("Fail malloc memory\n");
return -6;
}
output_format =(char *)malloc(buf_size_calc);
if (output_format == NULL)
{
free(buffer);
free(output_text);
free(output_resid);
fclose(fp);
printf("Fail malloc memory\n");
return -6;
}
//fread(buffer,1,buf_size,fp);
fread(buffer,buf_size,1,fp);
if (ferror(fp) !=0)
{
fclose(fp);
printf("Fail to read the file\n");
return -7;
}
fclose(fp);
/* Now we can write our parser */
paraser1(buffer, buf_size, output_text, output_resid, output_format,"UTF-8");
// printf ("%s",output_format);
/* Now we convert to utf-8 */
memset(output_resid,0,buf_size_calc);
buf_size_calc = ansiCodePage(atoi(argv[2]), output_format, output_resid, strlen(output_format));
if ((Outfp = fopen(argv[3],"wb")) != NULL )
{
fwrite(output_resid,1,buf_size_calc,Outfp);
fclose(Outfp);
}
if(buffer!=NULL)
free(buffer);
if(output_text!=NULL)
free(output_text);
if(output_resid!=NULL)
free(output_resid);
if(output_format!=NULL)
free(output_format);
return 0;
}
int paraser1(unsigned char *buf, long buf_size, unsigned char * output_text, unsigned char * output_resid, unsigned char * output_format, unsigned char *iso_type)
{
unsigned char *row;
long foundPos=0;
long foundNextPos=0;
long row_size=0;
long pos=0;
memset(output_text,0,buf_size);
memset(output_resid,0,buf_size);
memset(output_format,0,buf_size);
sprintf(output_format,"<?xml version=\"1.0\" encoding=\"%s\"?>\n<resource>\n",iso_type);
row = output_text;
while(pos < buf_size)
{
foundPos=0;
foundNextPos=0;
row_size=0;
/* create a row string so we can easy scan it */
find_str('\n',&buf[pos],&foundPos);
if (foundPos !=0)
{
row_size = foundPos - 1;
/* found a new row */
strncpy(row, &buf[pos], row_size);
pos+=foundPos;
if (foundPos >=2)
row[row_size -1]=0;
}
else
{
row_size = buf_size - pos;
/* no new row found in the buffer */
strncpy(row, &buf[pos], buf_size - pos);
pos= buf_size;
}
trim(row);
foundPos=0;
/* Detect Basic command and send it to own paraser */
if (*row==0)
continue;
if (strncmp("/*",row,2)==0)
{
ParserComment(&pos, buf, buf_size, output_text, output_resid, output_format);
continue;
}
if (strncmp("//",row,2)==0)
{
ParserComment(&pos, buf, buf_size, output_text, output_resid, output_format);
continue;
}
if (strncmp("#",row,1)==0)
{
ParserComment(&pos, buf, buf_size, output_text, output_resid, output_format);
continue;
}
stringbugs(row,true);
if (foundPos == 0)
{
find_str2 ("LANGUAGE ",row,&foundPos,output_resid,output_text);
if (foundPos != 0)
{
ParserLang("LANGUAGE", output_resid, output_text, output_format);
continue;
}
}
if (foundPos == 0)
{
find_str2 ("STRINGTABLE ",row,&foundPos,output_resid,output_text);
if (foundPos != 0)
{
ParserCMD3("STRINGTABLE", output_resid, output_text, output_format);
ParserString(&pos, buf, buf_size, output_text, output_resid, output_format);
continue;
}
}
if (foundPos == 0)
{
find_str2 (" DIALOGEX ",row,&foundPos,output_resid,output_text);
if (foundPos != 0)
{
ParserCMD2("DIALOGEX", output_resid, output_text, output_format);
ParserDialog("DIALOGEX",&pos, buf, buf_size, output_text, output_resid, output_format);
continue;
}
}
if (foundPos == 0)
{
find_str2 (" DIALOG ",row,&foundPos,output_resid,output_text);
if (foundPos != 0)
{
ParserCMD2("DIALOG", output_resid, output_text, output_format);
ParserDialog("DIALOG",&pos, buf, buf_size, output_text, output_resid, output_format);
continue;
}
}
if (foundPos == 0)
{
find_str2 (" ACCELERATORS\0",row,&foundPos,output_resid,output_text);
if (foundPos != 0)
{
ParserCMD1("ACCELERATORS", output_resid, output_text, output_format);
ParserAccelerators(&pos, buf, buf_size, output_text, output_resid, output_format);
continue;
}
}
if (foundPos == 0)
{
find_str2 (" MENU\0",row,&foundPos,output_resid,output_text);
if (foundPos != 0)
{
ParserCMD1("MENU", output_resid, output_text, output_format);
ParserMenu("MENU",&pos, buf, buf_size, output_text, output_resid, output_format);
continue;
}
}
} // end while
sprintf(output_format,"%s</resource>\n",output_format);
return false;
}
/*
ParserCMD
data
input : IDM_MDIFRAME MENU DISCARDABLE LANG LANG_TAG LANG_TAG
input : IDM_MDIFRAME MENU DISCARDABLE
input : IDM_MDIFRAME MENU
input : IDM_MDIFRAME ACCELERATORS DISCARDABLE LANG LANG_TAG LANG_TAG
input : IDM_MDIFRAME ACCELERATORS DISCARDABLE
input : IDM_MDIFRAME ACCELERATORS
output : <obj type="MENU" rc_name="ID">DISCARDABLE</obj>
output : <obj type="MENU" rc_name="ID">DISCARDABLE</obj>
output : <obj type="MENU" rc_name="ID"></obj>
output : <obj type="ACCELERATORS" rc_name="ID">DISCARDABLE</obj>
output : <obj type="ACCELERATORS" rc_name="ID">DISCARDABLE</obj>
output : <obj type="ACCELERATORS" rc_name="ID"></obj>
param : output_resid = rc_name ID
param : output_text = MENU DISCARDABLE LANG LANG_TAG LANG_TAG
param : text = type example MENU
param : output_format = xml data store buffer
*/
void ParserCMD1(unsigned char *text, unsigned char *output_resid, unsigned char *output_text, unsigned char *output_format)
{
long le;
stringbugs(output_resid,false);
stringbugs(output_text,false);
le = strlen(text);
if (strlen(output_text) == le)
{
sprintf(output_format,"%s<group name=\"%s\">\n <obj type=\"%s\" rc_name=\"%s\"></obj>\n",output_format,text,text,output_resid);
}
else if (output_text[le]==' ')
{
sprintf(output_format,"%s<group name=\"%s\">\n <obj type=\"%s\" rc_name=\"%s\">DISCARDABLE</obj>\n",output_format,text,text,output_resid);
}
}
/*
ParserCMD2
data
input : IDM_MDIFRAME DIALOG DISCARDABLE 15, 13, 210, 63 LANG LANG_TAG LANG_TAG
input : IDM_MDIFRAME DIALOG DISCARDABLE 15, 13, 210, 63
input : IDM_MDIFRAME DIALOGEX DISCARDABLE 15, 13, 210, 63 LANG LANG_TAG LANG_TAG
input : IDM_MDIFRAME DIALOGEX DISCARDABLE 15, 13, 210, 63
output : <obj type="DIALOG" rc_name="ID" top="15" left="13" right="210" bottom="63">DISCARDABLE</obj>
output : <obj type="DIALOG" rc_name="ID" top="15" left="13" right="210" bottom="63"></obj>
output : <obj type="DIALOGEX" rc_name="ID" top="15" left="13" right="210" bottom="63">DISCARDABLE</obj>
output : <obj type="DIALOGEX" rc_name="ID" top="15" left="13" right="210" bottom="63"></obj>
param : output_resid = rc_name ID
param : output_text = DIALOG DISCARDABLE 15, 13, 210, 63 LANG LANG_TAG LANG_TAG
param : text = type example DIALOG
param : output_format = xml data store buffer
*/
void ParserCMD2(unsigned char *text, unsigned char *output_resid, unsigned char *output_text, unsigned char *output_format)
{
long le;
long flag = 0;
stringbugs(output_resid,false);
stringbugs(output_text,false);
le=strlen(text);
sprintf(output_format,"%s<group name=\"%s\">\n <obj type=\"%s\" rc_name=\"%s\" ",output_format,text,text,output_resid);
find_str2 (" DISCARDABLE ",output_text,&flag,output_resid,output_text);
trim(output_resid);
trim(output_text);
if (flag==0)
{
*output_resid='\0'; /* not in use futer */
flag=0; /* DISCARDABLE off */
sprintf(output_text,"%s",&output_text[le]);
trim(output_text);
}
else
{
*output_resid='\0'; /* not in use futer */
flag=1; /* DISCARDABLE on */
sprintf(output_text,"%s",&output_text[11]);
trim(output_text);
}
/* data is looking like this 0 1 2 3 now */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -