1 /* 2 ** Copyright (c) 2001-2007 Expat maintainers. 3 ** 4 ** Permission is hereby granted, free of charge, to any person obtaining 5 ** a copy of this software and associated documentation files (the 6 ** "Software"), to deal in the Software without restriction, including 7 ** without limitation the rights to use, copy, modify, merge, publish, 8 ** distribute, sublicense, and/or sell copies of the Software, and to 9 ** permit persons to whom the Software is furnished to do so, subject to 10 ** the following conditions: 11 ** 12 ** The above copyright notice and this permission notice shall be included 13 ** in all copies or substantial portions of the Software. 14 ** 15 ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 18 ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 19 ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 20 ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 21 ** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 */ 23 24 #include <stdlib.h> 25 #include <exec/memory.h> 26 #include <proto/exec.h> 27 #include <proto/utility.h> 28 29 void * malloc (size_t len) 30 { 31 uint32 size = sizeof(uint32) + len; 32 33 uint32 *mem = AllocMem(size, MEMF_SHARED); 34 if ( mem != 0 ) { 35 *mem = size; 36 ++mem; 37 } 38 39 return mem; 40 } 41 42 43 void * realloc (void * mem, size_t len2) 44 { 45 if ( mem == 0 ) { 46 return malloc(len2); 47 } 48 49 if ( len2 == 0 ) { 50 free(mem); 51 return 0; 52 } 53 54 void * new_mem = malloc(len2); 55 if ( new_mem == 0 ) { 56 return 0; 57 } 58 59 uint32 mem_size = *(((uint32*)mem) - 1); 60 CopyMem(mem, new_mem, mem_size); 61 free(mem); 62 63 return new_mem; 64 } 65 66 67 void free (void * mem) 68 { 69 if ( mem != 0 ) { 70 uint32 * size_ptr = ((uint32*)mem) - 1; 71 FreeMem(size_ptr, *size_ptr); 72 } 73 } 74 75 76 int memcmp (const void * a, const void * b, size_t len) 77 { 78 size_t i; 79 int diff; 80 81 for ( i = 0; i < len; ++i ) { 82 diff = *((uint8 *)a++) - *((uint8 *)b++); 83 if ( diff ) { 84 return diff; 85 } 86 } 87 88 return 0; 89 } 90 91 92 void * memcpy (void * t, const void * a, size_t len) 93 { 94 CopyMem((APTR)a, t, len); 95 return t; 96 } 97 98 99 void * memmove (void * t1, const void * t2, size_t len) 100 { 101 MoveMem((APTR)t2, t1, len); 102 return t1; 103 } 104 105 106 void * memset (void * t, int c, size_t len) 107 { 108 return SetMem(t, c, len); 109 } 110