~ubuntu-branches/ubuntu/gutsy/avr-libc/gutsy

« back to all changes in this revision

Viewing changes to libc/string/strlcat.S

  • Committer: Bazaar Package Importer
  • Author(s): Hakan Ardo
  • Date: 2006-11-15 21:12:47 UTC
  • mfrom: (3.1.2 feisty)
  • Revision ID: james.westby@ubuntu.com-20061115211247-b7qhgnb6o49v5zsg
Tags: 1:1.4.5-2
* Convertion to debheler fixed (closes: #398220)
* Reference to /usr/share/common-licenses in copyright file

Show diffs side-by-side

added added

removed removed

Lines of Context:
32
32
 
33
33
*/
34
34
 
 
35
/* $Id: strlcat.S,v 1.4 2005/11/02 22:08:03 aesok Exp $ */
35
36
 
36
37
/** \ingroup avr_string
37
38
    \fn size_t strlcat (char *dst, const char *src, size_t siz)
44
45
    \returns The strlcat() function returns strlen(src) + MIN(siz,
45
46
    strlen(initial dst)).  If retval >= siz, truncation occurred.  */
46
47
 
47
 
#if !defined(DOXYGEN)
 
48
#if !defined(__DOXYGEN__)
48
49
 
49
50
#include "gasava.inc"
50
51
#include "macros.inc"
59
60
#define dlen_lo         r18
60
61
#define rWord_hi        r25
61
62
#define rWord_lo        r24
62
 
#define Z_hi            r31
63
 
#define Z_lo            r30
64
 
#define X_hi            r27
65
 
#define X_lo            r26
66
63
 
67
64
        .text
68
65
        .global _U(strlcat)
69
 
        .type    _U(strlcat),@function
 
66
        .type   _U(strlcat),@function
70
67
 
71
68
_U(strlcat):
72
 
        LOAD_X  (dst_lo, dst_hi)        ; X = dst
73
 
        LOAD_Z  (src_lo, src_hi)        ; Z = src
 
69
        X_movw  XL, dst_lo              ; X = dst
 
70
        X_movw  ZL, src_lo              ; Z = src
74
71
 
75
 
.strlcat_dlen:                          ; Find end of dst string
 
72
.L_strlcat_dlen:                        ; Find end of dst string
76
73
        ld      __tmp_reg__, X+         ; get next char from dst
77
74
        cp      siz_lo, __zero_reg__    ;  and calc dlen = len of dst
78
75
        cpc     siz_hi, __zero_reg__    ; size == 0 ?
81
78
        breq     1f                     ; --> done
82
79
        subi    siz_lo, lo8(-(-1))
83
80
        sbci    siz_hi, hi8(-(-1))      ; siz--
84
 
        rjmp    .strlcat_dlen           ; --> next char
85
 
1:      sbiw    X_lo, 1                 ; undo post increment
86
 
#if __AVR_ENHANCED__
87
 
        movw    dlen_lo, X_lo
88
 
#else
89
 
        mov     dlen_lo, X_lo
90
 
        mov     dlen_hi, X_hi
91
 
#endif
 
81
        rjmp    .L_strlcat_dlen         ; --> next char
 
82
1:      sbiw    XL, 1                   ; undo post increment
 
83
        X_movw  dlen_lo, XL
92
84
        sub     dlen_lo, dst_lo
93
85
        sbc     dlen_hi, dst_hi         ; dlen = X - dst
94
86
        cp      siz_lo, __zero_reg__
95
87
        cpc     siz_hi, __zero_reg__    ; size == 0 ?
96
 
        breq    .strlcat_slen           ; --> done
 
88
        breq    .L_strlcat_slen         ; --> done
97
89
        subi    siz_lo, lo8(-(-1))
98
90
        sbci    siz_hi, hi8(-(-1))      ; siz--
99
91
 
100
 
.strlcat_concat:                        ; Concatenate
 
92
.L_strlcat_concat:                      ; Concatenate
101
93
        ld      __tmp_reg__, Z+         ; get next char from src
102
94
        cp      siz_lo, __zero_reg__
103
95
        cpc     siz_hi, __zero_reg__    ; size == 0 ?
107
99
        st      X+, __tmp_reg__         ; store in dest
108
100
        subi    siz_lo, lo8(-(-1))
109
101
        sbci    siz_hi, hi8(-(-1))      ; siz--
110
 
        rjmp    .strlcat_concat         ; --> next char
 
102
        rjmp    .L_strlcat_concat               ; --> next char
111
103
1:      st      X, __zero_reg__         ; *X = '\0'
112
 
        sbiw    Z_lo, 1                 ; undo post increment
 
104
        sbiw    ZL, 1                   ; undo post increment
113
105
 
114
 
.strlcat_slen:
 
106
.L_strlcat_slen:
115
107
        ld      __tmp_reg__, Z+         ; get next char from src
116
108
        tst     __tmp_reg__             ; end of src ?
117
 
        brne    .strlcat_slen           ; --> next char
118
 
        sbiw    Z_lo, 1                 ; undo post increment
119
 
#if __AVR_ENHANCED__
120
 
        movw    rWord_lo, dlen_lo
121
 
#else
122
 
        mov     rWord_lo, dlen_lo
123
 
        mov     rWord_hi, dlen_hi
124
 
#endif
125
 
        add     rWord_lo, Z_lo
126
 
        adc     rWord_hi, Z_hi
 
109
        brne    .L_strlcat_slen         ; --> next char
 
110
        sbiw    ZL, 1                   ; undo post increment
 
111
        X_movw  rWord_lo, dlen_lo
 
112
        add     rWord_lo, ZL
 
113
        adc     rWord_hi, ZH
127
114
        sub     rWord_lo, src_lo
128
115
        sbc     rWord_hi, src_hi        ; return(dlen + (Z - src))
129
116
        ret
130
117
 
131
 
.strlcat_end:
132
 
.size   _U(strlcat), .strlcat_end - _U(strlcat)
 
118
.L_strlcat_end:
 
119
.size   _U(strlcat), .L_strlcat_end - _U(strlcat)
133
120
 
134
 
#endif /* not DOXYGEN */
 
121
#endif /* not __DOXYGEN__ */