1 // -*- related-file-name: "../../liblcdf/slurper.cc" -*- 2 #ifndef LCDF_SLURPER_HH 3 #define LCDF_SLURPER_HH 4 #include <lcdf/landmark.hh> 5 #include <lcdf/filename.hh> 6 #include <stdio.h> 7 8 class Slurper { public: 9 10 Slurper(const Filename &, FILE * = 0); 11 ~Slurper(); 12 ok() const13 bool ok() const { return _f != 0; } 14 landmark() const15 Landmark landmark() const { return Landmark(_filename.name(), _lineno); } operator Landmark() const16 operator Landmark() const { return landmark(); } lineno() const17 unsigned lineno() const { return _lineno; } 18 filename() const19 const Filename &filename() const { return _filename; } 20 char *peek_line(); 21 char *next_line(); 22 char *append_next_line(); save_line()23 void save_line() { _saved_line = true; } 24 cur_line() const25 char *cur_line() const { return (char *)_line; } cur_line_length() const26 unsigned cur_line_length() const { return _line_len; } 27 void shorten_line(unsigned); 28 29 private: 30 31 FILE *_f; 32 Filename _filename; 33 unsigned _lineno; 34 bool _own_f; 35 36 unsigned char *_data; 37 unsigned _cap; 38 unsigned _pos; 39 unsigned _len; 40 41 unsigned char *_line; 42 unsigned _line_len; 43 44 bool _saved_line; 45 bool _at_eof; 46 47 void grow_buffer(); 48 inline int more_data(); 49 char *get_line_at(unsigned); 50 51 }; 52 53 54 inline void shorten_line(unsigned pos)55Slurper::shorten_line(unsigned pos) 56 { 57 if (pos < _line_len) { 58 _line_len = pos; 59 _line[_line_len] = 0; 60 } 61 } 62 63 #endif 64