1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
#include <errno.h>
#include <locale.h>
#include <string.h>
#include <uchar.h>
#include <wchar.h>
int main( int argc, char *args[] ){
setlocale( LC_ALL, "" );
fprintf( stdout, "Buffer size: %llu\n", (0xFFFF - (0x00A0 - 0x007F)) * 4 );
uint16_t char_buffer[(0xFFFF - (0x00A0 - 0x007F)) * 4] = {0};
memset( (void*)&char_buffer, 0, (0xFFFF - (0x00A0 - 0x007F)) * 4 );
uint16_t current_char = 0x0020;
size_t char_bytes = 0;
char mbstr[sizeof(wchar_t)] = {0};
memset( (void*)&mbstr, 0, sizeof(mbstr) );
size_t b_size = 0;
mbstate_t *m_state = NULL;
for ( ; current_char < 0xFFFF; current_char++ ){
if ( current_char > 0x007F && current_char < 0x00A0 )
current_char = 0x00A0;
if ( (b_size = wcrtomb((char*)&mbstr, (wchar_t)current_char, m_state)) == (size_t)-1 )
continue;
memmove( (void*)&char_buffer[char_bytes], (const void*)&mbstr, b_size );
memset( (void*)&mbstr, 0, b_size );
char_bytes += b_size;
}
fprintf( stdout, "Copied %llu bytes into buffer\n", char_bytes );
b_size = 0;
m_state = NULL;
memset( (void*)&mbstr, 0, sizeof(mbstr) );
FILE *output = fopen( "unicode_chars.txt", "w" );
if ( output == NULL ){
fprintf( stderr, "Error: %s\n", strerror(errno) );
exit( EXIT_FAILURE );
}
ssize_t char_written = 0;
if ( (char_written = (ssize_t)fwrite((void*)&char_buffer, sizeof(uint16_t), char_bytes, output)) < 0 ){
fclose( output );
fprintf( stderr, "Error writing file: %s\n", strerror(errno) );
exit( EXIT_FAILURE );
}
fclose( output );
fprintf( stdout, "%llu bytes written into unicode_chars.txt\n", char_written );
memset( (void*)&char_buffer, 0, sizeof(char_buffer) );
output = NULL;
current_char = 0x0020;
char_written = 0;
char_bytes = 0;
exit( EXIT_SUCCESS );
}
|