diff options
| author | Harald Welte <laforge@gnumonks.org> | 2011-07-30 19:31:17 +0200 | 
|---|---|---|
| committer | Harald Welte <laforge@gnumonks.org> | 2011-07-30 19:31:17 +0200 | 
| commit | a6d24d323b402964086dbd816d54897b6d9e4d38 (patch) | |
| tree | 922830c19f80c4923bcb3cb7efd9f657431905ca /at91lib | |
| parent | ef6648e27ae39d1c339d5758d02e551f0e19ea39 (diff) | |
at91lib: re-add utility/string.c from basic-dataflash-example
Diffstat (limited to 'at91lib')
| -rw-r--r-- | at91lib/utility/string.c | 239 | 
1 files changed, 239 insertions, 0 deletions
diff --git a/at91lib/utility/string.c b/at91lib/utility/string.c new file mode 100644 index 0000000..6c2af0d --- /dev/null +++ b/at91lib/utility/string.c @@ -0,0 +1,239 @@ +/* ----------------------------------------------------------------------------
 + *         ATMEL Microcontroller Software Support 
 + * ----------------------------------------------------------------------------
 + * Copyright (c) 2008, Atmel Corporation
 + *
 + * All rights reserved.
 + *
 + * Redistribution and use in source and binary forms, with or without
 + * modification, are permitted provided that the following conditions are met:
 + *
 + * - Redistributions of source code must retain the above copyright notice,
 + * this list of conditions and the disclaimer below.
 + *
 + * Atmel's name may not be used to endorse or promote products derived from
 + * this software without specific prior written permission.
 + *
 + * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
 + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
 + * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
 + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 + * ----------------------------------------------------------------------------
 + */
 +
 +//------------------------------------------------------------------------------
 +/// \unit
 +///
 +/// !Purpose
 +///
 +/// Implementation of several methods defined in string.h, for reducing the
 +/// memory footprint when using them (since the whole libc.o file gets included
 +/// even when using a single method).
 +///
 +/// !Usage
 +///
 +/// Add string.c to the list of files to compile for the project. This will
 +/// automatically replace standard libc methods by the custom ones.
 +//------------------------------------------------------------------------------
 +
 +//------------------------------------------------------------------------------
 +//         Headers
 +//------------------------------------------------------------------------------
 +
 +#include <string.h>
 +
 +//------------------------------------------------------------------------------
 +//         Global Functions
 +//------------------------------------------------------------------------------
 +
 +//------------------------------------------------------------------------------
 +/// Copies data from a source buffer into a destination buffer. The two buffers
 +/// must NOT overlap. Returns the destination buffer.
 +/// \param pDestination  Destination buffer.
 +/// \param pSource  Source buffer.
 +/// \param num  Number of bytes to copy.
 +//------------------------------------------------------------------------------
 +void * memcpy(void *pDestination, const void *pSource, size_t num)
 +{
 +    unsigned char *pByteDestination;
 +    unsigned char *pByteSource;
 +    unsigned int *pAlignedSource = (unsigned int *) pSource;
 +    unsigned int *pAlignedDestination = (unsigned int *) pDestination;
 +
 +    // If num is more than 4 bytes, and both dest. and source are aligned,
 +    // then copy dwords
 +    if ((((unsigned int) pAlignedDestination & 0x3) == 0)
 +        && (((unsigned int) pAlignedSource & 0x3) == 0)
 +        && (num >= 4)) {
 +
 +        while (num >= 4) {
 +
 +            *pAlignedDestination++ = *pAlignedSource++;
 +            num -= 4;
 +        }
 +    }
 +
 +    // Copy remaining bytes
 +    pByteDestination = (unsigned char *) pAlignedDestination;
 +    pByteSource = (unsigned char *) pAlignedSource;
 +    while (num--) {
 +
 +        *pByteDestination++ = *pByteSource++;
 +    }
 +
 +    return pDestination;
 +}
 +
 +//------------------------------------------------------------------------------
 +/// Fills a memory region with the given value. Returns a pointer to the
 +/// memory region.
 +/// \param pBuffer  Pointer to the start of the memory region to fill
 +/// \param value    Value to fill the region with
 +/// \param num      Size to fill in bytes
 +//------------------------------------------------------------------------------
 +void * memset(void *pBuffer, int value, size_t num)
 +{
 +    unsigned char *pByteDestination;
 +    unsigned int  *pAlignedDestination = (unsigned int *) pBuffer;
 +    unsigned int  alignedValue = (value << 24) | (value << 16) | (value << 8) | value;
 +
 +    // Set words if possible
 +    if ((((unsigned int) pAlignedDestination & 0x3) == 0) && (num >= 4)) {
 +        while (num >= 4) {
 +            *pAlignedDestination++ = alignedValue;
 +            num -= 4;
 +        }
 +    }
 +    // Set remaining bytes
 +    pByteDestination = (unsigned char *) pAlignedDestination;
 +    while (num--) {
 +        *pByteDestination++ = value;
 +    }
 +    return pBuffer;
 +}
 +
 +//-----------------------------------------------------------------------------
 +/// Search a character in the given string.
 +/// Returns a pointer to the character location.
 +/// \param pString   Pointer to the start of the string to search.
 +/// \param character The character to find.
 +//-----------------------------------------------------------------------------
 +char * strchr(const char *pString, int character)
 +{
 +    char * p = (char *)pString;
 +    char   c = character & 0xFF;
 +
 +    while(*p != c) {
 +        if (*p == 0) {
 +            return 0;
 +        }
 +        p++;
 +    }
 +    return p;
 +}
 +
 +//-----------------------------------------------------------------------------
 +/// Return the length of a given string
 +/// \param pString Pointer to the start of the string.
 +//-----------------------------------------------------------------------------
 +size_t strlen(const char *pString)
 +{
 +    unsigned int length = 0;
 +
 +    while(*pString++ != 0) {
 +        length++;
 +    }
 +    return length;
 +}
 +
 +
 +//-----------------------------------------------------------------------------
 +/// Search a character backword from the end of given string.
 +/// Returns a pointer to the character location.
 +/// \param pString   Pointer to the start of the string to search.
 +/// \param character The character to find.
 +//-----------------------------------------------------------------------------
 +char * strrchr(const char *pString, int character)
 +{
 +    char *p = 0;
 +
 +    while(*pString != 0) {
 +        if (*pString++ == character) {
 +            p = (char*)pString;
 +        }
 +    }
 +    return p;
 +}
 +
 +//-----------------------------------------------------------------------------
 +/// Copy from source string to destination string
 +/// Return a pointer to the destination string
 +/// \param pDestination Pointer to the destination string.
 +/// \param pSource      Pointer to the source string.
 +//-----------------------------------------------------------------------------
 +char * strcpy(char *pDestination, const char *pSource)
 +{
 +    char *pSaveDest = pDestination;
 +
 +    for(; (*pDestination = *pSource) != 0; ++pSource, ++pDestination);
 +    return pSaveDest;
 +}
 +
 +//-----------------------------------------------------------------------------
 +/// Compare the first specified bytes of 2 given strings
 +/// Return 0 if equals
 +/// Return >0 if 1st string > 2nd string
 +/// Return <0 if 1st string < 2nd string
 +/// \param pString1 Pointer to the start of the 1st string.
 +/// \param pString2 Pointer to the start of the 2nd string.
 +/// \param count    Number of bytes that should be compared.
 +//-----------------------------------------------------------------------------
 +int strncmp(const char *pString1, const char *pString2, size_t count)
 +{
 +    int r;
 +
 +    while(count) {
 +        r = *pString1 - *pString2;
 +        if (r == 0) {
 +            if (*pString1 == 0) {
 +                break;
 +            }
 +            pString1++;
 +            pString2++;
 +            count--;
 +            continue;
 +        }
 +        return r;
 +    }
 +    return 0;
 +}
 +
 +//-----------------------------------------------------------------------------
 +/// Copy the first number of bytes from source string to destination string
 +/// Return the pointer to the destination string.
 +/// \param pDestination Pointer to the start of destination string.
 +/// \param pSource      Pointer to the start of the source string.
 +/// \param count        Number of bytes that should be copied.
 +//-----------------------------------------------------------------------------
 +char * strncpy(char *pDestination, const char *pSource, size_t count)
 +{
 +    char *pSaveDest = pDestination;
 +
 +    while (count) {
 +        *pDestination = *pSource;
 +        if (*pSource == 0) {
 +            break;
 +        }
 +        pDestination++;
 +        pSource++;
 +        count--;
 +    }
 +    return pSaveDest;
 +}
 +
  | 
