1 /********************************************************************\
2 * BitlBee -- An IRC to other IM-networks gateway *
4 * Copyright 2002-2008 Wilmer van der Gaast and others *
5 \********************************************************************/
7 /* INI file reading code */
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License with
21 the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL;
22 if not, write to the Free Software Foundation, Inc., 59 Temple Place,
23 Suite 330, Boston, MA 02111-1307 USA
28 ini_t
*ini_open( char *file
)
34 if( ( fd
= open( file
, O_RDONLY
) ) != -1 &&
35 fstat( fd
, &fi
) == 0 &&
36 fi
.st_size
<= 16384 &&
37 ( ini
= g_malloc( sizeof( ini_t
) + fi
.st_size
+ 1 ) ) &&
38 read( fd
, ini
->file
, fi
.st_size
) == fi
.st_size
)
40 memset( ini
, 0, sizeof( ini_t
) );
41 ini
->size
= fi
.st_size
;
42 ini
->file
[ini
->size
] = 0;
59 /* Strips leading and trailing whitespace and returns a pointer to the first
60 non-ws character of the given string. */
61 static char *ini_strip_whitespace( char *in
)
65 while( isspace( *in
) )
68 e
= in
+ strlen( in
) - 1;
69 while( e
> in
&& isspace( *e
) )
76 int ini_read( ini_t
*file
)
80 while( file
->cur
&& file
->cur
< file
->file
+ file
->size
)
86 /* Find the end of line */
87 if( ( e
= strchr( file
->cur
, '\n' ) ) != NULL
)
95 e
= file
->cur
+ strlen( file
->cur
);
100 if( ( s
= strchr( file
->cur
, '#' ) ) != NULL
)
103 file
->cur
= ini_strip_whitespace( file
->cur
);
105 if( *file
->cur
== '[' )
108 if( ( s
= strchr( file
->cur
, ']' ) ) != NULL
)
111 file
->c_section
= file
->cur
;
114 else if( ( s
= strchr( file
->cur
, '=' ) ) != NULL
)
117 file
->key
= ini_strip_whitespace( file
->cur
);
118 file
->value
= ini_strip_whitespace( s
+ 1 );
120 if( ( s
= strchr( file
->key
, '.' ) ) != NULL
)
123 file
->section
= file
->key
;
128 file
->section
= file
->c_section
;
134 /* else: noise/comment/etc, let's just ignore it. */
142 void ini_close( ini_t
*file
)