clibmisc.c
上传用户:yj_qqy
上传日期:2017-01-28
资源大小:2911k
文件大小:10k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. **********************************************************************
  3. *                          Micrium, Inc.
  4. *                      949 Crestview Circle
  5. *                     Weston,  FL 33327-1848
  6. *
  7. *                            uC/FS
  8. *
  9. *             (c) Copyright 2001 - 2003, Micrium, Inc.
  10. *                      All rights reserved.
  11. *
  12. ***********************************************************************
  13. ----------------------------------------------------------------------
  14. File        : clibmisc.c
  15. Purpose     : C Library function implementation.
  16.               To avoid usage of C runtime library function, the FS
  17.               uses its own implementation of the required functions.
  18.               Do not use them yourself in the application, because
  19.               they might be limited to the functionality required by
  20.               the FS. They are NOT meant to be a replacement for an
  21.               ANSI C runtime library !
  22. ----------------------------------------------------------------------
  23. Known problems or limitations with current version
  24. ----------------------------------------------------------------------
  25. None.
  26. ---------------------------END-OF-HEADER------------------------------
  27. */
  28. /*********************************************************************
  29. *
  30. *             #include Section
  31. *
  32. **********************************************************************
  33. */
  34. #include "fs_port.h"
  35. #ifndef FS_FARCHARPTR
  36.   #define FS_FARCHARPTR char *
  37. #endif
  38. #include "fs_conf.h"
  39. #include "fs_clib.h"
  40. /*********************************************************************
  41. *
  42. *             Local Variables        
  43. *
  44. **********************************************************************
  45. */
  46. const unsigned char _ToUpperTable[] = {
  47.   0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  48.   0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  49.   0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
  50.   0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  51.   0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
  52.   0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  53.   0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
  54.   0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  55.   0x40, 'A',  'B',  'C',  'D',  'E',  'F',  'G',
  56.   'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',
  57.   'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',
  58.   'X',  'Y',  'Z', 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
  59.   0x60, 'A',  'B',  'C',  'D',  'E',  'F',  'G',
  60.   'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',
  61.   'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',
  62.   'X',  'Y',  'Z', 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
  63.   0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
  64.   0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
  65.   0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
  66.   0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
  67.   0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
  68.   0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
  69.   0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
  70.   0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
  71.   0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
  72.   0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
  73.   0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
  74.   0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
  75.   0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
  76.   0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
  77.   0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
  78.   0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
  79. };
  80. /*********************************************************************
  81. *
  82. *             Global functions
  83. *
  84. **********************************************************************
  85. */
  86. /*********************************************************************
  87. *
  88. *             FS__CLIB_strchr
  89. *
  90.   Description:
  91.   FS internal function. Locate the first occurrence of c (converted
  92.   to a char) in the string pointed to by s.
  93.   Parameters:
  94.   s           - Pointer to a zero terminated string.
  95.   c           - 'Character' value to find.
  96.  
  97.   Return value:
  98.   ==0         - c was not found
  99.   !=0         - Pointer to the located character in s.
  100. */
  101. FS_FARCHARPTR FS__CLIB_strchr(const char *s, int c) {
  102.   const char ch = c;
  103.   for (; *s != ch; ++s) {
  104.     if (*s == '') {
  105. return 0;
  106.     }
  107.   }
  108. return ((FS_FARCHARPTR)s);
  109. }
  110. /*********************************************************************
  111. *
  112. *             FS__CLIB_strlen
  113. *
  114.   Description:
  115.   FS internal function. Compute the length of a string pointed to by s.
  116.   Parameters:
  117.   s           - Pointer to a zero terminated string.
  118.  
  119.   Return value:
  120.   Number of characters preceding the terminating 0.
  121. */
  122. FS_size_t FS__CLIB_strlen(const char *s) {
  123. const char *sc;
  124.   for (sc = s; *sc != ''; ++sc) {
  125.   }
  126. return (sc - s);
  127. }
  128. /*********************************************************************
  129. *
  130. *             FS__CLIB_strncmp
  131. *
  132.   Description:
  133.   FS internal function. Compare not more than n characters from the
  134.   array pointed to by s1 to the array pointed to by s2.
  135.   Parameters:
  136.   s1          - Pointer to a character array.
  137.   s2          - Pointer to a character array.
  138.   n           - Number of characters to compare.
  139.  
  140.   Return value:
  141.   <0          - s1<s2
  142.   ==0         - s1==s2.
  143.   >0          - s1>s2
  144. */
  145. int FS__CLIB_strncmp(const char *s1, const char *s2, FS_size_t n) {
  146.   for (; 0 < n; ++s1, ++s2, --n) {
  147.     if (*s1 != *s2) {
  148. return (*(unsigned char *)s1 < *(unsigned char *)s2 ? -1 : +1);
  149.     }
  150.     else if (*s1 == '') {
  151. return 0;
  152.     }
  153.   }
  154. return 0;
  155. }
  156. /*********************************************************************
  157. *
  158. *             FS__CLIB_strcmp
  159. *
  160.   Description:
  161.   FS internal function. Compare the sring pointed to by s1 with the 
  162.   string pointed to by s2.
  163.   Parameters:
  164.   s1          - Pointer to a zero terminated string.
  165.   s2          - Pointer to a zero terminated string.
  166.  
  167.   Return value:
  168.   <0          - s1<s2
  169.   ==0         - s1==s2.
  170.   >0          - s1>s2
  171. */
  172. int FS__CLIB_strcmp(const char *s1, const char *s2) {
  173.   for (; *s1 == *s2; ++s1, ++s2) {
  174.     if (*s1 == '') 
  175.       return 0;
  176.   }
  177.   return (*(unsigned char *)s1 < *(unsigned char *)s2 ? -1 : +1);
  178. }
  179. /*********************************************************************
  180. *
  181. *             FS__CLIB_atoi
  182. *
  183.   Description:
  184.   FS internal function. Convert string to int. The function stops with
  185.   the first character it cannot convert. It expects decimal numbers only.
  186.   It can handle +/- at the beginning and leading 0. It cannot handle
  187.   HEX or any other numbers.
  188.   Parameters:
  189.   s           - Pointer to a zero terminated string.
  190.  
  191.   Return value:
  192.   0           - In case of any problem or if the converted value is zero.
  193.   !=0         - Integer value of the converted string.
  194. */
  195. int FS__CLIB_atoi(const char *s) {
  196.   int value;
  197.   int len;
  198.   int i;
  199.   unsigned int base;
  200.   const char *t;
  201.   char c;
  202.   signed char sign;
  203.   value = 0;
  204.   /* Check for +/- */
  205.   sign = 1;
  206.   len = FS__CLIB_strlen(s);
  207.   if (len <= 0) {
  208.     return 0;
  209.   }
  210.   t = s;
  211.   if (*t == '-') {
  212.     t++;
  213.     sign = -1;
  214.   }
  215.   else if (*t == '+') {
  216.     t++;
  217.   }
  218.   /* Skip leading 0 */
  219.   len = FS__CLIB_strlen(t);
  220.   if (len <= 0) {
  221.     return 0;
  222.   }
  223.   while (1) {
  224.     if (*t != '0') {
  225.       break;
  226.     }
  227.     t++;
  228.     len--;
  229.     if (len <= 0) {
  230.       break;
  231.     }
  232.   }
  233.   /* Find end of number */
  234.   for (i = 0; i < len; i++) {
  235.     if (t[i] > '9') {
  236.       break;
  237.     }
  238.     if (t[i] < '0') {
  239.       break;
  240.     }
  241.   }
  242.   len = i;
  243.   if (len <= 0) {
  244.       return 0;
  245.   }
  246.   /* Calculate base */
  247.   base = 1;
  248.   for (i = 1; i < len; i++) {
  249.     base *= 10;
  250.   }
  251.   /* Get value */
  252.   for (i = 0; i < len; i++) {
  253.     c = t[i];
  254.     if (c > '9') {
  255.       break;
  256.     }
  257.     if (c < '0') {
  258.       break;
  259.     }
  260.     c -= '0';
  261.     value += c*base;
  262.     base /= 10;
  263.   }
  264.   return sign * value;
  265. }
  266. /*********************************************************************
  267. *
  268. *             FS__CLIB_memset
  269. *
  270.   Description:
  271.   FS internal function. Copy the value of c (converted to an unsigned
  272.   char) into each of the first n characters of the object pointed to 
  273.   by s.
  274.   Parameters:
  275.   s           - Pointer to an object.
  276.   c           - 'Character' value to be set.
  277.   n           - Number of characters to be set.
  278.  
  279.   Return value:
  280.   Value of s.
  281. */
  282. void *FS__CLIB_memset(void *s, int c, FS_size_t n) {
  283.   const unsigned char uc = c;
  284.   unsigned char *su = (unsigned char *)s;
  285.   
  286.   for (; 0 < n; ++su, --n) {
  287.     *su = uc;
  288.   }
  289.   return s;
  290. }
  291. /*********************************************************************
  292. *
  293. *             FS__CLIB_memcpy
  294. *
  295.   Description:
  296.   FS internal function. Copy n characters from the object pointed to
  297.   by s2 into the object pointed to by s1. 
  298.   Parameters:
  299.   s1          - Pointer to an object.
  300.   s2          - Pointer to an object.
  301.   n           - Number of characters to copy.
  302.  
  303.   Return value:
  304.   Value of s1.
  305. */
  306. void *FS__CLIB_memcpy(void *s1, const void *s2, FS_size_t n) {
  307.   char *su1 = (char *)s1;
  308.   const char *su2 = (const char *)s2;
  309.   
  310.   for (; 0 < n; ++su1, ++su2, --n) {
  311.     *su1 = *su2;
  312.   }
  313.   return s1;
  314. }
  315. /*********************************************************************
  316. *
  317. *             FS__CLIB_strncpy
  318. *
  319.   Description:
  320.   FS internal function. Copy not more than n characters from the array
  321.   pointed to by s2 to the array pointed to by s1.
  322.   Parameters:
  323.   s1          - Pointer to a character array.
  324.   s2          - Pointer to a character array.
  325.   n           - Number of characters to copy.
  326.  
  327.   Return value:
  328.   Value of s1.
  329. */
  330. char *FS__CLIB_strncpy(char *s1, const char *s2, FS_size_t n) {
  331.   char *s;
  332.   
  333.   for (s = s1; (0 < n) && (*s2 != ''); --n) {
  334.     *s++ = *s2++; /* copy at most n chars from s2[] */
  335.   }
  336.   for (; 0 < n; --n) {
  337.     *s++ = '';
  338.   }
  339.   return s1;
  340. }
  341. /*********************************************************************
  342. *
  343. *             FS__CLIB_toupper
  344. *
  345.   Description:
  346.   FS internal function. Convert a lowecase letter to a corresponding
  347.   uppercase letter. 
  348.   Parameters:
  349.   c           - Letter to convert.
  350.  
  351.   Return value:
  352.   Corresponding uppercase character.
  353. */
  354. int FS__CLIB_toupper(int c) {
  355.   return (int)_ToUpperTable[c];
  356. }