chunk.c

00001 /* Copyright 2008 Michael Marsh, University of Maryland.
00002  *
00003  * This file is part of pydtn.
00004  *
00005  * pydtn is free software: you can redistribute it and/or modify
00006  * it under the terms of the GNU General Public License as published by
00007  * the Free Software Foundation, either version 3 of the License, or
00008  * (at your option) any later version.
00009  *
00010  * pydtn is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  * GNU General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU General Public License
00016  * along with pydtn.  If not, see <http://www.gnu.org/licenses/>.
00017  *
00018  * The views and conclusions contained in the software and documentation
00019  * are those of the authors and should not be interpreted as representing
00020  * official policies, either expressed or implied, of the University
00021  * of Maryland.
00022  *
00023  * pydtn extends and embeds the Python interpreter, which is
00024  * Copyright 2001-2006 Python Software Foundation, All Rights Reserved,
00025  * and is released under the PSF License Agreement.
00026  *
00027  * RANLUX random number generation uses the Boost library,
00028  * Copyright 1994-2006 by various authors (details in individual files),
00029  * which is released under the Boost Software License, Version 1.0.
00030  */
00031 
00032 #include "aodv.h"
00033 #include <string.h>
00034 
00035 aodv_chunk_t*
00036 new_aodv_chunk( unsigned int length )
00037 {
00038    aodv_chunk_t* chunk;
00039 
00040    chunk = (aodv_chunk_t*) malloc( sizeof(aodv_chunk_t) );
00041    if ( NULL == chunk )
00042    {
00043       return NULL;
00044    }
00045 
00046    chunk->length = length;
00047    chunk->next = NULL;
00048    chunk->data = NULL;
00049    if ( length > 0 )
00050    {
00051       chunk->data = (unsigned char*) calloc( length, sizeof(unsigned char) );
00052       if ( NULL == chunk->data )
00053       {
00054          free( chunk );
00055          return NULL;
00056       }
00057    }
00058 
00059    return chunk;
00060 }
00061 
00062 void
00063 free_aodv_chunk( aodv_chunk_t* chunk )
00064 {
00065    aodv_chunk_t* curr = chunk;
00066    aodv_chunk_t* next;
00067    while ( NULL != curr )
00068    {
00069       next = curr->next;
00070       free( curr->data );
00071       free( curr );
00072       curr = next;
00073    }
00074 }
00075 
00076 aodv_chunk_t*
00077 collapse_chunk( const aodv_chunk_t* bigchunk )
00078 {
00079    unsigned char*       p_data;
00080    aodv_chunk_t*        collapsed;
00081    unsigned int         length;
00082    const aodv_chunk_t*  curr;
00083 
00084    length = 0;
00085    curr = bigchunk;
00086    while ( NULL != curr )
00087    {
00088       length += curr->length;
00089       curr = curr->next;
00090    }
00091 
00092    collapsed = new_aodv_chunk( length );
00093    if ( NULL == collapsed )
00094    {
00095       return NULL;
00096    }
00097 
00098    curr = bigchunk;
00099    p_data = collapsed->data;
00100    while ( NULL != curr )
00101    {
00102       memcpy(p_data,curr->data,curr->length);
00103       p_data += curr->length;
00104       curr = curr->next;
00105    }
00106 
00107    return collapsed;
00108 }

Generated on Mon Mar 24 11:15:45 2008 for Pydtn Simulator by  doxygen 1.5.4