Configuration file library
ConfigFile.cpp@0:57f3e167586f, 2011-01-27 (annotated)
- 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?
User | Revision | Line number | New 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 | } |