⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 roswebparser.c

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 C
📖 第 1 页 / 共 4 页
字号:
/*
 * 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 + -