TNB Library
TnbStrOperator.h
[詳解]
1#pragma once
13#include "TnbStrVector.h"
14#include "TnbBlockLinkVector.h"
16
17
18
19//T-TestCaseコードカバレッジDisable
20#pragma comment(user,"T-Coverage Disable")
21
22
23
24//TNB Library
25namespace TNB
26{
27
28
29
42template<typename TYP>
44{
45public:
46
55 static const TYP* FindCr(const TYP* lpsz)
56 {
57 if ( lpsz != NULL )
58 {
59 while ( *lpsz != 0 )
60 {
61 if ( *lpsz == 0x0D || *lpsz == 0x0A )
62 {
63 return lpsz;
64 }
65 lpsz += STRLIB::GetCharSize(*lpsz);
66 }
67 }
68 return NULL;
69 }
70
78 static const TYP* GetLine(CStrT<TYP>& _strLine, const TYP* lpsz)
79 {
80 _strLine.Empty();
81 const TYP* P = NULL;
82 if ( lpsz != NULL )
83 {
84 P = FindCr(lpsz);
85 if ( P == NULL )
86 {
87 //見つからなかった。全部が一行
88 _strLine = lpsz;
89 }
90 else
91 {
92 INT_PTR iLen = P - lpsz;
93 if ( iLen > 0 )
94 {
95 _strLine.SetFromLeft(lpsz, iLen);
96 }
97 if ( *P++ == 0x0D )
98 {
99 if ( *P == 0x0A )
100 {
101 P++;
102 }
103 }
104 }
105 }
106 return P;
107 }
108
116 static CStrT<TYP> ConnectLines(const CVectorT<CStrT<TYP> >& vs, const TYP* lpszCR = NULL)
117 {
118 CStrT<TYP> CR = lpszCR;
119 if ( lpszCR == NULL )
120 {
121 CR = "\r\n";
122 }
123 CStrT<TYP> s;
124 loop ( i, vs.GetSize() )
125 {
126 if ( i != 0 )
127 {
128 s += CR;
129 }
130 s += vs[i];
131 }
132 return s;
133 }
134
141 static CVectorT<CStrT<TYP> > SeparateLine(const TYP* lpsz)
142 {
144 CStrT<TYP> s;
145 const TYP* P = lpsz;
146 while ( P != NULL )
147 {
148 P = GetLine(s, P);
149 vs.Add(s);
150 }
152 v.Copy(vs);
153 return v;
154 }
155
167 static CVectorT<CStrT<TYP> > SeparatePeriod(const TYP* lpsz, const TYP* lpszMark, bool isCheckDc = true)
168 {
170 CStrT<TYP> s;
171 if ( lpsz[0] != 0 )
172 {
173 while ( true )
174 {
175 if ( isCheckDc && lpsz[0] == '\"' )
176 {
177 //先頭が " だった。
178 INT_PTR r = STRLIB::IndexOf(lpsz, '\"', 1);
179 if ( r >= 0 )
180 {
181 //次の " を発見
182 bool isEnd = (lpsz[r + 1] == 0);
183 if ( STRLIB::IndexOf(lpszMark, lpsz[r + 1]) >= 0 || isEnd )
184 {
185 // ,"〜", を発見
186 s.SetFromLeft(&lpsz[1], r - 1);
187 lpsz += r + 2;
188 vs.Add(s);
189 if ( isEnd )
190 {
191 break;
192 }
193 continue;
194 }
195 }
196 }
197 INT_PTR r = STRLIB::IndexOneOf(lpsz, lpszMark);
198 if ( r < 0 )
199 {
200 s = lpsz;
201 }
202 else
203 {
204 s.SetFromLeft(lpsz, r);
205 lpsz += r + 1;
206 }
207 vs.Add(s);
208 if ( r < 0 )
209 {
210 break;
211 }
212 }
213 }
215 v.Copy(vs);
216 return v;
217 }
218
230 static CVectorT<CStrT<TYP> > SeparatePeriod(const TYP* lpsz, TYP mark, bool isCheckDc = true)
231 {
232 TYP bb[2] = { mark, 0 };
233 return SeparatePeriod(lpsz, bb, isCheckDc);
234 }
235
243 {
244 size_t size = c.GetSize();
245 CStrT<TYP> str;
246 TYP* P = str.GetBuffer(size * 2 + 2);
247 loop ( i, size )
248 {
249 const BYTE& b = c.At(i);
250 *P++ = STRLIB::IntToHexChar(b >> 4);
251 *P++ = STRLIB::IntToHexChar(b);
252 }
253 *P++ = 0;
254 str.ReleaseBuffer();
255 return str;
256 }
257
265 static CStrT<TYP> BinaryToHexString(size_t dataSize, LPCVOID P)
266 {
267 CConstAdapterT<BYTE> cc(dataSize, static_cast<const BYTE*>(P));
268 return BinaryToHexString(cc);
269 }
270
279 static CByteVector HexStringToBinary(const TYP* lpszHex)
280 {
281 CByteVector vb;
282 while ( true )
283 {
284 TYP c = *lpszHex++;
285 if ( c == '_' || c ==' ' || c == '\t' || c =='\n' || c == '\r' || c =='-' )
286 {
287 continue;
288 }
289 int r = STRLIB::HexCharToInt(c);
290 if ( r < 0 )
291 {
292 break;
293 }
294 vb.Add(static_cast<BYTE>(r));
295 }
296 CByteVector vbr;
297 if ( ! vb.IsEmpty() )
298 {
299 INDEX startIndex = 0;
300 size_t size = vb.GetSize();
301 if ( (size & 1) != 0 )
302 {
303 vbr.Add(vb[0]);
304 startIndex = 1;
305 }
306 for ( INDEX i = startIndex; i < size; i += 2 )
307 {
308 vbr.Add(static_cast<BYTE>((vb[i] << 4) | vb[i + 1]));
309 }
310 }
311 return vbr;
312 }
313
321 static CStrT<TYP> TabToSpace(const TYP* lpsz, int iTabStep = 4)
322 {
323 CStrT<TYP> strWork;
324 strWork = lpsz;
325 while ( true )
326 {
327 INT_PTR iTabPosition = strWork.Find('\t');
328 if ( iTabPosition < 0)
329 {
330 break;
331 }
332 strWork =
333 strWork.Left(iTabPosition)
334 + CStrT<TYP>::Lineup(' ', iTabStep - (iTabPosition % iTabStep))
335 + &(strWork.operator const TYP*()[iTabPosition + 1]);
336 }
337 return strWork;
338 }
339
340private:
341 friend class CStrOperatorTest;
342};
343
344
345
355
365
375
376
377
378}; // TNB
379
380
381
382//T-TestCaseコードカバレッジEnable
383#pragma comment(user,"T-Coverage Enable")
384
配列型情報管理関係のヘッダ
情報群管理アダプタ関係のヘッダ
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
文字列情報配列管理関係のヘッダ
配列型情報管理テンプレート
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
情報参照アダプタテンプレート
文字列操作クラス
static const TYP * FindCr(const TYP *lpsz)
[検索] 改行位置検索.
static CStrT< TYP > BinaryToHexString(size_t dataSize, LPCVOID P)
[作成] バイナリ→HEX文字列
static CStrT< TYP > ConnectLines(const CVectorT< CStrT< TYP > > &vs, const TYP *lpszCR=NULL)
[取得] 各行連結
static CStrT< TYP > BinaryToHexString(const IConstCollectionT< BYTE > &c)
[作成] バイナリ→HEX文字列
static const TYP * GetLine(CStrT< TYP > &_strLine, const TYP *lpsz)
[取得] 一行取り出し
static CByteVector HexStringToBinary(const TYP *lpszHex)
[作成] HEX文字列→バイナリ
static CVectorT< CStrT< TYP > > SeparatePeriod(const TYP *lpsz, const TYP *lpszMark, bool isCheckDc=true)
[取得] トークン区切取得
static CVectorT< CStrT< TYP > > SeparatePeriod(const TYP *lpsz, TYP mark, bool isCheckDc=true)
[取得] トークン区切取得
static CVectorT< CStrT< TYP > > SeparateLine(const TYP *lpsz)
[取得] 改行毎分離
static CStrT< TYP > TabToSpace(const TYP *lpsz, int iTabStep=4)
タブコードをスペースに変換します。 改行は含まないようにしてください。
文字列管理テンプレート
Definition: TnbStr.h:74
CStrT Left(size_t iSize) const
[作成] 範囲取得.
Definition: TnbStr.h:801
void ReleaseBuffer(void)
[操作] 割り当てたバッファを開放.
Definition: TnbStr.h:954
INT_PTR Find(TYP t, INDEX iFromIndex=0) const
[確認] 検索.
Definition: TnbStr.h:540
CStrT & SetFromLeft(const TYP *lpText, size_t iLen)
[代入] 文字数制限代入.
Definition: TnbStr.h:278
void Empty(void)
[削除] 空化
Definition: TnbStr.h:197
static CStrT Lineup(TYP t, size_t length)
[作成] 指定文字を並べた文字列作成
Definition: TnbStr.h:1222
TYP * GetBuffer(size_t iLength=0)
[操作] 書き込みバッファ要求.
Definition: TnbStr.h:914
配列型情報管理テンプレート
Definition: TnbVector.h:75
virtual size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbVector.h:368
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
Definition: TnbVector.h:383
int GetCharSize(char c)
[取得] 文字のサイズ(ASCII/SJIS用)
Definition: TnbStrLib.h:341
INT_PTR IndexOf(LPCSTR lpszText, char c, INDEX iFromIndex=0)
[検索] 文字検索(ASCII/SJIS用)
Definition: TnbStrLib.h:184
char IntToHexChar(int c)
[変換] 数値HEX文字変換
Definition: TnbStrLib.h:518
int HexCharToInt(int c)
[変換] HEX文字数値変換
Definition: TnbStrLib.h:492
INT_PTR IndexOneOf(LPCSTR lpszText, LPCSTR lpszMark, INDEX iFromIndex=0)
[検索] 文字セット検索(ASCII/SJIS用)
Definition: TnbStrLib.h:216
TNB Library
Definition: TnbDoxyTitle.txt:2
CStrOperatorT< WCHAR > CUnicodeOperator
簡易文字列操作関数群(UNICODE)
CStrOperatorT< char > CAsciiOperator
簡易文字列操作関数群(ASCII/SJIS)
CStrOperatorT< TCHAR > CStrOperator
簡易文字列操作関数群
virtual size_t Copy(const IConstCollectionT< TYP > &c)
[設定] コピー.
bool IsEmpty(void) const
[確認] 要素の有無確認.
virtual const TYP & At(INDEX index) const =0
[取得] 要素の参照取得.
virtual size_t GetSize(void) const =0
[取得] 要素数取得.