From 8e716ed4580d1bb47d9ec6bedd03bd02a0a62937 Mon Sep 17 00:00:00 2001 From: kichik Date: Mon, 23 Jul 2007 18:43:07 +0000 Subject: [PATCH] applied patch #1758863 - Patch for building on GCC and aCC git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@5217 212acab6-be3b-0410-9dea-997c60f758d6 --- SCons/Config/gnu | 2 +- SCons/Config/hpc++ | 2 ++ Source/ResourceEditor.cpp | 36 ++++++++++++++++++------------------ Source/ResourceEditor.h | 4 ++-- Source/build.cpp | 6 +++--- Source/makenssi.cpp | 10 +++++----- Source/script.cpp | 3 +-- Source/strlist.cpp | 2 +- Source/strlist.h | 2 +- Source/util.cpp | 32 ++++++++++++++++---------------- 10 files changed, 50 insertions(+), 49 deletions(-) diff --git a/SCons/Config/gnu b/SCons/Config/gnu index a4c229fd..8942fa80 100644 --- a/SCons/Config/gnu +++ b/SCons/Config/gnu @@ -82,7 +82,7 @@ makensis_env = defenv.Clone() if not defenv['DEBUG']: makensis_env.Append(CCFLAGS = '-O2') # optimize makensis_env.Append(CCFLAGS = '-Wall') # all warnings -makensis_env.Append(CCFLAGS = '-Wno-non-virtual-dtor') # ignore virtual dtor warnings +makensis_env.Append(CXXFLAGS = '-Wno-non-virtual-dtor') # ignore virtual dtor warnings conf = FlagsConfigure(makensis_env) conf.CheckLinkFlag('-m32') # diff --git a/SCons/Config/hpc++ b/SCons/Config/hpc++ index 9df2905c..22d915fa 100644 --- a/SCons/Config/hpc++ +++ b/SCons/Config/hpc++ @@ -29,9 +29,11 @@ makensis_env.Append(CFLAGS = '-Ae') ### required to build makensis +makensis_env.Append(LINKFLAGS = '-AA') makensis_env.Append(LINKFLAGS = '+DD32') makensis_env.Append(LINKFLAGS = '-mt') +makensis_env.Append(CXXFLAGS = '-AA') makensis_env.Append(CCFLAGS = '+DD32') makensis_env.Append(CCFLAGS = '-mt') diff --git a/Source/ResourceEditor.cpp b/Source/ResourceEditor.cpp index 78d5d7f8..6988f454 100644 --- a/Source/ResourceEditor.cpp +++ b/Source/ResourceEditor.cpp @@ -547,16 +547,16 @@ CResourceDirectory* CResourceEditor::ScanDirectory(PRESOURCE_DIRECTORY rdRoot, P for (int i = 0; i < entries; i++) { MY_IMAGE_RESOURCE_DIRECTORY_ENTRY rd = rdToScan->Entries[i]; - rd.OffsetToData = ConvertEndianness(rd.OffsetToData); - rd.Name = ConvertEndianness(rd.Name); + rd.UOffset.OffsetToData = ConvertEndianness(rd.UOffset.OffsetToData); + rd.UName.Name = ConvertEndianness(rd.UName.Name); // If this entry points to data entry get a pointer to it - if (!rd.DirectoryOffset.DataIsDirectory) - rde = PIMAGE_RESOURCE_DATA_ENTRY(rd.OffsetToData + (BYTE*)rdRoot); + if (!rd.UOffset.DirectoryOffset.DataIsDirectory) + rde = PIMAGE_RESOURCE_DATA_ENTRY(rd.UOffset.OffsetToData + (BYTE*)rdRoot); // If this entry has a name, translate it from Unicode - if (rd.NameString.NameIsString) { - PIMAGE_RESOURCE_DIR_STRING_U rds = PIMAGE_RESOURCE_DIR_STRING_U(rd.NameString.NameOffset + (char*)rdRoot); + if (rd.UName.NameString.NameIsString) { + PIMAGE_RESOURCE_DIR_STRING_U rds = PIMAGE_RESOURCE_DIR_STRING_U(rd.UName.NameString.NameOffset + (char*)rdRoot); size_t nameSize = ConvertEndianness(rds->Length); szName = new WCHAR[nameSize+1]; @@ -565,15 +565,15 @@ CResourceDirectory* CResourceEditor::ScanDirectory(PRESOURCE_DIRECTORY rdRoot, P } // Else, set the name to this entry's id else - szName = MAKEINTRESOURCEW(ConvertEndianness(rdToScan->Entries[i].Id)); + szName = MAKEINTRESOURCEW(ConvertEndianness(rdToScan->Entries[i].UName.Id)); - if (rd.DirectoryOffset.DataIsDirectory) + if (rd.UOffset.DirectoryOffset.DataIsDirectory) rdc->AddEntry( new CResourceDirectoryEntry( szName, ScanDirectory( rdRoot, - PRESOURCE_DIRECTORY(rd.DirectoryOffset.OffsetToDirectory + (BYTE*)rdRoot) + PRESOURCE_DIRECTORY(rd.UOffset.DirectoryOffset.OffsetToDirectory + (BYTE*)rdRoot) ) ) ); @@ -632,10 +632,10 @@ void CResourceEditor::WriteRsrcSec(BYTE* pbRsrcSec) { MY_IMAGE_RESOURCE_DIRECTORY_ENTRY rDirE; ZeroMemory(&rDirE, sizeof(rDirE)); - rDirE.DirectoryOffset.DataIsDirectory = crd->GetEntry(i)->IsDataDirectory(); - rDirE.Id = crd->GetEntry(i)->HasName() ? 0 : crd->GetEntry(i)->GetId(); - rDirE.Id = ConvertEndianness(rDirE.Id); - rDirE.NameString.NameIsString = (crd->GetEntry(i)->HasName()) ? 1 : 0; + rDirE.UOffset.DirectoryOffset.DataIsDirectory = crd->GetEntry(i)->IsDataDirectory(); + rDirE.UName.Id = crd->GetEntry(i)->HasName() ? 0 : crd->GetEntry(i)->GetId(); + rDirE.UName.Id = ConvertEndianness(rDirE.UName.Id); + rDirE.UName.NameString.NameIsString = (crd->GetEntry(i)->HasName()) ? 1 : 0; CopyMemory(seeker, &rDirE, sizeof(MY_IMAGE_RESOURCE_DIRECTORY_ENTRY)); crd->GetEntry(i)->m_dwWrittenAt = DWORD(seeker); @@ -666,7 +666,7 @@ void CResourceEditor::WriteRsrcSec(BYTE* pbRsrcSec) { while (!qStrings.empty()) { CResourceDirectoryEntry* cRDirE = qStrings.front(); - PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY(cRDirE->m_dwWrittenAt)->NameString.NameOffset = ConvertEndianness(DWORD(seeker) - DWORD(pbRsrcSec)); + PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY(cRDirE->m_dwWrittenAt)->UName.NameString.NameOffset = ConvertEndianness(DWORD(seeker) - DWORD(pbRsrcSec)); WCHAR* szName = cRDirE->GetName(); WORD iLen = winchar_strlen(szName) + 1; @@ -705,13 +705,13 @@ void CResourceEditor::SetOffsets(CResourceDirectory* resDir, DWORD newResDirAt) for (int i = 0; i < resDir->CountEntries(); i++) { PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY rde = PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY(resDir->GetEntry(i)->m_dwWrittenAt); if (resDir->GetEntry(i)->IsDataDirectory()) { - rde->DirectoryOffset.DataIsDirectory = 1; - rde->DirectoryOffset.OffsetToDirectory = resDir->GetEntry(i)->GetSubDirectory()->m_dwWrittenAt - newResDirAt; - rde->OffsetToData = ConvertEndianness(rde->OffsetToData); + rde->UOffset.DirectoryOffset.DataIsDirectory = 1; + rde->UOffset.DirectoryOffset.OffsetToDirectory = resDir->GetEntry(i)->GetSubDirectory()->m_dwWrittenAt - newResDirAt; + rde->UOffset.OffsetToData = ConvertEndianness(rde->UOffset.OffsetToData); SetOffsets(resDir->GetEntry(i)->GetSubDirectory(), newResDirAt); } else { - rde->OffsetToData = ConvertEndianness(resDir->GetEntry(i)->GetDataEntry()->m_dwWrittenAt - newResDirAt); + rde->UOffset.OffsetToData = ConvertEndianness(resDir->GetEntry(i)->GetDataEntry()->m_dwWrittenAt - newResDirAt); } } } diff --git a/Source/ResourceEditor.h b/Source/ResourceEditor.h index 662eb26d..ea83bd04 100644 --- a/Source/ResourceEditor.h +++ b/Source/ResourceEditor.h @@ -72,7 +72,7 @@ typedef struct _MY_IMAGE_RESOURCE_DIRECTORY_ENTRY { } NameString; DWORD Name; WORD Id; - }; + } UName; union { DWORD OffsetToData; struct { @@ -84,7 +84,7 @@ typedef struct _MY_IMAGE_RESOURCE_DIRECTORY_ENTRY { DWORD OffsetToDirectory:31; #endif } DirectoryOffset; - }; + } UOffset; } MY_IMAGE_RESOURCE_DIRECTORY_ENTRY,*PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY; #pragma pack() diff --git a/Source/build.cpp b/Source/build.cpp index 01a3373d..7800ca74 100644 --- a/Source/build.cpp +++ b/Source/build.cpp @@ -510,7 +510,7 @@ int CEXEBuild::preprocess_string(char *out, const char *in, WORD codepage/*=CP_A // which is also memory wasting // So the line below must be commented !?? //m_UserVarNames.inc_reference(idxUserVar); - *out++ = (unsigned int) NS_VAR_CODE; // Named user variable; + *out++ = (char) NS_VAR_CODE; // Named user variable; WORD w = FIX_ENDIAN_INT16(CODE_SHORT(idxUserVar)); memcpy(out, &w, sizeof(WORD)); out += sizeof(WORD); @@ -534,7 +534,7 @@ int CEXEBuild::preprocess_string(char *out, const char *in, WORD codepage/*=CP_A { int CSIDL_Value_current = m_ShellConstants.get_value1(idxConst); int CSIDL_Value_all = m_ShellConstants.get_value2(idxConst); - *out++=(unsigned int)NS_SHELL_CODE; // Constant code identifier + *out++=(char)NS_SHELL_CODE; // Constant code identifier *out++=(char)CSIDL_Value_current; *out++=(char)CSIDL_Value_all; p = pShellConstName; @@ -555,7 +555,7 @@ int CEXEBuild::preprocess_string(char *out, const char *in, WORD codepage/*=CP_A idx = DefineLangString(cp); if (idx < 0) { - *out++ = (unsigned int)NS_LANG_CODE; // Next word is lang-string Identifier + *out++ = (char)NS_LANG_CODE; // Next word is lang-string Identifier WORD w = FIX_ENDIAN_INT16(CODE_SHORT(-idx-1)); memcpy(out, &w, sizeof(WORD)); out += sizeof(WORD); diff --git a/Source/makenssi.cpp b/Source/makenssi.cpp index 759fb8cf..ef58fba4 100644 --- a/Source/makenssi.cpp +++ b/Source/makenssi.cpp @@ -152,11 +152,11 @@ static void print_stub_info(CEXEBuild& build) { if (build.display_info) { - fprintf(g_output,"Size of first header is %d bytes.\n",sizeof(firstheader)); - fprintf(g_output,"Size of main header is %d bytes.\n",sizeof(header)); - fprintf(g_output,"Size of each section is %d bytes.\n",sizeof(section)); - fprintf(g_output,"Size of each page is %d bytes.\n",sizeof(page)); - fprintf(g_output,"Size of each instruction is %d bytes.\n",sizeof(entry)); + fprintf(g_output,"Size of first header is %lu bytes.\n",(unsigned long)sizeof(firstheader)); + fprintf(g_output,"Size of main header is %lu bytes.\n",(unsigned long)sizeof(header)); + fprintf(g_output,"Size of each section is %lu bytes.\n",(unsigned long)sizeof(section)); + fprintf(g_output,"Size of each page is %lu bytes.\n",(unsigned long)sizeof(page)); + fprintf(g_output,"Size of each instruction is %lu bytes.\n",(unsigned long)sizeof(entry)); int x=build.definedlist.getnum(); fprintf(g_output,"\nDefined symbols: "); for (int i=0; iHeader.NumberOfIdEntries); for (; i < l; i++) { - if (FIX_ENDIAN_INT16(rd->Entries[i].Id) == id) { + if (FIX_ENDIAN_INT16(rd->Entries[i].UName.Id) == id) { return i; } } @@ -326,10 +326,10 @@ int generate_unicons_offsets(unsigned char* exeHeader, size_t exeHeaderSize, uns int idx = find_in_dir(rdRoot, (WORD) (long) RT_ICON); MY_ASSERT(idx < 0, "no icons found"); MY_IMAGE_RESOURCE_DIRECTORY_ENTRY rdEntry = rdRoot->Entries[idx]; - FIX_ENDIAN_INT32_INPLACE(rdEntry.OffsetToData); - MY_ASSERT(!rdEntry.DirectoryOffset.DataIsDirectory, "bad resource directory"); + FIX_ENDIAN_INT32_INPLACE(rdEntry.UOffset.OffsetToData); + MY_ASSERT(!rdEntry.UOffset.DirectoryOffset.DataIsDirectory, "bad resource directory"); - PRESOURCE_DIRECTORY rdIcons = PRESOURCE_DIRECTORY(rdEntry.DirectoryOffset.OffsetToDirectory + DWORD(rdRoot)); + PRESOURCE_DIRECTORY rdIcons = PRESOURCE_DIRECTORY(rdEntry.UOffset.DirectoryOffset.OffsetToDirectory + DWORD(rdRoot)); MY_ASSERT((size_t)rdIcons - (size_t)exeHeader > exeHeaderSize, "corrupted EXE - invalid pointer"); @@ -339,19 +339,19 @@ int generate_unicons_offsets(unsigned char* exeHeader, size_t exeHeaderSize, uns for (WORD i = 0; i < wNumberOfEntries; i++) { // Icons dir can't have named entries MY_IMAGE_RESOURCE_DIRECTORY_ENTRY icoEntry = rdIcons->Entries[i]; - FIX_ENDIAN_INT32_INPLACE(icoEntry.OffsetToData); + FIX_ENDIAN_INT32_INPLACE(icoEntry.UOffset.OffsetToData); - MY_ASSERT(!icoEntry.DirectoryOffset.DataIsDirectory, "bad resource directory"); - PRESOURCE_DIRECTORY rd = PRESOURCE_DIRECTORY(icoEntry.DirectoryOffset.OffsetToDirectory + DWORD(rdRoot)); + MY_ASSERT(!icoEntry.UOffset.DirectoryOffset.DataIsDirectory, "bad resource directory"); + PRESOURCE_DIRECTORY rd = PRESOURCE_DIRECTORY(icoEntry.UOffset.DirectoryOffset.OffsetToDirectory + DWORD(rdRoot)); MY_ASSERT((size_t)rd - (size_t)exeHeader > exeHeaderSize, "corrupted EXE - invalid pointer"); MY_IMAGE_RESOURCE_DIRECTORY_ENTRY datEntry = rd->Entries[0]; - FIX_ENDIAN_INT32_INPLACE(datEntry.OffsetToData); + FIX_ENDIAN_INT32_INPLACE(datEntry.UOffset.OffsetToData); - MY_ASSERT(datEntry.DirectoryOffset.DataIsDirectory, "bad resource directory"); + MY_ASSERT(datEntry.UOffset.DirectoryOffset.DataIsDirectory, "bad resource directory"); - PIMAGE_RESOURCE_DATA_ENTRY rde = PIMAGE_RESOURCE_DATA_ENTRY(datEntry.OffsetToData + DWORD(rdRoot)); + PIMAGE_RESOURCE_DATA_ENTRY rde = PIMAGE_RESOURCE_DATA_ENTRY(datEntry.UOffset.OffsetToData + DWORD(rdRoot)); MY_ASSERT((size_t)rde - (size_t)exeHeader > exeHeaderSize, "corrupted EXE - invalid pointer"); @@ -605,18 +605,18 @@ FILE *my_fopen(const char *path, const char *mode) } #endif//!_WIN32 -void *operator new(size_t size) { +void *operator new(size_t size) throw(bad_alloc) { void *p = malloc(size); if (!p) throw bad_alloc(); return p; } -void operator delete(void *p) { +void operator delete(void *p) throw() { if (p) free(p); } -void operator delete [](void *p) { +void operator delete [](void *p) throw() { if (p) free(p); } @@ -695,7 +695,7 @@ string get_executable_path(const char* argv0) { char* pathtmp; char* path = NULL; size_t len = 100; - size_t nchars; + int nchars; while(1){ pathtmp = (char*)realloc(path,len+1); if( pathtmp == NULL ){ @@ -704,11 +704,11 @@ string get_executable_path(const char* argv0) { } path = pathtmp; nchars = readlink("/proc/self/exe", path, len); - if( nchars < 0 ){ + if( nchars == -1 ){ free(path); return get_full_path(argv0); } - if( nchars < len ){ + if( nchars < (int) len ){ path[nchars] = '\0'; string result(path); free(path);