Simple config file class with added support for floats
Fork of ConfigFile by
ConfigFile.cpp@7:0a8c1d05611b, 2015-01-10 (annotated)
- Committer:
- jaerts
- Date:
- Sat Jan 10 14:04:59 2015 +0000
- Revision:
- 7:0a8c1d05611b
- Parent:
- 6:78404e968c3e
Fix bug that prevents reading values with length=1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pbrier | 3:31c936f3b9df | 1 | /* |
pbrier | 0:57f3e167586f | 2 | * ConfigFile.cpp |
pbrier | 0:57f3e167586f | 3 | * Simple Config file reader class |
pbrier | 0:57f3e167586f | 4 | * |
pbrier | 0:57f3e167586f | 5 | * Copyright (c) 2011 Peter Brier |
pbrier | 0:57f3e167586f | 6 | * |
pbrier | 0:57f3e167586f | 7 | * This file is part of the LaOS project (see: http://wiki.protospace.nl/index.php/LaOS) |
pbrier | 0:57f3e167586f | 8 | * |
pbrier | 0:57f3e167586f | 9 | * LaOS is free software: you can redistribute it and/or modify |
pbrier | 0:57f3e167586f | 10 | * it under the terms of the GNU General Public License as published by |
pbrier | 0:57f3e167586f | 11 | * the Free Software Foundation, either version 3 of the License, or |
pbrier | 0:57f3e167586f | 12 | * (at your option) any later version. |
pbrier | 0:57f3e167586f | 13 | * |
pbrier | 0:57f3e167586f | 14 | * LaOS is distributed in the hope that it will be useful, |
pbrier | 0:57f3e167586f | 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
pbrier | 0:57f3e167586f | 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
pbrier | 0:57f3e167586f | 17 | * GNU General Public License for more details. |
pbrier | 0:57f3e167586f | 18 | * |
pbrier | 0:57f3e167586f | 19 | * You should have received a copy of the GNU General Public License |
pbrier | 0:57f3e167586f | 20 | * along with LaOS. If not, see <http://www.gnu.org/licenses/>. |
pbrier | 0:57f3e167586f | 21 | * |
pbrier | 0:57f3e167586f | 22 | */ |
pbrier | 0:57f3e167586f | 23 | #include "ConfigFile.h" |
pbrier | 0:57f3e167586f | 24 | |
pbrier | 2:ba316099c799 | 25 | // Make new config file object |
pbrier | 0:57f3e167586f | 26 | ConfigFile::ConfigFile(char *file) |
pbrier | 0:57f3e167586f | 27 | { |
pbrier | 0:57f3e167586f | 28 | // printf("ConfigFile(%s)\n\r", file); |
pbrier | 0:57f3e167586f | 29 | fp = fopen(file,"rb"); |
pbrier | 0:57f3e167586f | 30 | } |
pbrier | 0:57f3e167586f | 31 | |
pbrier | 2:ba316099c799 | 32 | // Destroy a config file (closes the file handle) |
pbrier | 0:57f3e167586f | 33 | ConfigFile::~ConfigFile() |
pbrier | 0:57f3e167586f | 34 | { |
pbrier | 0:57f3e167586f | 35 | // printf("~ConfigFile()\n\r"); |
pbrier | 0:57f3e167586f | 36 | if ( fp != NULL ) |
pbrier | 0:57f3e167586f | 37 | fclose(fp); |
pbrier | 0:57f3e167586f | 38 | } |
pbrier | 0:57f3e167586f | 39 | |
pbrier | 2:ba316099c799 | 40 | // Read value |
pbrier | 0:57f3e167586f | 41 | bool ConfigFile::Value(char *key, char *value, size_t maxlen, char *def) |
pbrier | 0:57f3e167586f | 42 | { |
pbrier | 0:57f3e167586f | 43 | int m=0,n=0,c,s=0; |
pbrier | 0:57f3e167586f | 44 | if (fp == NULL) |
pbrier | 0:57f3e167586f | 45 | { |
pbrier | 0:57f3e167586f | 46 | strncpy(value, def, maxlen); |
pbrier | 0:57f3e167586f | 47 | return false; |
pbrier | 0:57f3e167586f | 48 | } |
pbrier | 0:57f3e167586f | 49 | // printf("Value()\n\r"); |
pbrier | 0:57f3e167586f | 50 | n = strlen(key); |
pbrier | 0:57f3e167586f | 51 | fseek(fp, 0L, SEEK_SET); |
pbrier | 0:57f3e167586f | 52 | while( s != 99 ) |
pbrier | 0:57f3e167586f | 53 | { |
pbrier | 0:57f3e167586f | 54 | c = fgetc(fp); |
pbrier | 0:57f3e167586f | 55 | if ( c == EOF ) |
pbrier | 0:57f3e167586f | 56 | break; |
pbrier | 0:57f3e167586f | 57 | // printf("%d: '%c'\n\r", s, c); |
pbrier | 0:57f3e167586f | 58 | switch( s )// sate machine |
pbrier | 0:57f3e167586f | 59 | { |
pbrier | 0:57f3e167586f | 60 | case 0: // (re) start: note: no break; fall through to case 1 |
pbrier | 0:57f3e167586f | 61 | m=0; |
pbrier | 0:57f3e167586f | 62 | s=1; |
pbrier | 0:57f3e167586f | 63 | case 1: // read key, skip spaces |
pbrier | 0:57f3e167586f | 64 | if ( c == key[m] ) |
pbrier | 0:57f3e167586f | 65 | m++; |
pbrier | 0:57f3e167586f | 66 | else |
pbrier | 0:57f3e167586f | 67 | s = 0; |
pbrier | 0:57f3e167586f | 68 | if ( c == ';' ) |
pbrier | 0:57f3e167586f | 69 | s = 10; |
pbrier | 0:57f3e167586f | 70 | else if ( c == ' ' || c == '\t' || c == '\n' || c == '\r') |
pbrier | 0:57f3e167586f | 71 | { |
pbrier | 0:57f3e167586f | 72 | if ( n == m ) // key found |
pbrier | 0:57f3e167586f | 73 | { |
pbrier | 0:57f3e167586f | 74 | s = 2; |
pbrier | 0:57f3e167586f | 75 | m = 0; |
pbrier | 0:57f3e167586f | 76 | } |
pbrier | 0:57f3e167586f | 77 | else |
pbrier | 0:57f3e167586f | 78 | s = 0; |
pbrier | 0:57f3e167586f | 79 | } |
pbrier | 0:57f3e167586f | 80 | break; |
pbrier | 0:57f3e167586f | 81 | case 2: // key matched, skip whitepaces upto the first char |
pbrier | 0:57f3e167586f | 82 | if ( c == ';' ) s = 99; |
pbrier | 0:57f3e167586f | 83 | else if ( c != ' ' && c != '\t' ) |
pbrier | 0:57f3e167586f | 84 | { |
pbrier | 0:57f3e167586f | 85 | s = 3; |
pbrier | 0:57f3e167586f | 86 | m = 1; |
pbrier | 0:57f3e167586f | 87 | if ( m < maxlen) |
pbrier | 0:57f3e167586f | 88 | *value++ = c; |
pbrier | 0:57f3e167586f | 89 | } |
pbrier | 0:57f3e167586f | 90 | break; |
pbrier | 0:57f3e167586f | 91 | |
pbrier | 0:57f3e167586f | 92 | case 3: // copy value content, upto eol or comment |
pbrier | 0:57f3e167586f | 93 | if ( m == maxlen || c == '\n' || c == '\r' || c == ';' ) |
pbrier | 0:57f3e167586f | 94 | s = 99; |
pbrier | 0:57f3e167586f | 95 | else |
pbrier | 0:57f3e167586f | 96 | { |
pbrier | 0:57f3e167586f | 97 | m++; |
pbrier | 0:57f3e167586f | 98 | *value++ = c; |
pbrier | 0:57f3e167586f | 99 | } |
pbrier | 0:57f3e167586f | 100 | break; |
pbrier | 0:57f3e167586f | 101 | case 10: // skip comments, upto eol or eof |
pbrier | 0:57f3e167586f | 102 | if ( c == '\n' || c == '\r' ) s = 0; |
pbrier | 0:57f3e167586f | 103 | break; |
pbrier | 0:57f3e167586f | 104 | } |
pbrier | 0:57f3e167586f | 105 | } |
jaerts | 7:0a8c1d05611b | 106 | if ( s == 99 && m >= 1) // key found, and value assigned |
pbrier | 0:57f3e167586f | 107 | { |
pbrier | 0:57f3e167586f | 108 | *value = 0; // terminate string |
pbrier | 0:57f3e167586f | 109 | return true; |
pbrier | 0:57f3e167586f | 110 | } |
pbrier | 0:57f3e167586f | 111 | else |
pbrier | 0:57f3e167586f | 112 | { |
pbrier | 0:57f3e167586f | 113 | strncpy(value, def, maxlen); |
pbrier | 0:57f3e167586f | 114 | return false; |
pbrier | 0:57f3e167586f | 115 | } |
pbrier | 0:57f3e167586f | 116 | } |
pbrier | 0:57f3e167586f | 117 | |
pbrier | 2:ba316099c799 | 118 | // Read int value |
pbrier | 0:57f3e167586f | 119 | bool ConfigFile::Value(char *key, int *value, int def) |
pbrier | 0:57f3e167586f | 120 | { |
pbrier | 0:57f3e167586f | 121 | char val[16]; |
pbrier | 2:ba316099c799 | 122 | bool b = Value(key, val, 12, ""); |
pbrier | 0:57f3e167586f | 123 | if ( b ) |
pbrier | 0:57f3e167586f | 124 | *value = atoi(val); |
pbrier | 0:57f3e167586f | 125 | else |
pbrier | 0:57f3e167586f | 126 | { |
pbrier | 0:57f3e167586f | 127 | *value = def; |
pbrier | 0:57f3e167586f | 128 | } |
pbrier | 0:57f3e167586f | 129 | return b; |
pbrier | 0:57f3e167586f | 130 | } |
jaerts | 6:78404e968c3e | 131 | |
jaerts | 6:78404e968c3e | 132 | // Read float value |
jaerts | 6:78404e968c3e | 133 | bool ConfigFile::Value(char *key, float *value, float def) |
jaerts | 6:78404e968c3e | 134 | { |
jaerts | 6:78404e968c3e | 135 | char val[16]; |
jaerts | 6:78404e968c3e | 136 | bool b = Value(key, val, 12, ""); |
jaerts | 6:78404e968c3e | 137 | if ( b ) |
jaerts | 6:78404e968c3e | 138 | *value = atof(val); |
jaerts | 6:78404e968c3e | 139 | else |
jaerts | 6:78404e968c3e | 140 | { |
jaerts | 6:78404e968c3e | 141 | *value = def; |
jaerts | 6:78404e968c3e | 142 | } |
jaerts | 6:78404e968c3e | 143 | return b; |
jaerts | 6:78404e968c3e | 144 | } |