diff options
author | Bernard Normier <bernard@zeroc.com> | 2007-02-01 17:09:49 +0000 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2007-02-01 17:09:49 +0000 |
commit | abada90e3f84dc703b8ddc9efcbed8a946fadead (patch) | |
tree | 2c6f9dccd510ea97cb927a7bd635422efaae547a /cpp/src/IcePatch2/Util.cpp | |
parent | removing trace message (diff) | |
download | ice-abada90e3f84dc703b8ddc9efcbed8a946fadead.tar.bz2 ice-abada90e3f84dc703b8ddc9efcbed8a946fadead.tar.xz ice-abada90e3f84dc703b8ddc9efcbed8a946fadead.zip |
Expanded tabs into spaces
Diffstat (limited to 'cpp/src/IcePatch2/Util.cpp')
-rw-r--r-- | cpp/src/IcePatch2/Util.cpp | 1518 |
1 files changed, 759 insertions, 759 deletions
diff --git a/cpp/src/IcePatch2/Util.cpp b/cpp/src/IcePatch2/Util.cpp index f18a1b86b75..57b7890f723 100644 --- a/cpp/src/IcePatch2/Util.cpp +++ b/cpp/src/IcePatch2/Util.cpp @@ -44,8 +44,8 @@ const char* IcePatch2::logFile = "IcePatch2.log"; extern "C" static int ice_scandir(const char* dir, struct dirent*** namelist, - int (*select)(const struct dirent*), - int (*compar)(const void*, const void*)) + int (*select)(const struct dirent*), + int (*compar)(const void*, const void*)) { DIR* d; struct dirent* entry; @@ -54,46 +54,46 @@ ice_scandir(const char* dir, struct dirent*** namelist, if((d = opendir(dir)) == 0) { - return -1; + return -1; } *namelist = 0; while((entry = readdir(d)) != 0) { - if(select == 0 || (select != 0 && (*select)(entry))) - { - *namelist = (struct dirent**)realloc((void*)(*namelist), (size_t)((i + 1) * sizeof(struct dirent*))); - if(*namelist == 0) - { - closedir(d); - return -1; - } - - entrysize = sizeof(struct dirent) - sizeof(entry->d_name) + strlen(entry->d_name) + 1; - (*namelist)[i] = (struct dirent*)malloc(entrysize); - if((*namelist)[i] == 0) - { - closedir(d); - return -1; - } - memcpy((*namelist)[i], entry, entrysize); - ++i; - } + if(select == 0 || (select != 0 && (*select)(entry))) + { + *namelist = (struct dirent**)realloc((void*)(*namelist), (size_t)((i + 1) * sizeof(struct dirent*))); + if(*namelist == 0) + { + closedir(d); + return -1; + } + + entrysize = sizeof(struct dirent) - sizeof(entry->d_name) + strlen(entry->d_name) + 1; + (*namelist)[i] = (struct dirent*)malloc(entrysize); + if((*namelist)[i] == 0) + { + closedir(d); + return -1; + } + memcpy((*namelist)[i], entry, entrysize); + ++i; + } } if(closedir(d)) { - return -1; + return -1; } if(i == 0) { - return -1; + return -1; } if(compar != 0) { - qsort((void *)(*namelist), (size_t)i, sizeof(struct dirent *), compar); + qsort((void *)(*namelist), (size_t)i, sizeof(struct dirent *), compar); } return i; @@ -117,10 +117,10 @@ bool IcePatch2::writeFileInfo(FILE* fp, const FileInfo& info) { int rc = fprintf(fp, "%s\t%s\t%d\t%d\n", - IceUtil::escapeString(info.path, "").c_str(), - bytesToString(info.checksum).c_str(), - info.size, - static_cast<int>(info.executable)); + IceUtil::escapeString(info.path, "").c_str(), + bytesToString(info.checksum).c_str(), + info.size, + static_cast<int>(info.executable)); return rc > 0; } @@ -131,17 +131,17 @@ IcePatch2::readFileInfo(FILE* fp, FileInfo& info) char buf[BUFSIZ]; while(fgets(buf, static_cast<int>(sizeof(buf)), fp) != 0) { - data += buf; + data += buf; - size_t len = strlen(buf); - if(buf[len - 1] == '\n') - { - break; - } + size_t len = strlen(buf); + if(buf[len - 1] == '\n') + { + break; + } } if(data.empty()) { - return false; + return false; } istringstream is(data); @@ -165,31 +165,31 @@ IcePatch2::lastError() #ifdef _WIN32 LPVOID lpMsgBuf = 0; DWORD ok = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (LPTSTR)&lpMsgBuf, - 0, - NULL); + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR)&lpMsgBuf, + 0, + NULL); if(ok) { - LPCTSTR msg = (LPCTSTR)lpMsgBuf; - assert(msg && strlen((const char*)msg) > 0); - string result = (const char*)msg; - LocalFree(lpMsgBuf); + LPCTSTR msg = (LPCTSTR)lpMsgBuf; + assert(msg && strlen((const char*)msg) > 0); + string result = (const char*)msg; + LocalFree(lpMsgBuf); - while(result.size() >= 1 && (result[result.size() - 1] == '\n' || result[result.size() - 1] == '\r')) - { - result.erase(result.size() - 1); - } + while(result.size() >= 1 && (result[result.size() - 1] == '\n' || result[result.size() - 1] == '\r')) + { + result.erase(result.size() - 1); + } - return result; + return result; } else { - return "unknown error"; + return "unknown error"; } #else return strerror(errno); @@ -204,7 +204,7 @@ IcePatch2::bytesToString(const ByteSeq& bytes) for(ByteSeq::const_iterator p = bytes.begin(); p != bytes.end(); ++p) { - s << setw(2) << setfill('0') << hex << static_cast<int>(*p); + s << setw(2) << setfill('0') << hex << static_cast<int>(*p); } return s.str(); @@ -217,8 +217,8 @@ IcePatch2::bytesToString(const ByteSeq& bytes) for(unsigned int i = 0; i < bytes.size(); ++i) { - s[i * 2] = toHex[(bytes[i] >> 4) & 0xf]; - s[i * 2 + 1] = toHex[bytes[i] & 0xf]; + s[i * 2] = toHex[(bytes[i] >> 4) & 0xf]; + s[i * 2 + 1] = toHex[bytes[i] & 0xf]; } return s; @@ -233,37 +233,37 @@ IcePatch2::stringToBytes(const string& str) for(unsigned int i = 0; i + 1 < str.size(); i += 2) { /* - istringstream is(str.substr(i, 2)); - int byte; - is >> hex >> byte; + istringstream is(str.substr(i, 2)); + int byte; + is >> hex >> byte; */ - int byte = 0; + int byte = 0; - for(int j = 0; j < 2; ++j) - { - char c = str[i + j]; + for(int j = 0; j < 2; ++j) + { + char c = str[i + j]; - if(c >= '0' && c <= '9') - { - byte |= c - '0'; - } - else if(c >= 'a' && c <= 'f') - { - byte |= 10 + c - 'a'; - } - else if(c >= 'A' && c <= 'F') - { - byte |= 10 + c - 'A'; - } + if(c >= '0' && c <= '9') + { + byte |= c - '0'; + } + else if(c >= 'a' && c <= 'f') + { + byte |= 10 + c - 'a'; + } + else if(c >= 'A' && c <= 'F') + { + byte |= 10 + c - 'A'; + } - if(j == 0) - { - byte <<= 4; - } - } + if(j == 0) + { + byte <<= 4; + } + } - bytes.push_back(static_cast<Byte>(byte)); + bytes.push_back(static_cast<Byte>(byte)); } return bytes; @@ -279,23 +279,23 @@ IcePatch2::simplify(const string& path) #ifdef _WIN32 for(pos = 0; pos < result.size(); ++pos) { - if(result[pos] == '\\') - { - result[pos] = '/'; - } + if(result[pos] == '\\') + { + result[pos] = '/'; + } } #endif pos = 0; while((pos = result.find("//", pos)) != string::npos) { - result.erase(pos, 1); + result.erase(pos, 1); } pos = 0; while((pos = result.find("/./", pos)) != string::npos) { - result.erase(pos, 2); + result.erase(pos, 2); } while(result.substr(0, 4) == "/../") @@ -305,7 +305,7 @@ IcePatch2::simplify(const string& path) if(result.substr(0, 2) == "./") { - result.erase(0, 2); + result.erase(0, 2); } if(result == "/." || @@ -316,7 +316,7 @@ IcePatch2::simplify(const string& path) if(result.size() >= 2 && result.substr(result.size() - 2, 2) == "/.") { - result.erase(result.size() - 2, 2); + result.erase(result.size() - 2, 2); } if(result == "/" || result.size() == 3 && isalpha(result[0]) && result[1] == ':' && result[2] == '/') @@ -326,7 +326,7 @@ IcePatch2::simplify(const string& path) if(result.size() >= 1 && result[result.size() - 1] == '/') { - result.erase(result.size() - 1); + result.erase(result.size() - 1); } if(result == "/..") @@ -342,7 +342,7 @@ IcePatch2::isAbsolute(const string& pa) { if(pa.empty()) { - return false; + return false; } unsigned i = 0; @@ -378,7 +378,7 @@ IcePatch2::getSuffix(const string& pa) if(dotPos == string::npos || slashPos != string::npos && slashPos > dotPos) { - return string(); + return string(); } return path.substr(dotPos + 1); @@ -394,7 +394,7 @@ IcePatch2::getWithoutSuffix(const string& pa) if(dotPos == string::npos || slashPos != string::npos && slashPos > dotPos) { - return path; + return path; } return path.substr(0, dotPos); @@ -405,9 +405,9 @@ IcePatch2::ignoreSuffix(const string& path) { string suffix = getSuffix(path); return suffix == "md5" // For legacy IcePatch. - || suffix == "tot" // For legacy IcePatch. - || suffix == "bz2" - || suffix == "bz2temp"; + || suffix == "tot" // For legacy IcePatch. + || suffix == "bz2" + || suffix == "bz2temp"; } string @@ -418,11 +418,11 @@ IcePatch2::getBasename(const string& pa) string::size_type pos = path.rfind('/'); if(pos == string::npos) { - return path; + return path; } else { - return path.substr(pos + 1); + return path.substr(pos + 1); } } @@ -434,11 +434,11 @@ IcePatch2::getDirname(const string& pa) string::size_type pos = path.rfind('/'); if(pos == string::npos) { - return string(); + return string(); } else { - return path.substr(0, pos); + return path.substr(0, pos); } } @@ -453,7 +453,7 @@ IcePatch2::rename(const string& fromPa, const string& toPa) if(OS::rename(fromPath ,toPath) == -1) { - throw "cannot rename `" + fromPath + "' to `" + toPath + "': " + lastError(); + throw "cannot rename `" + fromPath + "' to `" + toPath + "': " + lastError(); } } @@ -465,26 +465,26 @@ IcePatch2::remove(const string& pa) OS::structstat buf; if(OS::osstat(path, &buf) == -1) { - throw "cannot stat `" + path + "':\n" + lastError(); + throw "cannot stat `" + path + "':\n" + lastError(); } if(S_ISDIR(buf.st_mode)) { - if(OS::rmdir(path) == -1) - { - if(errno == EACCES) - { - assert(false); - } - throw "cannot remove directory `" + path + "':\n" + lastError(); - } + if(OS::rmdir(path) == -1) + { + if(errno == EACCES) + { + assert(false); + } + throw "cannot remove directory `" + path + "':\n" + lastError(); + } } else { - if(OS::remove(path) == -1) - { - throw "cannot remove file `" + path + "':\n" + lastError(); - } + if(OS::remove(path) == -1) + { + throw "cannot remove file `" + path + "':\n" + lastError(); + } } } @@ -496,31 +496,31 @@ IcePatch2::removeRecursive(const string& pa) OS::structstat buf; if(OS::osstat(path, &buf) == -1) { - throw "cannot stat `" + path + "':\n" + lastError(); + throw "cannot stat `" + path + "':\n" + lastError(); } if(S_ISDIR(buf.st_mode)) { - StringSeq paths = readDirectory(path); - for(StringSeq::const_iterator p = paths.begin(); p != paths.end(); ++p) - { - removeRecursive(path + '/' + *p); - } + StringSeq paths = readDirectory(path); + for(StringSeq::const_iterator p = paths.begin(); p != paths.end(); ++p) + { + removeRecursive(path + '/' + *p); + } - if(!isRoot(path)) - { - if(OS::rmdir(path) == -1) - { - throw "cannot remove directory `" + path + "':\n" + lastError(); - } - } + if(!isRoot(path)) + { + if(OS::rmdir(path) == -1) + { + throw "cannot remove directory `" + path + "':\n" + lastError(); + } + } } else { - if(OS::remove(path) == -1) - { - throw "cannot remove file `" + path + "':\n" + lastError(); - } + if(OS::remove(path) == -1) + { + throw "cannot remove file `" + path + "':\n" + lastError(); + } } } @@ -539,35 +539,35 @@ IcePatch2::readDirectory(const string& pa) int h = _wfindfirst(fs.c_str(), &data, FA_DIREC); if(h == -1) { - if(_doserrno == ENMFILE) - { - return result; - } - throw "cannot read directory `" + path + "':\n" + lastError(); + if(_doserrno == ENMFILE) + { + return result; + } + throw "cannot read directory `" + path + "':\n" + lastError(); } while(true) { - string name = IceUtil::wstringToString(data.ff_name); - assert(!name.empty()); + string name = IceUtil::wstringToString(data.ff_name); + assert(!name.empty()); - if(name != ".." && name != ".") - { - result.push_back(name); - } + if(name != ".." && name != ".") + { + result.push_back(name); + } - if(_wfindnext(&data) == -1) - { - if(errno == ENOENT) - { - break; - } + if(_wfindnext(&data) == -1) + { + if(errno == ENOENT) + { + break; + } - string ex = "cannot read directory `" + path + "':\n" + lastError(); - _wfindclose(&data); - throw ex; - } + string ex = "cannot read directory `" + path + "':\n" + lastError(); + _wfindclose(&data); + throw ex; + } } _wfindclose(&data); @@ -623,7 +623,7 @@ IcePatch2::readDirectory(const string& pa) #endif if(n < 0) { - throw "cannot read directory `" + path + "':\n" + lastError(); + throw "cannot read directory `" + path + "':\n" + lastError(); } StringSeq result; @@ -631,15 +631,15 @@ IcePatch2::readDirectory(const string& pa) for(int i = 0; i < n; ++i) { - string name = namelist[i]->d_name; - assert(!name.empty()); + string name = namelist[i]->d_name; + assert(!name.empty()); - free(namelist[i]); + free(namelist[i]); - if(name != ".." && name != ".") - { - result.push_back(name); - } + if(name != ".." && name != ".") + { + result.push_back(name); + } } free(namelist); @@ -655,10 +655,10 @@ IcePatch2::createDirectory(const string& pa) if(OS::mkdir(path, 0777) == -1) { - if(errno != EEXIST) - { - throw "cannot create directory `" + path + "':\n" + lastError(); - } + if(errno != EEXIST) + { + throw "cannot create directory `" + path + "':\n" + lastError(); + } } } @@ -670,26 +670,26 @@ IcePatch2::createDirectoryRecursive(const string& pa) string dir = getDirname(path); if(!dir.empty()) { - createDirectoryRecursive(dir); + createDirectoryRecursive(dir); } if(!isRoot(path + "/")) { - OS::structstat buf; - if(OS::osstat(path, &buf) != -1) - { - if(S_ISDIR(buf.st_mode)) - { - return; - } - } + OS::structstat buf; + if(OS::osstat(path, &buf) != -1) + { + if(S_ISDIR(buf.st_mode)) + { + return; + } + } if(OS::mkdir(path, 0777) == -1) { - if(errno != EEXIST) - { - throw "cannot create directory `" + path + "':\n" + lastError(); - } + if(errno != EEXIST) + { + throw "cannot create directory `" + path + "':\n" + lastError(); + } } } } @@ -702,45 +702,45 @@ IcePatch2::compressBytesToFile(const string& pa, const ByteSeq& bytes, Int pos) FILE* stdioFile = OS::fopen(path, "wb"); if(!stdioFile) { - throw "cannot open `" + path + "' for writing:\n" + lastError(); + throw "cannot open `" + path + "' for writing:\n" + lastError(); } int bzError; BZFILE* bzFile = BZ2_bzWriteOpen(&bzError, stdioFile, 5, 0, 0); if(bzError != BZ_OK) { - string ex = "BZ2_bzWriteOpen failed"; - if(bzError == BZ_IO_ERROR) - { - ex += string(": ") + lastError(); - } - fclose(stdioFile); - throw ex; + string ex = "BZ2_bzWriteOpen failed"; + if(bzError == BZ_IO_ERROR) + { + ex += string(": ") + lastError(); + } + fclose(stdioFile); + throw ex; } BZ2_bzWrite(&bzError, bzFile, const_cast<Byte*>(&bytes[pos]), static_cast<int>(bytes.size() - pos)); if(bzError != BZ_OK) { - string ex = "BZ2_bzWrite failed"; - if(bzError == BZ_IO_ERROR) - { - ex += string(": ") + lastError(); - } - BZ2_bzWriteClose(&bzError, bzFile, 0, 0, 0); - fclose(stdioFile); - throw ex; + string ex = "BZ2_bzWrite failed"; + if(bzError == BZ_IO_ERROR) + { + ex += string(": ") + lastError(); + } + BZ2_bzWriteClose(&bzError, bzFile, 0, 0, 0); + fclose(stdioFile); + throw ex; } BZ2_bzWriteClose(&bzError, bzFile, 0, 0, 0); if(bzError != BZ_OK) { - string ex = "BZ2_bzWriteClose failed"; - if(bzError == BZ_IO_ERROR) - { - ex += string(": ") + lastError(); - } - fclose(stdioFile); - throw ex; + string ex = "BZ2_bzWriteClose failed"; + if(bzError == BZ_IO_ERROR) + { + ex += string(": ") + lastError(); + } + fclose(stdioFile); + throw ex; } fclose(stdioFile); @@ -759,136 +759,136 @@ IcePatch2::decompressFile(const string& pa) try { - fp = OS::fopen(path, "wb"); - if(!fp) - { - throw "cannot open `" + path + "' for writing:\n" + lastError(); - } - - stdioFileBZ2 = OS::fopen(pathBZ2, "rb"); - if(!stdioFileBZ2) - { - throw "cannot open `" + pathBZ2 + "' for reading:\n" + lastError(); - } + fp = OS::fopen(path, "wb"); + if(!fp) + { + throw "cannot open `" + path + "' for writing:\n" + lastError(); + } + + stdioFileBZ2 = OS::fopen(pathBZ2, "rb"); + if(!stdioFileBZ2) + { + throw "cannot open `" + pathBZ2 + "' for reading:\n" + lastError(); + } #ifdef __BCPLUSPLUS__ - // - // The BZ2_bzReadOpen/BZ2_bzRead/BZ2_bzReadClose functions fail with BCC - // - OS::structstat buf; - if(OS::osstat(pathBZ2, &buf) == -1) - { - throw "cannot stat `" + pathBZ2 + "':\n" + lastError(); - } - - ByteSeq compressedBytes(buf.st_size); - if(fread(&compressedBytes[0], buf.st_size, 1, stdioFileBZ2) == -1) - { - throw "cannot read from `" + pathBZ2 + "':\n" + lastError(); - } - - ByteSeq uncompressedBytes; - unsigned int uncompressedLen = buf.st_size * 2; - while(true) - { - uncompressedBytes.resize(uncompressedLen); - int bzError = BZ2_bzBuffToBuffDecompress(&uncompressedBytes[0], &uncompressedLen, &compressedBytes[0], - buf.st_size, 0, 0); - if(bzError == BZ_OK) - { - break; - } - else if(bzError == BZ_OUTBUFF_FULL) - { - uncompressedLen *= 2; - continue; - } - else - { - string ex = "BZ2_bzBuffToBuffDecompress failed"; - if(bzError == BZ_IO_ERROR) - { - ex += string(": ") + lastError(); - } - throw ex; - } - } - - if(fwrite(&uncompressedBytes[0], uncompressedLen, 1, fp) != 1) - { - throw "cannot write to `" + path + "':\n" + lastError(); - } + // + // The BZ2_bzReadOpen/BZ2_bzRead/BZ2_bzReadClose functions fail with BCC + // + OS::structstat buf; + if(OS::osstat(pathBZ2, &buf) == -1) + { + throw "cannot stat `" + pathBZ2 + "':\n" + lastError(); + } + + ByteSeq compressedBytes(buf.st_size); + if(fread(&compressedBytes[0], buf.st_size, 1, stdioFileBZ2) == -1) + { + throw "cannot read from `" + pathBZ2 + "':\n" + lastError(); + } + + ByteSeq uncompressedBytes; + unsigned int uncompressedLen = buf.st_size * 2; + while(true) + { + uncompressedBytes.resize(uncompressedLen); + int bzError = BZ2_bzBuffToBuffDecompress(&uncompressedBytes[0], &uncompressedLen, &compressedBytes[0], + buf.st_size, 0, 0); + if(bzError == BZ_OK) + { + break; + } + else if(bzError == BZ_OUTBUFF_FULL) + { + uncompressedLen *= 2; + continue; + } + else + { + string ex = "BZ2_bzBuffToBuffDecompress failed"; + if(bzError == BZ_IO_ERROR) + { + ex += string(": ") + lastError(); + } + throw ex; + } + } + + if(fwrite(&uncompressedBytes[0], uncompressedLen, 1, fp) != 1) + { + throw "cannot write to `" + path + "':\n" + lastError(); + } #else - bzFile = BZ2_bzReadOpen(&bzError, stdioFileBZ2, 0, 0, 0, 0); - if(bzError != BZ_OK) - { - string ex = "BZ2_bzReadOpen failed"; - if(bzError == BZ_IO_ERROR) - { - ex += string(": ") + lastError(); - } - throw ex; - } - - const Int numBZ2 = 64 * 1024; - Byte bytesBZ2[numBZ2]; - - while(bzError != BZ_STREAM_END) - { - int sz = BZ2_bzRead(&bzError, bzFile, bytesBZ2, numBZ2); - if(bzError != BZ_OK && bzError != BZ_STREAM_END) - { - string ex = "BZ2_bzRead failed"; - if(bzError == BZ_IO_ERROR) - { - ex += string(": ") + lastError(); - } - throw ex; - } - - if(sz > 0) - { - long pos = ftell(stdioFileBZ2); - if(pos == -1) - { - throw "cannot get read position for `" + pathBZ2 + "':\n" + lastError(); - } - - if(fwrite(bytesBZ2, sz, 1, fp) != 1) - { - throw "cannot write to `" + path + "':\n" + lastError(); - } - } - } - - BZ2_bzReadClose(&bzError, bzFile); - bzFile = 0; - if(bzError != BZ_OK) - { - string ex = "BZ2_bzReadClose failed"; - if(bzError == BZ_IO_ERROR) - { - ex += string(": ") + lastError(); - } - throw ex; - } + bzFile = BZ2_bzReadOpen(&bzError, stdioFileBZ2, 0, 0, 0, 0); + if(bzError != BZ_OK) + { + string ex = "BZ2_bzReadOpen failed"; + if(bzError == BZ_IO_ERROR) + { + ex += string(": ") + lastError(); + } + throw ex; + } + + const Int numBZ2 = 64 * 1024; + Byte bytesBZ2[numBZ2]; + + while(bzError != BZ_STREAM_END) + { + int sz = BZ2_bzRead(&bzError, bzFile, bytesBZ2, numBZ2); + if(bzError != BZ_OK && bzError != BZ_STREAM_END) + { + string ex = "BZ2_bzRead failed"; + if(bzError == BZ_IO_ERROR) + { + ex += string(": ") + lastError(); + } + throw ex; + } + + if(sz > 0) + { + long pos = ftell(stdioFileBZ2); + if(pos == -1) + { + throw "cannot get read position for `" + pathBZ2 + "':\n" + lastError(); + } + + if(fwrite(bytesBZ2, sz, 1, fp) != 1) + { + throw "cannot write to `" + path + "':\n" + lastError(); + } + } + } + + BZ2_bzReadClose(&bzError, bzFile); + bzFile = 0; + if(bzError != BZ_OK) + { + string ex = "BZ2_bzReadClose failed"; + if(bzError == BZ_IO_ERROR) + { + ex += string(": ") + lastError(); + } + throw ex; + } #endif } catch(...) { - if(bzFile != 0) - { - BZ2_bzReadClose(&bzError, bzFile); - } - if(stdioFileBZ2 != 0) - { - fclose(stdioFileBZ2); - } - if(fp != 0) - { - fclose(fp); - } - throw; + if(bzFile != 0) + { + BZ2_bzReadClose(&bzError, bzFile); + } + if(stdioFileBZ2 != 0) + { + fclose(stdioFileBZ2); + } + if(fp != 0) + { + fclose(fp); + } + throw; } fclose(stdioFileBZ2); @@ -903,7 +903,7 @@ IcePatch2::setFileFlags(const string& pa, const FileInfo& info) OS::structstat buf; if(OS::osstat(path, &buf) == -1) { - throw "cannot stat `" + path + "':\n" + lastError(); + throw "cannot stat `" + path + "':\n" + lastError(); } chmod(path.c_str(), info.executable ? buf.st_mode | S_IXUSR : buf.st_mode & ~S_IXUSR); #endif @@ -911,321 +911,321 @@ IcePatch2::setFileFlags(const string& pa, const FileInfo& info) static bool getFileInfoSeqInt(const string& basePath, const string& relPath, int compress, GetFileInfoSeqCB* cb, - FileInfoSeq& infoSeq) + FileInfoSeq& infoSeq) { if(relPath == checksumFile || relPath == logFile) { - return true; + return true; } const string path = simplify(basePath + '/' + relPath); if(ignoreSuffix(path)) { - const string pathWithoutSuffix = getWithoutSuffix(path); - - if(ignoreSuffix(pathWithoutSuffix)) - { - if(cb && !cb->remove(relPath)) - { - return false; - } - - remove(path); // Removing file with suffix for another file that already has a suffix. - } - else - { - OS::structstat buf; - if(OS::osstat(getWithoutSuffix(path), &buf) == -1) - { - if(errno == ENOENT) - { - if(cb && !cb->remove(relPath)) - { - return false; - } - - remove(path); // Removing orphaned file. - } - else - { - throw "cannot stat `" + path + "':\n" + lastError(); - } - } - else if(buf.st_size == 0) - { - if(cb && !cb->remove(relPath)) - { - return false; - } - - remove(path); // Removing file with suffix for empty file. - } - } + const string pathWithoutSuffix = getWithoutSuffix(path); + + if(ignoreSuffix(pathWithoutSuffix)) + { + if(cb && !cb->remove(relPath)) + { + return false; + } + + remove(path); // Removing file with suffix for another file that already has a suffix. + } + else + { + OS::structstat buf; + if(OS::osstat(getWithoutSuffix(path), &buf) == -1) + { + if(errno == ENOENT) + { + if(cb && !cb->remove(relPath)) + { + return false; + } + + remove(path); // Removing orphaned file. + } + else + { + throw "cannot stat `" + path + "':\n" + lastError(); + } + } + else if(buf.st_size == 0) + { + if(cb && !cb->remove(relPath)) + { + return false; + } + + remove(path); // Removing file with suffix for empty file. + } + } } else { - OS::structstat buf; - if(OS::osstat(path, &buf) == -1) - { - throw "cannot stat `" + path + "':\n" + lastError(); - } - - if(S_ISDIR(buf.st_mode)) - { - FileInfo info; - info.path = relPath; - info.size = -1; - info.executable = false; - - ByteSeq bytes(relPath.size()); - copy(relPath.begin(), relPath.end(), bytes.begin()); - - ByteSeq bytesSHA(20); - if(!bytes.empty()) - { - SHA1(reinterpret_cast<unsigned char*>(&bytes[0]), bytes.size(), - reinterpret_cast<unsigned char*>(&bytesSHA[0])); - } - else - { - fill(bytesSHA.begin(), bytesSHA.end(), 0); - } - info.checksum.swap(bytesSHA); - - infoSeq.push_back(info); - - StringSeq content = readDirectory(path); - for(StringSeq::const_iterator p = content.begin(); p != content.end() ; ++p) - { - if(!getFileInfoSeqInt(basePath, simplify(relPath + '/' + *p), compress, cb, infoSeq)) - { - return false; - } - } - } - else if(S_ISREG(buf.st_mode)) - { - FileInfo info; - info.path = relPath; - info.size = 0; + OS::structstat buf; + if(OS::osstat(path, &buf) == -1) + { + throw "cannot stat `" + path + "':\n" + lastError(); + } + + if(S_ISDIR(buf.st_mode)) + { + FileInfo info; + info.path = relPath; + info.size = -1; + info.executable = false; + + ByteSeq bytes(relPath.size()); + copy(relPath.begin(), relPath.end(), bytes.begin()); + + ByteSeq bytesSHA(20); + if(!bytes.empty()) + { + SHA1(reinterpret_cast<unsigned char*>(&bytes[0]), bytes.size(), + reinterpret_cast<unsigned char*>(&bytesSHA[0])); + } + else + { + fill(bytesSHA.begin(), bytesSHA.end(), 0); + } + info.checksum.swap(bytesSHA); + + infoSeq.push_back(info); + + StringSeq content = readDirectory(path); + for(StringSeq::const_iterator p = content.begin(); p != content.end() ; ++p) + { + if(!getFileInfoSeqInt(basePath, simplify(relPath + '/' + *p), compress, cb, infoSeq)) + { + return false; + } + } + } + else if(S_ISREG(buf.st_mode)) + { + FileInfo info; + info.path = relPath; + info.size = 0; #ifdef _WIN32 - info.executable = false; // Windows doesn't support the executable flag + info.executable = false; // Windows doesn't support the executable flag #else - info.executable = buf.st_mode & S_IXUSR; + info.executable = buf.st_mode & S_IXUSR; #endif OS::structstat bufBZ2; - const string pathBZ2 = path + ".bz2"; - bool doCompress = false; - if(buf.st_size != 0 && compress > 0) - { - // - // compress == 0: Never compress. - // compress == 1: Compress if necessary. - // compress >= 2: Always compress. - // - if(compress >= 2 || OS::osstat(pathBZ2, &bufBZ2) == -1 || buf.st_mtime >= bufBZ2.st_mtime) - { - if(cb && !cb->compress(relPath)) - { - return false; - } - - doCompress = true; - } - else - { - info.size = static_cast<Int>(bufBZ2.st_size); - } - } - - if(cb && !cb->checksum(relPath)) - { - return false; - } - - ByteSeq bytesSHA(20); - - if(relPath.size() + buf.st_size == 0) - { - fill(bytesSHA.begin(), bytesSHA.end(), 0); - } - else - { - SHA_CTX ctx; - SHA1_Init(&ctx); - if(relPath.size() != 0) - { - SHA1_Update(&ctx, reinterpret_cast<const void*>(relPath.c_str()), relPath.size()); - } - - if(buf.st_size != 0) - { + const string pathBZ2 = path + ".bz2"; + bool doCompress = false; + if(buf.st_size != 0 && compress > 0) + { + // + // compress == 0: Never compress. + // compress == 1: Compress if necessary. + // compress >= 2: Always compress. + // + if(compress >= 2 || OS::osstat(pathBZ2, &bufBZ2) == -1 || buf.st_mtime >= bufBZ2.st_mtime) + { + if(cb && !cb->compress(relPath)) + { + return false; + } + + doCompress = true; + } + else + { + info.size = static_cast<Int>(bufBZ2.st_size); + } + } + + if(cb && !cb->checksum(relPath)) + { + return false; + } + + ByteSeq bytesSHA(20); + + if(relPath.size() + buf.st_size == 0) + { + fill(bytesSHA.begin(), bytesSHA.end(), 0); + } + else + { + SHA_CTX ctx; + SHA1_Init(&ctx); + if(relPath.size() != 0) + { + SHA1_Update(&ctx, reinterpret_cast<const void*>(relPath.c_str()), relPath.size()); + } + + if(buf.st_size != 0) + { #ifdef __BCPLUSPLUS__ - // - // The BZ2_bzWriteOpen/BZ2_bzWrite/BZ2_bzWriteClose functions fail with BCC - // - if(doCompress) - { - int fd = OS::open(path.c_str(), O_BINARY|O_RDONLY); - if(fd == -1) - { - throw "cannot open `" + path + "' for reading:\n" + lastError(); - } - - ByteSeq uncompressedBytes(buf.st_size); - - if(read(fd, &uncompressedBytes[0], buf.st_size) == -1) - { - close(fd); - throw "cannot read from `" + path + "':\n" + lastError(); - } - - unsigned int compressedLen = buf.st_size * 1.01 + 600; - ByteSeq compressedBytes(compressedLen); - - int bzError = BZ2_bzBuffToBuffCompress(&compressedBytes[0], &compressedLen, - &uncompressedBytes[0], buf.st_size, 5, 0, 0); - if(bzError != BZ_OK) - { - string ex = "BZ2_bzBuffToBuffCompress failed"; - if(bzError == BZ_IO_ERROR) - { - ex += string(": ") + lastError(); - } - close(fd); - throw ex; - } - close(fd); - - const string pathBZ2Temp = path + ".bz2temp"; - FILE* stdioFile = OS::fopen(pathBZ2Temp, "wb"); - if(fwrite(&compressedBytes[0], compressedLen, 1, stdioFile) != 1) - { - fclose(stdioFile); - throw "cannot write to `" + pathBZ2Temp + "':\n" + lastError(); - } - fclose(stdioFile); - - rename(pathBZ2Temp, pathBZ2); - - } + // + // The BZ2_bzWriteOpen/BZ2_bzWrite/BZ2_bzWriteClose functions fail with BCC + // + if(doCompress) + { + int fd = OS::open(path.c_str(), O_BINARY|O_RDONLY); + if(fd == -1) + { + throw "cannot open `" + path + "' for reading:\n" + lastError(); + } + + ByteSeq uncompressedBytes(buf.st_size); + + if(read(fd, &uncompressedBytes[0], buf.st_size) == -1) + { + close(fd); + throw "cannot read from `" + path + "':\n" + lastError(); + } + + unsigned int compressedLen = buf.st_size * 1.01 + 600; + ByteSeq compressedBytes(compressedLen); + + int bzError = BZ2_bzBuffToBuffCompress(&compressedBytes[0], &compressedLen, + &uncompressedBytes[0], buf.st_size, 5, 0, 0); + if(bzError != BZ_OK) + { + string ex = "BZ2_bzBuffToBuffCompress failed"; + if(bzError == BZ_IO_ERROR) + { + ex += string(": ") + lastError(); + } + close(fd); + throw ex; + } + close(fd); + + const string pathBZ2Temp = path + ".bz2temp"; + FILE* stdioFile = OS::fopen(pathBZ2Temp, "wb"); + if(fwrite(&compressedBytes[0], compressedLen, 1, stdioFile) != 1) + { + fclose(stdioFile); + throw "cannot write to `" + pathBZ2Temp + "':\n" + lastError(); + } + fclose(stdioFile); + + rename(pathBZ2Temp, pathBZ2); + + } #endif - int fd = OS::open(path.c_str(), O_BINARY|O_RDONLY); - if(fd == -1) - { - throw "cannot open `" + path + "' for reading:\n" + lastError(); - } + int fd = OS::open(path.c_str(), O_BINARY|O_RDONLY); + if(fd == -1) + { + throw "cannot open `" + path + "' for reading:\n" + lastError(); + } #ifndef __BCPLUSPLUS__ - const string pathBZ2Temp = path + ".bz2temp"; - FILE* stdioFile = 0; - int bzError = 0; - BZFILE* bzFile = 0; - if(doCompress) - { - stdioFile = OS::fopen(simplify(pathBZ2Temp), "wb"); - if(!stdioFile) - { - close(fd); - throw "cannot open `" + pathBZ2Temp + "' for writing:\n" + lastError(); - } - - bzFile = BZ2_bzWriteOpen(&bzError, stdioFile, 5, 0, 0); - if(bzError != BZ_OK) - { - string ex = "BZ2_bzWriteOpen failed"; - if(bzError == BZ_IO_ERROR) - { - ex += string(": ") + lastError(); - } - fclose(stdioFile); - close(fd); - throw ex; - } - } + const string pathBZ2Temp = path + ".bz2temp"; + FILE* stdioFile = 0; + int bzError = 0; + BZFILE* bzFile = 0; + if(doCompress) + { + stdioFile = OS::fopen(simplify(pathBZ2Temp), "wb"); + if(!stdioFile) + { + close(fd); + throw "cannot open `" + pathBZ2Temp + "' for writing:\n" + lastError(); + } + + bzFile = BZ2_bzWriteOpen(&bzError, stdioFile, 5, 0, 0); + if(bzError != BZ_OK) + { + string ex = "BZ2_bzWriteOpen failed"; + if(bzError == BZ_IO_ERROR) + { + ex += string(": ") + lastError(); + } + fclose(stdioFile); + close(fd); + throw ex; + } + } #endif - unsigned int bytesLeft = static_cast<unsigned int>(buf.st_size); - while(bytesLeft > 0) - { - ByteSeq bytes(min(bytesLeft, 1024u*1024)); - if(read(fd, &bytes[0], static_cast<unsigned int>(bytes.size())) == -1) - { + unsigned int bytesLeft = static_cast<unsigned int>(buf.st_size); + while(bytesLeft > 0) + { + ByteSeq bytes(min(bytesLeft, 1024u*1024)); + if(read(fd, &bytes[0], static_cast<unsigned int>(bytes.size())) == -1) + { #ifndef __BCPLUSPLUS__ - if(doCompress) - { - fclose(stdioFile); - } + if(doCompress) + { + fclose(stdioFile); + } #endif - close(fd); - throw "cannot read from `" + path + "':\n" + lastError(); - } - bytesLeft -= static_cast<unsigned int>(bytes.size()); + close(fd); + throw "cannot read from `" + path + "':\n" + lastError(); + } + bytesLeft -= static_cast<unsigned int>(bytes.size()); #ifndef __BCPLUSPLUS__ - if(doCompress) - { + if(doCompress) + { BZ2_bzWrite(&bzError, bzFile, const_cast<Byte*>(&bytes[0]), static_cast<int>(bytes.size())); if(bzError != BZ_OK) { - string ex = "BZ2_bzWrite failed"; - if(bzError == BZ_IO_ERROR) - { - ex += string(": ") + lastError(); - } - BZ2_bzWriteClose(&bzError, bzFile, 0, 0, 0); - fclose(stdioFile); - close(fd); - throw ex; + string ex = "BZ2_bzWrite failed"; + if(bzError == BZ_IO_ERROR) + { + ex += string(": ") + lastError(); + } + BZ2_bzWriteClose(&bzError, bzFile, 0, 0, 0); + fclose(stdioFile); + close(fd); + throw ex; } - } + } #endif - SHA1_Update(&ctx, reinterpret_cast<const void*>(&bytes[0]), bytes.size()); - } + SHA1_Update(&ctx, reinterpret_cast<const void*>(&bytes[0]), bytes.size()); + } - close(fd); + close(fd); #ifndef __BCPLUSPLUS__ - if(doCompress) - { + if(doCompress) + { BZ2_bzWriteClose(&bzError, bzFile, 0, 0, 0); if(bzError != BZ_OK) { - string ex = "BZ2_bzWriteClose failed"; - if(bzError == BZ_IO_ERROR) - { - ex += string(": ") + lastError(); - } - fclose(stdioFile); - throw ex; + string ex = "BZ2_bzWriteClose failed"; + if(bzError == BZ_IO_ERROR) + { + ex += string(": ") + lastError(); + } + fclose(stdioFile); + throw ex; } - fclose(stdioFile); + fclose(stdioFile); - rename(pathBZ2Temp, pathBZ2); + rename(pathBZ2Temp, pathBZ2); - if(OS::osstat(pathBZ2, &bufBZ2) == -1) - { - throw "cannot stat `" + pathBZ2 + "':\n" + lastError(); - } + if(OS::osstat(pathBZ2, &bufBZ2) == -1) + { + throw "cannot stat `" + pathBZ2 + "':\n" + lastError(); + } - info.size = static_cast<Int>(bufBZ2.st_size); - } + info.size = static_cast<Int>(bufBZ2.st_size); + } #endif - } + } - SHA1_Final(reinterpret_cast<unsigned char*>(&bytesSHA[0]), &ctx); - } + SHA1_Final(reinterpret_cast<unsigned char*>(&bytesSHA[0]), &ctx); + } - info.checksum.swap(bytesSHA); + info.checksum.swap(bytesSHA); - infoSeq.push_back(info); - } + infoSeq.push_back(info); + } } return true; @@ -1233,21 +1233,21 @@ getFileInfoSeqInt(const string& basePath, const string& relPath, int compress, G bool IcePatch2::getFileInfoSeq(const string& basePath, int compress, GetFileInfoSeqCB* cb, - FileInfoSeq& infoSeq) + FileInfoSeq& infoSeq) { return getFileInfoSeqSubDir(basePath, ".", compress, cb, infoSeq); } bool IcePatch2::getFileInfoSeqSubDir(const string& basePa, const string& relPa, int compress, GetFileInfoSeqCB* cb, - FileInfoSeq& infoSeq) + FileInfoSeq& infoSeq) { const string basePath = simplify(basePa); const string relPath = simplify(relPa); if(!getFileInfoSeqInt(basePath, relPath, compress, cb, infoSeq)) { - return false; + return false; } sort(infoSeq.begin(), infoSeq.end(), FileInfoLess()); @@ -1260,41 +1260,41 @@ void IcePatch2::saveFileInfoSeq(const string& pa, const FileInfoSeq& infoSeq) { { - const string path = simplify(pa + '/' + checksumFile); - - FILE* fp = OS::fopen(path, "w"); - if(!fp) - { - throw "cannot open `" + path + "' for writing:\n" + lastError(); - } - try - { - for(FileInfoSeq::const_iterator p = infoSeq.begin(); p != infoSeq.end(); ++p) - { - if(!writeFileInfo(fp, *p)) - { - throw "error writing `" + path + "':\n" + lastError(); - } - } - } - catch(...) - { - fclose(fp); - throw; - } - fclose(fp); - } - - { - const string pathLog = simplify(pa + '/' + logFile); - - try - { - remove(pathLog); - } - catch(...) - { - } + const string path = simplify(pa + '/' + checksumFile); + + FILE* fp = OS::fopen(path, "w"); + if(!fp) + { + throw "cannot open `" + path + "' for writing:\n" + lastError(); + } + try + { + for(FileInfoSeq::const_iterator p = infoSeq.begin(); p != infoSeq.end(); ++p) + { + if(!writeFileInfo(fp, *p)) + { + throw "error writing `" + path + "':\n" + lastError(); + } + } + } + catch(...) + { + fclose(fp); + throw; + } + fclose(fp); + } + + { + const string pathLog = simplify(pa + '/' + logFile); + + try + { + remove(pathLog); + } + catch(...) + { + } } } @@ -1302,98 +1302,98 @@ void IcePatch2::loadFileInfoSeq(const string& pa, FileInfoSeq& infoSeq) { { - const string path = simplify(pa + '/' + checksumFile); - - FILE* fp = OS::fopen(path, "r"); - if(!fp) - { - throw "cannot open `" + path + "' for reading:\n" + lastError(); - } - - while(true) - { - FileInfo info; - if(readFileInfo(fp, info)) - { - infoSeq.push_back(info); - } - else - { - break; - } - } - fclose(fp); - - sort(infoSeq.begin(), infoSeq.end(), FileInfoLess()); - infoSeq.erase(unique(infoSeq.begin(), infoSeq.end(), FileInfoEqual()), infoSeq.end()); - } - - { - const string pathLog = simplify(pa + '/' + logFile); - - FILE* fp = OS::fopen(pathLog, "r"); - if(fp != 0) - { - FileInfoSeq remove; - FileInfoSeq update; - - while(true) - { - int c = fgetc(fp); - if(c == EOF) - { - break; - } - - FileInfo info; - if(!readFileInfo(fp, info)) - { - break; - } - - if(c == '-') - { - remove.push_back(info); - } - else if(c == '+') - { - update.push_back(info); - } - } - fclose(fp); - - sort(remove.begin(), remove.end(), FileInfoLess()); - remove.erase(unique(remove.begin(), remove.end(), FileInfoEqual()), remove.end()); - - sort(update.begin(), update.end(), FileInfoLess()); - update.erase(unique(update.begin(), update.end(), FileInfoEqual()), update.end()); - - FileInfoSeq newInfoSeq; - newInfoSeq.reserve(infoSeq.size()); - - set_difference(infoSeq.begin(), - infoSeq.end(), - remove.begin(), - remove.end(), - back_inserter(newInfoSeq), - FileInfoLess()); - - infoSeq.swap(newInfoSeq); - - newInfoSeq.clear(); - newInfoSeq.reserve(infoSeq.size()); - - set_union(infoSeq.begin(), - infoSeq.end(), - update.begin(), - update.end(), - back_inserter(newInfoSeq), - FileInfoLess()); - - infoSeq.swap(newInfoSeq); - - saveFileInfoSeq(pa, infoSeq); - } + const string path = simplify(pa + '/' + checksumFile); + + FILE* fp = OS::fopen(path, "r"); + if(!fp) + { + throw "cannot open `" + path + "' for reading:\n" + lastError(); + } + + while(true) + { + FileInfo info; + if(readFileInfo(fp, info)) + { + infoSeq.push_back(info); + } + else + { + break; + } + } + fclose(fp); + + sort(infoSeq.begin(), infoSeq.end(), FileInfoLess()); + infoSeq.erase(unique(infoSeq.begin(), infoSeq.end(), FileInfoEqual()), infoSeq.end()); + } + + { + const string pathLog = simplify(pa + '/' + logFile); + + FILE* fp = OS::fopen(pathLog, "r"); + if(fp != 0) + { + FileInfoSeq remove; + FileInfoSeq update; + + while(true) + { + int c = fgetc(fp); + if(c == EOF) + { + break; + } + + FileInfo info; + if(!readFileInfo(fp, info)) + { + break; + } + + if(c == '-') + { + remove.push_back(info); + } + else if(c == '+') + { + update.push_back(info); + } + } + fclose(fp); + + sort(remove.begin(), remove.end(), FileInfoLess()); + remove.erase(unique(remove.begin(), remove.end(), FileInfoEqual()), remove.end()); + + sort(update.begin(), update.end(), FileInfoLess()); + update.erase(unique(update.begin(), update.end(), FileInfoEqual()), update.end()); + + FileInfoSeq newInfoSeq; + newInfoSeq.reserve(infoSeq.size()); + + set_difference(infoSeq.begin(), + infoSeq.end(), + remove.begin(), + remove.end(), + back_inserter(newInfoSeq), + FileInfoLess()); + + infoSeq.swap(newInfoSeq); + + newInfoSeq.clear(); + newInfoSeq.reserve(infoSeq.size()); + + set_union(infoSeq.begin(), + infoSeq.end(), + update.begin(), + update.end(), + back_inserter(newInfoSeq), + FileInfoLess()); + + infoSeq.swap(newInfoSeq); + + saveFileInfoSeq(pa, infoSeq); + } } } @@ -1409,52 +1409,52 @@ IcePatch2::getFileTree0(const FileInfoSeq& infoSeq, FileTree0& tree0) for(int i = 0; i < 256; ++i, c0 += 20) { - FileTree1& tree1 = tree0.nodes[i]; - - tree1.files.clear(); - tree1.checksum.resize(20); - - FileInfoSeq::const_iterator p; - - for(p = infoSeq.begin(); p != infoSeq.end(); ++p) - { - if(i == static_cast<int>(p->checksum[0])) - { - tree1.files.push_back(*p); - } - } - - ByteSeq allChecksums1; - allChecksums1.resize(tree1.files.size() * 21); // 20 bytes for the checksum + 1 byte for the flag - ByteSeq::iterator c1 = allChecksums1.begin(); - - for(p = tree1.files.begin(); p != tree1.files.end(); ++p, c1 += 21) - { - copy(p->checksum.begin(), p->checksum.end(), c1); - *(c1 + 20) = p->executable; - } - - if(!allChecksums1.empty()) - { - SHA1(reinterpret_cast<unsigned char*>(&allChecksums1[0]), allChecksums1.size(), - reinterpret_cast<unsigned char*>(&tree1.checksum[0])); - } - else - { - fill(tree1.checksum.begin(), tree1.checksum.end(), 0); - } - - copy(tree1.checksum.begin(), tree1.checksum.end(), c0); + FileTree1& tree1 = tree0.nodes[i]; + + tree1.files.clear(); + tree1.checksum.resize(20); + + FileInfoSeq::const_iterator p; + + for(p = infoSeq.begin(); p != infoSeq.end(); ++p) + { + if(i == static_cast<int>(p->checksum[0])) + { + tree1.files.push_back(*p); + } + } + + ByteSeq allChecksums1; + allChecksums1.resize(tree1.files.size() * 21); // 20 bytes for the checksum + 1 byte for the flag + ByteSeq::iterator c1 = allChecksums1.begin(); + + for(p = tree1.files.begin(); p != tree1.files.end(); ++p, c1 += 21) + { + copy(p->checksum.begin(), p->checksum.end(), c1); + *(c1 + 20) = p->executable; + } + + if(!allChecksums1.empty()) + { + SHA1(reinterpret_cast<unsigned char*>(&allChecksums1[0]), allChecksums1.size(), + reinterpret_cast<unsigned char*>(&tree1.checksum[0])); + } + else + { + fill(tree1.checksum.begin(), tree1.checksum.end(), 0); + } + + copy(tree1.checksum.begin(), tree1.checksum.end(), c0); } if(!allChecksums0.empty()) { - SHA1(reinterpret_cast<unsigned char*>(&allChecksums0[0]), allChecksums0.size(), - reinterpret_cast<unsigned char*>(&tree0.checksum[0])); + SHA1(reinterpret_cast<unsigned char*>(&allChecksums0[0]), allChecksums0.size(), + reinterpret_cast<unsigned char*>(&tree0.checksum[0])); } else { - fill(tree0.checksum.begin(), tree0.checksum.end(), 0); + fill(tree0.checksum.begin(), tree0.checksum.end(), 0); } } |