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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
#ifndef SASS_POSITION_H
#define SASS_POSITION_H
#include <string>
#include <cstring>
#include "source_data.hpp"
#include "ast_fwd_decl.hpp"
namespace Sass {
class Offset {
public: // c-tor
Offset(const char chr);
Offset(const char* string);
Offset(const sass::string& text);
Offset(const size_t line, const size_t column);
// return new position, incremented by the given string
Offset add(const char* begin, const char* end);
Offset inc(const char* begin, const char* end) const;
// init/create instance from const char substring
static Offset init(const char* beg, const char* end);
public: // overload operators for position
void operator+= (const Offset &pos);
bool operator== (const Offset &pos) const;
bool operator!= (const Offset &pos) const;
Offset operator+ (const Offset &off) const;
Offset operator- (const Offset &off) const;
public: // overload output stream operator
// friend std::ostream& operator<<(std::ostream& strm, const Offset& off);
public:
Offset off() { return *this; }
public:
size_t line;
size_t column;
};
class Position : public Offset {
public: // c-tor
Position(const size_t file); // line(0), column(0)
Position(const size_t file, const Offset& offset);
Position(const size_t line, const size_t column); // file(-1)
Position(const size_t file, const size_t line, const size_t column);
public: // overload operators for position
void operator+= (const Offset &off);
bool operator== (const Position &pos) const;
bool operator!= (const Position &pos) const;
const Position operator+ (const Offset &off) const;
const Offset operator- (const Offset &off) const;
// return new position, incremented by the given string
Position add(const char* begin, const char* end);
Position inc(const char* begin, const char* end) const;
public: // overload output stream operator
// friend std::ostream& operator<<(std::ostream& strm, const Position& pos);
public:
size_t file;
};
// Token type for representing lexed chunks of text
class Token {
public:
const char* prefix;
const char* begin;
const char* end;
Token()
: prefix(0), begin(0), end(0) { }
Token(const char* b, const char* e)
: prefix(b), begin(b), end(e) { }
Token(const char* str)
: prefix(str), begin(str), end(str + strlen(str)) { }
Token(const char* p, const char* b, const char* e)
: prefix(p), begin(b), end(e) { }
size_t length() const { return end - begin; }
sass::string ws_before() const { return sass::string(prefix, begin); }
sass::string to_string() const { return sass::string(begin, end); }
sass::string time_wspace() const {
sass::string str(to_string());
sass::string whitespaces(" \t\f\v\n\r");
return str.erase(str.find_last_not_of(whitespaces)+1);
}
operator bool() { return begin && end && begin >= end; }
operator sass::string() { return to_string(); }
bool operator==(Token t) { return to_string() == t.to_string(); }
};
class SourceSpan {
public:
SourceSpan(const char* path);
SourceSpan(SourceDataObj source,
const Offset& position = Offset(0, 0),
const Offset& offset = Offset(0, 0));
const char* getPath() const {
return source->getPath();
}
const char* getRawData() const {
return source->getRawData();
}
Offset getPosition() const {
return position;
}
size_t getLine() const {
return position.line + 1;
}
size_t getColumn() const {
return position.column + 1;
}
size_t getSrcId() const {
return source == nullptr
? std::string::npos
: source->getSrcId();
}
SourceDataObj source;
Offset position;
Offset offset;
};
}
#endif
|