diff --git a/bacnet-stack/include/memcopy.h b/bacnet-stack/include/memcopy.h index 692ce8f3..611258c1 100644 --- a/bacnet-stack/include/memcopy.h +++ b/bacnet-stack/include/memcopy.h @@ -33,14 +33,16 @@ extern "C" { #endif /* __cplusplus */ -/* copy len bytes from src to offset of dest if there is enough space. */ -/* returns 0 if there is not enough space, or the number of bytes copied. */ + bool memcopylen( + size_t offset, + size_t max, + size_t len); size_t memcopy( void *dest, void *src, - size_t offset, /* where in dest to put the data */ - size_t len, /* amount of data to copy */ - size_t max); /* total size of destination */ + size_t offset, + size_t len, + size_t max); #ifdef __cplusplus } diff --git a/bacnet-stack/src/memcopy.c b/bacnet-stack/src/memcopy.c index 27a9f8f0..bb7d93d6 100644 --- a/bacnet-stack/src/memcopy.c +++ b/bacnet-stack/src/memcopy.c @@ -1,44 +1,118 @@ -/*####COPYRIGHTBEGIN#### - ------------------------------------------- - Copyright (C) 2008 Steve Karg - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to: - The Free Software Foundation, Inc. - 59 Temple Place - Suite 330 - Boston, MA 02111-1307, USA. - - As a special exception, if other files instantiate templates or - use macros or inline functions from this file, or you compile - this file and link it with other works to produce a work based - on this file, this file does not by itself cause the resulting - work to be covered by the GNU General Public License. However - the source code for this file must still be made available in - accordance with section (3) of the GNU General Public License. - - This exception does not invalidate any other reasons why a work - based on this file might be covered by the GNU General Public - License. - ------------------------------------------- -####COPYRIGHTEND####*/ +/** +* @file +* @author Steve Karg +* @date 2008 +* @section LICENSE +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to: +* The Free Software Foundation, Inc. +* 59 Temple Place - Suite 330 +* Boston, MA 02111-1307 +* USA. +* +* As a special exception, if other files instantiate templates or +* use macros or inline functions from this file, or you compile +* this file and link it with other works to produce a work based +* on this file, this file does not by itself cause the resulting +* work to be covered by the GNU General Public License. However +* the source code for this file must still be made available in +* accordance with section (3) of the GNU General Public License. +* +* This exception does not invalidate any other reasons why a work +* based on this file might be covered by the GNU General Public +* License. +* +* @section DESCRIPTION +* +* Memory copy functions for deeply embedded system. The functions +* are used with a buffer, the buffer offset, the sizeof the buffer, +* and the number of bytes to copy to the buffer. +*/ #include #include "memcopy.h" #include -/** @file memcopy.c Custom memcopy function */ +/** +* Tests to see if the number of bytes is available from an offset +* given the maximum sizeof a buffer. +* +* @param offset - offset into a buffer +* @param max - maximum sizeof a buffer +* @param len - number of bytes to add to the buffer starting at offset. +* +* @return True if there is enough space to copy len bytes. +*/ +bool memcopylen( + size_t offset, + size_t max, + size_t len) +{ + return ((offset + len) <= max); +} -/* copy len bytes from src to offset of dest if there is enough space. */ -/* returns 0 if there is not enough space, or the number of bytes copied. */ +#if defined (MEMCOPY_SIMPLE) +/** +* Copy len bytes from src to offset of dest if there is enough space +* in a buffer of max bytes. +* +* @param dest - pointer to the destination buffer +* @param src - pointer to the source buffer +* @param offset - offset into the destination buffer +* @param max - maximum sizeof the destination buffer +* @param len - number of bytes to add to the destination buffer +* starting at offset. +* +* @return returns zero if there is not enough space, or returns +* the number of bytes copied. +*/ +size_t memcopy( + void *dest, + void *src, + size_t offset, + size_t len, + size_t max) +{ + size_t i; + size_t copy_len = 0; + char *s1, *s2; + + s1 = dest; + s2 = src; + if (memcopylen(offset, max, len)) { + for (i = 0; i < len; i++) { + s1[offset + i] = s2[i]; + copy_len++; + } + } + + return copy_len; +} +#else +/** +* Copy len bytes from src to offset of dest if there is enough space +* in a buffer of max bytes. +* +* @param dest - pointer to the destination buffer +* @param src - pointer to the source buffer +* @param offset - offset into the destination buffer +* @param max - maximum sizeof the destination buffer +* @param len - number of bytes to add to the destination buffer +* starting at offset. +* +* @return returns zero if there is not enough space, or returns +* the number of bytes copied. +*/ size_t memcopy( void *dest, void *src, @@ -46,23 +120,14 @@ size_t memcopy( size_t len, /* amount of data to copy */ size_t max) { /* total size of destination */ -/* size_t i; */ -/* size_t copy_len = 0; */ -/* char *s1, *s2; */ - -/* s1 = dest; */ -/* s2 = src; */ - if (len <= (max - offset)) { + if (memcopylen(offset, max, len)) { memcpy(&((char *) dest)[offset], src, len); return (len); -/* for (i = 0; i < len; i++) { */ -/* s1[offset + i] = s2[i]; */ -/* copy_len++; */ -/* } */ } return 0; } +#endif #ifdef TEST #include