Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
359 serge 1
/****************************************************************************
2
*
3
*                            Open Watcom Project
4
*
5
*    Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
6
*
7
*  ========================================================================
8
*
9
*    This file contains Original Code and/or Modifications of Original
10
*    Code as defined in and that are subject to the Sybase Open Watcom
11
*    Public License version 1.0 (the 'License'). You may not use this file
12
*    except in compliance with the License. BY USING THIS FILE YOU AGREE TO
13
*    ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
14
*    provided with the Original Code and Modifications, and is also
15
*    available at www.sybase.com/developer/opensource.
16
*
17
*    The Original Code and all software distributed under the License are
18
*    distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
19
*    EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
20
*    ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
21
*    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
22
*    NON-INFRINGEMENT. Please see the License for the specific language
23
*    governing rights and limitations under the License.
24
*
25
*  ========================================================================
26
*
27
* Description:  WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
28
*               DESCRIBE IT HERE!
29
*
30
****************************************************************************/
31
 
32
 
33
#include "variety.h"
34
#include "widechar.h"
35
#include 
36
#include "riscstr.h"
37
 
38
#if defined(M_I86) & !defined(__WIDECHAR__)
39
 
40
extern char *fast_strncpy( char _WCFAR *, const char *, size_t );
41
 
42
#if defined(__SMALL_DATA__)
43
 
44
#pragma aux fast_strncpy = \
45
        0x57            /* push di */\
46
        0xac            /* L1: lodsb */\
47
        0xaa            /* stosb */\
48
        0x84 0xc0       /* test al,al */\
49
        0xe0 0xfa       /* loopne L1 */\
50
        0x31 0xc0       /* xor ax,ax */\
51
        0xd1 0xe9       /* shr cx,1 */\
52
        0xf3 0xab       /* rep stosw */\
53
        0x11 0xc9       /* adc cx,cx */\
54
        0xf3 0xaa       /* rep stosb */\
55
        0x58            /* pop ax */\
56
        parm caller     [es di] [si] [cx]\
57
        value           [ax] \
58
        modify exact    [ax cx si di];
59
 
60
#else
61
 
62
#pragma aux fast_strncpy = \
63
        0x1e            /* push ds */ \
64
        0x8e 0xda       /* mov ds,dx */ \
65
        0x57            /* push di */\
66
        0xac            /* L1: lodsb */\
67
        0xaa            /* stosb */\
68
        0x84 0xc0       /* test al,al */\
69
        0xe0 0xfa       /* loopne L1 */\
70
        0x31 0xc0       /* xor ax,ax */\
71
        0xd1 0xe9       /* shr cx,1 */\
72
        0xf3 0xab       /* rep stosw */\
73
        0x11 0xc9       /* adc cx,cx */\
74
        0xf3 0xaa       /* rep stosb */\
75
        0x58            /* pop ax */\
76
        0x1f            /* pop ds */ \
77
        parm caller     [es di] [dx si] [cx]\
78
        value           [es ax] \
79
        modify exact    [ax cx si di];
80
 
81
#endif
82
 
83
#endif
84
 
85
 
86
#if defined(__RISCSTR__) && defined(__WIDECHAR__)
87
 _WCRTLINK CHAR_TYPE *__simple_wcsncpy( CHAR_TYPE *dst, const CHAR_TYPE *src, size_t len )
88
#else
89
 _WCRTLINK CHAR_TYPE *__F_NAME(strncpy,wcsncpy)( CHAR_TYPE *dst, const CHAR_TYPE *src, size_t len )
90
#endif
91
    {
92
#if defined(M_I86) && !defined(__WIDECHAR__)
93
        if( len ) {
94
            return( fast_strncpy( dst, src, len ) );
95
        }
96
        return( dst );
97
#else
98
        CHAR_TYPE *ret;
99
 
100
        ret = dst;
101
        for(;len; --len ) {
102
            if( *src == NULLCHAR ) break;
103
            *dst++ = *src++;
104
        }
105
        while( len != 0 ) {
106
            *dst++ = NULLCHAR;      /* pad destination string with null chars */
107
            --len;
108
        }
109
        return( ret );
110
#endif
111
    }