#include #include #include "lrestool.h" #define COPYRIGHTTEXT "lrestool v 3.1.8.3090 (C) 2003-2008 Janne Huttunen: language resource tool\n\n" FILE* _stderr=stderr; int CreateMode(Data& o) { IDENTIFIERS iLResFile; // First load identifiers from file if (o.bVerbose) printf("Loading identifiers from file %s\n",LPCSTR(o.strLResFile)); if (!iLResFile.LoadFromLResFile(o.strLResFile,o.bDoubleVerbose)) { if (o.bVerbose) fprintf(_stderr,"Exiting due error...\n"); return 1; } if (o.bVerbose) printf("\t%d identifiers found.\n",iLResFile.GetCount()); if (o.strOutFile.IsEmpty()) { o.strOutFile.Copy(o.strLResFile,o.strLResFile.FindLast('.')); o.strOutFile << ".rc"; if (o.bVerbose) printf("Output file is set to '%s'\n",LPCSTR(o.strOutFile)); } if (o.bVerbose) printf("Merging identifies to file '%s'\n",LPCSTR(o.strOutFile)); if (!iLResFile.InsertToOutputFile(o.strOutFile,o.strBaseFile,o.bDoubleVerbose)) { if (o.bVerbose) fprintf(_stderr,"Exiting due error...\n"); return 1; } // Clearing memory iLResFile.RemoveAll(!o.bVerbose); return 0; } int CheckMode(Data& o) { IDENTIFIERS iRCFile,iReference; // Loading identifiers from base RC file if (o.bVerbose) printf("Retrievind identifiers from base file\n"); if (!iRCFile.LoadFromRCFile(o.strBaseFile,o.bDoubleVerbose)) { if (o.bVerbose) fprintf(_stderr,"Exiting due error...\n"); return 1; } iRCFile.AddHead()->name="FOR_PROGRAM"; iRCFile.GetHead().bUsed=TRUE; if (o.bVerbose) printf("\t%d identifiers found.\n",iRCFile.GetCount()); // Creating temp file for output if needed BOOL bIsTemp=o.strOutFile.IsEmpty(); if (bIsTemp) { int nIndex=o.strLResFile.FindLast('\\'); GetTempFileName(nIndex==-1?".":o.strLResFile.Left(nIndex), "lrt",0,o.strOutFile.GetBuffer(MAX_PATH)); if (o.bVerbose) printf("Output file is set temporarily to '%s'\n",LPCSTR(o.strOutFile)); } // Loading reference information if (FileSystem::IsFile(o.strReference)) iReference.LoadFromLResFile(o.strReference,FALSE); if (!iRCFile.UpdateLResFile(o.strLResFile,o.strOutFile,o.bDoubleVerbose,o.bInteractive,iReference)) { if (o.bVerbose) fprintf(_stderr,"Exiting due error...\n"); return 1; } // If output was temp file, overwriting original if (bIsTemp) { if (!MoveFileEx(o.strOutFile,o.strLResFile,MOVEFILE_COPY_ALLOWED|MOVEFILE_REPLACE_EXISTING)) { fprintf(_stderr,"Cannot overwrite file '%s', modified is still in file '%s'\n", LPCSTR(o.strLResFile),LPCSTR(o.strOutFile)); } } return 0; } int DifferenceMode(Data& o) { IDENTIFIERS iFirst,iSecond; if (!iFirst.LoadFromLResFile(o.strLResFile,FALSE)) { fprintf(_stderr,"error: cannot read from file %s\n",LPCSTR(o.strLResFile)); return 1; } if (!iSecond.LoadFromLResFile(o.strReference,FALSE)) { fprintf(_stderr,"error: cannot read from file %s\n",LPCSTR(o.strReference)); return 1; } iFirst.CheckDifferences(iSecond,TRUE); printf("\nIdentifiers found only in file %s\n\n",LPCSTR(o.strLResFile)); iFirst.PrintUnused(o.bShowLineNumbers); printf("\n\nIdentifiers found only in file %s\n\n",LPCSTR(o.strReference)); iSecond.PrintUnused(o.bShowLineNumbers); printf("\n\nChanged identifiers (%s <--> %s)\n\n",LPCSTR(o.strLResFile),LPCSTR(o.strReference)); iFirst.PrintChanged(&iSecond,o.bShowLineNumbers); return 0; } int GenerateHelpPage(Data& o) { IDENTIFIERS iSrcFile,iLRFFile; // First, load indentifiers from language files if (o.bVerbose) printf("Loading identifiers from file %s\n",LPCSTR(o.strLResFile)); if (!iLRFFile.LoadFromLResFile(o.strLResFile,FALSE)) { fprintf(_stderr,"error: cannot read from file %s\n",LPCSTR(o.strLResFile)); return 1; } if (o.bVerbose) printf("\t%d identifiers found.\n",iLRFFile.GetCount()); // Now parse source file to temporary file CHAR szTempFile[MAX_PATH],szTempDir[MAX_PATH]; if (!GetTempPath(MAX_PATH,szTempDir)) strcpy_s(szTempDir,MAX_PATH,"."); GetTempFileName(szTempDir,"lrs_",0,szTempFile); if (o.bVerbose) printf("Parsing %s and inserting strings from translation file\n",LPCSTR(o.strReference)); if (!iLRFFile.InsertToOutputFile(szTempFile,o.strReference,o.bDoubleVerbose,TRUE)) { if (o.bVerbose) fprintf(_stderr,"Exiting due error...\n"); return 1; } // Read base file from registry if (o.strBaseFile.IsEmpty()) { PIDENTIFIER pID=iLRFFile.FindIdentifier("FOR_PROGRAM"); LPCSTR pProgramName="LOCATE32"; if (pID==NULL) printf("Program name is not specified in %s, using \"LOCATE32\"\n",o.strLResFile); else pProgramName=pID->text; GetBaseFileFromRegistry(pProgramName,o.strBaseFile,TRUE); if (o.strBaseFile.IsEmpty()) { printf("No information about base file, using \"page_raw.htm\"\n",o.strLResFile); o.strBaseFile="page_raw.htm"; } } iLRFFile.RemoveAll(FALSE); // First load identifiers from file if (o.bVerbose) printf("Loading the html source file\n"); if (!iSrcFile.LoadFromHtmlRawFile(szTempFile,o.bDoubleVerbose)) { if (o.bVerbose) fprintf(_stderr,"Exiting due error...\n"); return 1; } if (o.bVerbose) printf("\t%d identifiers found.\n",iSrcFile.GetCount()); DeleteFile(szTempFile); // Check output file if (o.strOutFile.IsEmpty()) { o.strOutFile.Copy(o.strLResFile,o.strLResFile.FindLast('.')); o.strOutFile << ".htm"; if (o.bVerbose) printf("Output file is set to '%s'\n",LPCSTR(o.strOutFile)); } if (o.bVerbose) printf("Merging identifies to file '%s'\n",LPCSTR(o.strOutFile)); if (!iSrcFile.InsertToOutputFile(o.strOutFile,o.strBaseFile,o.bDoubleVerbose,TRUE)) { if (o.bVerbose) fprintf(_stderr,"Exiting due error...\n"); return 1; } // Clearing memory iSrcFile.RemoveAll(!o.bVerbose); return 0; } int SetRegFile(Data& o,BOOL bRawHtmpPage) { if (!FileSystem::IsFile(o.strBaseFile)) { fprintf(_stderr,"File '%s' does not exist",LPCSTR(o.strBaseFile)); return 1; } char szPath[MAX_PATH]; LPSTR szTemp; GetFullPathName(o.strBaseFile,MAX_PATH,szPath,&szTemp); if (SetBaseFileToRegistry(o.strLResFile,szPath,bRawHtmpPage)) printf("name '%s' is set to correspond with file '%s'\n",LPCSTR(o.strLResFile),szPath); else fprintf(_stderr,"Error: database cannot be setted"); return 0; } int ShowRegFile(Data& o,BOOL bRawHtmpPage) { CString sFile; GetBaseFileFromRegistry(o.strLResFile,sFile,bRawHtmpPage); printf("name '%s' corresponds with file '%s'\n",LPCSTR(o.strLResFile),LPCSTR(sFile)); return 0; } int DelRegFile(Data& o,BOOL bRawHtmpPage) { DeleteBaseFileFromRegistry(o.strLResFile,bRawHtmpPage); return 0; } int main(int argc,char* argv[]) { #ifdef _DEBUG CAppData::stdfunc(); #endif Data o; ZeroMemory(&o,sizeof(Data)); o.nMode=Data::CreateRCFile; SetHFCErrorCallback(StdHFCErrorCallbackStderr,DWORD("Error n/o %X occured: %s\n")); // Parsing parameters for (int i=1;i