aidl_language.cpp revision 70078e6d2b1afd3d1a5f4370fd4e116e6d0510e1
1#include "aidl_language.h" 2 3#include <iostream> 4#include <stdio.h> 5#include <stdlib.h> 6#include <string> 7 8#include "aidl_language_y.hpp" 9#include "parse_helpers.h" 10 11#ifdef _WIN32 12int isatty(int fd) 13{ 14 return (fd == 0); 15} 16#endif 17 18using std::string; 19using std::cerr; 20using std::endl; 21using android::aidl::cpp_strdup; 22 23Parser *psGlobal = NULL; 24ParserCallbacks* g_callbacks = NULL; // &k_parserCallbacks; 25char const* g_currentPackage = NULL; 26 27 28void yylex_init(void **); 29void yylex_destroy(void *); 30void yyset_in(FILE *f, void *); 31int yyparse(Parser*); 32YY_BUFFER_STATE yy_scan_string(const char *, void *); 33void yy_delete_buffer(YY_BUFFER_STATE, void *); 34 35Parser::Parser(const string& filename) 36 : filename_(filename) { 37 yylex_init(&scanner_); 38} 39 40Parser::~Parser() { 41 if (buffer_is_valid_) 42 yy_delete_buffer(buffer_, scanner_); 43 yylex_destroy(scanner_); 44} 45 46string AidlType::ToString() const { 47 return string(type.data) + Brackets(); 48} 49 50std::string AidlType::Brackets() const { 51 std::string result; 52 53 for (int i = 0; i < dimension; i++) 54 result += "[]"; 55 56 return result; 57} 58 59AidlArgument::AidlArgument(AidlArgument::Direction direction, AidlType* type, 60 buffer_type name) 61 : type_(type), 62 direction_(direction), 63 direction_specified_(true), 64 name_(name.data), 65 line_(name.lineno) {} 66 67AidlArgument::AidlArgument(AidlType* type, buffer_type name) 68 : type_(type), 69 direction_(AidlArgument::IN_DIR), 70 direction_specified_(false), 71 name_(name.data), 72 line_(name.lineno) {} 73 74string AidlArgument::ToString() const { 75 string ret; 76 77 if (direction_specified_) { 78 switch(direction_) { 79 case AidlArgument::IN_DIR: 80 ret += "in "; 81 break; 82 case AidlArgument::OUT_DIR: 83 ret += "out "; 84 break; 85 case AidlArgument::INOUT_DIR: 86 ret += "inout "; 87 break; 88 } 89 } 90 91 ret += type_->ToString(); 92 ret += " "; 93 ret += name_; 94 95 return ret; 96} 97 98string Parser::FileName() { 99 return filename_; 100} 101 102string Parser::Package() { 103 return g_currentPackage ? g_currentPackage : ""; 104} 105 106void Parser::ReportError(const string& err) { 107 /* FIXME: We're printing out the line number as -1. We used to use yylineno 108 * (which was NEVER correct even before reentrant parsing). Now we'll need 109 * another way. 110 */ 111 cerr << filename_ << ":" << -1 << ": " << err << endl; 112 error_ = 1; 113} 114 115bool Parser::FoundNoErrors() { 116 return error_ == 0; 117} 118 119void *Parser::Scanner() { 120 return scanner_; 121} 122 123bool Parser::OpenFileFromDisk() { 124 FILE *in = fopen(FileName().c_str(), "r"); 125 126 if (! in) 127 return false; 128 129 yyset_in(in, Scanner()); 130 return true; 131} 132 133void Parser::SetFileContents(const std::string& contents) { 134 if (buffer_is_valid_) 135 yy_delete_buffer(buffer_, scanner_); 136 137 buffer_ = yy_scan_string(contents.c_str(), scanner_); 138 buffer_is_valid_ = true; 139} 140 141bool Parser::RunParser() { 142 int ret = yy::parser(this).parse(); 143 144 delete[] g_currentPackage; 145 g_currentPackage = NULL; 146 147 return ret == 0 && error_ == 0; 148} 149 150void Parser::SetDocument(document_item_type *d) 151{ 152 document_ = d; 153} 154 155void Parser::AddImport(const buffer_type& statement) 156{ 157 import_info* import = new import_info(); 158 memset(import, 0, sizeof(import_info)); 159 import->from = cpp_strdup(this->FileName().c_str()); 160 import->statement.lineno = statement.lineno; 161 import->statement.data = cpp_strdup(statement.data); 162 import->statement.extra = NULL; 163 import->next = imports_; 164 import->neededClass = android::aidl::parse_import_statement(statement.data); 165 imports_ = import; 166} 167 168document_item_type *Parser::GetDocument() const 169{ 170 return document_; 171} 172 173import_info *Parser::GetImports() const 174{ 175 return imports_; 176} 177 178