Annotation of researchv10no/libc/gen/strncat.s, revision 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.