00001 00005 #include <malloc.h> 00006 #include <string.h> 00007 00008 #include "libmgk.h" 00009 00010 void * 00011 __mgk_allocate_buffer(unsigned int size) 00012 { 00013 mgk_buffer *result; 00014 if (size == 0) { 00015 mgk_errno = E_NOMEM; 00016 return (NULL); 00017 } 00018 result = malloc(sizeof(mgk_buffer) + size); 00019 if (!result) { 00020 mgk_errno = E_NOMEM; 00021 return (NULL); 00022 } 00023 result->tag = OBJ_BUFFER; 00024 result->size = size; 00025 result->refval = NULL; 00026 result->next = NULL; 00027 return (&result[1]); 00028 } 00029 00030 void * 00031 mgk_allocate_buffer(unsigned int size, int do_zero) 00032 { 00033 void *result = __mgk_allocate_buffer(size); 00034 if (result) { 00035 if (do_zero) { 00036 memset(result, 0, size); 00037 } 00038 if (__mgk_running_node) { 00039 mgk_buffer *bp = __mgk_buffer_header(result); 00040 bp->next = __mgk_running_node->buffer_list; 00041 __mgk_running_node->buffer_list = bp; 00042 } 00043 } 00044 return (result); 00045 } 00046 00047 void * 00048 __mgk_copy_buffer(void *buffer) 00049 { 00050 mgk_buffer *src = __mgk_checked_buffer_header(buffer); 00051 void *dst; 00052 if (!src) { 00053 mgk_errno = E_NOTBUFFER; 00054 return (NULL); 00055 } 00056 if (!(dst = __mgk_allocate_buffer(src->size))) { 00057 return (NULL); 00058 } 00059 memcpy(dst, buffer, src->size); 00060 return (dst); 00061 } 00062 00063 void * 00064 mgk_copy_buffer(void *buffer) 00065 { 00066 void *result = __mgk_copy_buffer(buffer); 00067 if (result && __mgk_running_node) { 00068 mgk_buffer *bp = __mgk_buffer_header(result); 00069 bp->next = __mgk_running_node->buffer_list; 00070 __mgk_running_node->buffer_list = bp; 00071 } 00072 return (result); 00073 } 00074 00075 mgk_error_code 00076 __mgk_free_buffer(void *buffer) 00077 { 00078 mgk_buffer *buf = __mgk_checked_buffer_header(buffer); 00079 if (!buf) { 00080 return (E_NOTBUFFER); 00081 } 00082 if (buf->refval) { 00083 return (E_BUFFERUSED); 00084 } 00085 buf->tag = OBJ_INVALID; 00086 free(buf); 00087 return (E_SUCCESS); 00088 } 00089 00090 mgk_error_code 00091 mgk_free_buffer(void *buffer) 00092 { 00093 mgk_buffer *buf = __mgk_checked_buffer_header(buffer); 00094 if (!buf) { 00095 return (E_NOTBUFFER); 00096 } 00097 if (buf->refval) { 00098 return (E_BUFFERUSED); 00099 } 00100 if (__mgk_running_node) { 00101 mgk_buffer **bpp = &__mgk_running_node->buffer_list; 00102 while (*bpp) { 00103 if (*bpp == buf) { 00104 *bpp = buf->next; 00105 break; 00106 } 00107 bpp = &(*bpp)->next; 00108 } 00109 } 00110 buf->tag = OBJ_INVALID; 00111 free(buf); 00112 return (E_SUCCESS); 00113 } 00114 00115 int 00116 mgk_is_a_buffer(void *buffer) 00117 { 00118 return (__mgk_check_buffer(buffer) ? TRUE : FALSE); 00119 } 00120 00121 unsigned int 00122 mgk_buffer_size(void *buffer) 00123 { 00124 mgk_buffer *buf = __mgk_checked_buffer_header(buffer); 00125 if (buf) { 00126 mgk_errno = E_SUCCESS; 00127 return (buf->size); 00128 } 00129 mgk_errno = E_NOTBUFFER; 00130 return (0); 00131 }