Annotation of researchv10no/libc/gen/strncat.s, revision 1.1.1.1

1.1       root        1:        .file   "strncat.s"
                      2: #      @(#)strncat.s   1.6
                      3: #      3.0 SID #       1.2
                      4: # Fast assembler language version of the following C-program
                      5: #                      strncat
                      6: # which represents the `standard' for the C-library.
                      7: 
                      8: # Concatenate s2 on the end of s1.  S1's space must be large enough.
                      9: # At most n characters are moved.  Return (null terminated) s1.
                     10: 
                     11: #      char *
                     12: #      strncat(s1, s2, n)
                     13: #      register char *s1, *s2;
                     14: #      register n;
                     15: #      {
                     16: #              register char *os1;
                     17: #      
                     18: #              os1 = s1;
                     19: #              while(*s1++)
                     20: #                      ;
                     21: #              --s1;
                     22: #              while(*s1++ = *s2++)
                     23: #                      if(--n < 0) {
                     24: #                              *--s1 = '\0';
                     25: #                              break;
                     26: #                      }
                     27: #              return(os1);
                     28: #      }
                     29:        .globl  _strncat
                     30:        .text
                     31:        .align  2
                     32: _strncat:
                     33:        .word   0x03c0          # uses regs. 0,1,2,3,4,5,6,7,8,9
                     34:        movq    4(ap),r6        # dest in r6, src in r7
                     35:        movl    12(ap),r8       # max src length (arg `n')
                     36:        bleq    L6              # done if <= 0
                     37:        movl    r6,r1           # working copy of dest
                     38: L0:
                     39:        locc    $0,$65535,(r1)  # gotta find the end of dest
                     40:        beql    L0              # BIG string, go around again
                     41:        movl    r1,r3           # found the null to cat onto
                     42: L1:
                     43:        subl3   $65535,r8,r9    # may have to take it in chunks
                     44:        blss    L2              # skip if `n' < 65535
                     45:        movl    $65535,r8       # else use 65535 as `chunk' length
                     46: L2:
                     47:        locc    $0,r8,(r7)      # see if there's a null in src
                     48:        bneq    L3              # found null, go move string & quit
                     49:        movc3   r8,(r7),(r3)    # else move a `chunk' of data
                     50:        tstl    r9              # ask if `n' is bigger than 65535
                     51:        bleq    L5              # skip to finish if `n' was small
                     52:        movl    r9,r8           # else reduce `n' by 65535,
                     53:        movl    r1,r7           # update source ptr,
                     54:        jmp     L1              # and go again
                     55: L3:
                     56:        subl3   r7,r1,r5        # calculate length of piece to move
                     57:        cmpl    r8,r5           # is `n' <= length of src?
                     58:        bleq    L4              # YES, then hop onward and use `n'
                     59:        movl    r5,r8           # NO, then use length
                     60: L4:
                     61:        movc3   r8,(r7),(r3)    # and then move it
                     62: L5:
                     63:        movb    $0,(r3)         # stick in the terminating null
                     64: L6:
                     65:        movl    r6,r0           # return pointer to dest
                     66:        ret

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.