//........................................................................ //... //... RLMAN.C //... //... Contains 'main' for rlman.exe. //........................................................................ #include #include #ifdef RLDOS #include "dosdefs.h" #else #include #include "windefs.h" #endif //#include #include "custres.h" #include "rlmsgtbl.h" #include "commbase.h" #include "rlman.h" #include "exe2res.h" #include "exeNTres.h" #include "rlstrngs.h" #include "projdata.h" #include "showerrs.h" #include "resread.h" #ifndef RLDOS int Update( char *, char *); #endif extern MSTRDATA gMstr; //... Data from Master Project file (MPJ) extern PROJDATA gProj; //... Data from Project file (PRJ) HWND hListWnd = NULL; HWND hMainWnd = NULL; HWND hStatusWnd = NULL; int nUpdateMode = 0; BOOL fCodePageGiven = FALSE; //... Set to TRUE if -p arg given CHAR szCustFilterSpec[MAXCUSTFILTER]; CHAR szFileTitle[256]=""; extern BOOL gfReplace; //... Set FALSE if -a option is given extern BOOL gbMaster; //... TRUE if working in a Master Project extern BOOL gbShowWarnings; //... Display warnining messages if TRUE extern BOOL gfShowClass; //... Set TRUE to put dlg box elemnt class in //... token file extern BOOL gfExtendedTok; //... Set TRUE if -x option is given extern UCHAR szDHW[]; //... Common buffer, many uses extern int atoihex( CHAR sz[]); extern BOOL bRLGui; CHAR szModule[MAX_PATH]; //............................................................ void Usage( void) { int i; for ( i = IDS_USG_00; i < IDS_USG_END; ++i ) { LoadStringA( NULL, i, szDHW, DHWSIZE); CharToOemA( szDHW, szDHW); fprintf( stderr, "%s\n", szDHW); } } //............................................................ //... //... This is a stub for console programs int RLMessageBoxA( LPCSTR lpError) { fprintf( stderr, "RLMan (%s): %s\n", szModule, lpError); return( IDOK); // Should return something. } #ifndef __cdecl #define __cdecl __cdecl #endif //............................................................ void __cdecl main( int argc, char *argv[]) { BOOL fBuildRes = FALSE; BOOL fBuildTok = FALSE; BOOL fExtRes = FALSE; BOOL bChanged = FALSE; BOOL fProject = FALSE; //... Set to TRUE if -l arg given BOOL fNewLanguageGiven = FALSE; //... Set to TRUE if -n arg given BOOL fOldLanguageGiven = FALSE; //... Set to TRUE if -o arg given FILE *pfCRFile = NULL; int iCount = 0; int iErrorLine = 0; UINT usError = 0; WORD wRC = 0; WORD wResTypeFilter = 0; //... Pass all resource types by default char *pszMasterFile = NULL; char *pszProjectFile = NULL; int chOpt = 0; bRLGui = FALSE; wRC = GetCopyright( argv[0], szDHW, DHWSIZE); if ( wRC != SUCCESS ) { ShowErr( wRC, NULL, NULL); DoExit( wRC); } CharToOemA( szDHW, szDHW); fprintf( stderr, "\n%s\n\n", szDHW); //... Enough args on command line? if ( argc < 2 ) { ShowErr( IDS_ERR_01, NULL, NULL); Usage(); DoExit( IDS_ERR_01); } gbMaster = FALSE; //... Build project token file by default. iCount = 1; //... Get the switches while ( iCount < argc && (*argv[ iCount] == '-' || *argv[ iCount] == '/') ) { switch ( (chOpt = *CharLowerA( &argv[iCount][1]))) { case '?': case 'h': WinHelp( NULL, TEXT("rlman.hlp"), HELP_CONTEXT, IDM_HELPUSAGE); DoExit( SUCCESS); break; case 'e': if ( fBuildTok != FALSE || fBuildRes != FALSE ) { ShowErr( IDS_ERR_02, NULL, NULL); Usage(); DoExit( IDS_ERR_01); } fExtRes = TRUE; gbMaster = FALSE; fBuildTok = FALSE; break; case 't': //... Create token file if ( fBuildRes != FALSE || fExtRes != FALSE ) { ShowErr( IDS_ERR_02, NULL, NULL); Usage(); DoExit( IDS_ERR_01); } gbMaster = FALSE; fProject = FALSE; fBuildTok = TRUE; break; //... Update 1.0 token files to fit upper 1.7 version, //... it is same as 'm' + 'l' option. case 'u': //...Update 1.0 token files to fit upper 1.7 version if ( argc - iCount < 6 ) { ShowErr( IDS_ERR_01, NULL, NULL); Usage(); DoExit( IDS_ERR_01); } gbMaster = TRUE; fProject = TRUE; fBuildTok = TRUE; pszMasterFile = argv[++iCount]; pszProjectFile = argv[++iCount]; break; case 'm': //... Build Master token file if ( argc - iCount < 2 ) { ShowErr( IDS_ERR_01, NULL, NULL); Usage(); DoExit( IDS_ERR_01); } gbMaster = TRUE; fProject = FALSE; fBuildTok = TRUE; pszMasterFile = argv[ ++iCount]; break; case 'l': //... Build language project token file if ( argc - iCount < 2 ) { ShowErr( IDS_ERR_01, NULL, NULL); Usage(); DoExit( IDS_ERR_01); } fProject = TRUE; fBuildTok = TRUE; gbMaster = FALSE; pszProjectFile = argv[ ++iCount]; break; case 'a': case 'r': if ( fBuildTok != FALSE || fExtRes != FALSE ) { ShowErr( IDS_ERR_02, NULL, NULL); Usage(); DoExit( IDS_ERR_02); } fBuildRes = TRUE; gfReplace = (chOpt == 'a') ? FALSE : TRUE; gbMaster = FALSE; fProject = FALSE; break; case 'n': //... Get ID components of new language if ( argc - iCount < 2 ) { ShowErr( IDS_ERR_01, NULL, NULL); Usage(); DoExit( IDS_ERR_01); } else { WORD wPri = (WORD)MyAtoi( argv[ ++iCount]); WORD wSub = (WORD)MyAtoi( argv[ ++iCount]); gProj.wLanguageID = MAKELANGID( wPri, wSub); fNewLanguageGiven = TRUE; } break; case 'o': //... Get old language ID components if ( argc - iCount < 2 ) { ShowErr( IDS_ERR_01, NULL, NULL); Usage(); DoExit( IDS_ERR_01); } else { WORD wPri = (WORD)MyAtoi( argv[ ++iCount]); WORD wSub = (WORD)MyAtoi( argv[ ++iCount]); gMstr.wLanguageID = MAKELANGID( wPri, wSub); fOldLanguageGiven = TRUE; } break; case 'p': //... Get code page number gMstr.uCodePage = gProj.uCodePage = (UINT)MyAtoi( argv[ ++iCount]); fCodePageGiven = TRUE; break; case 'c': //... Get custom resource def file name strcpy( gMstr.szRdfs, argv[ ++iCount]); pfCRFile = FOPEN( gMstr.szRdfs, "rt"); if ( pfCRFile == NULL ) { QuitA( IDS_ENGERR_02, gMstr.szRdfs, NULL); } wRC = (WORD)ParseResourceDescriptionFile( pfCRFile, &iErrorLine); if ( wRC ) { switch ( (int)wRC ) { case -1: ShowErr( IDS_ERR_14, NULL, NULL); break; case -2: ShowErr( IDS_ERR_15, NULL, NULL); break; case -3: ShowErr( IDS_ERR_16, NULL, NULL); break; } //... END switch ( wRC ) } FCLOSE( pfCRFile); break; case 'f': //... Get res type to retrieve wResTypeFilter = (WORD)MyAtoi( argv[ ++iCount]); break; case 'w': gbShowWarnings = TRUE; break; case 'd': gfShowClass = TRUE; break; case 'x': gfExtendedTok = TRUE; break; default: ShowErr( IDS_ERR_04, argv[ iCount], NULL); Usage(); DoExit( IDS_ERR_04); break; } //... END switch iCount++; } //... END while lstrcpyA(szModule, argv[ iCount]); if ( fExtRes ) { if ( argc - iCount < 2 ) { ShowErr( IDS_ERR_01, NULL, NULL); Usage(); DoExit( IDS_ERR_01); } ExtractResFromExe32A( argv[ iCount], argv[ iCount + 1], wResTypeFilter); } else if ( fBuildTok ) { if ( ( fProject == FALSE && gbMaster == FALSE) && argc - iCount < 2 ) { ShowErr( IDS_ERR_01, NULL, NULL); Usage(); DoExit( IDS_ERR_01); } //... check to see if we are updating a //... Master Token file if ( gbMaster ) { OFSTRUCT Of = { 0, 0, 0, 0, 0, ""}; CHAR *pExe, *pMtk; if ( chOpt == 'u' ) //Update them { pExe = argv[iCount++]; pMtk = argv[iCount++]; } else { pExe = argc - iCount < 1 ? NULL : argv[ iCount]; pMtk = argc - iCount < 2 ? NULL : argv[ iCount+1]; } wRC = (WORD)GetMasterProjectData( pszMasterFile, pExe, pMtk, fOldLanguageGiven); if ( wRC != SUCCESS ) { DoExit( wRC); } LoadCustResDescriptions( gMstr.szRdfs); //... check for the special case where Master //... Token file does not exists. This is //... possible if the MPJ file was created //... automatically. if ( OpenFile( gMstr.szMtk, &Of, OF_EXIST) == HFILE_ERROR ) { //... Master token file does not exists, //... so go ahead and create it wRC = (WORD)GenerateTokFile( gMstr.szMtk, gMstr.szSrc, &bChanged, wResTypeFilter); SzDateFromFileName( gMstr.szMpjLastRealUpdate, gMstr.szMtk); } else { //... we are doing an update, so we need to make //... sure we don't do unecessary upates SzDateFromFileName( gMstr.szSrcDate, gMstr.szSrc); if ( strcmp( gMstr.szMpjLastRealUpdate, gMstr.szSrcDate) ) { wRC = (WORD)GenerateTokFile( gMstr.szMtk, gMstr.szSrc, &bChanged, wResTypeFilter); //... did we really update anything ?? if( bChanged ) { SzDateFromFileName( gMstr.szMpjLastRealUpdate, gMstr.szMtk); } } } //... write out the new mpj data PutMasterProjectData( pszMasterFile); } #ifndef RLDOS if ( fProject ) //... Are we to update a project? { //... Yes CHAR *pMpj, *pTok; if ( chOpt == 'u' ) //Update it { pMpj = pszMasterFile; pTok = argv[iCount]; } else { pMpj = argc - iCount < 1 ? NULL : argv[ iCount]; pTok = argc - iCount < 2 ? NULL : argv[ iCount+1]; } if ( GetProjectData( pszProjectFile, pMpj, pTok, fCodePageGiven, fNewLanguageGiven) ) { DoExit( -1); } //... Get source and master token file names //... from the master project file. wRC = (WORD)GetMasterProjectData( gProj.szMpj, NULL, NULL, fOldLanguageGiven); if ( wRC != SUCCESS ) { DoExit( wRC); } //... Now we do the actual updating. wRC = (WORD)Update( gMstr.szMtk, gProj.szTok); //... If that worked, we update the project file if ( wRC == 0 ) { SzDateFromFileName( gProj.szTokDate, (CHAR *)gProj.szTok); PutProjectData( pszProjectFile); } else { ShowErr( IDS_ERR_18, gProj.szTok, gMstr.szMtk); DoExit( IDS_ERR_18); } } #endif // RLDOS if ( !gbMaster && !fProject ) { wRC = (WORD)GenerateTokFile( argv[ iCount + 1], argv[ iCount], &bChanged, wResTypeFilter); } if ( wRC != 0 ) { #ifdef RLDOS ShowErr( IDS_ERR_08, errno, NULL); DoExit( -1); #else usError = GetLastError(); ShowErr( IDS_ERR_08, UlongToPtr(usError), NULL); switch ( usError ) { case ERROR_BAD_FORMAT: ShowErr( IDS_ERR_09, NULL, NULL); DoExit( IDS_ERR_09); break; case ERROR_OPEN_FAILED: ShowErr( IDS_ERR_10, NULL, NULL); DoExit( IDS_ERR_10); break; case ERROR_EXE_MARKED_INVALID: case ERROR_INVALID_EXE_SIGNATURE: ShowErr( IDS_ERR_11, NULL, NULL); DoExit( IDS_ERR_11); break; default: if ( usError < ERROR_HANDLE_DISK_FULL ) { ShowErr( IDS_ERR_12, _sys_errlist[ usError], NULL); DoExit( IDS_ERR_12); } DoExit( (int)usError); } //... END switch #endif } } else if ( fBuildRes ) { if ( argc - iCount < 3 ) { ShowErr( IDS_ERR_01, NULL, NULL); Usage(); DoExit( IDS_ERR_01); } if ( GenerateImageFile( argv[iCount + 2], argv[iCount], argv[iCount + 1], gMstr.szRdfs, wResTypeFilter) != 1 ) { ShowErr( IDS_ERR_23, argv[iCount + 2], NULL); DoExit( IDS_ERR_23); } } else { Usage(); DoExit( IDS_ERR_28); } DoExit( SUCCESS); } //................................................................... void DoExit( int nErrCode) { #ifdef _DEBUG FreeMemList( NULL); #endif // _DEBUG exit( nErrCode); }