21 #pragma warning(disable:4244) // Conversion warnings 38 if (reader_ ==
nullptr) {
41 if (!(*reader_)(data_file_name, &data))
return false;
49 data_file_name_ = name;
53 if (fp.
FRead(&num_entries,
sizeof(num_entries), 1) != 1)
return false;
54 swap_ = num_entries > kMaxNumTessdataEntries || num_entries < 0;
56 if (swap_)
ReverseN(&num_entries,
sizeof(num_entries));
57 if (num_entries > kMaxNumTessdataEntries || num_entries < 0)
return false;
60 if (fp.
FReadEndian(&offset_table[0],
sizeof(offset_table[0]), num_entries) !=
64 if (offset_table[i] >= 0) {
65 inT64 entry_size = size - offset_table[i];
67 while (j < num_entries && offset_table[j] == -1) ++j;
68 if (j < num_entries) entry_size = offset_table[j] - offset_table[i];
70 if (fp.
FRead(&entries_[i][0], 1, entry_size) != entry_size)
return false;
83 if (writer ==
nullptr)
96 if (entries_[i].empty()) {
100 offset += entries_[i].
size();
107 fp.
FWrite(&num_entries,
sizeof(num_entries), 1);
108 fp.
FWrite(offset_table,
sizeof(offset_table), 1);
110 if (!entries_[i].empty()) {
111 fp.
FWrite(&entries_[i][0], entries_[i].
size(), 1);
128 if (!entries_[i].empty()) {
129 tprintf(
"%d:%s:size=%d, offset=%d\n", i, kTessdataFileSuffixes[i],
130 entries_[i].
size(), offset);
131 offset += entries_[i].
size();
139 if (!is_loaded_ && !
Init(data_file_name_.
string()))
return false;
140 if (entries_[type].empty())
return false;
141 fp->
Open(&entries_[type][0], entries_[type].
size());
147 const char *language_data_path_prefix,
148 const char *output_filename) {
154 filename += kTessdataFileSuffixes[i];
155 FILE *fp = fopen(filename.
string(),
"rb");
169 "Error: traineddata file must contain at least (a unicharset file" 170 "and inttemp) OR an lstm file.\n");
174 return SaveFile(output_filename,
nullptr);
178 const char *new_traineddata_filename,
179 char **component_filenames,
180 int num_new_components) {
182 for (
int i = 0; i < num_new_components; ++i) {
186 tprintf(
"Failed to read component file:%s\n", component_filenames[i]);
193 return SaveFile(new_traineddata_filename,
nullptr);
200 if (entries_[type].empty())
return false;
207 if (strcmp(kTessdataFileSuffixes[i], suffix) == 0) {
212 tprintf(
"TessdataManager can't determine which tessdata" 213 " component is represented by %s\n", suffix);
220 const char *suffix = strrchr(filename,
'.');
221 if (suffix ==
nullptr || *(++suffix) ==
'\0')
return false;
bool OverwriteComponents(const char *new_traineddata_filename, char **component_filenames, int num_new_components)
bool IsLSTMAvailable() const
static bool TessdataTypeFromFileName(const char *filename, TessdataType *type)
bool SaveDataToFile(const GenericVector< char > &data, const STRING &filename)
void init_to_size(int size, T t)
bool LoadMemBuffer(const char *name, const char *data, int size)
const char * string() const
void resize_no_init(int size)
bool IsBaseAvailable() const
int FReadEndian(void *buffer, int size, int count)
bool ExtractToFile(const char *filename)
void OpenWrite(GenericVector< char > *data)
bool SaveFile(const STRING &filename, FileWriter writer) const
bool GetComponent(TessdataType type, TFile *fp)
bool LoadDataFromFile(const char *filename, GenericVector< char > *data)
void set_swap(bool value)
int FWrite(const void *buffer, int size, int count)
void Serialize(GenericVector< char > *data) const
bool(* FileWriter)(const GenericVector< char > &data, const STRING &filename)
static bool TessdataTypeFromFileSuffix(const char *suffix, TessdataType *type)
bool Open(const STRING &filename, FileReader reader)
bool CombineDataFiles(const char *language_data_path_prefix, const char *output_filename)
bool Init(const char *data_file_name)
void ReverseN(void *ptr, int num_bytes)
int FRead(void *buffer, int size, int count)