Simple config file class with added support for floats

Fork of ConfigFile by peter brier

Committer:
pbrier
Date:
Thu Jan 27 21:08:51 2011 +0000
Revision:
0:57f3e167586f
Child:
1:a802df951169
1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pbrier 0:57f3e167586f 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 0:57f3e167586f 25 /// Make new config file object
pbrier 0:57f3e167586f 26 /** Open config file.
pbrier 0:57f3e167586f 27 * Note: the file handle is kept open during the lifetime of this object.
pbrier 0:57f3e167586f 28 * To close the file: destroy this ConfigFile object!
pbrier 0:57f3e167586f 29 * @param file Filename of the configuration file.
pbrier 0:57f3e167586f 30 */
pbrier 0:57f3e167586f 31 ConfigFile::ConfigFile(char *file)
pbrier 0:57f3e167586f 32 {
pbrier 0:57f3e167586f 33 // printf("ConfigFile(%s)\n\r", file);
pbrier 0:57f3e167586f 34 fp = fopen(file,"rb");
pbrier 0:57f3e167586f 35 }
pbrier 0:57f3e167586f 36
pbrier 0:57f3e167586f 37 /**
pbrier 0:57f3e167586f 38 * Destroy a config file (closes the file handle)
pbrier 0:57f3e167586f 39 */
pbrier 0:57f3e167586f 40 ConfigFile::~ConfigFile()
pbrier 0:57f3e167586f 41 {
pbrier 0:57f3e167586f 42 // printf("~ConfigFile()\n\r");
pbrier 0:57f3e167586f 43 if ( fp != NULL )
pbrier 0:57f3e167586f 44 fclose(fp);
pbrier 0:57f3e167586f 45 }
pbrier 0:57f3e167586f 46
pbrier 0:57f3e167586f 47 /** Read value. If file is not open, or key does not exist: copy default value (return false)
pbrier 0:57f3e167586f 48 * @param key name of the key in the file
pbrier 0:57f3e167586f 49 * @param value pointer to buffer that receives the value
pbrier 0:57f3e167586f 50 * @param maxlen the maximum length of the value. If the actual value is longer, it is truncated
pbrier 0:57f3e167586f 51 * @param def Default value. If the key is not found in the file, this value is copied.
pbrier 0:57f3e167586f 52 * @return "true" if the key is found "false" is key is not found (default value is returned)
pbrier 0:57f3e167586f 53 */
pbrier 0:57f3e167586f 54 bool ConfigFile::Value(char *key, char *value, size_t maxlen, char *def)
pbrier 0:57f3e167586f 55 {
pbrier 0:57f3e167586f 56 int m=0,n=0,c,s=0;
pbrier 0:57f3e167586f 57 if (fp == NULL)
pbrier 0:57f3e167586f 58 {
pbrier 0:57f3e167586f 59 strncpy(value, def, maxlen);
pbrier 0:57f3e167586f 60 return false;
pbrier 0:57f3e167586f 61 }
pbrier 0:57f3e167586f 62 // printf("Value()\n\r");
pbrier 0:57f3e167586f 63 n = strlen(key);
pbrier 0:57f3e167586f 64 fseek(fp, 0L, SEEK_SET);
pbrier 0:57f3e167586f 65 while( s != 99 )
pbrier 0:57f3e167586f 66 {
pbrier 0:57f3e167586f 67 c = fgetc(fp);
pbrier 0:57f3e167586f 68 if ( c == EOF )
pbrier 0:57f3e167586f 69 break;
pbrier 0:57f3e167586f 70 // printf("%d: '%c'\n\r", s, c);
pbrier 0:57f3e167586f 71 switch( s )// sate machine
pbrier 0:57f3e167586f 72 {
pbrier 0:57f3e167586f 73 case 0: // (re) start: note: no break; fall through to case 1
pbrier 0:57f3e167586f 74 m=0;
pbrier 0:57f3e167586f 75 s=1;
pbrier 0:57f3e167586f 76 case 1: // read key, skip spaces
pbrier 0:57f3e167586f 77 if ( c == key[m] )
pbrier 0:57f3e167586f 78 m++;
pbrier 0:57f3e167586f 79 else
pbrier 0:57f3e167586f 80 s = 0;
pbrier 0:57f3e167586f 81 if ( c == ';' )
pbrier 0:57f3e167586f 82 s = 10;
pbrier 0:57f3e167586f 83 else if ( c == ' ' || c == '\t' || c == '\n' || c == '\r')
pbrier 0:57f3e167586f 84 {
pbrier 0:57f3e167586f 85 if ( n == m ) // key found
pbrier 0:57f3e167586f 86 {
pbrier 0:57f3e167586f 87 s = 2;
pbrier 0:57f3e167586f 88 m = 0;
pbrier 0:57f3e167586f 89 }
pbrier 0:57f3e167586f 90 else
pbrier 0:57f3e167586f 91 s = 0;
pbrier 0:57f3e167586f 92 }
pbrier 0:57f3e167586f 93 break;
pbrier 0:57f3e167586f 94 case 2: // key matched, skip whitepaces upto the first char
pbrier 0:57f3e167586f 95 if ( c == ';' ) s = 99;
pbrier 0:57f3e167586f 96 else if ( c != ' ' && c != '\t' )
pbrier 0:57f3e167586f 97 {
pbrier 0:57f3e167586f 98 s = 3;
pbrier 0:57f3e167586f 99 m = 1;
pbrier 0:57f3e167586f 100 if ( m < maxlen)
pbrier 0:57f3e167586f 101 *value++ = c;
pbrier 0:57f3e167586f 102 }
pbrier 0:57f3e167586f 103 break;
pbrier 0:57f3e167586f 104
pbrier 0:57f3e167586f 105 case 3: // copy value content, upto eol or comment
pbrier 0:57f3e167586f 106 if ( m == maxlen || c == '\n' || c == '\r' || c == ';' )
pbrier 0:57f3e167586f 107 s = 99;
pbrier 0:57f3e167586f 108 else
pbrier 0:57f3e167586f 109 {
pbrier 0:57f3e167586f 110 m++;
pbrier 0:57f3e167586f 111 *value++ = c;
pbrier 0:57f3e167586f 112 }
pbrier 0:57f3e167586f 113 break;
pbrier 0:57f3e167586f 114 case 10: // skip comments, upto eol or eof
pbrier 0:57f3e167586f 115 if ( c == '\n' || c == '\r' ) s = 0;
pbrier 0:57f3e167586f 116 break;
pbrier 0:57f3e167586f 117 }
pbrier 0:57f3e167586f 118 }
pbrier 0:57f3e167586f 119 if ( s == 99 && m > 1) // key found, and value assigned
pbrier 0:57f3e167586f 120 {
pbrier 0:57f3e167586f 121 *value = 0; // terminate string
pbrier 0:57f3e167586f 122 return true;
pbrier 0:57f3e167586f 123 }
pbrier 0:57f3e167586f 124 else
pbrier 0:57f3e167586f 125 {
pbrier 0:57f3e167586f 126 strncpy(value, def, maxlen);
pbrier 0:57f3e167586f 127 return false;
pbrier 0:57f3e167586f 128 }
pbrier 0:57f3e167586f 129 }
pbrier 0:57f3e167586f 130
pbrier 0:57f3e167586f 131
pbrier 0:57f3e167586f 132 /** Read Integer value. If file is not open, or key does not exist: copy default value (return false)
pbrier 0:57f3e167586f 133 * @param key name of the key in the file
pbrier 0:57f3e167586f 134 * @param value pointer to integer that receives the value
pbrier 0:57f3e167586f 135 * @param def Default value. If the key is not found in the file, this value is copied.
pbrier 0:57f3e167586f 136 * @return "true" if the key is found "false" is key is not found (default value is returned)
pbrier 0:57f3e167586f 137 */
pbrier 0:57f3e167586f 138 // Return int value
pbrier 0:57f3e167586f 139 bool ConfigFile::Value(char *key, int *value, int def)
pbrier 0:57f3e167586f 140 {
pbrier 0:57f3e167586f 141 char val[16];
pbrier 0:57f3e167586f 142 bool b = Value(key, val, 15, "");
pbrier 0:57f3e167586f 143 if ( b )
pbrier 0:57f3e167586f 144 *value = atoi(val);
pbrier 0:57f3e167586f 145 else
pbrier 0:57f3e167586f 146 {
pbrier 0:57f3e167586f 147 *value = def;
pbrier 0:57f3e167586f 148 }
pbrier 0:57f3e167586f 149 return b;
pbrier 0:57f3e167586f 150 }