diff options
Diffstat (limited to 'help.c')
| -rw-r--r-- | help.c | 219 | 
1 files changed, 105 insertions, 114 deletions
| @@ -1,4 +1,4 @@ -  /********************************************************************\ +/********************************************************************\    * BitlBee -- An IRC to other IM-networks gateway                     *    *                                                                    *    * Copyright 2002-2010 Wilmer van der Gaast and others                * @@ -26,188 +26,179 @@  #define BITLBEE_CORE  #include "bitlbee.h"  #include "help.h" -#undef read  +#undef read  #undef write  #define BUFSIZE 1100 -help_t *help_init( help_t **help, const char *helpfile ) +help_t *help_init(help_t **help, const char *helpfile)  {  	int i, buflen = 0;  	help_t *h;  	char *s, *t;  	time_t mtime;  	struct stat stat[1]; -	 -	*help = h = g_new0 ( help_t, 1 ); -	 -	h->fd = open( helpfile, O_RDONLY ); -	 -	if( h->fd == -1 ) -	{ -		g_free( h ); -		return( *help = NULL ); + +	*help = h = g_new0(help_t, 1); + +	h->fd = open(helpfile, O_RDONLY); + +	if (h->fd == -1) { +		g_free(h); +		return(*help = NULL);  	} -	 -	if( fstat( h->fd, stat ) != 0 ) -	{ -		g_free( h ); -		return( *help = NULL ); + +	if (fstat(h->fd, stat) != 0) { +		g_free(h); +		return(*help = NULL);  	}  	mtime = stat->st_mtime; -	 -	s = g_new (char, BUFSIZE + 1 ); + +	s = g_new(char, BUFSIZE + 1);  	s[BUFSIZE] = 0; -	 -	while( ( ( i = read( h->fd, s + buflen, BUFSIZE - buflen ) ) > 0 ) || -	       ( i == 0 && strstr( s, "\n%\n" ) ) ) -	{ + +	while (((i = read(h->fd, s + buflen, BUFSIZE - buflen)) > 0) || +	       (i == 0 && strstr(s, "\n%\n"))) {  		buflen += i; -		memset( s + buflen, 0, BUFSIZE - buflen ); -		if( !( t = strstr( s, "\n%\n" ) ) || s[0] != '?' ) -		{ +		memset(s + buflen, 0, BUFSIZE - buflen); +		if (!(t = strstr(s, "\n%\n")) || s[0] != '?') {  			/* FIXME: Clean up */ -			help_free( help ); -			g_free( s ); +			help_free(help); +			g_free(s);  			return NULL;  		} -		i = strchr( s, '\n' ) - s; -		 -		if( h->title ) -		{ -			h = h->next = g_new0( help_t, 1 ); +		i = strchr(s, '\n') - s; + +		if (h->title) { +			h = h->next = g_new0(help_t, 1);  		} -		h->title = g_new ( char, i ); -		 -		strncpy( h->title, s + 1, i - 1 ); -		h->title[i-1] = 0; +		h->title = g_new(char, i); + +		strncpy(h->title, s + 1, i - 1); +		h->title[i - 1] = 0;  		h->fd = (*help)->fd; -		h->offset.file_offset = lseek( h->fd, 0, SEEK_CUR ) - buflen + i + 1; +		h->offset.file_offset = lseek(h->fd, 0, SEEK_CUR) - buflen + i + 1;  		h->length = t - s - i - 1;  		h->mtime = mtime; -		 -		buflen -= ( t + 3 - s ); -		t = g_strdup( t + 3 ); -		g_free( s ); -		s = g_renew( char, t, BUFSIZE + 1 ); + +		buflen -= (t + 3 - s); +		t = g_strdup(t + 3); +		g_free(s); +		s = g_renew(char, t, BUFSIZE + 1);  		s[BUFSIZE] = 0;  	} -	 -	g_free( s ); -	 -	return( *help ); + +	g_free(s); + +	return(*help);  } -void help_free( help_t **help ) +void help_free(help_t **help)  {  	help_t *h, *oh;  	int last_fd = -1; /* Weak de-dupe */ -	 -	if( help == NULL || *help == NULL ) + +	if (help == NULL || *help == NULL) {  		return; -	 +	} +  	h = *help; -	while( h ) -	{ -		if( h->fd != last_fd ) -		{ -			close( h->fd ); +	while (h) { +		if (h->fd != last_fd) { +			close(h->fd);  			last_fd = h->fd;  		} -		g_free( h->title ); -		h = (oh=h)->next; -		g_free( oh ); +		g_free(h->title); +		h = (oh = h)->next; +		g_free(oh);  	} -	 +  	*help = NULL;  } -char *help_get( help_t **help, char *title ) +char *help_get(help_t **help, char *title)  {  	time_t mtime;  	struct stat stat[1];  	help_t *h; -	for( h = *help; h; h = h->next ) -	{ -		if( h->title != NULL && g_strcasecmp( h->title, title ) == 0 ) +	for (h = *help; h; h = h->next) { +		if (h->title != NULL && g_strcasecmp(h->title, title) == 0) {  			break; +		}  	} -	if( h && h->length > 0 ) -	{ -		char *s = g_new( char, h->length + 1 ); -		 +	if (h && h->length > 0) { +		char *s = g_new(char, h->length + 1); +  		s[h->length] = 0; -		if( h->fd >= 0 ) -		{ -			if( fstat( h->fd, stat ) != 0 ) -			{ -				g_free( s ); +		if (h->fd >= 0) { +			if (fstat(h->fd, stat) != 0) { +				g_free(s);  				return NULL;  			}  			mtime = stat->st_mtime; -		 -			if( mtime > h->mtime ) -			{ -				g_free( s ); + +			if (mtime > h->mtime) { +				g_free(s);  				return NULL;  			} -			 -			if( lseek( h->fd, h->offset.file_offset, SEEK_SET ) == -1 || -			    read( h->fd, s, h->length ) != h->length ) + +			if (lseek(h->fd, h->offset.file_offset, SEEK_SET) == -1 || +			    read(h->fd, s, h->length) != h->length) {  				return NULL; -		} -		else -		{ -			strncpy( s, h->offset.mem_offset, h->length ); +			} +		} else { +			strncpy(s, h->offset.mem_offset, h->length);  		}  		return s;  	} -	 +  	return NULL;  } -int help_add_mem( help_t **help, const char *title, const char *content ) +int help_add_mem(help_t **help, const char *title, const char *content)  {  	help_t *h, *l = NULL; -	 -	for( h = *help; h; h = h->next ) -	{ -		if( g_strcasecmp( h->title, title ) == 0 ) + +	for (h = *help; h; h = h->next) { +		if (g_strcasecmp(h->title, title) == 0) {  			return 0; -		 +		} +  		l = h;  	} -	 -	if( l ) -		h = l->next = g_new0( struct help, 1 ); -	else -		*help = h = g_new0( struct help, 1 ); + +	if (l) { +		h = l->next = g_new0(struct help, 1); +	} else { +		*help = h = g_new0(struct help, 1); +	}  	h->fd = -1; -	h->title = g_strdup( title ); -	h->length = strlen( content ); -	h->offset.mem_offset = g_strdup( content ); -	 +	h->title = g_strdup(title); +	h->length = strlen(content); +	h->offset.mem_offset = g_strdup(content); +  	return 1;  } -char *help_get_whatsnew( help_t **help, int old ) +char *help_get_whatsnew(help_t **help, int old)  {  	GString *ret = NULL;  	help_t *h;  	int v; -	 -	for( h = *help; h; h = h->next ) -		if( h->title != NULL && strncmp( h->title, "whatsnew", 8 ) == 0 && -		    sscanf( h->title + 8, "%x", &v ) == 1 && v > old ) -		{ -			char *s = help_get( &h, h->title ); -			if( ret == NULL ) -				ret = g_string_new( s ); -			else -				g_string_append_printf( ret, "\n\n%s", s ); -			g_free( s ); + +	for (h = *help; h; h = h->next) { +		if (h->title != NULL && strncmp(h->title, "whatsnew", 8) == 0 && +		    sscanf(h->title + 8, "%x", &v) == 1 && v > old) { +			char *s = help_get(&h, h->title); +			if (ret == NULL) { +				ret = g_string_new(s); +			} else { +				g_string_append_printf(ret, "\n\n%s", s); +			} +			g_free(s);  		} -	 -	return ret ? g_string_free( ret, FALSE ) : NULL; +	} + +	return ret ? g_string_free(ret, FALSE) : NULL;  } | 
