~linaro-toolchain-dev/cortex-strings/trunk

73 by Michael Hope
Added the C only routines from Newlib 1.20+20120605~git3af2fa7
1
/*
2
FUNCTION
3
	<<strcmp>>---character string compare
4
	
5
INDEX
6
	strcmp
7
8
ANSI_SYNOPSIS
9
	#include <string.h>
10
	int strcmp(const char *<[a]>, const char *<[b]>);
11
12
TRAD_SYNOPSIS
13
	#include <string.h>
14
	int strcmp(<[a]>, <[b]>)
15
	char *<[a]>;
16
	char *<[b]>;
17
18
DESCRIPTION
19
	<<strcmp>> compares the string at <[a]> to
20
	the string at <[b]>.
21
22
RETURNS
23
	If <<*<[a]>>> sorts lexicographically after <<*<[b]>>>,
24
	<<strcmp>> returns a number greater than zero.  If the two
25
	strings match, <<strcmp>> returns zero.  If <<*<[a]>>>
26
	sorts lexicographically before <<*<[b]>>>, <<strcmp>> returns a
27
	number less than zero.
28
29
PORTABILITY
30
<<strcmp>> is ANSI C.
31
32
<<strcmp>> requires no supporting OS subroutines.
33
34
QUICKREF
35
	strcmp ansi pure
36
*/
37
38
#include "shim.h"
39
#include <string.h>
40
#include <limits.h>
41
42
#undef strcmp
43
44
/* Nonzero if either X or Y is not aligned on a "long" boundary.  */
45
#define UNALIGNED(X, Y) \
46
  (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1)))
47
48
/* DETECTNULL returns nonzero if (long)X contains a NULL byte. */
49
#if LONG_MAX == 2147483647L
50
#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080)
51
#else
52
#if LONG_MAX == 9223372036854775807L
53
#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080)
54
#else
55
#error long int is not a 32bit or 64bit type.
56
#endif
57
#endif
58
59
#ifndef DETECTNULL
60
#error long int is not a 32bit or 64bit byte
61
#endif
62
63
int
64
_DEFUN (strcmp, (s1, s2),
65
	_CONST char *s1 _AND
66
	_CONST char *s2)
67
{ 
68
#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__)
69
  while (*s1 != '\0' && *s1 == *s2)
70
    {
71
      s1++;
72
      s2++;
73
    }
74
75
  return (*(unsigned char *) s1) - (*(unsigned char *) s2);
76
#else
77
  unsigned long *a1;
78
  unsigned long *a2;
79
80
  /* If s1 or s2 are unaligned, then compare bytes. */
81
  if (!UNALIGNED (s1, s2))
82
    {  
83
      /* If s1 and s2 are word-aligned, compare them a word at a time. */
84
      a1 = (unsigned long*)s1;
85
      a2 = (unsigned long*)s2;
86
      while (*a1 == *a2)
87
        {
88
          /* To get here, *a1 == *a2, thus if we find a null in *a1,
89
	     then the strings must be equal, so return zero.  */
90
          if (DETECTNULL (*a1))
91
	    return 0;
92
93
          a1++;
94
          a2++;
95
        }
96
97
      /* A difference was detected in last few bytes of s1, so search bytewise */
98
      s1 = (char*)a1;
99
      s2 = (char*)a2;
100
    }
101
102
  while (*s1 != '\0' && *s1 == *s2)
103
    {
104
      s1++;
105
      s2++;
106
    }
107
  return (*(unsigned char *) s1) - (*(unsigned char *) s2);
108
#endif /* not PREFER_SIZE_OVER_SPEED */
109
}