summaryrefslogtreecommitdiff
path: root/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/afmparse.hh
blob: c97c4949b0c19955664f27a3328d958eb1d8165c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// -*- related-file-name: "../../libefont/afmparse.cc" -*-
#ifndef EFONT_AFMPARSE_HH
#define EFONT_AFMPARSE_HH
#include <lcdf/slurper.hh>
#include <lcdf/permstr.hh>
#include <stdarg.h>
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