GCC 4.3.x fixes for cabman and sysreg
[reactos.git] / reactos / tools / sysreg / file_reader.cpp
1 /* $Id$
2 *
3 * PROJECT: System regression tool for ReactOS
4 * LICENSE: GPL - See COPYING in the top level directory
5 * FILE: tools/sysreg/conf_parser.h
6 * PURPOSE: file reading support
7 * PROGRAMMERS: Johannes Anderwald (johannes.anderwald at sbox tugraz at)
8 */
9
10 #include "file_reader.h"
11
12 namespace System_
13 {
14 //---------------------------------------------------------------------------------------
15 FileReader::FileReader() : DataSource(), m_File(NULL)
16 {
17 }
18 //---------------------------------------------------------------------------------------
19 FileReader::~FileReader()
20 {
21 }
22 //---------------------------------------------------------------------------------------
23 bool FileReader::openSource(const string & filename)
24 {
25 m_File = fopen((char*)filename.c_str(), (char*)"rb");
26
27 if (m_File)
28 {
29 return true;
30 }
31 else
32 {
33 return false;
34 }
35 }
36 //---------------------------------------------------------------------------------------
37 bool FileReader::closeSource()
38 {
39 if (!m_File)
40 {
41 return false;
42 }
43
44 if (!fclose(m_File))
45 {
46 m_File = NULL;
47 return true;
48 }
49
50 return false;
51 }
52 //---------------------------------------------------------------------------------------
53 bool FileReader::readSource(vector<string> & lines)
54 {
55 if (!m_File)
56 {
57 return false;
58 }
59
60 bool ret = true;
61 size_t total_length = 0;
62 size_t line_count = lines.size();
63 size_t num = 0;
64 char szBuffer[256];
65 int readoffset = 0;
66
67 if (m_BufferedLines.length())
68 {
69 strcpy(szBuffer, m_BufferedLines.c_str());
70 readoffset = m_BufferedLines.length();
71 }
72
73 do
74 {
75 if (total_length < num)
76 {
77 memmove(szBuffer, &szBuffer[total_length], num - total_length);
78 readoffset = num - total_length;
79 }
80
81 num = fread(&szBuffer[readoffset],
82 sizeof(char), sizeof(szBuffer)/sizeof(char) - (readoffset+1) * sizeof(char),
83 m_File);
84
85 szBuffer[num] = L'\0';
86
87 if (!num)
88 {
89 if (line_count == lines.size ())
90 {
91 ret = false;
92 }
93 break;
94 }
95 char * ptr;
96 char * offset = szBuffer;
97
98 total_length = 0;
99 while((ptr = strstr(offset, "\x0D\x0A")) != NULL)
100 {
101 long length = ((long )ptr - (long)offset);
102 length /= sizeof(char);
103
104 offset[length] = '\0';
105
106 string line = offset;
107 lines.push_back (line);
108
109 offset += length + 2;
110 total_length += length + 2;
111
112 if (total_length == num)
113 {
114 break;
115 }
116 }
117 }while(num );
118
119 if (total_length < num)
120 {
121 m_BufferedLines = &szBuffer[total_length];
122 }
123
124 return ret;
125 }
126
127 } // end of namespace System_