|
|
/****************************************************************************/ /* */ /* RC.C - */ /* */ /* Windows 2.0 Resource Compiler - Main Module */ /* */ /* */ /****************************************************************************/
#include "rc.h"
#include <setjmp.h>
#include <ddeml.h>
#define READ_MAX (MAXSTR+80)
#define MAX_CMD 256
#define cDefineMax 100
CHAR resname[_MAX_PATH];
PCHAR szRCPP[MAX_CMD]; BOOL fRcppAlloc[MAX_CMD];
/************************************************************************/ /* Define Global Variables */ /************************************************************************/
SHORT ResCount; /* number of resources */ PTYPEINFO pTypInfo;
SHORT nFontsRead; FONTDIR *pFontList; FONTDIR *pFontLast; TOKEN token; int errorCount; WCHAR tokenbuf[ MAXSTR + 1 ]; UCHAR exename[ _MAX_PATH ], fullname[ _MAX_PATH ]; UCHAR curFile[ _MAX_PATH ]; HANDLE hHeap = NULL;
PDLGHDR pLocDlg; UINT mnEndFlagLoc; /* patch location for end of a menu. */ /* we set the high order bit there */
/* BOOL fLeaveFontDir; */ BOOL fVerbose; /* verbose mode (-v) */
BOOL fAFXSymbols; BOOL fMacRsrcs; BOOL fAppendNull; BOOL fWarnInvalidCodePage; BOOL fSkipDuplicateCtlIdWarning; long lOffIndex; WORD idBase; BOOL fPreprocessOnly; CHAR szBuf[_MAX_PATH * 2]; CHAR szPreProcessName[_MAX_PATH];
/* File global variables */ CHAR inname[_MAX_PATH]; PCHAR szTempFileName; PCHAR szTempFileName2; PFILE fhBin; PFILE fhInput;
/* array for include path stuff, initially empty */ PCHAR pchInclude;
/* Substitute font name */ int nBogusFontNames; WCHAR *pszBogusFontNames[16]; WCHAR szSubstituteFontName[MAXTOKSTR];
static jmp_buf jb; extern ULONG lCPPTotalLinenumber;
/* Function prototypes for local functions */ HANDLE RCInit(void); BOOL RC_PreProcess (PCHAR); VOID CleanUpFiles(void);
/*---------------------------------------------------------------------------*/ /* */ /* rc_main() - */ /* */ /*---------------------------------------------------------------------------*/
int __cdecl rc_main( int argc, char**argv ) { PCHAR r; PCHAR x; PCHAR s1, s2, s3; int n; PCHAR pchIncludeT; ULONG cchIncludeMax; int fInclude = TRUE; /* by default, search INCLUDE */ int fIncludeCurrentFirst = TRUE; /* by default, add current dir to start of includes */ int cDefine = 0; int cUnDefine = 0; PCHAR pszDefine[cDefineMax]; PCHAR pszUnDefine[cDefineMax]; CHAR szDrive[_MAX_DRIVE]; CHAR szDir[_MAX_DIR]; CHAR szFName[_MAX_FNAME]; CHAR szExt[_MAX_EXT]; CHAR szFullPath[_MAX_PATH]; CHAR szIncPath[_MAX_PATH]; CHAR buf[10]; CHAR *szRC; PCHAR *ppargv; BOOL *pfRcppAlloc; int rcpp_argc;
/* Set up for this run of RC */ if (_setjmp(jb)) { return Nerrors; }
hHeap = RCInit(); if (hHeap == NULL) { SET_MSG(Msg_Text, sizeof(Msg_Text), GET_MSG(1120), 0x01000000); quit(Msg_Text); }
pchInclude = pchIncludeT = (PCHAR) MyAlloc(_MAX_PATH*2); cchIncludeMax = _MAX_PATH*2;
szRC = argv[0];
/* process the command line switches */ while ((argc > 1) && (IsSwitchChar(*argv[1]))) { switch (toupper(argv[1][1])) { case '?': case 'H': /* print out help, and quit */ SendError("\n"); SET_MSG(Msg_Text, sizeof(Msg_Text), GET_MSG(10001), VER_PRODUCTVERSION_STR, VER_PRODUCTBUILD); SendError(Msg_Text); SendError(GET_MSG(10002)); SendError(GET_MSG(20001));
return 0; /* can just return - nothing to cleanup, yet. */
case 'B': if (toupper(argv[1][2]) == 'R') { /* base resource id */ unsigned long id; if (isdigit(argv[1][3])) argv[1] += 3; else if (argv[1][3] == ':') argv[1] += 4; else { argc--; argv++; if (argc <= 1) goto BadId; } if (*(argv[1]) == 0) goto BadId; id = atoi(argv[1]); if (id < 1 || id > 32767) quit(GET_MSG(1210)); idBase = (WORD)id; break;
BadId: quit(GET_MSG(1209)); } break;
case 'C': /* Check for the existence of CodePage Number */ if (argv[1][2]) argv[1] += 2; else { argc--; argv++; }
/* Now argv point to first digit of CodePage */
if (!argv[1]) quit(GET_MSG(1204));
uiCodePage = atoi(argv[1]);
if (uiCodePage == 0) quit(GET_MSG(1205));
/* Check if uiCodePage exist in registry. */ if (!IsValidCodePage (uiCodePage)) quit(GET_MSG(1206)); break;
case 'D': /* if not attached to switch, skip to next */ if (argv[1][2]) argv[1] += 2; else { argc--; argv++; }
/* remember pointer to string */ pszDefine[cDefine++] = argv[1]; if (cDefine > cDefineMax) { SET_MSG(Msg_Text, sizeof(Msg_Text), GET_MSG(1105), argv[1]); quit(Msg_Text); } break;
case 'F': switch (toupper(argv[1][2])) { case 'O': if (argv[1][3]) argv[1] += 3; else { argc--; argv++; } if (argc > 1) strcpy(resname, argv[1]); else quit(GET_MSG(1101));
break;
default: SET_MSG(Msg_Text, sizeof(Msg_Text), GET_MSG(1103), argv[1]); quit(Msg_Text); } break;
case 'I': /* add string to directories to search */ /* note: format is <path>\0<path>\0\0 */
/* if not attached to switch, skip to next */ if (argv[1][2]) argv[1] += 2; else { argc--; argv++; }
if (!argv[1]) quit(GET_MSG(1201));
if ((strlen(argv[1]) + 1 + strlen(pchInclude)) >= cchIncludeMax) { cchIncludeMax = strlen(pchInclude) + strlen(argv[1]) + _MAX_PATH*2; pchIncludeT = (PCHAR) MyAlloc(cchIncludeMax); strcpy(pchIncludeT, pchInclude); MyFree(pchInclude); pchInclude = pchIncludeT; pchIncludeT = pchInclude + strlen(pchIncludeT) + 1; }
/* if not first switch, write over terminator with semicolon */ if (pchInclude != pchIncludeT) pchIncludeT[-1] = ';';
/* copy the path */ while ((*pchIncludeT++ = *argv[1]++) != 0) ; break;
case 'L': /* if not attached to switch, skip to next */ if (argv[1][2]) argv[1] += 2; else { argc--; argv++; }
if (!argv[1]) quit(GET_MSG(1202)); if (sscanf( argv[1], "%x", &language ) != 1) quit(GET_MSG(1203));
while (*argv[1]++ != 0) ;
break;
case 'M': fMacRsrcs = TRUE; goto MaybeMore;
case 'N': fAppendNull = TRUE; goto MaybeMore;
case 'P': fPreprocessOnly = TRUE; break;
case 'R': goto MaybeMore;
case 'S': // find out from BRAD what -S does
fAFXSymbols = TRUE; break;
case 'U': /* if not attached to switch, skip to next */ if (argv[1][2]) argv[1] += 2; else { argc--; argv++; }
/* remember pointer to string */ pszUnDefine[cUnDefine++] = argv[1]; if (cUnDefine > cDefineMax) { SET_MSG(Msg_Text, sizeof(Msg_Text), GET_MSG(1104), argv[1]); quit(Msg_Text); } break;
case 'V': fVerbose = TRUE; // AFX doesn't set this
goto MaybeMore;
case 'W': fWarnInvalidCodePage = TRUE; // Invalid Codepage is a warning, not an error.
goto MaybeMore;
case 'Y': fSkipDuplicateCtlIdWarning = TRUE; goto MaybeMore;
case 'X': /* remember not to add INCLUDE path */ fInclude = FALSE;
// VC seems to feel the current dir s/b added first no matter what...
// If -X! is specified, don't do that.
if (argv[1][2] == '!') { fIncludeCurrentFirst = FALSE; argv[1]++; }
MaybeMore: /* check to see if multiple switches, like -xrv */ if (argv[1][2]) { argv[1][1] = '-'; argv[1]++; continue; } break;
case 'Z':
/* if not attached to switch, skip to next */ if (argv[1][2]) argv[1] += 2; else { argc--; argv++; }
if (!argv[1]) quit(GET_MSG(1211));
s3 = strchr(argv[1], '/'); if (s3 == NULL) quit(GET_MSG(1212));
*s3 = '\0'; MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, s3+1, -1, szSubstituteFontName, MAXTOKSTR);
s1 = argv[1]; do { s2 = strchr(s1, ','); if (s2 != NULL) *s2 = '\0';
if (strlen(s1)) { if (nBogusFontNames >= 16) quit(GET_MSG(1213));
pszBogusFontNames[nBogusFontNames] = (WCHAR *) MyAlloc((strlen(s1)+1) * sizeof(WCHAR)); MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, s1, -1, pszBogusFontNames[nBogusFontNames], MAXTOKSTR); nBogusFontNames += 1; }
if (s2 != NULL) *s2++ = ','; } while (s1 = s2);
*s3 = '/';
while (*argv[1]++ != 0) ; break;
default: SET_MSG(Msg_Text, sizeof(Msg_Text), GET_MSG(1106), argv[1]); quit(Msg_Text); }
/* get next argument or switch */ argc--; argv++; }
/* make sure we have at least one file name to work with */ if (argc != 2 || *argv[1] == '\0') quit(GET_MSG(1107));
if (fVerbose) { SET_MSG(Msg_Text, sizeof(Msg_Text), GET_MSG(10001), VER_PRODUCTVERSION_STR, VER_PRODUCTBUILD); printf(Msg_Text); printf("%s\n", GET_MSG(10002)); }
// Support Multi Code Page
// If user did NOT indicate code in command line, we have to set Default
// for NLS Conversion
if (uiCodePage == 0) {
CHAR *pchCodePageString;
/* At first, search ENVIRONMENT VALUE */
if ((pchCodePageString = getenv("RCCODEPAGE")) != NULL) { uiCodePage = atoi(pchCodePageString);
if (uiCodePage == 0 || !IsValidCodePage(uiCodePage)) quit(GET_MSG(1207)); } else { /* We use System ANSI Code page (ACP) */ uiCodePage = GetACP(); } } uiDefaultCodePage = uiCodePage; if (fVerbose) printf("Using codepage %d as default\n", uiDefaultCodePage);
/* If we have no extension, assumer .rc */ /* If .res extension, make sure we have -fo set, or error */ /* Otherwise, just assume file is .rc and output .res (or resname) */
//
// We have to be careful upper casing this, because the codepage
// of the filename might be in something other than current codepage.
//
// MultiByteToWideChar(uiCodePage, MB_PRECOMPOSED, argv[1], -1, tokenbuf, MAXSTR+1);
// if (CharUpperBuff(tokenbuf, wcslen(tokenbuf)) == 0)
// _wcsupr(tokenbuf);
// WideCharToMultiByte(uiCodePage, 0, tokenbuf, -1, argv[1], strlen(argv[1]), NULL, NULL);
_splitpath(argv[1], szDrive, szDir, szFName, szExt);
if (!(*szDir || *szDrive)) { strcpy(szIncPath, ".;"); } else { strcpy(szIncPath, szDrive); strcat(szIncPath, szDir); strcat(szIncPath, ";.;"); }
if ((strlen(szIncPath) + 1 + strlen(pchInclude)) >= cchIncludeMax) { cchIncludeMax = strlen(pchInclude) + strlen(szIncPath) + _MAX_PATH*2; pchIncludeT = (PCHAR) MyAlloc(cchIncludeMax); strcpy(pchIncludeT, pchInclude); MyFree(pchInclude); pchInclude = pchIncludeT; pchIncludeT = pchInclude + strlen(pchIncludeT) + 1; }
pchIncludeT = (PCHAR) MyAlloc(cchIncludeMax);
if (fIncludeCurrentFirst) { strcpy(pchIncludeT, szIncPath); strcat(pchIncludeT, pchInclude); } else { strcpy(pchIncludeT, pchInclude); strcat(pchIncludeT, ";"); strcat(pchIncludeT, szIncPath); }
MyFree(pchInclude); pchInclude = pchIncludeT; pchIncludeT = pchInclude + strlen(pchIncludeT) + 1;
if (!szExt[0]) { strcpy(szExt, ".RC"); } else if (strcmp (szExt, ".RES") == 0) { quit (GET_MSG(1208)); }
_makepath(inname, szDrive, szDir, szFName, szExt); if (fPreprocessOnly) { _makepath(szPreProcessName, NULL, NULL, szFName, ".rcpp"); }
/* Create the name of the .RES file */ if (resname[0] == 0) { // if building a Mac resource file, we use .rsc to match mrc's output
_makepath(resname, szDrive, szDir, szFName, fMacRsrcs ? ".RSC" : ".RES"); }
/* create the temporary file names */ szTempFileName = (PCHAR) MyAlloc(_MAX_PATH);
_fullpath(szFullPath, resname, _MAX_PATH); _splitpath(szFullPath, szDrive, szDir, NULL, NULL);
_makepath(szTempFileName, szDrive, szDir, "RCXXXXXX", ""); _mktemp (szTempFileName); szTempFileName2 = (PCHAR) MyAlloc(_MAX_PATH); _makepath(szTempFileName2, szDrive, szDir, "RDXXXXXX", ""); _mktemp (szTempFileName2);
ppargv = szRCPP; pfRcppAlloc = fRcppAlloc; *ppargv++ = "RCPP"; *pfRcppAlloc++ = FALSE; rcpp_argc = 1;
/* Open the .RES file (deleting any old versions which exist). */ if ((fhBin = fopen(resname, "w+b")) == NULL) { SET_MSG(Msg_Text, sizeof(Msg_Text), GET_MSG(1109), resname); quit(Msg_Text); } else { if (fMacRsrcs) MySeek(fhBin, MACDATAOFFSET, 0); if (fVerbose) { SET_MSG(Msg_Text, sizeof(Msg_Text), GET_MSG(10102), resname); printf(Msg_Text); }
/* Set up for RCPP. This constructs the command line for it. */ *ppargv++ = _strdup("-CP"); *pfRcppAlloc++ = TRUE; rcpp_argc++;
_itoa(uiCodePage, buf, 10); *ppargv++ = buf; *pfRcppAlloc++ = FALSE; rcpp_argc++;
*ppargv++ = _strdup("-f"); *pfRcppAlloc++ = TRUE; rcpp_argc++;
*ppargv++ = _strdup(szTempFileName); *pfRcppAlloc++ = TRUE; rcpp_argc++;
*ppargv++ = _strdup("-g"); *pfRcppAlloc++ = TRUE; rcpp_argc++; if (fPreprocessOnly) { *ppargv++ = _strdup(szPreProcessName); } else { *ppargv++ = _strdup(szTempFileName2); } *pfRcppAlloc++ = TRUE; rcpp_argc++;
*ppargv++ = _strdup("-DRC_INVOKED"); *pfRcppAlloc++ = TRUE; rcpp_argc++;
if (fAFXSymbols) { *ppargv++ = _strdup("-DAPSTUDIO_INVOKED"); *pfRcppAlloc++ = TRUE; rcpp_argc++; }
if (fMacRsrcs) { *ppargv++ = _strdup("-D_MAC"); *pfRcppAlloc++ = TRUE; rcpp_argc++; }
*ppargv++ = _strdup("-D_WIN32"); /* to be compatible with C9/VC++ */ *pfRcppAlloc++ = TRUE; rcpp_argc++;
*ppargv++ = _strdup("-pc\\:/"); *pfRcppAlloc++ = TRUE; rcpp_argc++;
*ppargv++ = _strdup("-E"); *pfRcppAlloc++ = TRUE; rcpp_argc++;
/* Parse the INCLUDE environment variable */
if (fInclude) {
*ppargv++ = _strdup("-I."); *pfRcppAlloc++ = TRUE; rcpp_argc++;
/* add seperator if any -I switches */ if (pchInclude != pchIncludeT) pchIncludeT[-1] = ';';
/* read 'em */ x = getenv("INCLUDE"); if (x == (PCHAR)NULL) { *pchIncludeT = '\000'; } else { if (strlen(pchInclude) + strlen(x) + 1 >= cchIncludeMax) { cchIncludeMax = strlen(pchInclude) + strlen(x) + _MAX_PATH*2; pchIncludeT = (PCHAR) MyAlloc(cchIncludeMax); strcpy(pchIncludeT, pchInclude); MyFree(pchInclude); pchInclude = pchIncludeT; }
strcat(pchInclude, x); pchIncludeT = pchInclude + strlen(pchInclude); } }
/* now put includes on the RCPP command line */ for (x = pchInclude ; *x ; ) {
r = x; while (*x && *x != ';') x = CharNextA(x);
/* mark if semicolon */ if (*x) *x-- = 0;
if (*r != '\0' && /* empty include path? */ *r != '%' /* check for un-expanded stuff */ // && strchr(r, ' ') == NULL /* check for whitespace */
) { /* add switch */ *ppargv++ = _strdup("-I"); *pfRcppAlloc++ = TRUE; rcpp_argc++;
*ppargv++ = _strdup(r); *pfRcppAlloc++ = TRUE; rcpp_argc++; }
/* was semicolon, need to fix for searchenv() */ if (*x) { *++x = ';'; x++; } }
/* include defines */ for (n = 0; n < cDefine; n++) { *ppargv++ = _strdup("-D"); *pfRcppAlloc++ = TRUE; rcpp_argc++;
*ppargv++ = pszDefine[n]; *pfRcppAlloc++ = FALSE; rcpp_argc++; }
/* include undefine */ for (n = 0; n < cUnDefine; n++) { *ppargv++ = _strdup("-U"); *pfRcppAlloc++ = TRUE; rcpp_argc++;
*ppargv++ = pszUnDefine[n]; *pfRcppAlloc++ = FALSE; rcpp_argc++; }
if (rcpp_argc > MAX_CMD) { quit(GET_MSG(1102)); } if (fVerbose) { /* echo the preprocessor command */ printf("RC:"); for (n = 0 ; n < rcpp_argc ; n++) { wsprintfA(Msg_Text, " %s", szRCPP[n]); printf(Msg_Text); } printf("\n"); }
/* Add .rc with rcincludes into szTempFileName */ if (!RC_PreProcess(inname)) quit(Msg_Text);
/* Run the Preprocessor. */ if (RCPP(rcpp_argc, szRCPP, NULL) != 0) quit(GET_MSG(1116));
// All done. Now free up the argv array.
for (n = 0 ; n < rcpp_argc ; n++) { if (fRcppAlloc[n] == TRUE) { free(szRCPP[n]); } } }
if (fPreprocessOnly) { sprintf(szBuf, "Preprocessed File Created in: %s\n", szPreProcessName); quit(szBuf); }
if (fVerbose) printf("\n%s", inname);
if ((fhInput = fopen(szTempFileName2, "rb")) == NULL_FILE) quit(GET_MSG(2180));
if (!InitSymbolInfo()) quit(GET_MSG(22103));
LexInit (fhInput); uiCodePage = uiDefaultCodePage; ReadRF(); /* create .RES from .RC */ if (!TermSymbolInfo(fhBin)) quit(GET_MSG(22204));
if (!fMacRsrcs) MyAlign(fhBin); // Pad end of file so that we can concatenate files
CleanUpFiles();
HeapDestroy(hHeap);
return Nerrors; // return success, not quitting.
}
/* RCInit
* Initializes this run of RC. */
HANDLE RCInit( void ) { Nerrors = 0; uiCodePage = 0; nFontsRead = 0;
szTempFileName = NULL; szTempFileName2 = NULL;
lOffIndex = 0; idBase = 128; pTypInfo = NULL;
fVerbose = FALSE; fMacRsrcs = FALSE;
// Clear the filenames
exename[0] = 0; resname[0] = 0;
/* create growable local heap of 16MB minimum size */ return HeapCreate(HEAP_NO_SERIALIZE, 0, 0); }
/*---------------------------------------------------------------------------*/ /* */ /* skipblanks() - */ /* */ /*---------------------------------------------------------------------------*/
PWCHAR skipblanks( PWCHAR pstr, int fTerminate ) { /* search forward for first non-white character and save its address */ while (*pstr && iswspace(*pstr)) pstr++;
if (fTerminate) { PWCHAR retval = pstr;
/* search forward for first white character and zero to extract word */ while (*pstr && !iswspace(*pstr)) pstr++; *pstr = 0; return retval; } else { return pstr; } }
/*---------------------------------------------------------------------------*/ /* */ /* RC_PreProcess() - */ /* */ /*---------------------------------------------------------------------------*/
BOOL RC_PreProcess( PCHAR szname ) { PFILE fhout; /* fhout: is temp file with rcincluded stuff */ PFILE fhin; CHAR nm[_MAX_PATH*2]; PCHAR pch; PWCHAR pwch; PWCHAR pfilename; WCHAR readszbuf[READ_MAX]; WCHAR szT[ MAXSTR ]; UINT iLine = 0; int fBlanks = TRUE; INT fFileType;
/* Open the .RC source file. */ MultiByteToWideChar(uiCodePage, MB_PRECOMPOSED, szname, -1, Filename, MED_BUFFER+1); fhin = fopen(szname, "rb"); if (!fhin) { SET_MSG(Msg_Text, sizeof(Msg_Text), GET_MSG(1110), szname); return(FALSE); }
/* Open the temporary output file. */ fhout = fopen(szTempFileName, "w+b"); if (!fhout) { strcpy(Msg_Text, GET_MSG(2180)); return(FALSE); }
/* output the current filename for RCPP messages */ for (pch=nm ; *szname ; szname = CharNextA(szname)) { *pch++ = *szname; if (IsDBCSLeadByteEx(uiCodePage, *szname)) *pch++ = *(szname + 1); /* Hack to fix bug #8786: makes '\' to "\\" */ else if (*szname == '\\') *pch++ = '\\'; } *pch++ = '\000';
/* Output the current filename for RCPP messages */ wcscpy(szT, L"#line 1\""); // hack - strlen("#line 1\"") is 8.
MultiByteToWideChar(uiCodePage, MB_PRECOMPOSED, nm, -1, szT+8, MAXSTR+1-8); wcscat(szT, L"\"\r\n"); MyWrite(fhout, szT, wcslen(szT) * sizeof(WCHAR));
/* Determine if the input file is Unicode */ fFileType = DetermineFileType (fhin);
/* Process each line of the input file. */ while (fgetl(readszbuf, READ_MAX, fFileType == DFT_FILE_IS_16_BIT, fhin)) {
/* keep track of the number of lines read */ Linenumber = iLine++;
if ((iLine & RC_PREPROCESS_UPDATE) == 0) UpdateStatus(1, iLine);
/* Skip the Byte Order Mark and the leading bytes. */ pwch = readszbuf; while (*pwch && (iswspace(*pwch) || *pwch == 0xFEFF)) pwch++;
/* if the line is a rcinclude line... */ if (strpre(L"rcinclude", pwch)) { /* Get the name of the rcincluded file. */ pfilename = skipblanks(pwch + 9, TRUE);
MyWrite(fhout, L"#include \"", 10 * sizeof(WCHAR)); MyWrite(fhout, pfilename, wcslen(pfilename) * sizeof(WCHAR)); MyWrite(fhout, L"\"\r\n", 3 * sizeof(WCHAR));
} else if (strpre(L"#pragma", pwch)) { WCHAR cSave;
pfilename = skipblanks(pwch + 7, FALSE); if (strpre(L"code_page", pfilename)) { pfilename = skipblanks(pfilename + 9, FALSE); if (*pfilename == L'(') { ULONG cp = 0;
pfilename = skipblanks(pfilename + 1, FALSE); // really should allow hex/octal, but ...
if (iswdigit(*pfilename)) { while (iswdigit(*pfilename)) { cp = cp * 10 + (*pfilename++ - L'0'); } pfilename = skipblanks(pfilename, FALSE); } else if (strpre(L"default", pfilename)) { cp = uiDefaultCodePage; pfilename = skipblanks(pfilename + 7, FALSE); }
if (cp == 0) { wsprintfA(Msg_Text, "%s%ws", GET_MSG(4212), pfilename); error(4212); } else if (*pfilename != L')') { strcpy (Msg_Text, GET_MSG (4211)); error(4211); } else if (cp == CP_WINUNICODE) { strcpy (Msg_Text, GET_MSG (4213)); if (fWarnInvalidCodePage) { warning(4213); } else { fatal(4213); } } else if (!IsValidCodePage(cp)) { strcpy (Msg_Text, GET_MSG (4214)); if (fWarnInvalidCodePage) { warning(4214); } else { fatal(4214); } } else { uiCodePage = cp; /* Copy the #pragma line to the temp file. */ MyWrite(fhout, pwch, wcslen(pwch) * sizeof(WCHAR)); MyWrite(fhout, L"\r\n", 2 * sizeof(WCHAR)); } } else { strcpy (Msg_Text, GET_MSG (4210)); error(4210); } } } else if (!*pwch) { fBlanks = TRUE; } else { if (fBlanks) { swprintf(szT, L"#line %d\r\n", iLine); MyWrite(fhout, szT, wcslen(szT) * sizeof(WCHAR)); fBlanks = FALSE; } /* Copy the .RC line to the temp file. */ MyWrite(fhout, pwch, wcslen(pwch) * sizeof(WCHAR)); MyWrite(fhout, L"\r\n", 2 * sizeof(WCHAR)); } }
lCPPTotalLinenumber = iLine; Linenumber = 0;
uiCodePage = uiDefaultCodePage;
fclose(fhout); fclose(fhin);
return(TRUE); }
/*---------------------------------------------------------------------------*/ /* */ /* quit() */ /* */ /*---------------------------------------------------------------------------*/
VOID quit( PSTR str ) { /* print out the error message */ if (str) { SendError("\n"); SendError(str); SendError("\n"); }
CleanUpFiles();
/* delete output file */ if (resname) remove(resname);
if (hHeap) HeapDestroy(hHeap);
Nerrors++; longjmp(jb, Nerrors); }
#ifdef __cplusplus
extern "C" #endif
BOOL WINAPI Handler( DWORD fdwCtrlType ) { if (fdwCtrlType == CTRL_C_EVENT) { SendError("\n"); SET_MSG(Msg_Text, sizeof(Msg_Text), GET_MSG(20101)); SendError(Msg_Text); CleanUpFiles();
HeapDestroy(hHeap);
/* delete output file */ if (resname) remove(resname);
return(FALSE); }
return(FALSE); }
VOID CleanUpFiles( void ) { TermSymbolInfo(NULL_FILE);
/* Close ALL files. */ if (fhBin != NULL) fclose(fhBin); if (fhInput != NULL) fclose(fhInput); if (fhCode != NULL) fclose(fhCode); p0_terminate();
/* clean up after font directory temp file */ if (nFontsRead) remove("rc$x.fdr");
/* delete the temporary files */ if (szTempFileName) remove(szTempFileName); if (szTempFileName2) remove(szTempFileName2); if (Nerrors > 0) remove(resname); }
|