199 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * 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 <stdio.h>
 | 
						|
#include "ast.h"
 | 
						|
 | 
						|
static const char gSpaces[] =
 | 
						|
    "                                                                "
 | 
						|
    "                                                                "
 | 
						|
    "                                                                "
 | 
						|
    "                                                                "
 | 
						|
    "                                                                "
 | 
						|
    "                                                                "
 | 
						|
    "                                                                ";
 | 
						|
const int gSpacesMax = sizeof(gSpaces) - 1;
 | 
						|
 | 
						|
static const char *
 | 
						|
pad(int level)
 | 
						|
{
 | 
						|
    level *= 4;
 | 
						|
    if (level > gSpacesMax) {
 | 
						|
        level = gSpacesMax;
 | 
						|
    }
 | 
						|
    return gSpaces + gSpacesMax - level;
 | 
						|
}
 | 
						|
 | 
						|
void dumpBooleanValue(int level, const AmBooleanValue *booleanValue);
 | 
						|
void dumpStringValue(int level, const AmStringValue *stringValue);
 | 
						|
 | 
						|
void
 | 
						|
dumpBooleanExpression(int level, const AmBooleanExpression *booleanExpression)
 | 
						|
{
 | 
						|
    const char *op;
 | 
						|
    bool unary = false;
 | 
						|
 | 
						|
    switch (booleanExpression->op) {
 | 
						|
    case AM_BOP_NOT:
 | 
						|
        op = "NOT";
 | 
						|
        unary = true;
 | 
						|
        break;
 | 
						|
    case AM_BOP_EQ:
 | 
						|
        op = "EQ";
 | 
						|
        break;
 | 
						|
    case AM_BOP_NE:
 | 
						|
        op = "NE";
 | 
						|
        break;
 | 
						|
    case AM_BOP_AND:
 | 
						|
        op = "AND";
 | 
						|
        break;
 | 
						|
    case AM_BOP_OR:
 | 
						|
        op = "OR";
 | 
						|
        break;
 | 
						|
    default:
 | 
						|
        op = "??";
 | 
						|
        break;
 | 
						|
    }
 | 
						|
 | 
						|
    printf("%sBOOLEAN %s {\n", pad(level), op);
 | 
						|
    dumpBooleanValue(level + 1, booleanExpression->arg1);
 | 
						|
    if (!unary) {
 | 
						|
        dumpBooleanValue(level + 1, booleanExpression->arg2);
 | 
						|
    }
 | 
						|
    printf("%s}\n", pad(level));
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
dumpFunctionArguments(int level, const AmFunctionArguments *functionArguments)
 | 
						|
{
 | 
						|
    int i;
 | 
						|
    for (i = 0; i < functionArguments->argc; i++) {
 | 
						|
        dumpStringValue(level, &functionArguments->argv[i]);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
dumpFunctionCall(int level, const AmFunctionCall *functionCall)
 | 
						|
{
 | 
						|
    printf("%sFUNCTION %s (\n", pad(level), functionCall->name);
 | 
						|
    dumpFunctionArguments(level + 1, functionCall->args);
 | 
						|
    printf("%s)\n", pad(level));
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
dumpStringValue(int level, const AmStringValue *stringValue)
 | 
						|
{
 | 
						|
    switch (stringValue->type) {
 | 
						|
    case AM_SVAL_LITERAL:
 | 
						|
        printf("%s\"%s\"\n", pad(level), stringValue->u.literal);
 | 
						|
        break;
 | 
						|
    case AM_SVAL_FUNCTION:
 | 
						|
        dumpFunctionCall(level, stringValue->u.function);
 | 
						|
        break;
 | 
						|
    default:
 | 
						|
        printf("%s<UNKNOWN SVAL TYPE %d>\n", pad(level), stringValue->type);
 | 
						|
        break;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
dumpStringComparisonExpression(int level,
 | 
						|
        const AmStringComparisonExpression *stringComparisonExpression)
 | 
						|
{
 | 
						|
    const char *op;
 | 
						|
 | 
						|
    switch (stringComparisonExpression->op) {
 | 
						|
    case AM_SOP_LT:
 | 
						|
        op = "LT";
 | 
						|
        break;
 | 
						|
    case AM_SOP_LE:
 | 
						|
        op = "LE";
 | 
						|
        break;
 | 
						|
    case AM_SOP_GT:
 | 
						|
        op = "GT";
 | 
						|
        break;
 | 
						|
    case AM_SOP_GE:
 | 
						|
        op = "GE";
 | 
						|
        break;
 | 
						|
    case AM_SOP_EQ:
 | 
						|
        op = "EQ";
 | 
						|
        break;
 | 
						|
    case AM_SOP_NE:
 | 
						|
        op = "NE";
 | 
						|
        break;
 | 
						|
    default:
 | 
						|
        op = "??";
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    printf("%sSTRING %s {\n", pad(level), op);
 | 
						|
    dumpStringValue(level + 1, stringComparisonExpression->arg1);
 | 
						|
    dumpStringValue(level + 1, stringComparisonExpression->arg2);
 | 
						|
    printf("%s}\n", pad(level));
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
dumpBooleanValue(int level, const AmBooleanValue *booleanValue)
 | 
						|
{
 | 
						|
    switch (booleanValue->type) {
 | 
						|
    case AM_BVAL_EXPRESSION:
 | 
						|
        dumpBooleanExpression(level, &booleanValue->u.expression);
 | 
						|
        break;
 | 
						|
    case AM_BVAL_STRING_COMPARISON:
 | 
						|
        dumpStringComparisonExpression(level,
 | 
						|
                &booleanValue->u.stringComparison);
 | 
						|
        break;
 | 
						|
    default:
 | 
						|
        printf("%s<UNKNOWN BVAL TYPE %d>\n", pad(1), booleanValue->type);
 | 
						|
        break;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
dumpWordList(const AmWordList *wordList)
 | 
						|
{
 | 
						|
    int i;
 | 
						|
    for (i = 0; i < wordList->argc; i++) {
 | 
						|
        printf("%s\"%s\"\n", pad(1), wordList->argv[i]);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
dumpCommandArguments(const AmCommandArguments *commandArguments)
 | 
						|
{
 | 
						|
    if (commandArguments->booleanArgs) {
 | 
						|
        dumpBooleanValue(1, commandArguments->u.b);
 | 
						|
    } else {
 | 
						|
        dumpWordList(commandArguments->u.w);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
dumpCommand(const AmCommand *command)
 | 
						|
{
 | 
						|
    printf("command \"%s\" {\n", command->name);
 | 
						|
    dumpCommandArguments(command->args);
 | 
						|
    printf("}\n");
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
dumpCommandList(const AmCommandList *commandList)
 | 
						|
{
 | 
						|
    int i;
 | 
						|
    for (i = 0; i < commandList->commandCount; i++) {
 | 
						|
        dumpCommand(commandList->commands[i]);
 | 
						|
    }
 | 
						|
}
 |