Merge remote-tracking branch 'upstream/edge' into firmconfig
[clinton/Smoothieware.git] / src / libs / ConfigSource.h
1 /*
2 This file is part of Smoothie (http://smoothieware.org/). The motion control part is heavily based on Grbl (https://github.com/simen/grbl).
3 Smoothie is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
4 Smoothie is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
5 You should have received a copy of the GNU General Public License along with Smoothie. If not, see <http://www.gnu.org/licenses/>.
6 */
7
8 #ifndef CONFIGSOURCE_H
9 #define CONFIGSOURCE_H
10
11 using namespace std;
12 #include <vector>
13 #include <string>
14 #include "ConfigValue.h"
15 #include "ConfigCache.h"
16
17 class ConfigValue;
18
19 class ConfigSource {
20 public:
21 ConfigSource(){}
22
23 // Read each value, and append it as a ConfigValue to the config_cache we were passed
24 virtual void transfer_values_to_cache( ConfigCache* ) = 0;
25 virtual bool is_named( uint16_t check_sum ) = 0;
26 virtual void write( string setting, string value ) = 0;
27 virtual string read( uint16_t check_sums[3] ) = 0;
28
29 uint16_t name_checksum;
30 protected:
31 virtual string process_char_from_ascii_config(int c, ConfigCache* cache) {
32 static string buffer;
33 if (c == '\n' || c == EOF)
34 {
35 // We have a new line
36 if( buffer[0] == '#' ){ buffer.clear(); return ""; } // Ignore comments
37 if( buffer.length() < 3 ){ buffer.clear(); return ""; } //Ignore empty lines
38 size_t begin_key = buffer.find_first_not_of(" ");
39 size_t begin_value = buffer.find_first_not_of(" ", buffer.find_first_of(" ", begin_key));
40
41 uint16_t check_sums[3];
42 get_checksums(check_sums, buffer.substr(begin_key, buffer.find_first_of(" ", begin_key) - begin_key).append(" "));
43
44 ConfigValue* result = new ConfigValue;
45
46 result->found = true;
47 result->check_sums[0] = check_sums[0];
48 result->check_sums[1] = check_sums[1];
49 result->check_sums[2] = check_sums[2];
50
51 result->value = buffer.substr(begin_value, buffer.find_first_of("\r\n# ", begin_value+1)-begin_value);
52 // Append the newly found value to the cache we were passed
53 cache->replace_or_push_back(result);
54
55 buffer.clear();
56
57 return result->value;
58 }
59 else
60 buffer += c;
61
62 return "";
63 };
64 virtual string process_char_from_ascii_config(int c, uint16_t line_checksums[3]) {
65 static string buffer;
66 string value;
67 if (c == '\n' || c == EOF)
68 {
69 // We have a new line
70 if( buffer[0] == '#' ){ buffer.clear(); return ""; } // Ignore comments
71 if( buffer.length() < 3 ){ buffer.clear(); return ""; } //Ignore empty lines
72 size_t begin_key = buffer.find_first_not_of(" ");
73 size_t begin_value = buffer.find_first_not_of(" ", buffer.find_first_of(" ", begin_key));
74
75 uint16_t check_sums[3];
76 get_checksums(check_sums, buffer.substr(begin_key, buffer.find_first_of(" ", begin_key) - begin_key).append(" "));
77
78 if(check_sums[0] == line_checksums[0] && check_sums[1] == line_checksums[1] && check_sums[2] == line_checksums[2] ){
79 value = buffer.substr(begin_value, buffer.find_first_of("\r\n# ", begin_value+1)-begin_value);
80 buffer.clear();
81 return value;
82 }
83
84 buffer.clear();
85 }
86 else
87 buffer += c;
88 return value;
89 };
90 };
91
92
93
94 #endif