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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
| #include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
/*****************************************************************************/
/*********************************** Main **********************************/
/*****************************************************************************/
void UTF_16_display_hexa(wchar_t* str, char* end_str) {
if (str != NULL) {
size_t len = wcslen(str);
if (len > 0) {
size_t c;
wchar_t* str_c;
unsigned char bit_hi, bit_lo;
for(c=1, str_c=str; c <= len; ++c, ++str_c) {
bit_hi = (((*str_c) >> 8) & 0xFF);
bit_lo = ((*str_c) & 0xFF);
printf("%02X%02X%c", bit_hi, bit_lo, (((c % 8) != 0)? ' ': '\n'));
}
}
if (end_str != NULL) { printf("%s", end_str); }
}
}
wchar_t* UTF_16_escape(wchar_t* str) {
wchar_t* escape_str;
if (str != NULL) {
size_t len, nb_quotes;
wchar_t* str_c;
// Calculate len and nb_quotes
str_c = str;
len = 0;
nb_quotes = 0;
while ((*str_c) != L'\0') {
if ((*str_c) == L'\'') { ++nb_quotes; }
++str_c;
++len;
}
printf("UTF_16_escape - debug: len : %lu, nb_quotes : %lu\n", len, nb_quotes);
// wprintf(L"UTF_16_escape - debug: len : %lu, nb_quotes : %lu\n", len, nb_quotes);
if (len > 0) {
// Allocate and copy/ escape
escape_str = malloc(sizeof(wchar_t) * (len + nb_quotes + 1));
if (escape_str != NULL) {
if (nb_quotes > 0) {
wchar_t* escape_str_c;
str_c = str;
escape_str_c = escape_str;
len = 0;
while ((*str_c) != L'\0') {
if ((*str_c) == L'\'') {
(*escape_str_c) = L'\\';
++escape_str_c;
}
(*escape_str_c) = (*str_c);
++str_c;
++escape_str_c;
++len;
}
} else {
wcscpy(escape_str, str);
}
escape_str[(len + nb_quotes)] = L'\0';
}
} else {
escape_str = NULL;
}
} else {
escape_str = NULL;
}
return escape_str;
}
int main(int argc, char** argv)
{
wchar_t str_empty[] = L"";
wchar_t str_01[] = L"Lorem ipsum dolor sit amet, consectetur adipiscing elit";
wchar_t str_02[] = L"Le code é permet d'écrire un é, É pour écrire É.";
wchar_t str_03[] = L"\'\'\'\'\'\'\'''''''";
wchar_t* escape_str_00;
wchar_t* escape_str_01;
wchar_t* escape_str_02;
wchar_t* escape_str_03;
// wprintf(L"%ls\n%ls\n%ls\n%ls\n", str_empty, str_01, str_02, str_03);
UTF_16_display_hexa(str_01, "\n\n");
UTF_16_display_hexa(str_02, "\n\n");
UTF_16_display_hexa(str_03, "\n\n");
escape_str_00 = UTF_16_escape(str_empty);
escape_str_01 = UTF_16_escape(str_01);
escape_str_02 = UTF_16_escape(str_02);
escape_str_03 = UTF_16_escape(str_03);
printf("\n");
if (escape_str_00 == NULL) { printf("main - debug: test empty ok\n"); }
if (escape_str_01 != NULL) { printf("main - debug: test str_01 ok (len: %lu)\n", wcslen(escape_str_01)); }
if (escape_str_02 != NULL) { printf("main - debug: test str_02 ok (len: %lu)\n", wcslen(escape_str_02)); }
if (escape_str_03 != NULL) { printf("main - debug: test str_03 ok (len: %lu)\n", wcslen(escape_str_03)); }
printf("\n");
// wprintf(L"%ls\n%ls\n%ls\n%ls\n", str_empty, escape_str_01, escape_str_02, escape_str_03);
UTF_16_display_hexa(escape_str_01, "\n\n");
UTF_16_display_hexa(escape_str_02, "\n\n");
UTF_16_display_hexa(escape_str_03, "\n\n");
if (escape_str_01 != NULL) { free(escape_str_01); }
if (escape_str_02 != NULL) { free(escape_str_02); }
if (escape_str_03 != NULL) { free(escape_str_03); }
return EXIT_SUCCESS;
} |