Re: gcc C++ app: need a double, but gcc converts back to long

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 4/18/07, Jack Andrews <effbiae@xxxxxxxxx> wrote:
> problem to solve: the app fails on all files larger than 4.2GB. The

4.2GB is around 2^32B.  ie, you probably have an overflow problem

Yup.

you want FileSize to return an  unsigned long long  (a 64 bit value),
so declare fileSize as an unsigned long long.

Done.

however, i get the impression that FileSize only returns a 32 bit
value, so you need to  change this.  post the source for FileSize and
i'll see if i can help.

Done. Other things that may be of interest:
* I'm compiling with  -D_FILE_OFFSET_BITS for large file support.
* Another potential cause fileList (see FSutils.cpp) somehow ignoring
large files - I can't see why but as I mentioned I'm not much of a C++
programmer.

Thanks very much,

Mike
/***************************************************************************
 *   Made by Zotty                                                         *
 *   January 2007                                                          *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

#include <iostream>
#include <string>
#include <fstream>
#include <exception>
#include <algorithm>	// tokenizer

#include "utils.h"

using namespace std;

/**
 *
 */
Utils::Utils()
{
	// start logfile
	// do this here since Utils is used in almost every class
	cout << "*** Starting logfile ***" << endl;
	log.open("aca_decrypter.log");
	if (!log)
		cerr << "Error starting logfile. Continueing, but not logging." << endl;

}

/**
 *
 */
Utils::~Utils()
{
	if (log)
		log.close();
}

/**
 * Convert unsigned char to string of length 2
 */
void Utils::Char2Hex(unsigned char ch, char* szHex)
{
	unsigned char byte[2];
	byte[0] = ch/16;
	byte[1] = ch%16;
	for(int i=0; i<2; i++)
	{
		if(byte[i] >= 0 && byte[i] <= 9)
			szHex[i] = '0' + byte[i];
		else
			szHex[i] = 'A' + byte[i] - 10;
	}
	szHex[2] = 0;
}

/**
 * Convert string of length 2 to unsigned char
 */
void Utils::Hex2Char(char const* szHex, unsigned char& rch)
{
	rch = 0;
	for(int i=0; i<2; i++)
	{
		if(*(szHex + i) >='0' && *(szHex + i) <= '9')
			rch = (rch << 4) + (*(szHex + i) - '0');
		else if(*(szHex + i) >='A' && *(szHex + i) <= 'F')
			rch = (rch << 4) + (*(szHex + i) - 'A' + 10);
		else
			break;
	}
}    

/**
 * Convert string of unsigned chars to string of chars
 */
void Utils::toHexString(unsigned char const* pucCharStr, char* pszHexStr, int iSize)
{
	int i;
	char szHex[3];
	pszHexStr[0] = 0;
	for(i=0; i<iSize; i++)
	{
		Char2Hex(pucCharStr[i], szHex);
		strcat(pszHexStr, szHex);
	}
}

/**
 * Convert string of chars to string of unsigned chars
 */
void Utils::hexStringToByteArray(char const* pszHexStr, unsigned char* pucCharStr, int iSize)
{
	int i;
	unsigned char ch;
	for(i=0; i<iSize; i++)
	{
		Hex2Char(pszHexStr+2*i, ch);
		pucCharStr[i] = ch;
	}
}

/**
 * XOR
 */
void Utils::Xor(char (&buff)[16], char const* chain)
{
	for (int i=0; i<sizeof(buff); i++)
		buff[i] ^= *(chain++);	
}

/**
 * Strip leading/trailing spaces
 */
void Utils::Trim(string& str)
{
	string::size_type pos = str.find_last_not_of(' ');
	pos = str.find_last_not_of('\t', pos);	// filter tabs (keydb.cfg)
	
	if( pos != string::npos )
	{
		str.erase(pos + 1);
		pos = str.find_first_not_of(' ');
		if(pos != string::npos) str.erase(0, pos);
	}
	else
		str.erase(str.begin(), str.end());
}

/**
 * Tokenize string
 * leading/trailing spaces are trimmed
 */
void Utils::Tokenize(const string& str,
                      vector<string>& tokens,
                      const string& delimiters = " ")
{
    // Skip delimiters at beginning.
    string::size_type lastPos = str.find_first_not_of(delimiters, 0);
    // Find first "non-delimiter".
    string::size_type pos     = str.find_first_of(delimiters, lastPos);

    while (string::npos != pos || string::npos != lastPos)
    {
    	// Found a token, trim and add it to the vector.
    	string tmp = str.substr(lastPos, pos - lastPos);
    	Trim(tmp);
        tokens.push_back(tmp);
        // Skip delimiters.  Note the "not_of"
        lastPos = str.find_first_not_of(delimiters, pos);
        // Find next "non-delimiter"
        pos = str.find_first_of(delimiters, lastPos);
    }
}

/**
 * get filesize, OS independant
 */
unsigned long long Utils::FileSize(string fileName)
{
	ifstream f;
	f.open(fileName.c_str(), ios_base::binary | ios_base::in);
	if (!f.good() || f.eof() || !f.is_open()) { return 0; }
	f.seekg(0, std::ios_base::beg);
	ifstream::pos_type begin_pos = f.tellg();
	f.seekg(0, ios_base::end);
	return static_cast<int>(f.tellg() - begin_pos);
}


/**
 * load entire file into buffer
 */
byte * Utils::loadAFile(string fileName)
{
	unsigned long long fileSize = FileSize(fileName);

	try {
		byte * buffer = new byte[fileSize];
		ifstream fis(fileName.c_str());
		if (!fis) {
			cerr << fileName << " not found" << endl;
		}
		
		fis.read((char *)buffer, fileSize);
		
		fis.close();
		return buffer;
	}
	catch (exception e){
		e.what();
	}
	
	return NULL;
}

/**
 * Write message to logfile
 */
void Utils::LogMsg(string msg)
{
	msg += "\n";

	if (log) {
		log.write(msg.c_str(), msg.length());
		log.flush();
	}
	else
		cerr << "Error writing to logfile!" << endl;
}
/***************************************************************************
 *   Made by Zotty                                                         *
 *   January 2007                                                          *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

/*
Simple filesystem stuff. Quickly made because I find the M$ API crap. This
gets the job done, but doesn't win a beautycontest ;)
 */

#ifdef __WIN32__
#include <dir.h>
#else
#include <sys/dir.h>
#endif
#include <dirent.h>
#include <errno.h>
#include <sys/stat.h>

#include <vector>
#include <algorithm>	// transform
#include <cctype>		// tolower

#include "FSUtils.h"

using namespace std;

FSUtils::FSUtils()
{
	extention = "";
}

/**
 * Scan a directory
 * needs seperator at the end (not checked!)
 */
void FSUtils::ScanDir(string directoryPath, bool recursive)
{
	DIR * dir = opendir( directoryPath.c_str() );

	if (NULL != dir)
	{
		struct dirent *entry;

		for(; NULL != (entry = readdir(dir)); )
		{
			struct stat st;

			// Skip dots
			if ('.' == entry->d_name[0] && ( '\0' == entry->d_name[1] ||
				( '.' == entry->d_name[1] && '\0' == entry->d_name[2])) )
			{
				// do nothing
			}
			else
			{
				if (0 == stat((string(directoryPath) + entry->d_name).c_str(), &st))
				{
					// directories
					if (S_IFDIR == (st.st_mode & S_IFDIR))
					{
						// add to FileList
						File * listEntry = new File();
							listEntry->path = directoryPath;
							listEntry->fileName = "";
							listEntry->fileSize = 0;
							listEntry->isDirectory = true;
						fileList.push_back(listEntry);

						// when recursive scanning
						if (recursive) {
							string newPath = directoryPath + entry->d_name + SEPERATOR;
							ScanDir( newPath );
						}
					}

					// files
					if (S_IFREG == (st.st_mode & S_IFREG))
					{
						string fileName = entry->d_name;

						// check for extention
						if (extention.empty()) {
							File * listEntry = new File();
								listEntry->path = directoryPath;
								listEntry->fileName = fileName;
								listEntry->fileSize = 0;
								listEntry->isDirectory = false;
							fileList.push_back(listEntry);

						}
						else {
							string ext = fileName.substr( fileName.rfind('.', fileName.length()) );
							transform(ext.begin(), ext.end(), ext.begin(), (int(*)(int)) tolower);

							if (ext == extention) {
								File * listEntry = new File();
									listEntry->path = directoryPath;
									listEntry->fileName = fileName;
									listEntry->fileSize = 0;
									listEntry->isDirectory = false;
								fileList.push_back(listEntry);
							}
						}
					}		// files
				}		// stat
			}		// else
		}		// for

		closedir( dir );
	}
}

/**
 * Create directory
 */
bool FSUtils::CreateDir(string dirName)
{
	errno = 0;
#ifdef __WIN32__
	mkdir(dirName.c_str());
#else
	mkdir(dirName.c_str(), S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
#endif

	if (errno)
		return false;
	else
		return true;
}

/**
 * Remove/delete directory
 * dir must be empty or rmdir() fails!
 */
bool FSUtils::RemoveDir(string dirName)
{
	errno = 0;
	rmdir(dirName.c_str());

	if (errno)
		return false;
	else
		return true;
}

/**
 *
 */
/*
void FSUtils::ls()
{
	vector<string>::iterator it;
	for (it = fileList.begin(); it != fileList.end(); it++) {
		cout << "\t" << *it << endl;
	}
}
*/

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux