Mercurial > noffle
view src/dynamicstring.c @ 239:2b7ddb90d9b2 noffle
[svn] * src/over.c: Fix warning.
* src/fetchlist.h,src/fetchlist.c,src/noffle.c: Provide fetchmode for
groups on fetchlist.
* src/server.c: When fetching overviews online from groups on the fetchlist,
fetch them in the appropriate fetch mode for the group. E.g. if group
mode is FULL, fetch overviews and put all articles on articles required
list to be fetched on the next noffle --fetch.
* packages/redhat/noffle.spec: Incorporate changes from Carles Arjona.
author | bears |
---|---|
date | Thu, 14 Feb 2002 17:17:02 +0000 |
parents | 24d4cd032da5 |
children | 5eece4dfd945 |
line wrap: on
line source
/* dynamicstring.c $Id: dynamicstring.c 316 2001-10-31 11:44:53Z bears $ */ #if HAVE_CONFIG_H #include <config.h> #endif #include <sys/types.h> #include "dynamicstring.h" #include "log.h" #include "portable.h" struct DynStr { int len; /* Current length (without trailing '\0') */ int max; /* Max length that fits into buffer (incl. trailing '\0') */ char *str; }; static void reallocStr( DynStr *self, int max ) { ASSERT( max >= 0 ); if ( max <= self->max ) return; if ( ! ( self->str = (char *)realloc( self->str, (size_t)max ) ) ) { Log_err( "Realloc of DynStr failed" ); exit( EXIT_FAILURE ); } if ( self->max == 0 ) /* First allocation? */ *(self->str) = '\0'; self->max = max; } DynStr * new_DynStr( int reserve ) { DynStr *s; if ( ! ( s = malloc( sizeof( DynStr ) ) ) ) { Log_err( "Allocation of DynStr failed" ); exit( EXIT_FAILURE ); } s->len = 0; s->max = 0; s->str = NULL; if ( reserve > 0 ) reallocStr( s, reserve + 1 ); return s; } void del_DynStr( DynStr *self ) { if ( ! self ) return; free( self->str ); self->str = NULL; free( self ); } int DynStr_len( const DynStr *self ) { return self->len; } const char * DynStr_str( const DynStr *self ) { return self->str; } void DynStr_app( DynStr *self, const char *s ) { int len; len = strlen( s ); if ( self->len + len + 1 > self->max ) reallocStr( self, self->len * 2 + len + 1 ); strcpy( self->str + self->len, s ); self->len += len; } void DynStr_appDynStr( DynStr *self, const DynStr *s ) { if ( self->len + s->len + 1 > self->max ) reallocStr( self, self->len * 2 + s->len + 1 ); memcpy( self->str + self->len, s->str, (size_t)s->len + 1 ); self->len += s->len; } void DynStr_appLn( DynStr *self, const char *s ) { DynStr_app( self, s ); DynStr_app( self, "\n" ); } void DynStr_appN( DynStr *self, const char *s, int n ) { int len = self->len; ASSERT( n >= 0 ); if ( len + n + 1 > self->max ) reallocStr( self, len * 2 + n + 1 ); strncat( self->str + len, s, (size_t)n ); self->len = len + strlen( self->str + len ); } void DynStr_clear( DynStr *self ) { self->len = 0; if ( self->max > 0 ) *(self->str) = '\0'; }