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 00026 inline ui INIFile::Header(const c * & currentcharref, c * & header, ui & headercap) 00027 { 00028 //ptr to the current character 00029 const c * currentchar = currentcharref; 00030 //current character 00031 register c ch; 00032 //size of header in characters 00033 ui headersize = 0; 00034 //searching for [ 00035 for(; ; ++currentchar) 00036 { 00037 ch = *currentchar; 00038 switch(ch) 00039 { 00040 case ' ': 00041 case '\t': 00042 { 00043 //ignore spaces 00044 break; 00045 } 00046 //CR, LF 00047 case 10: 00048 case 13: 00049 { 00050 currentcharref = NextLine(currentchar); 00051 return 0; 00052 break; 00053 } 00054 //header start found, we can start reading header 00055 case '[': 00056 { 00057 //move to next char 00058 ++currentchar; 00059 goto HEADER_START; 00060 } 00061 case '\0': 00062 { 00063 currentcharref = currentchar; 00064 return 0; 00065 break; 00066 } 00067 default: 00068 { 00069 //comment char 00070 if(ch == comment) 00071 { 00072 currentcharref = NextLine(currentchar); 00073 return 0; 00074 } 00075 break; 00076 } 00077 } 00078 } 00079 HEADER_START:; 00080 //searching for ] and reading header characters 00081 for(; ; ++currentchar) 00082 { 00083 ch = *currentchar; 00084 switch(ch) 00085 { 00086 case ' ': 00087 case '\t': 00088 { 00089 //ignore spaces 00090 break; 00091 } 00092 //CR, LF 00093 case 10: 00094 case 13: 00095 { 00096 currentcharref = NextLine(currentchar); 00097 return 0; 00098 break; 00099 } 00100 //header end found, we're finished reading 00101 case ']': 00102 { 00103 header[headersize] = 0; 00104 currentcharref = NextLine(currentchar); 00105 return headersize; 00106 break; 00107 } 00108 case '\0': 00109 { 00110 currentcharref = currentchar; 00111 return 0; 00112 break; 00113 } 00114 default: 00115 { 00116 if(ch == comment) 00117 { 00118 currentcharref = NextLine(currentchar); 00119 return 0; 00120 } 00121 //reallocate header buffer if not enough space to add new char 00122 //need 1 more char for trailing 0 00123 if(headercap < headersize + 2) 00124 { 00125 MINIINI_REALLOCATE(header, headercap, headersize, c); 00126 } 00127 //add new char to header 00128 header[headersize] = ch; 00129 ++headersize; 00130 break; 00131 } 00132 } 00133 } 00134 } 00135 #endif