void zip_archive_impl::dump_file_entry(size_t pos) const { if (pos >= m_file_params.size()) throw zip_error("invalid file entry index."); const zip_file_param& param = m_file_params[pos]; cout << "-- filename: " << param.filename << endl; zip_stream_parser file_header(m_stream, param.offset_file_header); uint32_t v32 = file_header.read_4bytes(); printf(" header signature: 0x%8.8x\n", v32); uint16_t v16 = file_header.read_2bytes(); cout << " version needed to extract: " << v16 << endl; v16 = file_header.read_2bytes(); printf(" general purpose bit flag: 0x%4.4x\n", v16); v16 = file_header.read_2bytes(); cout << " compression method: " << v16 << endl; v16 = file_header.read_2bytes(); cout << " file last modified time: " << v16 << endl; v16 = file_header.read_2bytes(); cout << " file last modified date: " << v16 << endl; v32 = file_header.read_4bytes(); printf(" crc32: 0x%8.8x\n", v32); v32 = file_header.read_4bytes(); cout << " compressed size: " << v32 << endl; v32 = file_header.read_4bytes(); cout << " uncompressed size: " << v32 << endl; size_t filename_len = file_header.read_2bytes(); cout << " filename length: " << filename_len << endl; uint16_t extra_field_len = file_header.read_2bytes(); cout << " extra field length: " << extra_field_len << endl; if (filename_len) { string filename = file_header.read_string(filename_len); cout << " filename: '" << filename << "'" << endl; } if (extra_field_len) { // Ignore extra field. file_header.skip_bytes(extra_field_len); } // Header followed by the actual data bytes. m_stream->seek(file_header.tell()); vector<unsigned char> buf; if (read_file_entry(param.filename, buf)) { cout << "-- data section" << endl; cout << &buf[0] << endl; cout << "--" << endl; } }
int process( char * struct_name ) { int status; int c; int l; char occi_header_filename[512]; int holder; char filter_filename[512]; char tn[512]; char token[512]; FILE * sh; sprintf(occi_header_filename,"%s.h",struct_name); sprintf(filter_filename, "%s_occi_filter.h", struct_name); sprintf(tn,"%s.c", struct_name); if (!( sh = fopen( occi_header_filename, "r" ))) return( failure(40,"file not found",occi_header_filename) ); else if (!( C.target = fopen( tn, "w" ))) { fclose(sh); return( failure(46,"creating file",tn) ); } else { holder = check_cool_cosacs( struct_name ); file_header( C.target, tn, occi_header_filename, filter_filename); while ((c = remove_white_space( sh ))) { if ( is_punctuation(c) ) { if (!(status = handle_punctuation(sh,getch(sh)))) continue; else break; } else if (!( l = get_token(sh,token,512) )) break; else if (!( status = handle_token(sh,token) )) continue; else break; } file_footer( C.target, tn ); fclose(C.target); fclose(sh); C.gensql = holder; } return( 0 ); }
bool zip_archive_impl::read_file_entry(const pstring& entry_name, vector<unsigned char>& buf) const { pstring name(entry_name); filename_map_type::const_iterator it = m_filenames.find(name); if (it == m_filenames.end()) // entry name not found. return false; size_t index = it->second; if (index >= m_file_params.size()) // entry index is out of bound. return false; const zip_file_param& param = m_file_params[index]; // Skip the file header section. zip_stream_parser file_header(m_stream, param.offset_file_header); file_header.skip_bytes(4); file_header.skip_bytes(2); file_header.skip_bytes(2); file_header.skip_bytes(2); file_header.skip_bytes(2); file_header.skip_bytes(2); file_header.skip_bytes(4); file_header.skip_bytes(4); file_header.skip_bytes(4); uint16_t filename_len = file_header.read_2bytes(); uint16_t extra_field_len = file_header.read_2bytes(); file_header.skip_bytes(filename_len); file_header.skip_bytes(extra_field_len); // Data section is immediately followed by the header section. m_stream->seek(file_header.tell()); vector<unsigned char> raw_buf(param.size_compressed+1, 0); m_stream->read(&raw_buf[0], param.size_compressed); switch (param.compress_method) { case zip_file_param::stored: // Not compressed at all. buf.swap(raw_buf); return true; case zip_file_param::deflated: { // deflate compression vector<unsigned char> zip_buf(param.size_uncompressed+1, 0); // null-terminated zip_inflater inflater(raw_buf, zip_buf, param); if (!inflater.init()) break; if (!inflater.inflate()) throw zip_error("error during inflate."); buf.swap(zip_buf); return true; } default: ; } return false; }