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