Configuration file library

Committer:
pbrier
Date:
Thu Jan 27 21:23:19 2011 +0000
Revision:
1:a802df951169
Parent:
0:57f3e167586f
Child:
2:ba316099c799
version 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 1:a802df951169 47
pbrier 0:57f3e167586f 48 bool ConfigFile::Value(char *key, char *value, size_t maxlen, char *def)
pbrier 0:57f3e167586f 49 {
pbrier 0:57f3e167586f 50 int m=0,n=0,c,s=0;
pbrier 0:57f3e167586f 51 if (fp == NULL)
pbrier 0:57f3e167586f 52 {
pbrier 0:57f3e167586f 53 strncpy(value, def, maxlen);
pbrier 0:57f3e167586f 54 return false;
pbrier 0:57f3e167586f 55 }
pbrier 0:57f3e167586f 56 // printf("Value()\n\r");
pbrier 0:57f3e167586f 57 n = strlen(key);
pbrier 0:57f3e167586f 58 fseek(fp, 0L, SEEK_SET);
pbrier 0:57f3e167586f 59 while( s != 99 )
pbrier 0:57f3e167586f 60 {
pbrier 0:57f3e167586f 61 c = fgetc(fp);
pbrier 0:57f3e167586f 62 if ( c == EOF )
pbrier 0:57f3e167586f 63 break;
pbrier 0:57f3e167586f 64 // printf("%d: '%c'\n\r", s, c);
pbrier 0:57f3e167586f 65 switch( s )// sate machine
pbrier 0:57f3e167586f 66 {
pbrier 0:57f3e167586f 67 case 0: // (re) start: note: no break; fall through to case 1
pbrier 0:57f3e167586f 68 m=0;
pbrier 0:57f3e167586f 69 s=1;
pbrier 0:57f3e167586f 70 case 1: // read key, skip spaces
pbrier 0:57f3e167586f 71 if ( c == key[m] )
pbrier 0:57f3e167586f 72 m++;
pbrier 0:57f3e167586f 73 else
pbrier 0:57f3e167586f 74 s = 0;
pbrier 0:57f3e167586f 75 if ( c == ';' )
pbrier 0:57f3e167586f 76 s = 10;
pbrier 0:57f3e167586f 77 else if ( c == ' ' || c == '\t' || c == '\n' || c == '\r')
pbrier 0:57f3e167586f 78 {
pbrier 0:57f3e167586f 79 if ( n == m ) // key found
pbrier 0:57f3e167586f 80 {
pbrier 0:57f3e167586f 81 s = 2;
pbrier 0:57f3e167586f 82 m = 0;
pbrier 0:57f3e167586f 83 }
pbrier 0:57f3e167586f 84 else
pbrier 0:57f3e167586f 85 s = 0;
pbrier 0:57f3e167586f 86 }
pbrier 0:57f3e167586f 87 break;
pbrier 0:57f3e167586f 88 case 2: // key matched, skip whitepaces upto the first char
pbrier 0:57f3e167586f 89 if ( c == ';' ) s = 99;
pbrier 0:57f3e167586f 90 else if ( c != ' ' && c != '\t' )
pbrier 0:57f3e167586f 91 {
pbrier 0:57f3e167586f 92 s = 3;
pbrier 0:57f3e167586f 93 m = 1;
pbrier 0:57f3e167586f 94 if ( m < maxlen)
pbrier 0:57f3e167586f 95 *value++ = c;
pbrier 0:57f3e167586f 96 }
pbrier 0:57f3e167586f 97 break;
pbrier 0:57f3e167586f 98
pbrier 0:57f3e167586f 99 case 3: // copy value content, upto eol or comment
pbrier 0:57f3e167586f 100 if ( m == maxlen || c == '\n' || c == '\r' || c == ';' )
pbrier 0:57f3e167586f 101 s = 99;
pbrier 0:57f3e167586f 102 else
pbrier 0:57f3e167586f 103 {
pbrier 0:57f3e167586f 104 m++;
pbrier 0:57f3e167586f 105 *value++ = c;
pbrier 0:57f3e167586f 106 }
pbrier 0:57f3e167586f 107 break;
pbrier 0:57f3e167586f 108 case 10: // skip comments, upto eol or eof
pbrier 0:57f3e167586f 109 if ( c == '\n' || c == '\r' ) s = 0;
pbrier 0:57f3e167586f 110 break;
pbrier 0:57f3e167586f 111 }
pbrier 0:57f3e167586f 112 }
pbrier 0:57f3e167586f 113 if ( s == 99 && m > 1) // key found, and value assigned
pbrier 0:57f3e167586f 114 {
pbrier 0:57f3e167586f 115 *value = 0; // terminate string
pbrier 0:57f3e167586f 116 return true;
pbrier 0:57f3e167586f 117 }
pbrier 0:57f3e167586f 118 else
pbrier 0:57f3e167586f 119 {
pbrier 0:57f3e167586f 120 strncpy(value, def, maxlen);
pbrier 0:57f3e167586f 121 return false;
pbrier 0:57f3e167586f 122 }
pbrier 0:57f3e167586f 123 }
pbrier 0:57f3e167586f 124
pbrier 0:57f3e167586f 125
pbrier 0:57f3e167586f 126 /** Read Integer value. If file is not open, or key does not exist: copy default value (return false)
pbrier 0:57f3e167586f 127 * @param key name of the key in the file
pbrier 0:57f3e167586f 128 * @param value pointer to integer that receives the value
pbrier 0:57f3e167586f 129 * @param def Default value. If the key is not found in the file, this value is copied.
pbrier 0:57f3e167586f 130 * @return "true" if the key is found "false" is key is not found (default value is returned)
pbrier 0:57f3e167586f 131 */
pbrier 0:57f3e167586f 132 bool ConfigFile::Value(char *key, int *value, int def)
pbrier 0:57f3e167586f 133 {
pbrier 0:57f3e167586f 134 char val[16];
pbrier 0:57f3e167586f 135 bool b = Value(key, val, 15, "");
pbrier 0:57f3e167586f 136 if ( b )
pbrier 0:57f3e167586f 137 *value = atoi(val);
pbrier 0:57f3e167586f 138 else
pbrier 0:57f3e167586f 139 {
pbrier 0:57f3e167586f 140 *value = def;
pbrier 0:57f3e167586f 141 }
pbrier 0:57f3e167586f 142 return b;
pbrier 0:57f3e167586f 143 }