Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
StyledTextIO_PlainText.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#include "Stroika/Frameworks/StroikaPreComp.h"
5
8#include "Stroika/Foundation/Characters/LineEndings.h"
10#include "Stroika/Foundation/Streams/MemoryStream.h"
11#include "Stroika/Foundation/Streams/TextToBinary.h"
12
13#include "StyledTextIO_PlainText.h"
14
15using namespace Stroika::Foundation;
17
18using namespace Stroika::Frameworks;
19using namespace Stroika::Frameworks::Led;
20using namespace Stroika::Frameworks::Led::StyledTextIO;
21
22/*
23 ********************************************************************************
24 ************************** StyledTextIOReader_PlainText ************************
25 ********************************************************************************
26 */
27StyledTextIOReader_PlainText::StyledTextIOReader_PlainText (SrcStream* srcStream, SinkStream* sinkStream)
28 : StyledTextIOReader{srcStream, sinkStream}
29{
30}
31
32void StyledTextIOReader_PlainText::Read ()
33{
34 // Read into a contiguous block of memory since it makes the dealing with CRLF
35 // strattling a buffer-bounary problem go away. Note that the Memory::StackBuffer<>::GrowToSize()
36 // code grows exponentially so that we minimize buffer copies on grows...
37 size_t len = 0;
38 Memory::StackBuffer<char> buf{Memory::eUninitialized, len};
39 while (true) {
40 size_t kTryToReadThisTime = 16 * 1024;
41 buf.GrowToSize (len + kTryToReadThisTime);
42 void* readPtr = static_cast<char*> (buf) + len;
43 size_t bytesRead = GetSrcStream ().read (readPtr, kTryToReadThisTime);
44 len += bytesRead;
45 if (bytesRead == 0) {
46 break;
47 }
48 }
49 span<const byte> rawByteSpan{reinterpret_cast<const byte*> (buf.data ()), len};
50 CodeCvt<Led_tChar> converter{&rawByteSpan, CodeCvt<Led_tChar>{locale{}}};
51 size_t outCharCnt = converter.ComputeTargetCharacterBufferSize (rawByteSpan);
52 Memory::StackBuffer<Led_tChar> wbuf{outCharCnt};
53 outCharCnt = converter.Bytes2Characters (&rawByteSpan, span{wbuf}).size ();
54 size_t charsRead = outCharCnt;
55 Assert (charsRead <= len);
56 Led_tChar* useBuf = wbuf.data ();
57 charsRead = Characters::NormalizeTextToNL<Led_tChar> (useBuf, charsRead, useBuf, charsRead);
58 GetSinkStream ().AppendText (useBuf, charsRead, nullptr);
59 GetSinkStream ().EndOfBuffer ();
60}
61
62bool StyledTextIOReader_PlainText::QuickLookAppearsToBeRightFormat ()
63{
64 return true;
65}
66
67/*
68 ********************************************************************************
69 ************************** StyledTextIOWriter_PlainText ************************
70 ********************************************************************************
71 */
72StyledTextIOWriter_PlainText::StyledTextIOWriter_PlainText (SrcStream* srcStream, SinkStream* sinkStream)
73 : StyledTextIOWriter{srcStream, sinkStream}
74{
75}
76
77void StyledTextIOWriter_PlainText::Write ()
78{
79 Led_tChar buf[8 * 1024];
80 size_t bytesRead = 0;
81 while ((bytesRead = GetSrcStream ().readNTChars (buf, Memory::NEltsOf (buf))) != 0) {
82#if qStroika_Foundation_Common_Platform_Windows
83 Led_tChar buf2[2 * Memory::NEltsOf (buf)];
84#else
85 Led_tChar buf2[Memory::NEltsOf (buf)];
86#endif
87 bytesRead = Characters::NLToNative<Led_tChar> (buf, bytesRead, buf2, Memory::NEltsOf (buf2));
88 Streams::MemoryStream::Ptr<byte> memStream = Streams::MemoryStream::New<byte> ();
89 Streams::TextToBinary::Writer::New (memStream, Characters::CodeCvt<>{locale{}}).Write (span{buf2, bytesRead});
90 auto b = memStream.As<Memory::BLOB> ();
91 write (b.data (), b.size ());
92 }
93}
CodeCvt unifies byte <-> unicode conversions, vaguely inspired by (and wraps) std::codecvt,...
Definition CodeCvt.h:118
Logically halfway between std::array and std::vector; Smart 'direct memory array' - which when needed...
nonvirtual void GrowToSize(size_t nElements)