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