|  | /** | 
|  | * This file has no copyright assigned and is placed in the Public Domain. | 
|  | * This file is part of the mingw-w64 runtime package. | 
|  | * No warranty is given; refer to the file DISCLAIMER.PD within this package. | 
|  | */ | 
|  | /* ISO C1x Unicode utilities | 
|  | * Based on ISO/IEC SC22/WG14 9899 TR 19769 (SC22 N1326) | 
|  | * | 
|  | *  THIS SOFTWARE IS NOT COPYRIGHTED | 
|  | * | 
|  | *  This source code is offered for use in the public domain. You may | 
|  | *  use, modify or distribute it freely. | 
|  | * | 
|  | *  This code is distributed in the hope that it will be useful but | 
|  | *  WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY | 
|  | *  DISCLAIMED. This includes but is not limited to warranties of | 
|  | *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 
|  | * | 
|  | *  Date: 2011-09-27 | 
|  | */ | 
|  |  | 
|  | #include <errno.h> | 
|  | #include <uchar.h> | 
|  |  | 
|  | size_t c32rtomb (char *__restrict__ s, | 
|  | char32_t c32, | 
|  | mbstate_t *__restrict__ __UNUSED_PARAM(ps)) | 
|  | { | 
|  | if (c32 <= 0x7F) /* 7 bits needs 1 byte */ | 
|  | { | 
|  | *s = (char)c32 & 0x7F; | 
|  | return 1; | 
|  | } | 
|  | else if (c32 <= 0x7FF) /* 11 bits needs 2 bytes */ | 
|  | { | 
|  | s[1] = 0x80 | (char)(c32 & 0x3F); | 
|  | s[0] = 0xC0 | (char)(c32 >> 6); | 
|  | return 2; | 
|  | } | 
|  | else if (c32 <= 0xFFFF) /* 16 bits needs 3 bytes */ | 
|  | { | 
|  | s[2] = 0x80 | (char)(c32 & 0x3F); | 
|  | s[1] = 0x80 | (char)((c32 >> 6) & 0x3F); | 
|  | s[0] = 0xE0 | (char)(c32 >> 12); | 
|  | return 3; | 
|  | } | 
|  | else if (c32 <= 0x1FFFFF) /* 21 bits needs 4 bytes */ | 
|  | { | 
|  | s[3] = 0x80 | (char)(c32 & 0x3F); | 
|  | s[2] = 0x80 | (char)((c32 >> 6) & 0x3F); | 
|  | s[1] = 0x80 | (char)((c32 >> 12) & 0x3F); | 
|  | s[0] = 0xF0 | (char)(c32 >> 18); | 
|  | return 4; | 
|  | } | 
|  |  | 
|  | errno = EILSEQ; | 
|  | return (size_t)-1; | 
|  | } | 
|  |  |