// Copyright (C) 2010, Guy Barrand. All rights reserved. // See the file tools.license for terms. #ifndef tools_gzip #define tools_gzip #include "signature" namespace tools { namespace file { inline bool is_gzip(const std::string& a_file,bool& a_is){ unsigned char head[4]; {unsigned int num = 4; if(!signature(a_file,head,num)) {a_is = false;return false;} if(num!=4) {a_is = false;return true;}} if(head[0]!=31) {a_is = false;return true;} if(head[1]!=139) {a_is = false;return true;} //if(head[2]!=8) {a_is = false;return true;} //if(head[3]!=8) {a_is = false;return true;} a_is = true; return true; } inline bool gzip_usize(const std::string& a_file,unsigned int& a_usz){ bool is; if(!is_gzip(a_file,is)) {a_usz=0;return false;} if(!is) {a_usz=0;return false;} FILE* file = ::fopen(a_file.c_str(),"rb"); if(!file) {a_usz=0;return false;} ::fseek(file,-4,SEEK_END); unsigned char buf[4]; size_t n = ::fread(buf,1,4,file); ::fclose(file); if(n!=4) {a_usz=0;return false;} unsigned int b4 = buf[0]; unsigned int b3 = buf[1]; unsigned int b2 = buf[2]; unsigned int b1 = buf[3]; a_usz = (b1 << 24) | ((b2 << 16) + (b3 << 8) + b4); return true; } }} #endif