~ubuntu-branches/ubuntu/raring/avr-libc/raring-proposed

« back to all changes in this revision

Viewing changes to libc/string/strcasecmp.S

  • Committer: Bazaar Package Importer
  • Author(s): Hakan Ardo
  • Date: 2008-08-10 09:59:16 UTC
  • mfrom: (1.2.1 upstream) (8 intrepid)
  • mto: (4.1.7 sid)
  • mto: This revision was merged to the branch mainline in revision 9.
  • Revision ID: james.westby@ubuntu.com-20080810095916-7ku06pjsfia3hz16
Added build-depends on texlive-extra-utils (closes: #493454)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* Copyright (c) 2002, Reiner Patommel
 
1
/* Copyright (c) 2002, 2007 Reiner Patommel
 
2
   Copyright (c) 2007  Dmitry Xmelkov
2
3
   All rights reserved.
3
4
 
4
5
   Redistribution and use in source and binary forms, with or without
26
27
  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
28
  POSSIBILITY OF SUCH DAMAGE. */
28
29
 
29
 
/* $Id: strcasecmp.S,v 1.6 2005/11/05 16:49:46 aesok Exp $ */
 
30
/* $Id: strcasecmp.S,v 1.9 2007/03/02 11:23:32 dmix Exp $ */
30
31
 
31
32
/*
32
33
   strcasecmp.S
35
36
   Contributors:
36
37
     Created by Reiner Patommel
37
38
*/
 
39
/** \file */
 
40
 
 
41
/** \ingroup avr_string
 
42
    \fn int strcasecmp(const char *s1, const char *s2)
 
43
    \brief Compare two strings ignoring case.
 
44
 
 
45
    The strcasecmp() function compares the two strings \p s1 and \p s2,
 
46
    ignoring the case of the characters.
 
47
 
 
48
    \returns The strcasecmp() function returns an integer less than,
 
49
    equal to, or greater than zero if \p s1 is found, respectively, to
 
50
    be less than, to match, or be greater than \p s2. A consequence of
 
51
    the ordering used by strcasecmp() is that if \p s1 is an initial
 
52
    substring of \p s2, then \p s1 is considered to be "less than"
 
53
    \p s2.      */
 
54
 
 
55
#if !defined(__DOXYGEN__)
 
56
 
38
57
#include "macros.inc"
39
58
 
40
59
#define s1_hi r25
46
65
#define ret_lo r24
47
66
 
48
67
#define tmp r22
49
 
#define cht r21
50
 
 
51
 
/** \ingroup avr_string
52
 
    \fn int strcasecmp(const char *s1, const char *s2)
53
 
    \brief Compare two strings ignoring case.
54
 
 
55
 
    The strcasecmp() function compares the two strings s1 and s2, ignoring the
56
 
    case of the characters.
57
 
 
58
 
    \returns The strcasecmp() function returns an integer less than, equal to,
59
 
    or greater than zero if s1 is found, respectively, to be less than, to
60
 
    match, or be greater than s2.  */
61
 
 
62
 
#if !defined(__DOXYGEN__)
63
68
 
64
69
        .text
65
70
        .global _U(strcasecmp)
68
73
_U(strcasecmp):
69
74
        X_movw  ZL, s2_lo
70
75
        X_movw  XL, s1_lo
71
 
.L_strcasecmp_loop:
72
 
        LD      ret_lo, X+              ; load *s1
73
 
        LD      tmp, Z+                 ; load *s2
74
 
        MOV     cht, tmp                ; copy of *s2 to tmp
75
 
        ORI     cht, 0x20               ; make tmp lower case
76
 
        CPI     cht, 'a'                ; test on [a .. z]
77
 
        BRLT    .L_strcasecmp_tst
78
 
        CPI     cht, 'z'+1
79
 
        BRGE    .L_strcasecmp_tst
80
 
        ORI     tmp, 0x20               ; we got an aplpha in s2
81
 
        ORI     ret_lo, 0x20
82
 
.L_strcasecmp_tst:                      ; compare
83
 
        SUB     ret_lo, tmp
84
 
        BRNE    .L_strcasecmp_done
85
 
        TST     tmp                     ; end of s2?
86
 
        BRNE    .L_strcasecmp_loop
87
 
.L_strcasecmp_done:
88
 
; ret_hi = SREG.C ? 0xFF : 0
89
 
        SBC     ret_hi, ret_hi
90
 
        RET
91
 
.L_strcasecmp_end:
92
 
        .size   _U(strcasecmp), .L_strcasecmp_end - _U(strcasecmp)
 
76
 
 
77
1:      ld      ret_lo, X+              ; *s1++
 
78
        cpi     ret_lo, 'A'             ; if in [A-Z] then tolower()
 
79
        brlt    2f
 
80
        cpi     ret_lo, 'Z'+1
 
81
        brge    2f
 
82
        subi    ret_lo, 'A'-'a'
 
83
 
 
84
2:      ld      tmp, Z+                 ; *s2++
 
85
        cpi     tmp, 'A'                ; if in [A-Z] then tolower()
 
86
        brlt    3f
 
87
        cpi     tmp, 'Z'+1
 
88
        brge    3f
 
89
        subi    tmp, 'A'-'a'
 
90
 
 
91
3:      sub     ret_lo, tmp             ; compare
 
92
        cpse    tmp, __zero_reg__       ; break, if end of string
 
93
        breq    1b
 
94
 
 
95
        sbc     ret_hi, ret_hi          ; sign extension
 
96
        ret
 
97
 
 
98
        .size   _U(strcasecmp), . - _U(strcasecmp)
93
99
 
94
100
#endif /* not __DOXYGEN__ */