yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
4c76b2759
master
1#include "slang-text-io.h" 2 3#include "slang-com-helper.h" 4 5namespace Slang 6{ 7 8// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! StreamWriter !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 9 10SlangResult StreamWriter ::init (const String & path ,CharEncoding * encoding ) 11{ 12RefPtr < FileStream > fileStream = new FileStream ; 13SLANG_RETURN_ON_FAIL (fileStream -> init (path ,FileMode ::Create )); 14return init (fileStream ,encoding ); 15} 16 17SlangResult StreamWriter ::init (RefPtr < Stream > stream ,CharEncoding * encoding ) 18{ 19m_stream = stream ; 20m_encoding = encoding ; 21if (encoding == CharEncoding ::UTF16 ) 22 { 23SLANG_RETURN_ON_FAIL (m_stream -> write (& kUTF16Header ,2 )); 24 } 25else if (encoding == CharEncoding ::UTF16Reversed ) 26 { 27SLANG_RETURN_ON_FAIL (m_stream -> write (& kUTF16ReversedHeader ,2 )); 28 } 29 30return SLANG_OK ; 31} 32 33SlangResult StreamWriter ::writeSlice (const UnownedStringSlice & slice ) 34{ 35// TODO(JS): 36// We can do better here. On Linux, this is a no-op and can just write directly (assuming slice 37// only contains \n) 38 39m_encodingBuffer .clear (); 40 41StringBuilder sb ; 42#ifdef _WIN32 43const char newLine []= "\r\n" ; 44#else 45const char newLine []= "\n" ; 46#endif 47const Index length = slice .getLength (); 48 49for (Index i = 0 ;i < length ;i ++ ) 50 { 51if (slice [i ]== '\r' ) 52sb <<newLine ; 53else if (slice [i ]== '\n' ) 54 { 55if (i > 0 && slice [i - 1 ]!= '\r' ) 56sb <<newLine ; 57 } 58else 59sb <<slice [i ]; 60 } 61 62// NOTE! This assumes that sb contains *complete* utf8 code points, which it might not, as 63// encoder is only able to handle complete code points. 64m_encodingBuffer .clear (); 65m_encoding -> encode (sb .getUnownedSlice (),m_encodingBuffer ); 66return m_stream -> write (m_encodingBuffer .getBuffer (),m_encodingBuffer .getCount ()); 67} 68 69// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! StreamReader !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 70 71StreamReader ::StreamReader () {} 72 73SlangResult StreamReader ::init (const String & path ) 74{ 75RefPtr < FileStream > fileStream = new FileStream ; 76SLANG_RETURN_ON_FAIL (fileStream -> init (path ,FileMode ::Open )); 77return init (fileStream ); 78} 79 80SlangResult StreamReader ::init (RefPtr < Stream > stream ,CharEncoding * encoding ) 81{ 82m_stream = stream ; 83m_encoding = encoding ; 84SLANG_RETURN_ON_FAIL (readBuffer ()); 85 86if (encoding == nullptr ) 87 { 88size_t offset ; 89m_encodingType = CharEncoding ::determineEncoding ( 90 (const Byte * )m_buffer .getBuffer (), 91m_buffer .getCount (), 92offset ); 93m_encoding = CharEncoding ::getEncoding (m_encodingType ); 94m_index = Index (offset ); 95 } 96else 97 { 98m_encodingType = encoding -> getEncodingType (); 99m_encoding = encoding ; 100 } 101 102return SLANG_OK ; 103} 104 105SlangResult StreamReader ::readBuffer () 106{ 107m_buffer .setCount (0 ); 108m_index = 0 ; 109 110if (m_stream -> isEnd ()) 111 { 112return SLANG_OK ; 113 } 114 115m_buffer .setCount (4096 ); 116 117// TODO(JS): Not clear this is necessary 118memset (m_buffer .getBuffer (),0 ,m_buffer .getCount ()* sizeof (m_buffer [0 ])); 119 120size_t readBytes ; 121SLANG_RETURN_ON_FAIL (m_stream -> read (m_buffer .getBuffer (),m_buffer .getCount (),readBytes )); 122 123m_buffer .setCount (Index (readBytes )); 124m_index = 0 ; 125return SLANG_OK ; 126} 127 128Byte StreamReader ::readBufferByte () 129{ 130if (m_index < m_buffer .getCount ()) 131 { 132return m_buffer [m_index ++ ]; 133 } 134 135readBuffer (); 136 137if (m_index < m_buffer .getCount ()) 138 { 139return m_buffer [m_index ++ ]; 140 } 141return 0 ; 142} 143 144SlangResult StreamReader ::readToEnd (String & outString ) 145{ 146StringBuilder sb (16384 ); 147while (!isEnd ()) 148 { 149auto ch = read (); 150if (isEnd ()) 151break ; 152if (ch == '\r' ) 153 { 154sb .append ('\n' ); 155if (peek ()== '\n' ) 156read (); 157 } 158else 159sb .append (ch ); 160 } 161 162outString = sb .produceString (); 163return SLANG_OK ; 164} 165 166}// namespace Slang