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;
+}