diff options
Diffstat (limited to 'private/crt32/mbstring/mbsnset.c')
-rw-r--r-- | private/crt32/mbstring/mbsnset.c | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/private/crt32/mbstring/mbsnset.c b/private/crt32/mbstring/mbsnset.c new file mode 100644 index 000000000..4b24cd5c1 --- /dev/null +++ b/private/crt32/mbstring/mbsnset.c @@ -0,0 +1,110 @@ +/*** +*mbsnset.asm - Sets first n charcaters of string to given character (MBCS) +* +* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved. +* +*Purpose: +* Sets first n charcaters of string to given character (MBCS) +* +*Revision History: +* 11-19-92 KRS Ported from 16-bit sources. +* 08-20-93 CFW Change short params to int for 32-bit tree. +* +*******************************************************************************/ + +#ifdef _MBCS +#include <cruntime.h> +#include <mbdata.h> +#include <mbctype.h> +#include <mbstring.h> + +/*** +* _mbsnset - Sets first n charcaters of string to given character (MBCS) +* +*Purpose: +* Sets the first n characters of string to the supplied +* character value. If the length of string is less than n, +* the length of string is used in place of n. Handles +* MBCS chars correctly. +* +* There are several factors that make this routine complicated: +* (1) The fill value may be 1 or 2 bytes long. +* (2) The fill operation may end by hitting the count value +* or by hitting the end of the string. +* (3) A null terminating char is NOT placed at the end of +* the string. +* +* Cases to be careful of (both of these can occur at once): +* (1) Leaving an "orphaned" trail byte in the string (e.g., +* overwriting a lead byte but not the corresponding trail byte). +* (2) Writing only the 1st byte of a 2-byte fill value because the +* end of string was encountered. +* +*Entry: +* unsigned char *string = string to modify +* unsigned int val = value to fill string with +* size_t count = count of characters to fill +* +* +*Exit: +* Returns string = now filled with char val +* +*Uses: +* +*Exceptions: +* +*******************************************************************************/ + +unsigned char * _CRTAPI1 _mbsnset( + unsigned char *string, + unsigned int val, + size_t count + ) +{ + unsigned char *start = string; + unsigned int leadbyte = 0; + unsigned char highval, lowval; + + /* + * leadbyte flag indicates if the last byte we overwrote was + * a lead byte or not. + */ + + if (highval = (unsigned char)(val>>8)) { + + /* double byte value */ + + lowval = (unsigned char)(val & 0x00ff); + + while (count-- && *string) { + + leadbyte = _ismbbtruelead(leadbyte, *string); + *string++ = highval; + + if (*string) { + leadbyte = _ismbbtruelead(leadbyte, *string); + *string++ = lowval; + } + else + /* overwrite orphaned highval byte */ + *(string-1) = ' '; + } + } + + else { + /* single byte value */ + + while (count-- && *string) { + leadbyte = _ismbbtruelead(leadbyte, *string); + *string++ = (unsigned char)val; + } + + } + + /* overwrite orphaned trailing byte, if necessary */ + if(leadbyte && *string) + *string = ' '; + + return( start ); +} +#endif /* _MBCS */ |