xref: /haiku/src/tests/add-ons/print/ppd/test/TestParser.cpp (revision 4420c1ceffd7f2246e4303d59cf02ed122980e9d)
1 /*
2  * Copyright 2008, Haiku.
3  * Distributed under the terms of the MIT license.
4  *
5  * Authors:
6  *		Michael Pfeiffer <laplace@users.sourceforge.net>
7  */
8 
9 #include "Parser.h"
10 #include "Test.h"
11 
12 #include <StopWatch.h>
13 #include <stdio.h>
14 
TestParser()15 void TestParser()
16 {
17 	Parser parser(gPPDFile);
18 	if (parser.InitCheck() != B_OK) {
19 		fprintf(stderr, "Could not open ppd file %s\n", gPPDFile);
20 		return;
21 	}
22 
23 	Statement* statement;
24 	do {
25 		statement = parser.Parse();
26 		if (statement != NULL) {
27 			statement->Print();
28 		}
29 		delete statement;
30 	} while (statement != NULL);
31 }
32 
33 #include "PPDParser.h"
34 
OpenTestFile(bool all,bool timing)35 static PPD* OpenTestFile(bool all, bool timing)
36 {
37 	BStopWatch* stopWatch = NULL;
38 	if (timing) {
39 		stopWatch = new BStopWatch("PPDParser");
40 	}
41 	PPDParser parser(gPPDFile);
42 
43 	if (parser.InitCheck() != B_OK) {
44 		fprintf(stderr, "Could not open ppd file %s\n", gPPDFile);
45 		return NULL;
46 	}
47 
48 	PPD* ppd = all ? parser.ParseAll() : parser.ParseHeader();
49 
50 	delete stopWatch;
51 
52 	if (ppd == NULL) {
53 		fprintf(stderr, "Parser returned NULL\n");
54 		fprintf(stderr, "%s\n", parser.GetErrorMessage());
55 		return NULL;
56 	}
57 
58 	return ppd;
59 }
60 
TestPPDParser(bool all,bool verbose)61 void TestPPDParser(bool all, bool verbose)
62 {
63 	PPD* ppd = OpenTestFile(all, !verbose);
64 	if (ppd == NULL) return;
65 	if (verbose) {
66 		ppd->Print();
67 	}
68 	delete ppd;
69 }
70 
71 void ExtractChildren(StatementList* list, int level);
72 
Indent(int level)73 void Indent(int level)
74 {
75 	for (; level > 0; level --) {
76 		printf("  ");
77 	}
78 }
79 
PrintValue(const char * label,Value * arg,int level)80 void PrintValue(const char* label, Value* arg, int level)
81 {
82 	Indent(level);
83 
84 	if (label != NULL) {
85 		printf("%s ", label);
86 	}
87 
88 	if (arg != NULL) {
89 		BString* value = arg->GetValue();
90 		BString* translation = arg->GetTranslation();
91 		if (translation != NULL) {
92 			printf("%s", translation->String());
93 		}
94 		if (value != NULL) {
95 			printf(" [%s]", value->String());
96 		}
97 	} else {
98 		printf("NULL");
99 	}
100 
101 	printf("\n");
102 }
103 
ExtractGroup(Statement * statement,int level)104 bool ExtractGroup(Statement* statement, int level)
105 {
106 	GroupStatement group(statement);
107 	if (group.IsOpenGroup()) {
108 		const char* translation = group.GetGroupTranslation();
109 		Indent(level);
110 		if (translation != NULL) {
111 			printf("%s", translation);
112 		}
113 		const char* name = group.GetGroupName();
114 		if (name != NULL) {
115 			printf("[%s]", name);
116 		}
117 		printf("\n");
118 		ExtractChildren(statement->GetChildren(), level+1);
119 		return true;
120 	}
121 	return false;
122 }
123 
ExtractChildren(StatementList * list,int level)124 void ExtractChildren(StatementList* list, int level)
125 {
126 	if (list == NULL) return;
127 	for (int32 i = 0; i < list->Size(); i ++) {
128 		Statement* statement = list->StatementAt(i);
129 		if (!ExtractGroup(statement, level)) {
130 			if (statement->GetType() == Statement::kValue) {
131 				PrintValue(NULL, statement->GetOption(), level);
132 			} else if (statement->GetType() == Statement::kDefault) {
133 				PrintValue("Default", statement->GetValue(), level);
134 			}
135 		}
136 	}
137 }
138 
TestExtractUI()139 void TestExtractUI()
140 {
141 	PPD* ppd = OpenTestFile(true, false);
142 	if (ppd == NULL) return;
143 
144 	for (int32 i = 0; i < ppd->Size(); i++) {
145 		Statement* statement = ppd->StatementAt(i);
146 		ExtractGroup(statement, 0);
147 	}
148 }
149