summaryrefslogtreecommitdiff
path: root/all_unicode_chars/all_unicode_chars.c
blob: b278f4f9b4f2f40512716fb7fabfe309d9e21492 (about) (plain)
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;
        wmemmove( (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 );
}