1/**********************************************************************************
2 * iniElement
3 *
4 * Use when;
5 * 1. strtok is scary (also does not handle empty elements well)
6 * 2. strstr is not portable
7 * 3. performance is less important than simplicity and the above (feel free to improve on this)
8 *
9 **************************************************
10 * This code was created by Peter Harvey @ CodeByDesign.
11 * Released under LGPL 28.JAN.99
12 *
13 * Contributions from...
14 * -----------------------------------------------
15 * Peter Harvey - pharvey@codebydesign.com
16 **************************************************/
17
18#include <config.h>
19#include "ini.h"
20
21int iniElement( char *pszData, char cSeperator, char cTerminator, int nElement, char *pszElement, int nMaxElement )
22{
23 int nCurElement = 0;
24 int nChar = 0;
25 int nCharInElement = 0;
26
27 memset( pszElement, '\0', nMaxElement );
28 for ( ; nCurElement <= nElement && (nCharInElement+1) < nMaxElement; nChar++ )
29 {
30 /* check for end of data */
31 if ( cSeperator != cTerminator && pszData[nChar] == cTerminator )
32 {
33 break;
34 }
35
36 if ( cSeperator == cTerminator && pszData[nChar] == cSeperator && pszData[nChar+1] == cTerminator )
37 {
38 break;
39 }
40
41 /* check for end of element */
42 if ( pszData[nChar] == cSeperator )
43 {
44 nCurElement++;
45 }
46 else if ( nCurElement == nElement )
47 {
48 pszElement[nCharInElement] = pszData[nChar];
49 nCharInElement++;
50 }
51 }
52
53 if ( pszElement[0] == '\0' )
54 {
55 return INI_NO_DATA;
56 }
57
58 return INI_SUCCESS;
59}
60
61/* Like iniElement(), but rather than a terminator, the input buffer length is given */
62
63int iniElementMax( char *pData, char cSeperator, int nDataLen, int nElement, char *pszElement, int nMaxElement )
64{
65 int nCurElement = 0;
66 int nChar = 0;
67 int nCharInElement = 0;
68
69 memset( pszElement, '\0', nMaxElement );
70 for ( ; nCurElement <= nElement && (nCharInElement+1) < nMaxElement && nChar < nDataLen ; nChar++ )
71 {
72 /* check for end of element */
73 if ( pData[nChar] == cSeperator )
74 {
75 nCurElement++;
76 }
77 else if ( nCurElement == nElement )
78 {
79 pszElement[nCharInElement] = pData[nChar];
80 nCharInElement++;
81 }
82 }
83
84 if ( pszElement[0] == '\0' )
85 {
86 return INI_NO_DATA;
87 }
88
89 return INI_SUCCESS;
90}
91
92
93int iniElementEOL( char *pszData, char cSeperator, char cTerminator, int nElement, char *pszElement, int nMaxElement )
94{
95 int nCurElement = 0;
96 int nChar = 0;
97 int nCharInElement = 0;
98
99 memset( pszElement, '\0', nMaxElement );
100 for ( ;(nCharInElement+1) < nMaxElement; nChar++ )
101 {
102 /* check for end of data */
103 if ( cSeperator != cTerminator && pszData[nChar] == cTerminator )
104 {
105 break;
106 }
107
108 if ( cSeperator == cTerminator && pszData[nChar] == cSeperator && pszData[nChar+1] == cTerminator )
109 {
110 break;
111 }
112
113 /* check for end of element */
114 if ( pszData[nChar] == cSeperator && nCurElement < nElement )
115 {
116 nCurElement++;
117 }
118 else if ( nCurElement >= nElement )
119 {
120 pszElement[nCharInElement] = pszData[nChar];
121 nCharInElement++;
122 }
123 }
124
125 if ( pszElement[0] == '\0' )
126 {
127 return INI_NO_DATA;
128 }
129
130 return INI_SUCCESS;
131}
132
133int iniElementToEnd( char *pszData, char cSeperator, char cTerminator, int nElement, char *pszElement, int nMaxElement )
134{
135 int nCurElement = 0;
136 int nChar = 0;
137 int nCharInElement = 0;
138
139 memset( pszElement, '\0', nMaxElement );
140 for ( ; nCurElement <= nElement && (nCharInElement+1) < nMaxElement; nChar++ )
141 {
142 /* check for end of data */
143 if ( cSeperator != cTerminator && pszData[nChar] == cTerminator )
144 break;
145
146 if ( cSeperator == cTerminator && pszData[nChar] == cSeperator && pszData[nChar+1] == cTerminator )
147 break;
148
149 /* check for end of element */
150 if ( pszData[nChar] == cSeperator && ( nCurElement < nElement ))
151 nCurElement++;
152 else if ( nCurElement == nElement )
153 {
154 pszElement[nCharInElement] = pszData[nChar];
155 nCharInElement++;
156 }
157 }
158
159 if ( pszElement[0] == '\0' )
160 return INI_NO_DATA;
161
162 return INI_SUCCESS;
163}
164
165