1 /********************************************************************\
2 * BitlBee -- An IRC to other IM-networks gateway *
4 * Copyright 2002-2005 Wilmer van der Gaast and others *
5 \********************************************************************/
7 /* Help file control */
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
33 help_t
*help_init( help_t
**help
, const char *helpfile
)
41 *help
= h
= g_new0 ( help_t
, 1 );
43 h
->fd
= open( helpfile
, O_RDONLY
52 return( *help
= NULL
);
55 if( fstat( h
->fd
, stat
) != 0 )
58 return( *help
= NULL
);
60 mtime
= stat
->st_mtime
;
62 s
= g_new (char, BUFSIZE
+ 1 );
65 while( ( ( i
= read( h
->fd
, s
+ buflen
, BUFSIZE
- buflen
) ) > 0 ) ||
66 ( i
== 0 && strstr( s
, "\n%\n" ) ) )
69 memset( s
+ buflen
, 0, BUFSIZE
- buflen
);
70 if( !( t
= strstr( s
, "\n%\n" ) ) || s
[0] != '?' )
77 i
= strchr( s
, '\n' ) - s
;
81 h
= h
->next
= g_new0( help_t
, 1 );
83 h
->title
= g_new ( char, i
);
85 strncpy( h
->title
, s
+ 1, i
- 1 );
88 h
->offset
.file_offset
= lseek( h
->fd
, 0, SEEK_CUR
) - buflen
+ i
+ 1;
89 h
->length
= t
- s
- i
- 1;
92 buflen
-= ( t
+ 3 - s
);
93 t
= g_strdup( t
+ 3 );
95 s
= g_renew( char, t
, BUFSIZE
+ 1 );
104 void help_free( help_t
**help
)
107 int last_fd
= -1; /* Weak de-dupe */
109 if( help
== NULL
|| *help
== NULL
)
115 if( h
->fd
!= last_fd
)
128 char *help_get( help_t
**help
, char *title
)
134 for( h
= *help
; h
; h
= h
->next
)
136 if( h
->title
!= NULL
&& g_strcasecmp( h
->title
, title
) == 0 )
139 if( h
&& h
->length
> 0 )
141 char *s
= g_new( char, h
->length
+ 1 );
146 if( fstat( h
->fd
, stat
) != 0 )
151 mtime
= stat
->st_mtime
;
153 if( mtime
> h
->mtime
)
159 lseek( h
->fd
, h
->offset
.file_offset
, SEEK_SET
);
160 read( h
->fd
, s
, h
->length
);
164 strncpy( s
, h
->offset
.mem_offset
, h
->length
);