annotate foosdk/sdk/pfc/string_conv.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "array.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 namespace stringcvt {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 //! Converts UTF-8 characters to wide character.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 //! @param p_out Output buffer, receives converted string, with null terminator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 //! @param p_out_size Size of output buffer, in characters. If converted string is too long, it will be truncated. Null terminator is always written, unless p_out_size is zero.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 //! @param p_source String to convert.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 //! @param p_source_size Number of characters to read from p_source. If reading stops if null terminator is encountered earlier.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 //! @returns Number of characters written, not counting null terminator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 t_size convert_utf8_to_wide(wchar_t * p_out,t_size p_out_size,const char * p_source,t_size p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 //! Estimates buffer size required to convert specified UTF-8 string to widechar.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 //! @param p_source String to be converted.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 //! @param p_source_size Number of characters to read from p_source. If reading stops if null terminator is encountered earlier.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 //! @returns Number of characters to allocate, including space for null terminator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 t_size estimate_utf8_to_wide(const char * p_source,t_size p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 t_size estimate_utf8_to_wide(const char * p_source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 //! Converts wide character string to UTF-8.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 //! @param p_out Output buffer, receives converted string, with null terminator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 //! @param p_out_size Size of output buffer, in characters. If converted string is too long, it will be truncated. Null terminator is always written, unless p_out_size is zero.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 //! @param p_source String to convert.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 //! @param p_source_size Number of characters to read from p_source. If reading stops if null terminator is encountered earlier.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 //! @returns Number of characters written, not counting null terminator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 t_size convert_wide_to_utf8(char * p_out,t_size p_out_size,const wchar_t * p_source,t_size p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 //! Estimates buffer size required to convert specified wide character string to UTF-8.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 //! @param p_source String to be converted.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 //! @param p_source_size Number of characters to read from p_source. If reading stops if null terminator is encountered earlier.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 //! @returns Number of characters to allocate, including space for null terminator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 t_size estimate_wide_to_utf8(const wchar_t * p_source,t_size p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 t_size estimate_utf8_to_ascii( const char * p_source, t_size p_source_size );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 t_size convert_utf8_to_ascii( char * p_out, t_size p_out_size, const char * p_source, t_size p_source_size );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 t_size estimate_wide_to_win1252( const wchar_t * p_source, t_size p_source_size );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 t_size convert_wide_to_win1252( char * p_out, t_size p_out_size, const wchar_t * p_source, t_size p_source_size );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 t_size estimate_win1252_to_wide( const char * p_source, t_size p_source_size );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 t_size convert_win1252_to_wide( wchar_t * p_out, t_size p_out_size, const char * p_source, t_size p_source_size );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 t_size estimate_utf8_to_win1252( const char * p_source, t_size p_source_size );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 t_size convert_utf8_to_win1252( char * p_out, t_size p_out_size, const char * p_source, t_size p_source_size );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 t_size estimate_win1252_to_utf8( const char * p_source, t_size p_source_size );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 t_size convert_win1252_to_utf8( char * p_out, t_size p_out_size, const char * p_source, t_size p_source_size );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 // 2016-05-16 additions
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 // Explicit UTF-16 converters
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 t_size estimate_utf16_to_utf8( const char16_t * p_source, size_t p_source_size );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 t_size convert_utf16_to_utf8( char * p_out, size_t p_out_size, const char16_t * p_source, size_t p_source_size );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 //! estimate_utf8_to_wide_quick() functions use simple math to determine buffer size required for the conversion. The result is not accurate length of output string - it's just a safe estimate of required buffer size, possibly bigger than what's really needed. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 //! These functions are meant for scenarios when speed is more important than memory usage.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 inline t_size estimate_utf8_to_wide_quick(t_size sourceLen) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 return sourceLen + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 inline t_size estimate_utf8_to_wide_quick(const char * source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 return estimate_utf8_to_wide_quick(strlen(source));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 inline t_size estimate_utf8_to_wide_quick(const char * source, t_size sourceLen) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 return estimate_utf8_to_wide_quick(strlen_max(source, sourceLen));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 t_size convert_utf8_to_wide_unchecked(wchar_t * p_out,const char * p_source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 template<typename t_char> const t_char * null_string_t();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 template<> inline const char * null_string_t<char>() {return "";}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 template<> inline const wchar_t * null_string_t<wchar_t>() {return L"";}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 template<typename t_char> t_size strlen_t(const t_char * p_string,t_size p_string_size = SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 for(t_size n=0;n<p_string_size;n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 if (p_string[n] == 0) return n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 return p_string_size;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 template<typename t_char> bool string_is_empty_t(const t_char * p_string,t_size p_string_size = SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 if (p_string_size == 0) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 return p_string[0] == 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 template<typename t_char,template<typename t_allocitem> class t_alloc = pfc::alloc_standard> class char_buffer_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 char_buffer_t() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 char_buffer_t(const char_buffer_t & p_source) : m_buffer(p_source.m_buffer) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 void set_size(t_size p_count) {m_buffer.set_size(p_count);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 t_char * get_ptr_var() {return m_buffer.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 const t_char * get_ptr() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 return m_buffer.get_size() > 0 ? m_buffer.get_ptr() : null_string_t<t_char>();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 pfc::array_t<t_char,t_alloc> m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 template<template<typename t_allocitem> class t_alloc = pfc::alloc_standard>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 class string_utf8_from_wide_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 string_utf8_from_wide_t() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 string_utf8_from_wide_t(const wchar_t * p_source,t_size p_source_size = SIZE_MAX) {convert(p_source,p_source_size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 void convert(const wchar_t * p_source,t_size p_source_size = SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 t_size size = estimate_wide_to_utf8(p_source,p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 m_buffer.set_size(size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 convert_wide_to_utf8( m_buffer.get_ptr_var(),size,p_source,p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 operator const char * () const {return get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 const char * get_ptr() const {return m_buffer.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 const char * toString() const {return get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 bool is_empty() const {return string_is_empty_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 t_size length() const {return strlen_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 char_buffer_t<char,t_alloc> m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 typedef string_utf8_from_wide_t<> string_utf8_from_wide;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 template<template<typename t_allocitem> class t_alloc = pfc::alloc_standard>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 class string_wide_from_utf8_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 string_wide_from_utf8_t() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 string_wide_from_utf8_t(const char* p_source) {convert(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 string_wide_from_utf8_t(const char* p_source,t_size p_source_size) {convert(p_source,p_source_size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 void convert(const char* p_source,t_size p_source_size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 const t_size size = estimate_size(p_source, p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 m_buffer.set_size(size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 convert_utf8_to_wide( m_buffer.get_ptr_var(),size,p_source,p_source_size );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 void convert(const char * p_source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 m_buffer.set_size( estimate_size(p_source) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 convert_utf8_to_wide_unchecked(m_buffer.get_ptr_var(), p_source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 operator const wchar_t * () const {return get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 const wchar_t * get_ptr() const {return m_buffer.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 bool is_empty() const {return string_is_empty_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 t_size length() const {return strlen_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 void append(const char* p_source,t_size p_source_size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 const t_size base = length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 const t_size size = estimate_size(p_source, p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 m_buffer.set_size(base + size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 convert_utf8_to_wide( m_buffer.get_ptr_var() + base, size, p_source, p_source_size );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 void append(const char * p_source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 const t_size base = length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 m_buffer.set_size( base + estimate_size(p_source) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 convert_utf8_to_wide_unchecked(m_buffer.get_ptr_var() + base, p_source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 enum { alloc_prioritizes_speed = t_alloc<wchar_t>::alloc_prioritizes_speed };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 inline t_size estimate_size(const char * source, t_size sourceLen) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 return alloc_prioritizes_speed ? estimate_utf8_to_wide_quick(source, sourceLen) : estimate_utf8_to_wide(source,sourceLen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 inline t_size estimate_size(const char * source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 return alloc_prioritizes_speed ? estimate_utf8_to_wide_quick(source) : estimate_utf8_to_wide(source,SIZE_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 char_buffer_t<wchar_t,t_alloc> m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 typedef string_wide_from_utf8_t<> string_wide_from_utf8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 typedef string_wide_from_utf8_t<alloc_fast_aggressive> string_wide_from_utf8_fast;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 template<template<typename t_allocitem> class t_alloc = pfc::alloc_standard>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 class string_wide_from_win1252_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 string_wide_from_win1252_t() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 string_wide_from_win1252_t(const char * p_source,t_size p_source_size = SIZE_MAX) {convert(p_source,p_source_size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 void convert(const char * p_source,t_size p_source_size = SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 t_size size = estimate_win1252_to_wide(p_source,p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 m_buffer.set_size(size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 convert_win1252_to_wide(m_buffer.get_ptr_var(),size,p_source,p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 operator const wchar_t * () const {return get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 const wchar_t * get_ptr() const {return m_buffer.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 bool is_empty() const {return string_is_empty_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 t_size length() const {return strlen_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 char_buffer_t<wchar_t,t_alloc> m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 typedef string_wide_from_win1252_t<> string_wide_from_win1252;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 template<template<typename t_allocitem> class t_alloc = pfc::alloc_standard>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 class string_win1252_from_wide_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 string_win1252_from_wide_t() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 string_win1252_from_wide_t(const wchar_t * p_source,t_size p_source_size = SIZE_MAX) {convert(p_source,p_source_size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 void convert(const wchar_t * p_source,t_size p_source_size = SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 t_size size = estimate_wide_to_win1252(p_source,p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 m_buffer.set_size(size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 convert_wide_to_win1252(m_buffer.get_ptr_var(),size,p_source,p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 operator const char * () const {return get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 const char * get_ptr() const {return m_buffer.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 bool is_empty() const {return string_is_empty_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 t_size length() const {return strlen_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 char_buffer_t<char,t_alloc> m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 typedef string_win1252_from_wide_t<> string_win1252_from_wide;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 template<template<typename t_allocitem> class t_alloc = pfc::alloc_standard>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 class string_utf8_from_win1252_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 string_utf8_from_win1252_t() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 string_utf8_from_win1252_t(const char * p_source,t_size p_source_size = SIZE_MAX) {convert(p_source,p_source_size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 void convert(const char * p_source,t_size p_source_size = SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 t_size size = estimate_win1252_to_utf8(p_source,p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 m_buffer.set_size(size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 convert_win1252_to_utf8(m_buffer.get_ptr_var(),size,p_source,p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 operator const char * () const {return get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 const char * get_ptr() const {return m_buffer.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 bool is_empty() const {return string_is_empty_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 t_size length() const {return strlen_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 char_buffer_t<char,t_alloc> m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 typedef string_utf8_from_win1252_t<> string_utf8_from_win1252;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 template<template<typename t_allocitem> class t_alloc = pfc::alloc_standard>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 class string_win1252_from_utf8_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 string_win1252_from_utf8_t() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 string_win1252_from_utf8_t(const char * p_source,t_size p_source_size = SIZE_MAX) {convert(p_source,p_source_size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 void convert(const char * p_source,t_size p_source_size = SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 t_size size = estimate_utf8_to_win1252(p_source,p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 m_buffer.set_size(size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 convert_utf8_to_win1252(m_buffer.get_ptr_var(),size,p_source,p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 operator const char * () const {return get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 const char * get_ptr() const {return m_buffer.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 bool is_empty() const {return string_is_empty_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 t_size length() const {return strlen_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 char_buffer_t<char,t_alloc> m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 typedef string_win1252_from_utf8_t<> string_win1252_from_utf8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 class string_ascii_from_utf8 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 string_ascii_from_utf8() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 string_ascii_from_utf8( const char * p_source, t_size p_source_size = SIZE_MAX) { convert(p_source, p_source_size); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 void convert( const char * p_source, t_size p_source_size = SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 t_size size = estimate_utf8_to_ascii(p_source, p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 m_buffer.set_size(size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 convert_utf8_to_ascii(m_buffer.get_ptr_var(), size, p_source, p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 operator const char * () const {return get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 const char * get_ptr() const {return m_buffer.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 bool is_empty() const {return string_is_empty_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 t_size length() const {return strlen_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 char_buffer_t<char, pfc::alloc_fast_aggressive> m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 class string_utf8_from_utf16 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 string_utf8_from_utf16() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 string_utf8_from_utf16( const char16_t * p_source, size_t p_source_size = SIZE_MAX) {convert(p_source, p_source_size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 void convert( const char16_t * p_source, size_t p_source_size = SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 size_t size = estimate_utf16_to_utf8(p_source, p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 m_buffer.set_size(size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 convert_utf16_to_utf8(m_buffer.get_ptr_var(), size, p_source, p_source_size );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 operator const char * () const {return get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 const char * get_ptr() const {return m_buffer.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 bool is_empty() const {return string_is_empty_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 t_size length() const {return strlen_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 char_buffer_t<char, pfc::alloc_fast_aggressive> m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 #ifdef _WINDOWS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 namespace stringcvt {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 codepage_system = CP_ACP,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 codepage_ascii = 20127,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 codepage_iso_8859_1 = 28591,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 //! Converts string from specified codepage to wide character.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 //! @param p_out Output buffer, receives converted string, with null terminator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 //! @param p_codepage Codepage ID of source string.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 //! @param p_source String to convert.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 //! @param p_source_size Number of characters to read from p_source. If reading stops if null terminator is encountered earlier.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 //! @param p_out_size Size of output buffer, in characters. If converted string is too long, it will be truncated. Null terminator is always written, unless p_out_size is zero.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 //! @returns Number of characters written, not counting null terminator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 t_size convert_codepage_to_wide(unsigned p_codepage,wchar_t * p_out,t_size p_out_size,const char * p_source,t_size p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 //! Estimates buffer size required to convert specified string from specified codepage to wide character.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 //! @param p_codepage Codepage ID of source string.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 //! @param p_source String to be converted.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 //! @param p_source_size Number of characters to read from p_source. If reading stops if null terminator is encountered earlier.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 //! @returns Number of characters to allocate, including space for null terminator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 t_size estimate_codepage_to_wide(unsigned p_codepage,const char * p_source,t_size p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 //! Converts string from wide character to specified codepage.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 //! @param p_codepage Codepage ID of source string.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 //! @param p_out Output buffer, receives converted string, with null terminator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 //! @param p_out_size Size of output buffer, in characters. If converted string is too long, it will be truncated. Null terminator is always written, unless p_out_size is zero.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 //! @param p_source String to convert.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 //! @param p_source_size Number of characters to read from p_source. If reading stops if null terminator is encountered earlier.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 //! @returns Number of characters written, not counting null terminator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 t_size convert_wide_to_codepage(unsigned p_codepage,char * p_out,t_size p_out_size,const wchar_t * p_source,t_size p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 //! Estimates buffer size required to convert specified wide character string to specified codepage.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 //! @param p_codepage Codepage ID of source string.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 //! @param p_source String to be converted.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 //! @param p_source_size Number of characters to read from p_source. If reading stops if null terminator is encountered earlier.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 //! @returns Number of characters to allocate, including space for null terminator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 t_size estimate_wide_to_codepage(unsigned p_codepage,const wchar_t * p_source,t_size p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 //! Converts string from system codepage to wide character.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 //! @param p_out Output buffer, receives converted string, with null terminator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 //! @param p_source String to convert.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 //! @param p_source_size Number of characters to read from p_source. If reading stops if null terminator is encountered earlier.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 //! @param p_out_size Size of output buffer, in characters. If converted string is too long, it will be truncated. Null terminator is always written, unless p_out_size is zero.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 //! @returns Number of characters written, not counting null terminator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 inline t_size convert_ansi_to_wide(wchar_t * p_out,t_size p_out_size,const char * p_source,t_size p_source_size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 return convert_codepage_to_wide(codepage_system,p_out,p_out_size,p_source,p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 //! Estimates buffer size required to convert specified system codepage string to wide character.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 //! @param p_source String to be converted.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 //! @param p_source_size Number of characters to read from p_source. If reading stops if null terminator is encountered earlier.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 //! @returns Number of characters to allocate, including space for null terminator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 inline t_size estimate_ansi_to_wide(const char * p_source,t_size p_source_size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 return estimate_codepage_to_wide(codepage_system,p_source,p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 //! Converts string from wide character to system codepage.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 //! @param p_out Output buffer, receives converted string, with null terminator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 //! @param p_out_size Size of output buffer, in characters. If converted string is too long, it will be truncated. Null terminator is always written, unless p_out_size is zero.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 //! @param p_source String to convert.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 //! @param p_source_size Number of characters to read from p_source. If reading stops if null terminator is encountered earlier.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 //! @returns Number of characters written, not counting null terminator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 inline t_size convert_wide_to_ansi(char * p_out,t_size p_out_size,const wchar_t * p_source,t_size p_source_size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 return convert_wide_to_codepage(codepage_system,p_out,p_out_size,p_source,p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 //! Estimates buffer size required to convert specified wide character string to system codepage.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 //! @param p_source String to be converted.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 //! @param p_source_size Number of characters to read from p_source. If reading stops if null terminator is encountered earlier.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 //! @returns Number of characters to allocate, including space for null terminator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 inline t_size estimate_wide_to_ansi(const wchar_t * p_source,t_size p_source_size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 return estimate_wide_to_codepage(codepage_system,p_source,p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 template<template<typename t_allocitem> class t_alloc = pfc::alloc_standard>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 class string_wide_from_codepage_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 string_wide_from_codepage_t() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 string_wide_from_codepage_t(const string_wide_from_codepage_t<t_alloc> & p_source) : m_buffer(p_source.m_buffer) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 string_wide_from_codepage_t(unsigned p_codepage,const char * p_source,t_size p_source_size = SIZE_MAX) {convert(p_codepage,p_source,p_source_size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 void convert(unsigned p_codepage,const char * p_source,t_size p_source_size = SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 t_size size = estimate_codepage_to_wide(p_codepage,p_source,p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 m_buffer.set_size(size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 convert_codepage_to_wide(p_codepage, m_buffer.get_ptr_var(),size,p_source,p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 operator const wchar_t * () const {return get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 const wchar_t * get_ptr() const {return m_buffer.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 bool is_empty() const {return string_is_empty_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 t_size length() const {return strlen_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 char_buffer_t<wchar_t,t_alloc> m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 typedef string_wide_from_codepage_t<> string_wide_from_codepage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 template<template<typename t_allocitem> class t_alloc = pfc::alloc_standard>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 class string_codepage_from_wide_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 string_codepage_from_wide_t() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 string_codepage_from_wide_t(const string_codepage_from_wide_t<t_alloc> & p_source) : m_buffer(p_source.m_buffer) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 string_codepage_from_wide_t(unsigned p_codepage,const wchar_t * p_source,t_size p_source_size = SIZE_MAX) {convert(p_codepage,p_source,p_source_size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 void convert(unsigned p_codepage,const wchar_t * p_source,t_size p_source_size = SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 t_size size = estimate_wide_to_codepage(p_codepage,p_source,p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 m_buffer.set_size(size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 convert_wide_to_codepage(p_codepage, m_buffer.get_ptr_var(),size,p_source,p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 operator const char * () const {return get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 const char * get_ptr() const {return m_buffer.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 bool is_empty() const {return string_is_empty_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 t_size length() const {return strlen_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 char_buffer_t<char,t_alloc> m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 typedef string_codepage_from_wide_t<> string_codepage_from_wide;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 class string_codepage_from_utf8 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 string_codepage_from_utf8() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 string_codepage_from_utf8(const string_codepage_from_utf8 & p_source) : m_buffer(p_source.m_buffer) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 string_codepage_from_utf8(unsigned p_codepage,const char * p_source,t_size p_source_size = SIZE_MAX) {convert(p_codepage,p_source,p_source_size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 void convert(unsigned p_codepage,const char * p_source,t_size p_source_size = SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 string_wide_from_utf8 temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 temp.convert(p_source,p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 t_size size = estimate_wide_to_codepage(p_codepage,temp,SIZE_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442 m_buffer.set_size(size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 convert_wide_to_codepage(p_codepage,m_buffer.get_ptr_var(),size,temp,SIZE_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 operator const char * () const {return get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 const char * get_ptr() const {return m_buffer.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 bool is_empty() const {return string_is_empty_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 t_size length() const {return strlen_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 char_buffer_t<char> m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 class string_utf8_from_codepage {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 string_utf8_from_codepage() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 string_utf8_from_codepage(const string_utf8_from_codepage & p_source) : m_buffer(p_source.m_buffer) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 string_utf8_from_codepage(unsigned p_codepage,const char * p_source,t_size p_source_size = SIZE_MAX) {convert(p_codepage,p_source,p_source_size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 void convert(unsigned p_codepage,const char * p_source,t_size p_source_size = SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 string_wide_from_codepage temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 temp.convert(p_codepage,p_source,p_source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 t_size size = estimate_wide_to_utf8(temp,SIZE_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 m_buffer.set_size(size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 convert_wide_to_utf8( m_buffer.get_ptr_var(),size,temp,SIZE_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 operator const char * () const {return get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 const char * get_ptr() const {return m_buffer.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 bool is_empty() const {return string_is_empty_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 t_size length() const {return strlen_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 char_buffer_t<char> m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 class string_utf8_from_ansi {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 string_utf8_from_ansi() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482 string_utf8_from_ansi(const string_utf8_from_ansi & p_source) : m_buffer(p_source.m_buffer) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483 string_utf8_from_ansi(const char * p_source,t_size p_source_size = SIZE_MAX) : m_buffer(codepage_system,p_source,p_source_size) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 operator const char * () const {return get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 const char * get_ptr() const {return m_buffer.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 const char * toString() const {return get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 bool is_empty() const {return string_is_empty_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 t_size length() const {return strlen_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 void convert(const char * p_source,t_size p_source_size = SIZE_MAX) {m_buffer.convert(codepage_system,p_source,p_source_size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 string_utf8_from_codepage m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 class string_ansi_from_utf8 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 string_ansi_from_utf8() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 string_ansi_from_utf8(const string_ansi_from_utf8 & p_source) : m_buffer(p_source.m_buffer) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 string_ansi_from_utf8(const char * p_source,t_size p_source_size = SIZE_MAX) : m_buffer(codepage_system,p_source,p_source_size) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500 operator const char * () const {return get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 const char * get_ptr() const {return m_buffer.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 bool is_empty() const {return string_is_empty_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 t_size length() const {return strlen_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 void convert(const char * p_source,t_size p_source_size = SIZE_MAX) {m_buffer.convert(codepage_system,p_source,p_source_size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 string_codepage_from_utf8 m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 class string_wide_from_ansi {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 string_wide_from_ansi() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 string_wide_from_ansi(const string_wide_from_ansi & p_source) : m_buffer(p_source.m_buffer) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 string_wide_from_ansi(const char * p_source,t_size p_source_size = SIZE_MAX) : m_buffer(codepage_system,p_source,p_source_size) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 operator const wchar_t * () const {return get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 const wchar_t * get_ptr() const {return m_buffer.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 bool is_empty() const {return string_is_empty_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 t_size length() const {return strlen_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 void convert(const char * p_source,t_size p_source_size = SIZE_MAX) {m_buffer.convert(codepage_system,p_source,p_source_size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524 string_wide_from_codepage m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 class string_ansi_from_wide {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 string_ansi_from_wide() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 string_ansi_from_wide(const string_ansi_from_wide & p_source) : m_buffer(p_source.m_buffer) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531 string_ansi_from_wide(const wchar_t * p_source,t_size p_source_size = SIZE_MAX) : m_buffer(codepage_system,p_source,p_source_size) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 operator const char * () const {return get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 const char * get_ptr() const {return m_buffer.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534 bool is_empty() const {return string_is_empty_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 t_size length() const {return strlen_t(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537 void convert(const wchar_t * p_source,t_size p_source_size = SIZE_MAX) {m_buffer.convert(codepage_system,p_source,p_source_size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540 string_codepage_from_wide m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
541 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 #ifdef UNICODE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 typedef string_wide_from_utf8 string_os_from_utf8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545 typedef string_utf8_from_wide string_utf8_from_os;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 typedef string_wide_from_utf8_fast string_os_from_utf8_fast;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548 typedef string_ansi_from_utf8 string_os_from_utf8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 typedef string_utf8_from_ansi string_utf8_from_os;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 typedef string_ansi_from_utf8 string_os_from_utf8_fast;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553 class string_utf8_from_os_ex {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
554 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555 template<typename t_source> string_utf8_from_os_ex(const t_source * source, t_size sourceLen = SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556 convert(source,sourceLen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559 void convert(const char * source, t_size sourceLen = SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 m_buffer = string_utf8_from_ansi(source,sourceLen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
562 void convert(const wchar_t * source, t_size sourceLen = SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
563 m_buffer = string_utf8_from_wide(source,sourceLen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
564 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
565
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
566 operator const char * () const {return get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567 const char * get_ptr() const {return m_buffer.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568 bool is_empty() const {return m_buffer.is_empty();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569 t_size length() const {return m_buffer.length();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
570 const char * toString() const {return get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
571 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
572 string8 m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
573 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
574 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
575
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
576 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
577 namespace stringcvt {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
578 typedef string_win1252_from_wide string_ansi_from_wide;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
579 typedef string_wide_from_win1252 string_wide_from_ansi;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
580 typedef string_win1252_from_utf8 string_ansi_from_utf8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
581 typedef string_utf8_from_win1252 string_utf8_from_ansi;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
582 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
583 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
584 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
585
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
586 pfc::string_base & operator<<(pfc::string_base & p_fmt, const wchar_t * p_str);