Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 | } |
