First pass on reentrant C++-ish parser

We're flipping Flex/Bison in to reentrant mode, cutting down on global
variables, and exposing a more C++-like interface earlier. This is the first
phase. There's still a couple of weird hacks to deal with the previous code's
reckless disregard for scope sanity, but the outline of things to come is
starting to appear, and this CL really doesn't need to get any bigger.

Change-Id: Ife2d70db026d7ab1319bdf6c586959315666d0bb
Signed-off-by: Casey Dahlin <sadmac@google.com>
diff --git a/aidl_language.cpp b/aidl_language.cpp
index 5fab6c2..5252920 100644
--- a/aidl_language.cpp
+++ b/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);
-}
-#endif
-
-#if 0
-ParserCallbacks k_parserCallbacks = {
-    NULL
-};
-#endif
+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_);
+}
+
+ParseState::~ParseState() {
+  yylex_destroy(scanner_);
+}
+
+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;
+}