Claes Ekengren / Mbed 2 deprecated Measurement_system

Dependencies:   mbed

Committer:
CE
Date:
Thu Jan 06 19:01:44 2011 +0000
Revision:
0:0732b16d9a92
R1A

Who changed what in which revision?

UserRevisionLine numberNew contents of line
CE 0:0732b16d9a92 1 ///////////////////////////////////////////////////////////////////////////////
CE 0:0732b16d9a92 2 // IniFile: .ini file parser by rinos 2010
CE 0:0732b16d9a92 3 ///////////////////////////////////////////////////////////////////////////////
CE 0:0732b16d9a92 4
CE 0:0732b16d9a92 5 #include "IniFile.h"
CE 0:0732b16d9a92 6 #include <string.h>
CE 0:0732b16d9a92 7 #include <stdlib.h>
CE 0:0732b16d9a92 8
CE 0:0732b16d9a92 9 ////////////////////////////////////////////////////////////////////////////////
CE 0:0732b16d9a92 10 // defines
CE 0:0732b16d9a92 11 const char INI_DELIM[] = " \t\r\n";
CE 0:0732b16d9a92 12 const int INI_LINE_BUF= 256;
CE 0:0732b16d9a92 13
CE 0:0732b16d9a92 14 ////////////////////////////////////////////////////////////////////////////////
CE 0:0732b16d9a92 15 // IniFile
CE 0:0732b16d9a92 16 IniFile::IniFile(const char* file): m_fp(0) {
CE 0:0732b16d9a92 17 if(file) open(file);
CE 0:0732b16d9a92 18 }
CE 0:0732b16d9a92 19 IniFile::~IniFile(){
CE 0:0732b16d9a92 20 close();
CE 0:0732b16d9a92 21 }
CE 0:0732b16d9a92 22
CE 0:0732b16d9a92 23 ////////////////////////////////////////////////////////////////////////////////
CE 0:0732b16d9a92 24 // internal funcs
CE 0:0732b16d9a92 25 IniFile::Status IniFile::strtrim(char* dst, const char* src, int dst_size){
CE 0:0732b16d9a92 26 if(!dst_size) return S_BUFFER_TOO_SHORT; // myStrcpy needs more than 1 byte for '\0'.
CE 0:0732b16d9a92 27
CE 0:0732b16d9a92 28 // Find valid string area
CE 0:0732b16d9a92 29 const char* p1 = strchr (src, '"');
CE 0:0732b16d9a92 30 const char* p2 = p1? strrchr(++p1, '"') : 0;
CE 0:0732b16d9a92 31 if(!p2){
CE 0:0732b16d9a92 32 // trim space or tab
CE 0:0732b16d9a92 33 for(p1 = src ; *p1 && strchr(INI_DELIM, *p1) ; p1++);
CE 0:0732b16d9a92 34 if(!*p1){ // all char is space or tab
CE 0:0732b16d9a92 35 *dst = 0;
CE 0:0732b16d9a92 36 return S_SUCCESS;
CE 0:0732b16d9a92 37 }
CE 0:0732b16d9a92 38 for(p2 = p1 + strlen(p1) ; strchr(INI_DELIM, p2[-1]) ; --p2);
CE 0:0732b16d9a92 39 }
CE 0:0732b16d9a92 40
CE 0:0732b16d9a92 41 // Check copy size
CE 0:0732b16d9a92 42 Status ret;
CE 0:0732b16d9a92 43 if(dst_size > p2 - p1){
CE 0:0732b16d9a92 44 dst_size = p2 - p1;
CE 0:0732b16d9a92 45 ret = S_SUCCESS;
CE 0:0732b16d9a92 46 } else {
CE 0:0732b16d9a92 47 dst_size--;
CE 0:0732b16d9a92 48 ret = S_BUFFER_TOO_SHORT;
CE 0:0732b16d9a92 49 }
CE 0:0732b16d9a92 50
CE 0:0732b16d9a92 51 // copy buffer
CE 0:0732b16d9a92 52 if(dst != p1) memmove(dst, p1, dst_size);
CE 0:0732b16d9a92 53 dst[dst_size] = 0;
CE 0:0732b16d9a92 54 return ret;
CE 0:0732b16d9a92 55 }
CE 0:0732b16d9a92 56
CE 0:0732b16d9a92 57 ////////////////////////////////////////////////////////////////////////////////
CE 0:0732b16d9a92 58 // Access methods
CE 0:0732b16d9a92 59 IniFile::Status IniFile::open(const char* file){
CE 0:0732b16d9a92 60 close();
CE 0:0732b16d9a92 61 m_fp = fopen(file, "r");
CE 0:0732b16d9a92 62 if(m_fp) return S_SUCCESS;
CE 0:0732b16d9a92 63
CE 0:0732b16d9a92 64 //printf("IniFile: Can't open %s\n", file);
CE 0:0732b16d9a92 65 return S_OPEN_ERROR;
CE 0:0732b16d9a92 66 }
CE 0:0732b16d9a92 67
CE 0:0732b16d9a92 68 IniFile::Status IniFile::close(){
CE 0:0732b16d9a92 69 if(!m_fp) return S_NOT_OPENED;
CE 0:0732b16d9a92 70
CE 0:0732b16d9a92 71 fclose(m_fp);
CE 0:0732b16d9a92 72 m_fp = 0;
CE 0:0732b16d9a92 73 return S_SUCCESS;
CE 0:0732b16d9a92 74 }
CE 0:0732b16d9a92 75
CE 0:0732b16d9a92 76 IniFile::Status IniFile::get(const char* key, char* ret, int ret_size){
CE 0:0732b16d9a92 77 if(!m_fp){
CE 0:0732b16d9a92 78 printf("IniFile::get %s S_OPEN_ERROR\n", key);
CE 0:0732b16d9a92 79 return S_OPEN_ERROR;
CE 0:0732b16d9a92 80 }
CE 0:0732b16d9a92 81
CE 0:0732b16d9a92 82 rewind(m_fp);
CE 0:0732b16d9a92 83 char line[INI_LINE_BUF];
CE 0:0732b16d9a92 84 while(fgets(line, sizeof(line), m_fp)){
CE 0:0732b16d9a92 85 if(*line == '#') continue; // comment line
CE 0:0732b16d9a92 86
CE 0:0732b16d9a92 87 char* p = strchr(line, '=');
CE 0:0732b16d9a92 88 if(!p || line == p) continue; // invalid line
CE 0:0732b16d9a92 89
CE 0:0732b16d9a92 90 *p++ = 0;
CE 0:0732b16d9a92 91 strtrim(line, line, p - line);
CE 0:0732b16d9a92 92 if(strcmp(line, key)) continue; // different key // stricmp?
CE 0:0732b16d9a92 93
CE 0:0732b16d9a92 94 // check data type
CE 0:0732b16d9a92 95 switch(ret_size){
CE 0:0732b16d9a92 96 case DTYPE_INT:
CE 0:0732b16d9a92 97 strtrim(line, p, INI_LINE_BUF);
CE 0:0732b16d9a92 98 *(int*)ret = strtoul(line, &p, 0);
CE 0:0732b16d9a92 99 //return p[0]? S_FORMAT_ERROR : S_SUCCESS; // check end
CE 0:0732b16d9a92 100 printf("IniFile::get %s INT %d\n", key, *(int*)ret);
CE 0:0732b16d9a92 101 return S_SUCCESS; // always success
CE 0:0732b16d9a92 102
CE 0:0732b16d9a92 103 case DTYPE_BOOL:
CE 0:0732b16d9a92 104 strtrim(line, p, INI_LINE_BUF);
CE 0:0732b16d9a92 105 switch(line[0]){
CE 0:0732b16d9a92 106 case 'T':
CE 0:0732b16d9a92 107 case 't': *(bool*)ret = true; break;
CE 0:0732b16d9a92 108 case 'F':
CE 0:0732b16d9a92 109 case 'f': *(bool*)ret = false; break;
CE 0:0732b16d9a92 110 default: *(bool*)ret = strtoul(line, &p, 0)? true : false;
CE 0:0732b16d9a92 111 }
CE 0:0732b16d9a92 112 printf("IniFile::get %s BOOL %d\n", key, *(bool*)ret);
CE 0:0732b16d9a92 113 return S_SUCCESS;
CE 0:0732b16d9a92 114
CE 0:0732b16d9a92 115 default: // string
CE 0:0732b16d9a92 116 {
CE 0:0732b16d9a92 117 Status sts = strtrim(ret, p, ret_size);
CE 0:0732b16d9a92 118 printf("IniFile::get %s = '%s'\n", key, ret_size? ret : "E");
CE 0:0732b16d9a92 119 return sts;
CE 0:0732b16d9a92 120 }
CE 0:0732b16d9a92 121 }
CE 0:0732b16d9a92 122 }
CE 0:0732b16d9a92 123 printf("IniFile::get S_NO_KEY'%s'\n", key);
CE 0:0732b16d9a92 124 return S_NO_KEY; // No key
CE 0:0732b16d9a92 125 }
CE 0:0732b16d9a92 126 IniFile::Status IniFile::get(const char* key, int& ret){
CE 0:0732b16d9a92 127 return get(key, (char*)&ret, DTYPE_INT);
CE 0:0732b16d9a92 128 }
CE 0:0732b16d9a92 129 IniFile::Status IniFile::get(const char* key, bool& ret){
CE 0:0732b16d9a92 130 return get(key, (char*)&ret, DTYPE_BOOL);
CE 0:0732b16d9a92 131 }
CE 0:0732b16d9a92 132
CE 0:0732b16d9a92 133 IniFile::Status IniFile::get(const IniFile::IniList* inilist){
CE 0:0732b16d9a92 134 Status ret = S_SUCCESS;
CE 0:0732b16d9a92 135 for(; inilist->key ; ++inilist){
CE 0:0732b16d9a92 136 Status sts = get(inilist->key, (char*)inilist->buf, inilist->typelen);
CE 0:0732b16d9a92 137 switch(sts){
CE 0:0732b16d9a92 138 case S_SUCCESS:
CE 0:0732b16d9a92 139 break;
CE 0:0732b16d9a92 140 case S_NO_KEY:
CE 0:0732b16d9a92 141 ret = sts; // continue
CE 0:0732b16d9a92 142 break;
CE 0:0732b16d9a92 143 default:
CE 0:0732b16d9a92 144 return sts; // fatal error
CE 0:0732b16d9a92 145 }
CE 0:0732b16d9a92 146 }
CE 0:0732b16d9a92 147 return ret;
CE 0:0732b16d9a92 148 }