/********************************************************************\ * BitlBee -- An IRC to other IM-networks gateway * * * * Copyright 2002-2008 Wilmer van der Gaast and others * \********************************************************************/ /* INI file reading code */ /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License with the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define BITLBEE_CORE #include "bitlbee.h" ini_t *ini_open( char *file ) { int fd; ini_t *ini = NULL; struct stat fi; if( ( fd = open( file, O_RDONLY ) ) != -1 && fstat( fd, &fi ) == 0 && fi.st_size <= 16384 && ( ini = g_malloc( sizeof( ini_t ) + fi.st_size + 1 ) ) && read( fd, ini->file, fi.st_size ) == fi.st_size ) { memset( ini, 0, sizeof( ini_t ) ); ini->size = fi.st_size; ini->file[ini->size] = 0; ini->cur = ini->file; ini->c_section = ""; return ini; } g_free( ini ); if( fd >= 0 ) close( fd ); return NULL; } int ini_read( ini_t *file ) { char *s; while( file->cur && file->cur < file->file + file->size ) { char *e, *next; file->line++; /* Leading whitespace */ while( *file->cur == ' ' || *file->cur == '\t' ) file->cur++; /* Find the end of line */ if( ( e = strchr( file->cur, '\n' ) ) != NULL ) { next = e + 1; } else { /* No more lines. */ e = file->cur + strlen( file->cur ) - 1; next = NULL; } /* Comment? */ if( ( s = strchr( file->cur, '#' ) ) != NULL ) e = s - 1; /* And kill trailing whitespace. */ while( isspace( *e ) && e > file->cur ) e--; e[1] = 0; printf( "Stripped line: '%s'\n", file->cur ); if( *file->cur == '[' ) { file->cur++; if( ( s = strchr( file->cur, ']' ) ) != NULL ) { *s = 0; file->c_section = file->cur; printf( "Section started: %s\n", file->c_section ); } } else if( ( s = strchr( file->cur, '=' ) ) != NULL ) { *s = 0; file->value = s + 1; while( isspace( *file->value ) ) file->value++; s--; while( isspace( *s ) && s > file->cur ) s--; s[1] = 0; file->key = file->cur; if( ( s = strchr( file->key, '.' ) ) != NULL ) { *s = 0; file->section = file->key; file->key = s + 1; } else { file->section = file->c_section; } file->cur = next; printf( "%s.%s = '%s'\n", file->section, file->key, file->value ); return 1; } /* else: noise, but let's just ignore it. */ file->cur = next; } return 0; } void ini_close( ini_t *file ) { g_free( file ); }