view src/tokenizer.h @ 120:1d9e6c1b8872

uribl patch from Jeff Evans <jeffe@tricab.com>
author carl
date Sun, 12 Mar 2006 12:55:40 -0800
parents 99049fdc7320
children ecb40aa3eaa5
line wrap: on
line source

#ifndef tokenizer_include
#define tokenizer_include

#include <fstream>
#include <list>
#include <set>
#include <stdio.h>
#include <ctype.h>


using namespace std;

struct ltstr {
    bool operator()(char* s1, char* s2) const {
        return strcmp(s1, s2) < 0;
    }
};

typedef list<ifstream *>    stream_list;
typedef list<char *>        string_list;
typedef set<char *, ltstr>  string_set;
typedef list<int>           line_list;

class TOKEN {
    stream_list streams;
    string_list filenames;
    string_set  filenamess;
    line_list   linenumbers;
    string_list pending_tokens;
    string_set  *include_files;
    bool        pushed;
    u_char      pushed_char;

    void pop();
    bool next_char(u_char &c);
    void push_char(u_char c);

public:
    TOKEN(char *fn, string_set *includes);
    ~TOKEN();
    bool    include(char *fn);
    char    *next();            // return next token
    int     nextint();
    void    skipeol();          // skip to eol
    void    push(char *token)           {pending_tokens.push_front(token);};
    char    *cur_fn()                   {return filenames.front();};
    int     cur_line()                  {return linenumbers.front();};
    void    token_error(const char *err);
    void    token_error(const char *fmt, int d, const char *s);
    void    token_error(const char *fmt, const char *t, const char *h);
    void    token_error(const char *want, const char *have);
    void    token_error();
};

#endif