⛏️ index : haiku.git

/*
 * Copyright 2008, Haiku.
 * Distributed under the terms of the MIT license.
 *
 * Authors:
 *		Michael Pfeiffer <laplace@users.sourceforge.net>
 */

#include "Parser.h"
#include "Test.h"

#include <StopWatch.h>
#include <stdio.h>

void TestParser()
{
	Parser parser(gPPDFile);
	if (parser.InitCheck() != B_OK) {
		fprintf(stderr, "Could not open ppd file %s\n", gPPDFile);
		return;
	}
	
	Statement* statement;
	do {
		statement = parser.Parse();
		if (statement != NULL) {
			statement->Print();
		}
		delete statement;
	} while (statement != NULL);
}

#include "PPDParser.h"

static PPD* OpenTestFile(bool all, bool timing)
{
	BStopWatch* stopWatch = NULL; 
	if (timing) {
		stopWatch = new BStopWatch("PPDParser");
	}
	PPDParser parser(gPPDFile);

	if (parser.InitCheck() != B_OK) {
		fprintf(stderr, "Could not open ppd file %s\n", gPPDFile);
		return NULL;
	}
	
	PPD* ppd = all ? parser.ParseAll() : parser.ParseHeader();

	delete stopWatch;
	
	if (ppd == NULL) {
		fprintf(stderr, "Parser returned NULL\n");
		fprintf(stderr, "%s\n", parser.GetErrorMessage());
		return NULL;
	}
	
	return ppd;
}

void TestPPDParser(bool all, bool verbose)
{
	PPD* ppd = OpenTestFile(all, !verbose);
	if (ppd == NULL) return;	
	if (verbose) {
		ppd->Print();
	}
	delete ppd;
}

void ExtractChildren(StatementList* list, int level);

void Indent(int level)
{
	for (; level > 0; level --) {
		printf("  ");
	} 
}

void PrintValue(const char* label, Value* arg, int level)
{	
	Indent(level);
	
	if (label != NULL) {
		printf("%s ", label);
	}
	
	if (arg != NULL) {
		BString* value = arg->GetValue();
		BString* translation = arg->GetTranslation();
		if (translation != NULL) {
			printf("%s", translation->String());
		}
		if (value != NULL) {
			printf(" [%s]", value->String());
		}
	} else {
		printf("NULL");
	}	
	
	printf("\n");
}

bool ExtractGroup(Statement* statement, int level)
{
	GroupStatement group(statement);
	if (group.IsOpenGroup()) {
		const char* translation = group.GetGroupTranslation();
		Indent(level);
		if (translation != NULL) {
			printf("%s", translation);
		}
		const char* name = group.GetGroupName();
		if (name != NULL) {
			printf("[%s]", name);
		}
		printf("\n");
		ExtractChildren(statement->GetChildren(), level+1);
		return true;
	}
	return false;
}

void ExtractChildren(StatementList* list, int level)
{
	if (list == NULL) return;
	for (int32 i = 0; i < list->Size(); i ++) {
		Statement* statement = list->StatementAt(i);
		if (!ExtractGroup(statement, level)) {
			if (statement->GetType() == Statement::kValue) {
				PrintValue(NULL, statement->GetOption(), level);
			} else if (statement->GetType() == Statement::kDefault) {
				PrintValue("Default", statement->GetValue(), level);			
			}
		}
	}	
}

void TestExtractUI()
{
	PPD* ppd = OpenTestFile(true, false);
	if (ppd == NULL) return;
	
	for (int32 i = 0; i < ppd->Size(); i++) {
		Statement* statement = ppd->StatementAt(i);
		ExtractGroup(statement, 0);
	}
}