An improved version of a linked list 64 characters
/* 2010-05 john pfeiffer
buffer linked list for file data */
#define CHARBUFFERMAX 64
typedef struct charbuffer* charbufferptr;
struct charbuffer
{ int id;
char data[ CHARBUFFERMAX ];
charbufferptr prev;
charbufferptr next ;
};
charbufferptr charbufferAlloc( VOID )
{
return( (charbufferptr)malloc( sizeof( struct charbuffer ) ) );
}/* end charbufferAlloc( ) */
charbufferptr initializecharbuffer( VOID )
{
charbufferptr temp;
temp = charbufferAlloc( );
if( temp == NULL )
{ printf( "error allocating memory");
exit( 1 );
}
temp -> id = 0;
memset( temp ->data , 0 , sizeof( temp ->data ) );
temp ->prev = NULL ;
temp ->next = NULL ;
return temp ;
}/* end initializecharbuffer( ) */
charbufferptr appendcharbufferList( charbufferptr listend , charbufferptr newobject )
{
listend -> next = newobject ;
newobject ->id = ( listend ->id ) +1;
newobject ->prev = listend ;
return newobject ;
}/* end appendcharbufferList( ) */
/* cannot rely on stop char as this is raw */
void displaycharbufferConsole( charbufferptr temp )
{ int i=0;
if( temp != NULL)
{
for( i =0 ; i< CHARBUFFERMAX; i++)
{
printf("%c", temp->data[ i ] );
}
}
}/* end displaycharbufferConsole( ) */
void displaycharbufferDebug( charbufferptr temp )
{ if( temp != NULL)
{
printf("id=%d\n", temp->id );
printf("data=%s\n", temp->data );
printf("next=%d\n", (int) temp->next );
printf("prev=%d\n", (int) temp->prev );
}
}/* end displaycharbufferDebug() */
void displaycharbufferListConsole( charbufferptr temp )
{
printf(" \n---CHARBUFFER-LIST---\n");
while( temp != NULL)
{
displaycharbufferConsole( temp );
temp = temp-> next ;
}
}/* end displaycharbufferListConsole( ) */
charbufferptr removecharbufferListEnd( charbufferptr t )
{
charbufferptr temp;
if(t != NULL)
{
temp = t;
t = t->prev;
t->next = NULL;
free( temp );
return t;
}
return( NULL );
}/* end removecharbufferListEnd( ) */
/* deletes down the list next */
charbufferptr deletecharbufferList( charbufferptr t )
{
charbufferptr temp;
printf("\n---CHARBUFFER-LIST-DELETE--- \n ");
while( t != NULL)
{
printf( "%d " , t->id );
temp = t;
t = t->next;
free( temp );
}
printf( "\n" );
}/* end function deletecharbufferList( ) */
int charbufferGetData ( charbufferptr temp , FILE* fp )
{
int i = 0 ;
memset( temp -> data , 0 , sizeof(temp-> data) );
while( (i < CHARBUFFERMAX ) && !feof(fp) )
{
temp -> data[ i ] = fgetc(fp);
i++;
}
/* EOF condition stored in data, remove? */
if( feof(fp) && i>0)
{ temp -> data[ i-1 ] = 0; }
return i;
}/* end charbufferGetData */