Configuration file library

Committer:
pbrier
Date:
Thu Jan 27 21:46:18 2011 +0000
Revision:
5:8c8cf4615b32
Parent:
3:31c936f3b9df
1.21

Who changed what in which revision?

UserRevisionLine numberNew 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 }
pbrier 0:57f3e167586f 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 }