Geant4 Cross Reference |
1 // Copyright (C) 2010, Guy Barrand. All rights reserved. 2 // See the file tools.license for terms. 3 4 #ifndef tools_gzip 5 #define tools_gzip 6 7 #include "signature" 8 9 namespace tools { 10 namespace file { 11 12 inline bool is_gzip(const std::string& a_file,bool& a_is){ 13 unsigned char head[4]; 14 {unsigned int num = 4; 15 if(!signature(a_file,head,num)) {a_is = false;return false;} 16 if(num!=4) {a_is = false;return true;}} 17 if(head[0]!=31) {a_is = false;return true;} 18 if(head[1]!=139) {a_is = false;return true;} 19 //if(head[2]!=8) {a_is = false;return true;} 20 //if(head[3]!=8) {a_is = false;return true;} 21 a_is = true; 22 return true; 23 } 24 25 inline bool gzip_usize(const std::string& a_file,unsigned int& a_usz){ 26 bool is; 27 if(!is_gzip(a_file,is)) {a_usz=0;return false;} 28 if(!is) {a_usz=0;return false;} 29 FILE* file = ::fopen(a_file.c_str(),"rb"); 30 if(!file) {a_usz=0;return false;} 31 ::fseek(file,-4,SEEK_END); 32 unsigned char buf[4]; 33 size_t n = ::fread(buf,1,4,file); 34 ::fclose(file); 35 if(n!=4) {a_usz=0;return false;} 36 unsigned int b4 = buf[0]; 37 unsigned int b3 = buf[1]; 38 unsigned int b2 = buf[2]; 39 unsigned int b1 = buf[3]; 40 a_usz = (b1 << 24) | ((b2 << 16) + (b3 << 8) + b4); 41 return true; 42 } 43 44 }} 45 46 #endif