tesseract  4.0.0-beta.1-59-g2cc4
serialis.cpp
Go to the documentation of this file.
1 /**********************************************************************
2  * File: serialis.cpp (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_t end_offset) {
66  offset_ = 0;
67  long current_pos = ftell(fp);
68  if (current_pos < 0) {
69  // ftell failed.
70  return false;
71  }
72  if (end_offset < 0) {
73  if (fseek(fp, 0, SEEK_END))
74  return false;
75  end_offset = ftell(fp);
76  if (fseek(fp, current_pos, SEEK_SET))
77  return false;
78  }
79  int size = end_offset - current_pos;
80  is_writing_ = false;
81  swap_ = false;
82  if (!data_is_owned_) {
83  data_ = new GenericVector<char>;
84  data_is_owned_ = true;
85  }
86  data_->resize_no_init(size);
87  return static_cast<int>(fread(&(*data_)[0], 1, size, fp)) == size;
88 }
89 
90 char* TFile::FGets(char* buffer, int buffer_size) {
91  ASSERT_HOST(!is_writing_);
92  int size = 0;
93  while (size + 1 < buffer_size && offset_ < data_->size()) {
94  buffer[size++] = (*data_)[offset_++];
95  if ((*data_)[offset_ - 1] == '\n') break;
96  }
97  if (size < buffer_size) buffer[size] = '\0';
98  return size > 0 ? buffer : NULL;
99 }
100 
101 int TFile::FReadEndian(void* buffer, int size, int count) {
102  int num_read = FRead(buffer, size, count);
103  if (swap_) {
104  char* char_buffer = static_cast<char*>(buffer);
105  for (int i = 0; i < num_read; ++i, char_buffer += size) {
106  ReverseN(char_buffer, size);
107  }
108  }
109  return num_read;
110 }
111 
112 int TFile::FRead(void* buffer, int size, int count) {
113  ASSERT_HOST(!is_writing_);
114  int required_size = size * count;
115  if (required_size <= 0) return 0;
116  if (data_->size() - offset_ < required_size)
117  required_size = data_->size() - offset_;
118  if (required_size > 0 && buffer != NULL)
119  memcpy(buffer, &(*data_)[offset_], required_size);
120  offset_ += required_size;
121  return required_size / size;
122 }
123 
125  ASSERT_HOST(!is_writing_);
126  offset_ = 0;
127 }
128 
130  offset_ = 0;
131  if (data != NULL) {
132  if (data_is_owned_) delete data_;
133  data_ = data;
134  data_is_owned_ = false;
135  } else if (!data_is_owned_) {
136  data_ = new GenericVector<char>;
137  data_is_owned_ = true;
138  }
139  is_writing_ = true;
140  swap_ = false;
141  data_->truncate(0);
142 }
143 
145  ASSERT_HOST(is_writing_);
146  if (writer == NULL)
147  return SaveDataToFile(*data_, filename);
148  else
149  return (*writer)(*data_, filename);
150 }
151 
152 int TFile::FWrite(const void* buffer, int size, int count) {
153  ASSERT_HOST(is_writing_);
154  int total = size * count;
155  if (total <= 0) return 0;
156  const char* buf = static_cast<const char*>(buffer);
157  // This isn't very efficient, but memory is so fast compared to disk
158  // that it is relatively unimportant, and very simple.
159  for (int i = 0; i < total; ++i)
160  data_->push_back(buf[i]);
161  return count;
162 }
163 
164 
165 } // namespace tesseract.
166 
bool CloseWrite(const STRING &filename, FileWriter writer)
Definition: serialis.cpp:144
char * FGets(char *buffer, int buffer_size)
Definition: serialis.cpp:90
bool(* FileReader)(const STRING &filename, GenericVector< char > *data)
int FRead(void *buffer, int size, int count)
Definition: serialis.cpp:112
void OpenWrite(GenericVector< char > *data)
Definition: serialis.cpp:129
Definition: strngs.h:45
int size() const
Definition: genericvector.h:72
bool LoadDataFromFile(const char *filename, GenericVector< char > *data)
void ReverseN(void *ptr, int num_bytes)
Definition: helpers.h:189
int push_back(T object)
bool(* FileWriter)(const GenericVector< char > &data, const STRING &filename)
#define ASSERT_HOST(x)
Definition: errcode.h:84
void truncate(int size)
void resize_no_init(int size)
Definition: genericvector.h:66
int FReadEndian(void *buffer, int size, int count)
Definition: serialis.cpp:101
bool Open(const STRING &filename, FileReader reader)
Definition: serialis.cpp:38
bool SaveDataToFile(const GenericVector< char > &data, const STRING &filename)
int FWrite(const void *buffer, int size, int count)
Definition: serialis.cpp:152
int count(LIST var_list)
Definition: oldlist.cpp:103