00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifdef HAVE_CONFIG_H
00023 # include <config.h>
00024 #endif
00025
00026 #include "exceptions.h"
00027 #include "segfile.h"
00028 #include "utils.h"
00029
00030
00031
00032
00033
00034 Segment_file::Segment_file
00035 (
00036 std::string nm
00037 ) : filename(nm), num_segments(0)
00038 {
00039 U7open(file, filename.c_str());
00040 file.seekg(0x54);
00041 num_segments = Read4(file);
00042 if( !file.good() )
00043 throw file_read_exception(filename);
00044 }
00045
00046
00047
00048
00049
00050
00051
00052 char* Segment_file::retrieve
00053 (
00054 uint32 index,
00055 std::size_t& len
00056 )
00057 {
00058 char *buffer;
00059 if (index >= num_segments)
00060 throw exult_exception("objnum too large in read_object()");
00061
00062 file.seekg(0x80 + 8*index);
00063 long offset = Read4(file);
00064 len = Read4(file);
00065 if (!len)
00066 throw file_read_exception(filename);
00067
00068 file.seekg(offset);
00069 buffer = new char[len];
00070 file.read(buffer, len);
00071 if( !file.good() )
00072 throw file_read_exception(filename);
00073
00074 return buffer;
00075 }
00076