21 #pragma warning(disable:4244) // Conversion warnings 40 data_file_name_ = data_file_name;
45 if (reader_ ==
nullptr) {
48 if (!(*reader_)(data_file_name, &data))
return false;
57 data_file_name_ = name;
61 if (fp.
FRead(&num_entries,
sizeof(num_entries), 1) != 1)
return false;
62 swap_ = num_entries > kMaxNumTessdataEntries || num_entries < 0;
64 if (swap_)
ReverseN(&num_entries,
sizeof(num_entries));
65 if (num_entries > kMaxNumTessdataEntries || num_entries < 0)
return false;
68 if (fp.
FReadEndian(&offset_table[0],
sizeof(offset_table[0]), num_entries) !=
72 if (offset_table[i] >= 0) {
73 inT64 entry_size = size - offset_table[i];
75 while (j < num_entries && offset_table[j] == -1) ++j;
76 if (j < num_entries) entry_size = offset_table[j] - offset_table[i];
78 if (fp.
FRead(&entries_[i][0], 1, entry_size) != entry_size)
return false;
93 memcpy(&entries_[type][0], data, size);
102 if (writer ==
nullptr)
113 inT64 offset =
sizeof(
inT32) +
sizeof(offset_table);
115 if (entries_[i].empty()) {
116 offset_table[i] = -1;
118 offset_table[i] = offset;
119 offset += entries_[i].
size();
126 fp.
FWrite(&num_entries,
sizeof(num_entries), 1);
127 fp.
FWrite(offset_table,
sizeof(offset_table), 1);
129 if (!entries_[i].empty()) {
130 fp.
FWrite(&entries_[i][0], entries_[i].size(), 1);
148 if (!entries_[i].empty()) {
149 tprintf(
"%d:%s:size=%d, offset=%d\n", i, kTessdataFileSuffixes[i],
150 entries_[i].size(), offset);
151 offset += entries_[i].
size();
159 if (!is_loaded_ && !
Init(data_file_name_.
string()))
return false;
168 if (entries_[type].empty())
return false;
169 fp->
Open(&entries_[type][0], entries_[type].size());
177 entries_[TESSDATA_VERSION].size());
187 const char *language_data_path_prefix,
188 const char *output_filename) {
194 filename += kTessdataFileSuffixes[i];
195 FILE *fp = fopen(filename.
string(),
"rb");
209 "Error: traineddata file must contain at least (a unicharset file" 210 "and inttemp) OR an lstm file.\n");
214 return SaveFile(output_filename,
nullptr);
218 const char *new_traineddata_filename,
219 char **component_filenames,
220 int num_new_components) {
222 for (
int i = 0; i < num_new_components; ++i) {
226 tprintf(
"Failed to read component file:%s\n", component_filenames[i]);
233 return SaveFile(new_traineddata_filename,
nullptr);
240 if (entries_[type].empty())
return false;
247 if (strcmp(kTessdataFileSuffixes[i], suffix) == 0) {
252 tprintf(
"TessdataManager can't determine which tessdata" 253 " component is represented by %s\n", suffix);
260 const char *suffix = strrchr(filename,
'.');
261 if (suffix ==
nullptr || *(++suffix) ==
'\0')
return false;
static bool TessdataTypeFromFileName(const char *filename, TessdataType *type)
int FWrite(const void *buffer, int size, int count)
static bool TessdataTypeFromFileSuffix(const char *suffix, TessdataType *type)
bool SaveFile(const STRING &filename, FileWriter writer) const
void OpenWrite(GenericVector< char > *data)
void resize_no_init(int size)
bool ExtractToFile(const char *filename)
bool IsLSTMAvailable() const
bool GetComponent(TessdataType type, TFile *fp)
bool(* FileWriter)(const GenericVector< char > &data, const STRING &filename)
string VersionString() const
void set_swap(bool value)
bool CombineDataFiles(const char *language_data_path_prefix, const char *output_filename)
const char * string() const
bool LoadMemBuffer(const char *name, const char *data, int size)
void LoadFileLater(const char *data_file_name)
void Serialize(GenericVector< char > *data) const
bool Open(const STRING &filename, FileReader reader)
bool SaveDataToFile(const GenericVector< char > &data, const STRING &filename)
bool OverwriteComponents(const char *new_traineddata_filename, char **component_filenames, int num_new_components)
int FReadEndian(void *buffer, int size, int count)
void ReverseN(void *ptr, int num_bytes)
void OverwriteEntry(TessdataType type, const char *data, int size)
bool LoadDataFromFile(const char *filename, GenericVector< char > *data)
bool Init(const char *data_file_name)
void init_to_size(int size, T t)
int FRead(void *buffer, int size, int count)
bool IsBaseAvailable() const
void SetVersionString(const string &v_str)