v1.0
commit
8b93cf4fc3
|
@ -0,0 +1,127 @@
|
|||
// Small module for correct Russian localization of programs written in C/C++ under Windows
|
||||
#pragma once
|
||||
#include <stdio.h>
|
||||
#include <io.h>
|
||||
#include <fcntl.h>
|
||||
#include <tchar.h>
|
||||
#include <Windows.h>
|
||||
|
||||
#define WT _T // WT = widechar text - Macro for declaring constant widechar strings
|
||||
#define W_SET wmemset // Memset for wchar
|
||||
|
||||
// Internal functions of the module, not intended for use in user code
|
||||
int set_unicode_mode(void); // Enable unicode mode
|
||||
int set_default_mode(void); // Enable default mode
|
||||
//
|
||||
|
||||
void wwrite(TCHAR* dst, size_t dst_size); // Input wide char characters from console into array
|
||||
void wprint(wchar_t* format, ...); // Formatted output of wide char array to console
|
||||
void bwprint(wchar_t* arr, size_t size); // Output wide char array in binary form to console
|
||||
void bcprint(char* arr, size_t size); // Output char array in binary form to console
|
||||
TCHAR* ctow(char* arr1, TCHAR* arr2); // Converts char array to wide char array
|
||||
char* wtoc(TCHAR* arr1, char* arr2); // Converts wide char array to char array
|
||||
|
||||
enum COD3K_ERRORS {
|
||||
SETMODE_ERROR_STDIN = -228,
|
||||
SETMODE_ERROR_STDOUT,
|
||||
SETMODE_ERROR_STDERR
|
||||
};
|
||||
|
||||
// Enable Unicode mode
|
||||
int set_unicode_mode(void) {
|
||||
int err_inp, err_out, err_err;
|
||||
if ((err_inp = _setmode(_fileno(stdin), _O_WTEXT)) == -1) { // Unicode mode for input stream
|
||||
return SETMODE_ERROR_STDIN;
|
||||
}
|
||||
if ((err_inp = _setmode(_fileno(stdout), _O_WTEXT)) == -1) { // Unicode mode for output stream
|
||||
return SETMODE_ERROR_STDOUT;
|
||||
}
|
||||
if ((err_err = _setmode(_fileno(stderr), _O_WTEXT)) == -1) { // Unicode mode for error stream
|
||||
return SETMODE_ERROR_STDERR;
|
||||
}
|
||||
}
|
||||
|
||||
// Disable Unicode mode
|
||||
int set_default_mode(void) {
|
||||
int err_inp, err_out, err_err;
|
||||
if ((err_inp = _setmode(_fileno(stdin), _O_TEXT)) == -1) { // Restore mode for input stream
|
||||
return SETMODE_ERROR_STDIN;
|
||||
}
|
||||
if ((err_out = _setmode(_fileno(stdout), _O_TEXT)) == -1) { // Restore mode for output stream
|
||||
return SETMODE_ERROR_STDOUT;
|
||||
}
|
||||
if ((err_err = _setmode(_fileno(stderr), _O_TEXT)) == -1) { // Restore mode for error stream
|
||||
return SETMODE_ERROR_STDERR;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Formatted output of wide char array to console
|
||||
void wprint(const wchar_t* format, ...) {
|
||||
set_unicode_mode();
|
||||
va_list args;
|
||||
va_start(args, format); vfwprintf(stdout, format, args); va_end(args);
|
||||
set_default_mode();
|
||||
}
|
||||
|
||||
// Function to print the first 'size' characters of wchar_t array in binary form
|
||||
void bwprint(wchar_t* arr, size_t size) {
|
||||
for (size_t i = 0; i < size; i++) {
|
||||
for (int j = sizeof(wchar_t) * 8 - 1; j >= 0; j--) {
|
||||
putchar((arr[i] & (1 << j)) ? '1' : '0');
|
||||
}
|
||||
putchar(' ');
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
|
||||
// Function to print the first 'size' characters of char array in binary form
|
||||
void bcprint(char* arr, size_t size) {
|
||||
for (size_t i = 0; i < size; i++) {
|
||||
for (int j = sizeof(char) * 8 - 1; j >= 0; j--) {
|
||||
putchar((arr[i] & (1 << j)) ? '1' : '0');
|
||||
}
|
||||
putchar(' ');
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
|
||||
// dst - TCHAR a.k.a wchar_t array, into which characters from console will be written, size - size of this array
|
||||
// removes newline character
|
||||
void wwrite(TCHAR* dst, size_t dst_size) {
|
||||
set_unicode_mode();
|
||||
fgetws(dst, dst_size, stdin); dst[wcslen(dst) - 1] = 0;
|
||||
set_default_mode();
|
||||
}
|
||||
|
||||
// char to wide char conversion
|
||||
TCHAR* ctow(char* arr1, TCHAR* arr2) {
|
||||
int i = 0;
|
||||
for (char* p_byte = arr1; *p_byte != 0; ++p_byte) {
|
||||
char byte = *p_byte;
|
||||
if (byte & 0x80) { // bit at position 8 is set => Russian text
|
||||
// clear bit at position 8 +
|
||||
// set bit at position 11 (this is necessary for correct wide char if the text is not ASCII)
|
||||
arr2[i] = byte & 0x7F | 0x400;
|
||||
}
|
||||
else { // English text
|
||||
arr2[i] = byte;
|
||||
}
|
||||
++i;
|
||||
}
|
||||
return arr2;
|
||||
}
|
||||
|
||||
// widechar to char
|
||||
char* wtoc(TCHAR* arr1, char* arr2) {
|
||||
int i = 0;
|
||||
for (TCHAR* p_wbyte = arr1; *p_wbyte != 0; ++p_wbyte) {
|
||||
TCHAR wbyte = *p_wbyte;
|
||||
arr2[i] = (char)(wbyte & 0xFF); // lower 8 bits
|
||||
if (wbyte & 0x400) { // if the 11th bit is set, the text is Russian
|
||||
arr2[i] |= 0x80; // marker for Russian text in char - set the 8th bit
|
||||
}
|
||||
++i;
|
||||
}
|
||||
return arr2;
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
#include <stdio.h>
|
||||
#include "cod3k.h" // включение библиотеки
|
||||
|
||||
#define SZ 256
|
||||
|
||||
int main(void)
|
||||
{
|
||||
// Пример 1 - пример работы в wide char
|
||||
wprint(WT("Введите текст: "));
|
||||
TCHAR bufferW[SZ] = { 0 }; wwrite(bufferW, SZ); // считываю символы из консоли
|
||||
wprint(WT("Содержимое bufferW: %s\n"), bufferW); bwprint(bufferW, 20);
|
||||
|
||||
char buffer[SZ] = { 0 };
|
||||
wtoc(bufferW, buffer); // конвертация widechar в char
|
||||
wprint(WT("bufferc в бинарном виде: ")); bcprint(buffer, 20);
|
||||
|
||||
W_SET(bufferW, SZ, 0);
|
||||
ctow(buffer, bufferW); // конвертация обратно
|
||||
wprint(WT("Содержимое bufferW: %s\n"), bufferW); bwprint(bufferW, 20);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue