Mercurial > noffle
diff src/fetchlist.c @ 43:2842f50feb55 noffle
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
control.c, control.h, database.c, database.h, dynamicstring.c,
dynamicstring.h, fetch.c, fetch.h, fetchlist.c, fetchlist.h, group.c,
group.h, itemlist.c, itemlist.h, lock.c, lock.h, log.c, log.h, noffle.c,
online.c, online.h, outgoing.c, outgoing.h, over.c, over.h, post.c, post.h,
protocol.c, protocol.h, pseudo.c, pseudo.h, request.c, request.h, server.c,
server.h, util.c, util.h, wildmat.c, wildmat.h: Moved files to the
subdirectory src/
* Makefile.am, acconfig.h, configure.in, docs/Makefile.am, src/Makefile.am,
Makefile.in, aclocal.m4, config.h.in, configure, install-sh, missing,
mkinstalldirs, stamp-h.in, docs/Makefile.in, src/Makefile.in: Added files.
They are used by aclocal, autoheader, autoconf and automake.
* src/config.c, src/config.h: Renamed to configfile.c and configfile.h,
because configure will generate a config.h file itself.
* src/client.c, src/content.c, src/database.c, src/fetch.c, src/fetchlist.c,
src/group.c, src/lock.c, src/noffle.c, src/online.c, src/outgoing.c,
src/over.c, src/pseudo.c, src/request.c, src/server.c, src/util.c:
Changed '#include "config.h"' to '#include "configfile.h"'.
* src/client.c, src/content.c, src/database.c, src/fetch.c, src/fetchlist.c,
src/group.c, src/lock.c, src/online.c, src/outgoing.c, src/post.c,
src/protocol.c, src/request.c, src/server.c: Files now #include <config.h>.
Added missing <stdio.h>. This removes the warnings about snprintf() not
being declared.
* Makefile: Removed. This is now generated by configure.
author | uh1763 |
---|---|
date | Fri, 05 May 2000 22:45:56 +0100 |
parents | |
children | 32ba1198c6fa |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/fetchlist.c Fri May 05 22:45:56 2000 +0100 @@ -0,0 +1,210 @@ +/* + fetchlist.c + + $Id: fetchlist.c 49 2000-05-05 21:45:56Z uh1763 $ +*/ + +#if HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include "fetchlist.h" +#include "configfile.h" +#include "log.h" +#include "util.h" + +struct Elem +{ + Str name; + FetchMode mode; +}; + +static struct Fetchlist +{ + struct Elem *elem; + int size; + int max; +} fetchlist = { NULL, 0, 0 }; + +static const char * +getFile( void ) +{ + static Str file; + snprintf( file, MAXCHAR, "%s/fetchlist", Cfg_spoolDir() ); + return file; +} + +static void +clearList( void ) +{ + fetchlist.size = 0; +} + +static int +compareElem( const void *elem1, const void *elem2 ) +{ + struct Elem* e1 = (struct Elem*)elem1; + struct Elem* e2 = (struct Elem*)elem2; + return strcmp( e1->name, e2->name ); +} + +static struct Elem * +searchElem( const char *name ) +{ + int i; + + for ( i = 0; i < fetchlist.size; ++i ) + if ( strcmp( name, fetchlist.elem[ i ].name ) == 0 ) + return &fetchlist.elem[ i ]; + return NULL; +} + +static void +appGrp( const char *name, FetchMode mode ) +{ + struct Elem elem; + + if ( fetchlist.max < fetchlist.size + 1 ) + { + if ( ! ( fetchlist.elem + = realloc( fetchlist.elem, + ( fetchlist.max + 50 ) + * sizeof( fetchlist.elem[ 0 ] ) ) ) ) + { + Log_err( "Could not realloc fetchlist" ); + exit( EXIT_FAILURE ); + } + fetchlist.max += 50; + } + strcpy( elem.name, name ); + elem.mode = mode; + fetchlist.elem[ fetchlist.size++ ] = elem; +} + +void +Fetchlist_read( void ) +{ + FILE *f; + const char *file = getFile(); + char *p; + FetchMode mode = OVER; + Bool valid; + int ret; + Str line, grp, modeStr; + + Log_dbg( "Reading %s", file ); + clearList(); + if ( ! ( f = fopen( file, "r" ) ) ) + { + Log_inf( "No file %s", file ); + return; + } + while ( fgets( line, MAXCHAR, f ) ) + { + p = Utl_stripWhiteSpace( line ); + if ( *p == '#' || *p == '\0' ) + continue; + ret = sscanf( p, "%s %s", grp, modeStr ); + valid = TRUE; + if ( ret < 1 || ret > 2 ) + valid = FALSE; + else if ( ret >= 2 ) + { + if ( strcmp( modeStr, "full" ) == 0 ) + mode = FULL; + else if ( strcmp( modeStr, "thread" ) == 0 ) + mode = THREAD; + else if ( strcmp( modeStr, "over" ) == 0 ) + mode = OVER; + else + valid = FALSE; + } + if ( ! valid ) + { + Log_err( "Invalid entry in %s: %s", file, line ); + continue; + } + appGrp( grp, mode ); + } + fclose( f ); +} + +Bool +Fetchlist_write( void ) +{ + int i; + FILE *f; + const char *file = getFile(); + const char *modeStr = ""; + + qsort( fetchlist.elem, fetchlist.size, sizeof( fetchlist.elem[ 0 ] ), + compareElem ); + if ( ! ( f = fopen( file, "w" ) ) ) + { + Log_err( "Could not open %s for writing", file ); + return FALSE; + } + for ( i = 0; i < fetchlist.size; ++i ) + { + switch ( fetchlist.elem[ i ].mode ) + { + case FULL: + modeStr = "full"; break; + case THREAD: + modeStr = "thread"; break; + case OVER: + modeStr = "over"; break; + } + fprintf( f, "%s %s\n", fetchlist.elem[ i ].name, modeStr ); + } + fclose( f ); + return TRUE; +} + +int +Fetchlist_size( void ) +{ + return fetchlist.size; +} + +Bool +Fetchlist_contains( const char *name ) +{ + return ( searchElem( name ) != NULL ); +} + +Bool +Fetchlist_element( const char **name, FetchMode *mode, int index ) +{ + if ( index < 0 || index >= fetchlist.size ) + return FALSE; + *name = fetchlist.elem[ index ].name; + *mode = fetchlist.elem[ index ].mode; + return TRUE; +} + +Bool +Fetchlist_add( const char *name, FetchMode mode ) +{ + struct Elem *elem = searchElem( name ); + if ( elem == NULL ) + { + appGrp( name, mode ); + return TRUE; + } + strcpy( elem->name, name ); + elem->mode = mode; + return FALSE; +} + +Bool +Fetchlist_remove( const char *name ) +{ + struct Elem *elem = searchElem( name ); + if ( elem == NULL ) + return FALSE; + *elem = fetchlist.elem[ fetchlist.size - 1 ]; + --fetchlist.size; + return TRUE; +}