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

1.1       root        1:        .file   "strncpy.s"
                      2: #      @(#)strncpy.s   1.6
                      3: # Fast assembler language version of the following C-program
                      4: #                      strncpy
                      5: # which represents the `standard' for the C-library.
                      6: 
                      7: # Copy s2 to s1, truncating or null-padding to always copy n bytes.
                      8: # Return s1
                      9: 
                     10: #      char *
                     11: #      strncpy(s1, s2, n)
                     12: #      register char *s1, *s2;
                     13: #      register int n;
                     14: #      {
                     15: #              register char *os1 = s1;
                     16: #      
                     17: #              while (--n >= 0)
                     18: #                      if ((*s1++ = *s2++) == '\0')
                     19: #                              while (--n >= 0)
                     20: #                                      *s1++ = '\0';
                     21: #              return (os1);
                     22: #      }
                     23:        .globl  _strncpy
                     24:        .text
                     25:        .align  2
                     26: _strncpy:
                     27:        .word   0x03c0          # uses regs. 0,1,2,3,4,5,6,7,8,9
                     28:        movl    12(ap),r5       # source length (arg `n')
                     29:        bleq    L4              # n <= 0, so return now!
                     30:        movq    4(ap),r3        # dest ptr
                     31:        movl    r4,r6           # working copy of src ptr
                     32:        movl    r5,r2           # copy of `n' for dest. length
                     33:        movl    $65535,r9       # max length for vax string instructions
                     34: L0:
                     35:        subl3   r9,r5,r8        # is max src.len VERY large?
                     36:        bleq    L1              # hop if not
                     37:        movl    r9,r5           # wow, src.limit > 65535, (and r8 > 0)
                     38: L1:
                     39:        locc    $0,r5,(r6)      # look for terminal null in src.
                     40:        beql    L2              # none? then r5 is right, so hop
                     41:        subl3   r6,r1,r5        # else src.len < `n'. (put in r5).
                     42:        clrl    r8              # indicate no more (src) iterations
                     43: L2:
                     44:        subl3   r9,r2,r7        # is dest.len VERY large?
                     45:        bleq    L3              # hop if not
                     46:        movl    r9,r2           # dest.limit was > 65535 (and r7 > 0)
                     47: L3:
                     48:        movc5   r5,(r6),$0,r2,(r3)      # Move n bytes, pad with nulls
                     49:        movl    r7,r2           # was dst.ln > 65535?
                     50:        bleq    L4              # NO, we're done
                     51:        movl    r8,r5           # YES, was src.ln also > 65535?
                     52:        bgtr    L0              # YES, then go move some more
                     53:        clrl    r5              # NO, set up to pad nulls
                     54:        jbr     L2              #   to dst.ln `n'
                     55: L4:
                     56:        movl    4(ap),r0        # we're done - return s1
                     57:        ret

unix.superglobalmegacorp.com

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