Initialize slang and Android.mk.
Change-Id: If74da8e54d45511c8c9bb236bcfeec508f4f2439
diff --git a/slang_pragma_recorder.cpp b/slang_pragma_recorder.cpp
new file mode 100644
index 0000000..c445994
--- /dev/null
+++ b/slang_pragma_recorder.cpp
@@ -0,0 +1,71 @@
+#include "slang_pragma_recorder.hpp"
+
+#include "clang/Lex/Token.h" /* for class clang::Token */
+
+#include "clang/Basic/TokenKinds.h" /* for enum clang::tok::* */
+
+#include "clang/Lex/Preprocessor.h" /* for class clang::Preprocessor */
+
+namespace slang {
+
+bool PragmaRecorder::GetPragmaNameFromToken(const Token& Token, std::string& PragmaName) {
+ if(Token.isLiteral())
+ PragmaName.assign(Token.getLiteralData(), Token.getLength());
+ else if(Token.is(clang::tok::identifier))
+ PragmaName.assign(Token.getIdentifierInfo()->getNameStart(), Token.getIdentifierInfo()->getLength());
+ else
+ return false;
+ return true;
+}
+
+bool PragmaRecorder::GetPragmaValueFromToken(const Token& Token, std::string& PragmaValue) {
+ /* Same as the GetPragmaName() */
+ if(Token.is(clang::tok::r_paren))
+ PragmaValue.clear();
+ else
+ return GetPragmaNameFromToken(Token, PragmaValue);
+ return true;
+}
+
+PragmaRecorder::PragmaRecorder(PragmaList& Pragmas) : PragmaHandler(NULL), mPragmas(Pragmas) { return; }
+
+void PragmaRecorder::HandlePragma(Preprocessor &PP, Token &FirstToken) {
+ Token& CurrentToken = FirstToken;
+ std::string PragmaName, PragmaValue = "";
+ /* Pragma in ACC should be a name/value pair */
+
+ if(GetPragmaNameFromToken(FirstToken, PragmaName)) {
+ /* start parsing the value '(' PragmaValue ')' */
+ const Token* NextToken = &PP.LookAhead(0);
+
+ if(NextToken->is(clang::tok::l_paren))
+ PP.LexUnexpandedToken(CurrentToken);
+ else
+ goto end_parsing_pragma_value;
+
+ NextToken = &PP.LookAhead(0);
+ if(GetPragmaValueFromToken(*NextToken, PragmaValue))
+ PP.Lex(CurrentToken);
+ else
+ goto end_parsing_pragma_value;
+
+ if(!NextToken->is(clang::tok::r_paren)) {
+ NextToken = &PP.LookAhead(0);
+ if(NextToken->is(clang::tok::r_paren))
+ PP.LexUnexpandedToken(CurrentToken);
+ else
+ goto end_parsing_pragma_value;
+ }
+
+ /* Until now, we ensure that we have a pragma name/value pair */
+ mPragmas.push_back( make_pair(PragmaName, PragmaValue) );
+ }
+
+end_parsing_pragma_value:
+ /* Infor lex to eat the token */
+ PP.LexUnexpandedToken(CurrentToken);
+
+ return;
+}
+
+} /* namespace slang */