xref: /haiku/src/add-ons/print/drivers/postscript/PPDParser.cpp (revision 02354704729d38c3b078c696adc1bbbd33cbcf72)
1 /*
2 * Copyright 2010, Haiku. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Ithamar R. Adema <ithamar.adema@team-embedded.nl>
7 */
8 
9 
10 #include "PPDParser.h"
11 
12 #include <File.h>
13 #include <Path.h>
14 
15 
16 PPDParser::PPDParser(BFile& file)
17 {
18 	InitData(file);
19 }
20 
21 
22 PPDParser::PPDParser(const BDirectory& dir, const char* fname)
23 {
24 	BFile file(&dir, fname, B_READ_ONLY);
25 	InitData(file);
26 }
27 
28 
29 PPDParser::PPDParser(const BPath& path)
30 {
31 	BFile file(path.Path(), B_READ_ONLY);
32 	InitData(file);
33 }
34 
35 
36 status_t
37 PPDParser::InitData(BFile& file)
38 {
39 	// Check if file exists...
40 	if ((fInitErr = file.InitCheck()) != B_OK)
41 		return fInitErr;
42 
43 	// Read entire file into BString
44 	ssize_t len;
45 	char buffer[1025];
46 	while ((len = file.Read(buffer, sizeof(buffer)-1)) > 0) {
47 		buffer[len] = '\0';
48 		fContent << buffer;
49 	}
50 
51 	// Convert DOS/Windows newlines to UNIX ones
52 	fContent.ReplaceAll("\r\n", "\n");
53 	// Handle line continuation
54 	fContent.ReplaceAll("&&\n", "");
55 	// Make sure file ends with newline
56 	fContent << '\n';
57 
58 	return B_OK;
59 }
60 
61 
62 BString
63 PPDParser::GetParameter(const BString& param)
64 {
65 	BString result, line;
66 	int32 pos = 0, next;
67 	BString pattern;
68 
69 	pattern << "*" << param << ":";
70 
71 	while ((next = fContent.FindFirst('\n', pos)) > 0) {
72 		// Grab line (without newline)
73 		fContent.CopyInto(line, pos, next - pos);
74 		// Found our parameter?
75 		if (line.Compare(pattern, pattern.Length()) == 0) {
76 			// Copy result
77 			line.CopyInto(result, pattern.Length(),
78 				line.Length() - pattern.Length()).Trim();
79 			// If result is quoted, remove quotes
80 			if (result[0] == '"') {
81 				result.Truncate(result.Length() -1);
82 				result.Remove(0, 1);
83 			}
84 			break;
85 		}
86 		pos = next +1;
87 	}
88 
89 	return result;
90 }
91 
92 
93 PPDParser::~PPDParser()
94 {
95 }
96