scbstream.c
Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 #define _GNU_SOURCE
00029 
00030 
00031 
00032 
00033 
00034 
00035 #include <memory.h>
00036 
00037 
00038 
00039 
00040 #include "scbstream.h"
00041 #include "scblog.h"
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 ScbStreamPtr erscribble_create_stream(const int size)
00069 {
00070     ScbStreamPtr ptr = g_new0(ScbStream, 1);
00071 
00072     if (ptr == NULL)
00073     {
00074         ERRORPRINTF("Could not allocate memory stream!");
00075         return NULL;
00076     }
00077 
00078     ptr->buffer = g_malloc0(size);
00079     if (ptr->buffer == NULL)
00080     {
00081         ERRORPRINTF("Could not allocate memory stream!");
00082         g_free(ptr);
00083         return NULL;
00084     }
00085     ptr->size = size;
00086 
00087     return ptr;
00088 }
00089 
00090 
00091 void erscribble_free_stream(ScbStreamPtr stream, gboolean is_free_buffer)
00092 {
00093     if (stream)
00094     {
00095         
00096         if (stream->buffer && is_free_buffer)
00097         {
00098             g_free(stream->buffer);
00099             stream->buffer = NULL;
00100         }
00101 
00102         g_free(stream);
00103     }
00104 }
00105 
00106 
00107 gboolean erscribble_read_stream(ScbStreamPtr stream, void *data, const int length)
00108 {
00109     if (stream->offset + length > stream->size)
00110     {
00111         return FALSE;
00112     }
00113 
00114     unsigned char * src = (unsigned char*)stream->buffer + stream->offset;
00115 
00116     memcpy(data, src, length);
00117 
00118     stream->offset += length;
00119 
00120     return TRUE;
00121 }
00122 
00123 
00124 gboolean erscribble_write_stream(ScbStreamPtr stream, const void *data, const int length)
00125 {
00126     if (stream->offset + length > stream->size)
00127     {
00128         
00129         void * new_mem = g_malloc0(stream->size + length);
00130 
00131         if (new_mem == NULL)
00132         {
00133             return FALSE;
00134         }
00135 
00136         
00137         memcpy(new_mem, stream->buffer, stream->offset);
00138 
00139         
00140         g_free(stream->buffer);
00141 
00142         stream->buffer = new_mem;
00143 
00144         stream->size += length;
00145     }
00146 
00147     unsigned char * dst = (unsigned char *)stream->buffer + stream->offset;
00148 
00149     
00150     memcpy(dst, data, length);
00151 
00152     stream->offset += length;
00153     
00154     return TRUE;
00155 }
00156 
00157 
00158 void erscribble_reset_offset(ScbStreamPtr stream)
00159 {
00160     stream->offset = 0;
00161 }