// -*- related-file-name: "../../libefont/afmparse.cc" -*- #ifndef EFONT_AFMPARSE_HH #define EFONT_AFMPARSE_HH #include #include #include namespace Efont { class AfmParser { public: AfmParser(Slurper &); bool ok() const { return _slurper.ok(); } operator Landmark() const { return _slurper.landmark(); } Landmark landmark() const { return _slurper.landmark(); } unsigned lineno() const { return _slurper.lineno(); } const Filename &filename() const { return _slurper.filename(); } bool key_matched() const { return _fail_field >= 0; } int fail_field() const { return _fail_field; } PermString message() const { return _message; } void clear_message() { _message = PermString(); } PermString keyword() const; bool is(const char *, ...); bool isall(const char *, ...); inline bool next_line(); void save_line() { _slurper.save_line(); } void skip_until(unsigned char); unsigned char *cur_line() const { return _pos; } unsigned char first() const { return _pos[0]; } unsigned char operator[](int i) const { return _pos[i]; } bool left() const { return *_pos != 0; } private: Slurper &_slurper; bool _save_line; unsigned char *_line; unsigned char *_pos; int _length; PermString _message; int _fail_field; void static_initialize(); void trim_end(); unsigned char *vis(const char *, va_list); }; inline bool AfmParser::next_line() { _pos = _line = (unsigned char *)_slurper.next_line(); _length = _slurper.cur_line_length(); return _line != 0; } } #endif