tesseract  4.00.00dev
serialis.cpp
Go to the documentation of this file.
1 /**********************************************************************
2  * File: serialis.h (Formerly serialmac.h)
3  * Description: Inline routines and macros for serialisation functions
4  * Author: Phil Cheatle
5  * Created: Tue Oct 08 08:33:12 BST 1991
6  *
7  * (C) Copyright 1990, Hewlett-Packard Ltd.
8  ** Licensed under the Apache License, Version 2.0 (the "License");
9  ** you may not use this file except in compliance with the License.
10  ** You may obtain a copy of the License at
11  ** http://www.apache.org/licenses/LICENSE-2.0
12  ** Unless required by applicable law or agreed to in writing, software
13  ** distributed under the License is distributed on an "AS IS" BASIS,
14  ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  ** See the License for the specific language governing permissions and
16  ** limitations under the License.
17  *
18  **********************************************************************/
19 
20 #include "serialis.h"
21 #include <stdio.h>
22 #include "genericvector.h"
23 
24 namespace tesseract {
25 
27  : offset_(0),
28  data_(NULL),
29  data_is_owned_(false),
30  is_writing_(false),
31  swap_(false) {}
32 
34  if (data_is_owned_)
35  delete data_;
36 }
37 
38 bool TFile::Open(const STRING& filename, FileReader reader) {
39  if (!data_is_owned_) {
40  data_ = new GenericVector<char>;
41  data_is_owned_ = true;
42  }
43  offset_ = 0;
44  is_writing_ = false;
45  swap_ = false;
46  if (reader == NULL)
47  return LoadDataFromFile(filename, data_);
48  else
49  return (*reader)(filename, data_);
50 }
51 
52 bool TFile::Open(const char* data, int size) {
53  offset_ = 0;
54  if (!data_is_owned_) {
55  data_ = new GenericVector<char>;
56  data_is_owned_ = true;
57  }
58  is_writing_ = false;
59  swap_ = false;
60  data_->resize_no_init(size);
61  memcpy(&(*data_)[0], data, size);
62  return true;
63 }
64 
65 bool TFile::Open(FILE* fp, inT64 end_offset) {
66  offset_ = 0;
67  inT64 current_pos = ftell(fp);
68  if (end_offset < 0) {
69  if (fseek(fp, 0, SEEK_END))
70  return false;
71  end_offset = ftell(fp);
72  if (fseek(fp, current_pos, SEEK_SET))
73  return false;
74  }
75  int size = end_offset - current_pos;
76  is_writing_ = false;
77  swap_ = false;
78  if (!data_is_owned_) {
79  data_ = new GenericVector<char>;
80  data_is_owned_ = true;
81  }
82  data_->resize_no_init(size);
83  return static_cast<int>(fread(&(*data_)[0], 1, size, fp)) == size;
84 }
85 
86 char* TFile::FGets(char* buffer, int buffer_size) {
87  ASSERT_HOST(!is_writing_);
88  int size = 0;
89  while (size + 1 < buffer_size && offset_ < data_->size()) {
90  buffer[size++] = (*data_)[offset_++];
91  if ((*data_)[offset_ - 1] == '\n') break;
92  }
93  if (size < buffer_size) buffer[size] = '\0';
94  return size > 0 ? buffer : NULL;
95 }
96 
97 int TFile::FReadEndian(void* buffer, int size, int count) {
98  int num_read = FRead(buffer, size, count);
99  if (swap_) {
100  char* char_buffer = static_cast<char*>(buffer);
101  for (int i = 0; i < num_read; ++i, char_buffer += size) {
102  ReverseN(char_buffer, size);
103  }
104  }
105  return num_read;
106 }
107 
108 int TFile::FRead(void* buffer, int size, int count) {
109  ASSERT_HOST(!is_writing_);
110  int required_size = size * count;
111  if (required_size <= 0) return 0;
112  if (data_->size() - offset_ < required_size)
113  required_size = data_->size() - offset_;
114  if (required_size > 0 && buffer != NULL)
115  memcpy(buffer, &(*data_)[offset_], required_size);
116  offset_ += required_size;
117  return required_size / size;
118 }
119 
121  ASSERT_HOST(!is_writing_);
122  offset_ = 0;
123 }
124 
126  offset_ = 0;
127  if (data != NULL) {
128  if (data_is_owned_) delete data_;
129  data_ = data;
130  data_is_owned_ = false;
131  } else if (!data_is_owned_) {
132  data_ = new GenericVector<char>;
133  data_is_owned_ = true;
134  }
135  is_writing_ = true;
136  swap_ = false;
137  data_->truncate(0);
138 }
139 
141  ASSERT_HOST(is_writing_);
142  if (writer == NULL)
143  return SaveDataToFile(*data_, filename);
144  else
145  return (*writer)(*data_, filename);
146 }
147 
148 int TFile::FWrite(const void* buffer, int size, int count) {
149  ASSERT_HOST(is_writing_);
150  int total = size * count;
151  if (total <= 0) return 0;
152  const char* buf = static_cast<const char*>(buffer);
153  // This isn't very efficient, but memory is so fast compared to disk
154  // that it is relatively unimportant, and very simple.
155  for (int i = 0; i < total; ++i)
156  data_->push_back(buf[i]);
157  return count;
158 }
159 
160 
161 } // namespace tesseract.
162 
int64_t inT64
Definition: host.h:40
bool SaveDataToFile(const GenericVector< char > &data, const STRING &filename)
bool(* FileReader)(const STRING &filename, GenericVector< char > *data)
voidpf void uLong size
Definition: ioapi.h:39
bool CloseWrite(const STRING &filename, FileWriter writer)
Definition: serialis.cpp:140
int push_back(T object)
void resize_no_init(int size)
Definition: genericvector.h:66
int FReadEndian(void *buffer, int size, int count)
Definition: serialis.cpp:97
void truncate(int size)
#define SEEK_SET
Definition: ioapi.c:29
int size() const
Definition: genericvector.h:72
void OpenWrite(GenericVector< char > *data)
Definition: serialis.cpp:125
#define ASSERT_HOST(x)
Definition: errcode.h:84
Definition: strngs.h:45
bool LoadDataFromFile(const char *filename, GenericVector< char > *data)
int FWrite(const void *buffer, int size, int count)
Definition: serialis.cpp:148
bool(* FileWriter)(const GenericVector< char > &data, const STRING &filename)
const char * filename
Definition: ioapi.h:38
bool Open(const STRING &filename, FileReader reader)
Definition: serialis.cpp:38
voidpf void * buf
Definition: ioapi.h:39
#define SEEK_END
Definition: ioapi.c:25
char * FGets(char *buffer, int buffer_size)
Definition: serialis.cpp:86
int count(LIST var_list)
Definition: oldlist.cpp:103
void ReverseN(void *ptr, int num_bytes)
Definition: helpers.h:184
int FRead(void *buffer, int size, int count)
Definition: serialis.cpp:108