Made on Kubuntu
00001 // Copyright (C) 2009-2010 Ferdinand Majerech 00002 // This file is part of MiniINI 00003 // For conditions of distribution and use, see copyright notice in LICENSE.txt 00004 00005 #ifndef INISECTIONUTIL_H_INCLUDED 00006 #define INISECTIONUTIL_H_INCLUDED 00007 00008 #include <cstdio> 00009 #include <cstring> 00010 00011 #include "typedefs.h" 00012 #include "inisection.h" 00013 #include "inifile.h" 00014 #include "util.h" 00015 00016 using namespace miniini_private; 00017 00019 00027 inline ui INIFile::Header(const c * & currentcharref, c * & header, ui & headercap) 00028 { 00029 //ptr to the current character 00030 const c * currentchar = currentcharref; 00031 //current character 00032 register c ch; 00033 //size of header in characters 00034 ui headersize = 0; 00035 //searching for [ 00036 for(; ; ++currentchar) 00037 { 00038 ch = *currentchar; 00039 switch(ch) 00040 { 00041 case ' ': 00042 case '\t': 00043 { 00044 //ignore spaces 00045 break; 00046 } 00047 //CR, LF 00048 case 10: 00049 case 13: 00050 { 00051 currentcharref = NextLine(currentchar); 00052 return 0; 00053 break; 00054 } 00055 //header start found, we can start reading header 00056 case '[': 00057 { 00058 //move to next char 00059 ++currentchar; 00060 goto HEADER_START; 00061 } 00062 case '\0': 00063 { 00064 currentcharref = currentchar; 00065 return 0; 00066 break; 00067 } 00068 default: 00069 { 00070 //comment char 00071 if(ch == comment) 00072 { 00073 currentcharref = NextLine(currentchar); 00074 return 0; 00075 } 00076 break; 00077 } 00078 } 00079 } 00080 HEADER_START:; 00081 //searching for ] and reading header characters 00082 for(; ; ++currentchar) 00083 { 00084 ch = *currentchar; 00085 switch(ch) 00086 { 00087 case ' ': 00088 case '\t': 00089 { 00090 //ignore spaces 00091 break; 00092 } 00093 //CR, LF 00094 case 10: 00095 case 13: 00096 { 00097 currentcharref = NextLine(currentchar); 00098 return 0; 00099 break; 00100 } 00101 //header end found, we're finished reading 00102 case ']': 00103 { 00104 header[headersize] = 0; 00105 currentcharref = NextLine(currentchar); 00106 return headersize; 00107 break; 00108 } 00109 case '\0': 00110 { 00111 currentcharref = currentchar; 00112 return 0; 00113 break; 00114 } 00115 default: 00116 { 00117 if(ch == comment) 00118 { 00119 currentcharref = NextLine(currentchar); 00120 return 0; 00121 } 00122 //reallocate header buffer if not enough space to add new char 00123 //need 1 more char for trailing 0 00124 if(headercap < headersize + 2) 00125 { 00126 MINIINI_REALLOCATE(header, headercap, headersize, c); 00127 } 00128 //add new char to header 00129 header[headersize] = ch; 00130 ++headersize; 00131 break; 00132 } 00133 } 00134 } 00135 } 00136 #endif