string.c
上传用户:jnhtjd
上传日期:2022-07-16
资源大小:403k
文件大小:9k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /* ----------------------------------------------------------------------------
  2.  *         ATMEL Microcontroller Software Support 
  3.  * ----------------------------------------------------------------------------
  4.  * Copyright (c) 2008, Atmel Corporation
  5.  *
  6.  * All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions are met:
  10.  *
  11.  * - Redistributions of source code must retain the above copyright notice,
  12.  * this list of conditions and the disclaimer below.
  13.  *
  14.  * Atmel's name may not be used to endorse or promote products derived from
  15.  * this software without specific prior written permission.
  16.  *
  17.  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  19.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
  20.  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  22.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  23.  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  24.  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  25.  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  26.  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  * ----------------------------------------------------------------------------
  28.  */
  29. //------------------------------------------------------------------------------
  30. /// unit
  31. ///
  32. /// !Purpose
  33. ///
  34. /// Implementation of several methods defined in string.h, for reducing the
  35. /// memory footprint when using them (since the whole libc.o file gets included
  36. /// even when using a single method).
  37. ///
  38. /// !Usage
  39. ///
  40. /// Add string.c to the list of files to compile for the project. This will
  41. /// automatically replace standard libc methods by the custom ones.
  42. //------------------------------------------------------------------------------
  43. //------------------------------------------------------------------------------
  44. //         Headers
  45. //------------------------------------------------------------------------------
  46. #include <string.h>
  47. //------------------------------------------------------------------------------
  48. //         Global Functions
  49. //------------------------------------------------------------------------------
  50. //------------------------------------------------------------------------------
  51. /// Copies data from a source buffer into a destination buffer. The two buffers
  52. /// must NOT overlap. Returns the destination buffer.
  53. /// param pDestination  Destination buffer.
  54. /// param pSource  Source buffer.
  55. /// param num  Number of bytes to copy.
  56. //------------------------------------------------------------------------------
  57. void * memcpy(void *pDestination, const void *pSource, size_t num)
  58. {
  59.     unsigned char *pByteDestination;
  60.     unsigned char *pByteSource;
  61.     unsigned int *pAlignedSource = (unsigned int *) pSource;
  62.     unsigned int *pAlignedDestination = (unsigned int *) pDestination;
  63.     // If num is more than 4 bytes, and both dest. and source are aligned,
  64.     // then copy dwords
  65.     if ((((unsigned int) pAlignedDestination & 0x3) == 0)
  66.         && (((unsigned int) pAlignedSource & 0x3) == 0)
  67.         && (num >= 4)) {
  68.         while (num >= 4) {
  69.             *pAlignedDestination++ = *pAlignedSource++;
  70.             num -= 4;
  71.         }
  72.     }
  73.     // Copy remaining bytes
  74.     pByteDestination = (unsigned char *) pAlignedDestination;
  75.     pByteSource = (unsigned char *) pAlignedSource;
  76.     while (num--) {
  77.         *pByteDestination++ = *pByteSource++;
  78.     }
  79.     return pDestination;
  80. }
  81. //------------------------------------------------------------------------------
  82. /// Fills a memory region with the given value. Returns a pointer to the
  83. /// memory region.
  84. /// param pBuffer  Pointer to the start of the memory region to fill
  85. /// param value    Value to fill the region with
  86. /// param num      Size to fill in bytes
  87. //------------------------------------------------------------------------------
  88. void * memset(void *pBuffer, int value, size_t num)
  89. {
  90.     unsigned char *pByteDestination;
  91.     unsigned int  *pAlignedDestination = (unsigned int *) pBuffer;
  92.     unsigned int  alignedValue = (value << 24) | (value << 16) | (value << 8) | value;
  93.     // Set words if possible
  94.     if ((((unsigned int) pAlignedDestination & 0x3) == 0) && (num >= 4)) {
  95.         while (num >= 4) {
  96.             *pAlignedDestination++ = alignedValue;
  97.             num -= 4;
  98.         }
  99.     }
  100.     // Set remaining bytes
  101.     pByteDestination = (unsigned char *) pAlignedDestination;
  102.     while (num--) {
  103.         *pByteDestination++ = value;
  104.     }
  105.     return pBuffer;
  106. }
  107. //-----------------------------------------------------------------------------
  108. /// Search a character in the given string.
  109. /// Returns a pointer to the character location.
  110. /// param pString   Pointer to the start of the string to search.
  111. /// param character The character to find.
  112. //-----------------------------------------------------------------------------
  113. char * strchr(const char *pString, int character)
  114. {
  115.     char * p = (char *)pString;
  116.     char   c = character & 0xFF;
  117.     while(*p != c) {
  118.         if (*p == 0) {
  119.             return 0;
  120.         }
  121.         p++;
  122.     }
  123.     return p;
  124. }
  125. //-----------------------------------------------------------------------------
  126. /// Return the length of a given string
  127. /// param pString Pointer to the start of the string.
  128. //-----------------------------------------------------------------------------
  129. size_t strlen(const char *pString)
  130. {
  131.     unsigned int length = 0;
  132.     while(*pString++ != 0) {
  133.         length++;
  134.     }
  135.     return length;
  136. }
  137. //-----------------------------------------------------------------------------
  138. /// Search a character backword from the end of given string.
  139. /// Returns a pointer to the character location.
  140. /// param pString   Pointer to the start of the string to search.
  141. /// param character The character to find.
  142. //-----------------------------------------------------------------------------
  143. char * strrchr(const char *pString, int character)
  144. {
  145.     char *p = 0;
  146.     while(*pString != 0) {
  147.         if (*pString++ == character) {
  148.             p = (char*)pString;
  149.         }
  150.     }
  151.     return p;
  152. }
  153. //-----------------------------------------------------------------------------
  154. /// Copy from source string to destination string
  155. /// Return a pointer to the destination string
  156. /// param pDestination Pointer to the destination string.
  157. /// param pSource      Pointer to the source string.
  158. //-----------------------------------------------------------------------------
  159. char * strcpy(char *pDestination, const char *pSource)
  160. {
  161.     char *pSaveDest = pDestination;
  162.     for(; (*pDestination = *pSource) != 0; ++pSource, ++pDestination);
  163.     return pSaveDest;
  164. }
  165. //-----------------------------------------------------------------------------
  166. /// Compare the first specified bytes of 2 given strings
  167. /// Return 0 if equals
  168. /// Return >0 if 1st string > 2nd string
  169. /// Return <0 if 1st string < 2nd string
  170. /// param pString1 Pointer to the start of the 1st string.
  171. /// param pString2 Pointer to the start of the 2nd string.
  172. /// param count    Number of bytes that should be compared.
  173. //-----------------------------------------------------------------------------
  174. int strncmp(const char *pString1, const char *pString2, size_t count)
  175. {
  176.     int r;
  177.     while(count) {
  178.         r = *pString1 - *pString2;
  179.         if (r == 0) {
  180.             if (*pString1 == 0) {
  181.                 break;
  182.             }
  183.             pString1++;
  184.             pString2++;
  185.             count--;
  186.             continue;
  187.         }
  188.         return r;
  189.     }
  190.     return 0;
  191. }
  192. //-----------------------------------------------------------------------------
  193. /// Copy the first number of bytes from source string to destination string
  194. /// Return the pointer to the destination string.
  195. /// param pDestination Pointer to the start of destination string.
  196. /// param pSource      Pointer to the start of the source string.
  197. /// param count        Number of bytes that should be copied.
  198. //-----------------------------------------------------------------------------
  199. char * strncpy(char *pDestination, const char *pSource, size_t count)
  200. {
  201.     char *pSaveDest = pDestination;
  202.     while (count) {
  203.         *pDestination = *pSource;
  204.         if (*pSource == 0) {
  205.             break;
  206.         }
  207.         pDestination++;
  208.         pSource++;
  209.         count--;
  210.     }
  211.     return pSaveDest;
  212. }