Advertisement
Guest User

Untitled

a guest
Dec 10th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.06 KB | None | 0 0
  1. #include <iostream>
  2. #include <assert.h>
  3. #include <memory>
  4. #include <fstream>
  5. #include "TrackingDeque.h"
  6. #include <unistd.h>
  7. #include <sys/types.h>
  8. #include <cstring>
  9. #include <stdio.h>
  10. #include <ctype.h>
  11. using namespace std;
  12.  
  13. class BufferedFile : public fstream
  14. {
  15. public:
  16. void get(char &ch);
  17. void put(char ch);
  18. BufferedFile() = delete;
  19. BufferedFile(const BufferedFile &) = delete;
  20. BufferedFile(const string &name);
  21. int buffersize() { return buffer.size(); }
  22. void flushy();
  23. //bool eof() const;
  24. ios::streampos putpos;
  25. string filename;
  26.  
  27. private:
  28. bool internal_eof;
  29. TrackingDeque<char> buffer;
  30. ios::streampos getpos;
  31. };
  32.  
  33. BufferedFile::BufferedFile(const string &name)
  34. : internal_eof(false), getpos(0), putpos(0),
  35. fstream(name, ios::in | ios::out), filename(name)
  36. {
  37. }
  38.  
  39. void BufferedFile::get(char &ch)
  40. {
  41. ch = '#';
  42. if (buffer.size() > 0)
  43. {
  44. cerr << "getting from buffer!\n";
  45. ch = buffer.front();
  46. buffer.pop_front();
  47. }
  48. else
  49. {
  50. seekg(getpos);
  51. if (fstream::eof())
  52. cerr << "eof before fstream::get\n";
  53. fstream::get(ch); //trigger eof at some point
  54. if (fstream::eof())
  55. {
  56. cerr << "eof after fstream::get\n";
  57. internal_eof = true;
  58. }
  59. //getpos=tellg();
  60. getpos += 1;
  61. }
  62. }
  63.  
  64. void BufferedFile::put(char ch)
  65. {
  66. cerr << "BEFORE putpos=" << putpos << ", getpos=" << getpos << endl;
  67. assert(eof() || putpos <= getpos);
  68. if (putpos == getpos && !internal_eof)
  69. {
  70. char temp;
  71. seekg(getpos);
  72. fstream::get(temp);
  73. cerr << "temp: " << temp << "\n";
  74. getpos = tellg();
  75. cerr << "pushing back=>" << temp << "<=\n";
  76. buffer.push_back(temp);
  77. }
  78. cerr << "PUT CH: " << ch << " PUTPOS: " << putpos << "\n";
  79. seekg(putpos);
  80. fstream::put(ch);
  81. if (fstream::good())
  82. putpos = tellp();
  83. cerr << "AFTER putpos=" << putpos << ", getpos=" << getpos << endl
  84. << endl;
  85. }
  86. void BufferedFile::flushy()
  87. {
  88. //fstream::clear();
  89. while (buffer.size() > 0)
  90. {
  91. fstream::clear();
  92. cerr << "buf size: " << buffer.size() << "\n";
  93. cerr << "FLUSHY! putpos=" << putpos << " buffer front=" << buffer.front() << "\n";
  94. //put('g');
  95. if (isalnum(buffer.front()))
  96. {
  97. fstream::put(buffer.front());
  98. } else {
  99. cerr << "skipping bad char >" << buffer.front() << "< \n";
  100. }
  101. buffer.pop_front();
  102. }
  103. }
  104.  
  105. bool compare_match() {
  106.  
  107. }
  108.  
  109. int main(int argc, char *argv[])
  110. {
  111. //BufferedFile bf;//do this, not smart pointers
  112. BufferedFile bf(argv[3]);
  113. string filename = argv[3];
  114. ifstream is;
  115. is.open(filename.c_str(), ios::binary);
  116. is.seekg(0, ios::end);
  117. int length = is.tellg();
  118. int cur_len = 0;
  119. cout << length << endl;
  120.  
  121. enum State
  122. {
  123. SEARCHING,
  124. POTENTIAL_MATCH,
  125. FAILED_MATCH,
  126. SUCCESSFUL_MATCH
  127. };
  128.  
  129. State state = SEARCHING;
  130.  
  131. const char *srch = argv[1];
  132. int srch_len = std::strlen(srch);
  133. const char *repl = argv[2];
  134. int repl_len = std::strlen(repl);
  135.  
  136. //while(!bf.eof())
  137. while (cur_len < length - (repl_len - srch_len))
  138. {
  139. cerr << cur_len << " until : " << length - (repl_len - srch_len) << endl;
  140. cout << "current_state=" << state << endl;
  141. char mychar;
  142. int num_matches = 0;
  143. int counter = 0;
  144. bf.get(mychar);
  145. cerr << "mychar=---------------------------->" << mychar << endl;
  146. if (mychar == srch[0])
  147. {
  148. state = POTENTIAL_MATCH;
  149. num_matches = 0;
  150. while (counter < srch_len && srch[num_matches] == mychar)
  151. {
  152. cerr << "srch[num_matche]: " << srch[num_matches] << "\n";
  153. cerr << "bf.get() mychar: " << mychar << "\n";
  154. ++counter;
  155. ++num_matches;
  156. if (counter < srch_len) {
  157. bf.get(mychar);
  158. cerr << "GET GET\n";
  159. }
  160. }
  161. cerr << "counter=" << counter << endl;
  162. if (counter < srch_len)
  163. state = FAILED_MATCH;
  164. else
  165. state = SUCCESSFUL_MATCH;
  166. }
  167.  
  168. switch (state)
  169. {
  170. case SEARCHING:
  171. bf.put(mychar);
  172. break;
  173. case SUCCESSFUL_MATCH:
  174. for (int i = 0; i < repl_len; ++i) {
  175. cerr << "bf.put() char: " << repl[i] << "\n";
  176. bf.put(repl[i]);
  177. }
  178. state = SEARCHING;
  179. break;
  180. case FAILED_MATCH:
  181. assert(false);
  182. //state = SEARCHING;
  183. break;
  184. case POTENTIAL_MATCH:
  185. assert(false);
  186. }
  187. cur_len++;
  188. }
  189. bf.flushy();
  190.  
  191. cerr << "size of buffer at end=" << bf.buffersize() << endl;
  192. truncate(bf.filename.c_str(), bf.putpos);
  193. return 0;
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement