| /** |
| * 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. |
| */ |
| |
| #include <stdio.h> |
| #include <errno.h> |
| |
| wchar_t *__cdecl fgetws(wchar_t * __restrict__ _Dst, int _SizeInWords, FILE * __restrict__ _File) |
| { |
| wchar_t format[19]; |
| int count; |
| int ret; |
| |
| if (_Dst == NULL || _SizeInWords <= 0) |
| { |
| errno = EINVAL; |
| return NULL; |
| } |
| |
| if (_SizeInWords == 1) |
| { |
| _Dst[0] = L'\0'; |
| return _Dst; |
| } |
| |
| /* _SizeInWords-1 must be positive as it is maximum width for %l[ format */ |
| if (_swprintf(format, L"%%%dl[^\n]%%n", _SizeInWords-1) < 0) |
| { |
| return NULL; |
| } |
| |
| ret = __ms_fwscanf(_File, format, _Dst, &count); |
| |
| /* fwscanf() returns zero if the format "%l[^\n]" does not match any character |
| * which means that the first character in _File has to be new line */ |
| if (ret == 0) |
| { |
| _Dst[0] = L'\0'; |
| count = 0; |
| ret = 2; |
| } |
| |
| if (ret < 2) |
| { |
| return NULL; |
| } |
| |
| if (count < _SizeInWords-1) |
| { |
| if (__ms_fwscanf(_File, L"%1l[\n]", &_Dst[count]) == 1) |
| { |
| count++; |
| } |
| } |
| |
| return _Dst; |
| } |