SourcePos.cpp revision 54b6cfa9a9e5b861a9930af873580d6dc20f773c
1cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#include "SourcePos.h"
2cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com
38cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include <stdarg.h>
4cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#include <vector>
5cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com
6cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.comusing namespace std;
78cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com
8cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com
98cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com// ErrorPos
10cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com// =============================================================================
118cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comstruct ErrorPos
128cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com{
138cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    String8 file;
148cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    int line;
158cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    String8 error;
168cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    bool fatal;
178cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com
188cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    ErrorPos();
198cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    ErrorPos(const ErrorPos& that);
208cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    ErrorPos(const String8& file, int line, const String8& error, bool fatal);
218cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    ~ErrorPos();
228cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    bool operator<(const ErrorPos& rhs) const;
238cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    bool operator==(const ErrorPos& rhs) const;
248cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    ErrorPos& operator=(const ErrorPos& rhs);
258cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com
268cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    void print(FILE* to) const;
278cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com};
288cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com
298cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comstatic vector<ErrorPos> g_errors;
308cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com
318cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comErrorPos::ErrorPos()
328cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    :line(-1), fatal(false)
338cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com{
348cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com}
358cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com
368cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comErrorPos::ErrorPos(const ErrorPos& that)
378cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    :file(that.file),
388cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com     line(that.line),
398cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com     error(that.error),
408cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com     fatal(that.fatal)
418cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com{
428cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com}
438cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com
448cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comErrorPos::ErrorPos(const String8& f, int l, const String8& e, bool fat)
458cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    :file(f),
468cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com     line(l),
478cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com     error(e),
488cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com     fatal(fat)
498cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com{
508cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com}
518cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com
528cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comErrorPos::~ErrorPos()
538cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com{
548cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com}
558cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com
568cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.combool
578cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comErrorPos::operator<(const ErrorPos& rhs) const
588cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com{
598cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    if (this->file < rhs.file) return true;
608cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    if (this->file == rhs.file) {
618cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com        if (this->line < rhs.line) return true;
628cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com        if (this->line == rhs.line) {
638cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com            if (this->error < rhs.error) return true;
648cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com        }
658cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    }
668cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    return false;
678cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com}
688cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com
698cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.combool
708cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comErrorPos::operator==(const ErrorPos& rhs) const
718cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com{
728cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    return this->file == rhs.file
738cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com            && this->line == rhs.line
748cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com            && this->error == rhs.error;
758cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com}
768cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com
778cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comErrorPos&
788cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comErrorPos::operator=(const ErrorPos& rhs)
798cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com{
808cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    this->file = rhs.file;
818cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    this->line = rhs.line;
828cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    this->error = rhs.error;
838cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    return *this;
848cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com}
858cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com
868cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comvoid
878cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comErrorPos::print(FILE* to) const
888cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com{
898cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    const char* type = fatal ? "ERROR" : "WARNING";
908cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com
918cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    if (this->line >= 0) {
928cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com        fprintf(to, "%s:%d: %s %s\n", this->file.string(), this->line, type, this->error.string());
938cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    } else {
948cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com        fprintf(to, "%s: %s %s\n", this->file.string(), type, this->error.string());
958cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    }
968cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com}
978cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com
988cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com// SourcePos
998cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com// =============================================================================
1008cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comSourcePos::SourcePos(const String8& f, int l)
1018cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    : file(f), line(l)
1028cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com{
1038cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com}
1048cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com
1058cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comSourcePos::SourcePos(const SourcePos& that)
1068cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    : file(that.file), line(that.line)
1078cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com{
1088cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com}
1098cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com
1108cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comSourcePos::SourcePos()
1118cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    : file("???", 0), line(-1)
1128cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com{
1138cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com}
1148cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com
1158cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comSourcePos::~SourcePos()
1168cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com{
1178cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com}
1188cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com
1198cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comint
1208cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comSourcePos::error(const char* fmt, ...) const
1218cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com{
1228cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    int retval=0;
1238cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    char buf[1024];
1248cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    va_list ap;
1258cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    va_start(ap, fmt);
1268cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    retval = vsnprintf(buf, sizeof(buf), fmt, ap);
1278cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    va_end(ap);
1288cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    char* p = buf + retval - 1;
1298cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    while (p > buf && *p == '\n') {
1308cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com        *p = '\0';
1318cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com        p--;
1328cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    }
1338cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    g_errors.push_back(ErrorPos(this->file, this->line, String8(buf), true));
1348cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    return retval;
1358cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com}
1368cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com
1378cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comint
1388cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comSourcePos::warning(const char* fmt, ...) const
1398cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com{
1408cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    int retval=0;
1418cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com    char buf[1024];
142    va_list ap;
143    va_start(ap, fmt);
144    retval = vsnprintf(buf, sizeof(buf), fmt, ap);
145    va_end(ap);
146    char* p = buf + retval - 1;
147    while (p > buf && *p == '\n') {
148        *p = '\0';
149        p--;
150    }
151    ErrorPos(this->file, this->line, String8(buf), false).print(stderr);
152    return retval;
153}
154
155bool
156SourcePos::hasErrors()
157{
158    return g_errors.size() > 0;
159}
160
161void
162SourcePos::printErrors(FILE* to)
163{
164    vector<ErrorPos>::const_iterator it;
165    for (it=g_errors.begin(); it!=g_errors.end(); it++) {
166        it->print(to);
167    }
168}
169
170
171
172