summaryrefslogtreecommitdiff
path: root/tools/aidl/aidl_language.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/aidl/aidl_language.cpp')
-rw-r--r--tools/aidl/aidl_language.cpp90
1 files changed, 78 insertions, 12 deletions
diff --git a/tools/aidl/aidl_language.cpp b/tools/aidl/aidl_language.cpp
index 5fab6c26431a..525292055755 100644
--- a/tools/aidl/aidl_language.cpp
+++ b/tools/aidl/aidl_language.cpp
@@ -1,20 +1,86 @@
#include "aidl_language.h"
#include <stdio.h>
-#include <string.h>
#include <stdlib.h>
+#include <string>
+#include <iostream>
-#ifdef _WIN32
-int isatty(int fd)
-{
- return (fd == 0);
+using std::string;
+using std::cerr;
+using std::endl;
+
+ParserCallbacks* g_callbacks = NULL; // &k_parserCallbacks;
+
+void yylex_init(void **);
+void yylex_destroy(void *);
+void yyset_in(FILE *f, void *);
+int yyparse(ParseState*);
+
+ParseState::ParseState() : ParseState("") {}
+
+ParseState::ParseState(const string& filename)
+ : filename_(filename) {
+ yylex_init(&scanner_);
}
-#endif
-#if 0
-ParserCallbacks k_parserCallbacks = {
- NULL
-};
-#endif
+ParseState::~ParseState() {
+ yylex_destroy(scanner_);
+}
-ParserCallbacks* g_callbacks = NULL; // &k_parserCallbacks;
+string ParseState::FileName() {
+ return filename_;
+}
+
+string ParseState::Package() {
+ return g_currentPackage;
+}
+
+void ParseState::ProcessDocument(const document_item_type& items) {
+ /* The cast is not my fault. I didn't write the code on the other side. */
+ /* TODO(sadmac): b/23977313 */
+ g_callbacks->document((document_item_type *)&items);
+}
+
+void ParseState::ProcessImport(const buffer_type& statement) {
+ /* The cast is not my fault. I didn't write the code on the other side. */
+ /* TODO(sadmac): b/23977313 */
+ g_callbacks->import((buffer_type *)&statement);
+}
+void ParseState::ReportError(const string& err) {
+ /* FIXME: We're printing out the line number as -1. We used to use yylineno
+ * (which was NEVER correct even before reentrant parsing). Now we'll need
+ * another way.
+ */
+ cerr << filename_ << ":" << -1 << ": " << err << endl;
+ error_ = 1;
+}
+
+bool ParseState::FoundNoErrors() {
+ return error_ == 0;
+}
+
+void *ParseState::Scanner() {
+ return scanner_;
+}
+
+bool ParseState::OpenFileFromDisk() {
+ FILE *in = fopen(FileName().c_str(), "r");
+
+ if (! in)
+ return false;
+
+ yyset_in(in, Scanner());
+ return true;
+}
+
+int ParseState::RunParser() {
+ int ret = yyparse(this);
+
+ free((void *)g_currentPackage);
+ g_currentPackage = NULL;
+
+ if (error_)
+ return 1;
+
+ return ret;
+}