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