/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include "ast.h" #include "lexer.h" #include "parser.h" #include "register.h" #include "execute.h" void lexTest() { int token; do { token = yylex(); if (token == 0) { printf(" EOF"); fflush(stdout); break; } else { printf(" %s", tokenToString(token)); fflush(stdout); if (token == TOK_IDENTIFIER) { if (strcmp(yylval.literalString, "assert") == 0) { setLexerArgumentType(AM_BOOLEAN_ARGS); } else { setLexerArgumentType(AM_WORD_ARGS); } do { token = yylex(); printf(" %s", tokenToString(token)); fflush(stdout); } while (token != TOK_EOL && token != TOK_EOF && token != 0); } else if (token != TOK_EOL) { fprintf(stderr, "syntax error: expected identifier\n"); break; } } } while (token != 0); printf("\n"); } void usage() { printf("usage: amend [--debug-lex|--debug-ast] []\n"); exit(1); } extern const AmCommandList *gCommands; int main(int argc, char *argv[]) { FILE *inputFile = NULL; bool debugLex = false; bool debugAst = false; const char *fileName = NULL; int err; #if 1 extern int test_symtab(void); int ret = test_symtab(); if (ret != 0) { fprintf(stderr, "test_symtab() failed: %d\n", ret); exit(ret); } extern int test_cmd_fn(void); ret = test_cmd_fn(); if (ret != 0) { fprintf(stderr, "test_cmd_fn() failed: %d\n", ret); exit(ret); } #endif argc--; argv++; while (argc > 0) { if (strcmp("--debug-lex", argv[0]) == 0) { debugLex = true; } else if (strcmp("--debug-ast", argv[0]) == 0) { debugAst = true; } else if (argv[0][0] == '-') { fprintf(stderr, "amend: Unknown option \"%s\"\n", argv[0]); usage(); } else { fileName = argv[0]; } argc--; argv++; } if (fileName != NULL) { inputFile = fopen(fileName, "r"); if (inputFile == NULL) { fprintf(stderr, "amend: Can't open input file '%s'\n", fileName); usage(); } } commandInit(); //xxx clean up err = registerUpdateCommands(); if (err < 0) { fprintf(stderr, "amend: Error registering commands: %d\n", err); exit(-err); } err = registerUpdateFunctions(); if (err < 0) { fprintf(stderr, "amend: Error registering functions: %d\n", err); exit(-err); } #if AMEND_LEXER_BUFFER_INPUT if (inputFile == NULL) { fprintf(stderr, "amend: No input file\n"); usage(); } char *fileData; int fileDataLen; fseek(inputFile, 0, SEEK_END); fileDataLen = ftell(inputFile); rewind(inputFile); if (fileDataLen < 0) { fprintf(stderr, "amend: Can't get file length\n"); exit(2); } else if (fileDataLen == 0) { printf("amend: Empty input file\n"); exit(0); } fileData = (char *)malloc(fileDataLen + 1); if (fileData == NULL) { fprintf(stderr, "amend: Can't allocate %d bytes\n", fileDataLen + 1); exit(2); } size_t nread = fread(fileData, 1, fileDataLen, inputFile); if (nread != (size_t)fileDataLen) { fprintf(stderr, "amend: Didn't read %d bytes, only %zd\n", fileDataLen, nread); exit(2); } fileData[fileDataLen] = '\0'; setLexerInputBuffer(fileData, fileDataLen); #else if (inputFile == NULL) { inputFile = stdin; } yyset_in(inputFile); #endif if (debugLex) { lexTest(); } else { int ret = yyparse(); if (ret != 0) { fprintf(stderr, "amend: Parse failed (%d)\n", ret); exit(2); } else { if (debugAst) { dumpCommandList(gCommands); } printf("amend: Parse successful.\n"); ret = execCommandList((ExecContext *)1, gCommands); if (ret != 0) { fprintf(stderr, "amend: Execution failed (%d)\n", ret); exit(3); } printf("amend: Execution successful.\n"); } } return 0; }