Annotation of coherent/b/STREAMS/conf/streams/src/strings.s, revision 1.1

1.1     ! root        1: / Hand-coded string functions for STREAMS implementation.
        !             2: 
        !             3:                .unixorder
        !             4: 
        !             5:                .globl  strlen
        !             6: 
        !             7: string         =       4
        !             8: 
        !             9: strlen:
        !            10:                mov     %edi, %edx              / Preserve %edi
        !            11:                movl    string(%esp), %edi      / String start
        !            12: 
        !            13:                movl    $-1, %ecx               / Maximum string length
        !            14:                xorl    %eax, %eax              / Looking for 0
        !            15:                cld                             / Scan upwards
        !            16:                repne scasb                     / Find end-of-string
        !            17: 
        !            18:                movl    $-2, %eax               / Inital %ecx - 1
        !            19:                subl    %ecx, %eax              / Get iteration count - 1
        !            20: 
        !            21:                movl    %edx, %edi              / Restore %edi
        !            22:                ret
        !            23: 
        !            24: 
        !            25: / String copy with length limit. An important part of the semantics of this
        !            26: / operation is the fact that the destination is null-padded out the maximum
        !            27: / length every time; the operating system depends on this for security at
        !            28: / some times.
        !            29: 
        !            30:                .globl  strncpy
        !            31: 
        !            32: dest           =       4
        !            33: src            =       8
        !            34: len            =       12
        !            35: 
        !            36: strncpy:
        !            37:                movl    len(%esp), %ecx         / Maximum length
        !            38:                jecxz   ?strncpy_done
        !            39: 
        !            40:                movl    %esi, %edx              / Preserve %esi
        !            41:                movl    src(%esp), %esi         / Get src
        !            42: 
        !            43:                pushl   %edi                    / Preserve %edi
        !            44:                movl    dest+4(%esp), %edi      / Get dest, adjusting the
        !            45:                                                / stack offset for push
        !            46: 
        !            47:                cld                             / Scan upwards
        !            48: 
        !            49: ?strncpy_loop: lodsb                           / %al = * %ds:%esi ++
        !            50:                stosb                           / * %es:%edi ++ = %al
        !            51:                orb     %al, %al                / %al == 0 ?
        !            52:                loopne  ?strncpy_loop
        !            53: 
        !            54: / At some point it may be profitable to look at doing the zero-fill here in
        !            55: / 16-bit or 32-bit chunks.
        !            56: 
        !            57:                rep     stosb                   / Pad out destination, doing
        !            58:                                                / nothing if %ecx == 0
        !            59: 
        !            60:                popl    %edi                    / Restore %edi
        !            61:                movl    %edx, %esi              / Restore %esi
        !            62: 
        !            63: ?strncpy_done:
        !            64:                movl    dest(%esp), %eax        / Return destination
        !            65:                ret
        !            66: 

unix.superglobalmegacorp.com

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