mirror of https://github.com/KLayout/klayout.git
data: URLs for abstract paths
This commit is contained in:
parent
ad1ec18361
commit
21b14706dd
|
|
@ -43,7 +43,7 @@
|
||||||
#include "tlFileUtils.h"
|
#include "tlFileUtils.h"
|
||||||
#include "tlLog.h"
|
#include "tlLog.h"
|
||||||
#include "tlResources.h"
|
#include "tlResources.h"
|
||||||
|
#include "tlBase64.h"
|
||||||
#include "tlException.h"
|
#include "tlException.h"
|
||||||
#include "tlString.h"
|
#include "tlString.h"
|
||||||
#include "tlUri.h"
|
#include "tlUri.h"
|
||||||
|
|
@ -242,6 +242,14 @@ InputStream::InputStream (const std::string &abstract_path)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
} else if (ex.test ("data:")) {
|
||||||
|
|
||||||
|
std::vector<unsigned char> data = tl::from_base64 (ex.get ());
|
||||||
|
|
||||||
|
char *data_ptr = new char [data.size ()];
|
||||||
|
memcpy (data_ptr, data.begin ().operator-> (), data.size ());
|
||||||
|
mp_delegate = new InputMemoryStream (data_ptr, data.size (), true);
|
||||||
|
|
||||||
} else if (ex.test ("pipe:")) {
|
} else if (ex.test ("pipe:")) {
|
||||||
|
|
||||||
mp_delegate = new InputPipe (ex.get ());
|
mp_delegate = new InputPipe (ex.get ());
|
||||||
|
|
|
||||||
|
|
@ -122,13 +122,22 @@ public:
|
||||||
*
|
*
|
||||||
* @param data The memory block where to read from
|
* @param data The memory block where to read from
|
||||||
* @param length The length of the block
|
* @param length The length of the block
|
||||||
|
* @param owns_data If true, the memory becomes owned by the stream
|
||||||
*/
|
*/
|
||||||
InputMemoryStream (const char *data, size_t length)
|
InputMemoryStream (const char *data, size_t length, bool owns_data = false)
|
||||||
: mp_data (data), m_length (length), m_pos (0)
|
: mp_data (data), m_length (length), m_owns_data (owns_data), m_pos (0)
|
||||||
{
|
{
|
||||||
// .. nothing yet ..
|
// .. nothing yet ..
|
||||||
}
|
}
|
||||||
|
|
||||||
|
~InputMemoryStream ()
|
||||||
|
{
|
||||||
|
if (m_owns_data) {
|
||||||
|
delete [] const_cast<char *> (mp_data);
|
||||||
|
}
|
||||||
|
mp_data = 0;
|
||||||
|
}
|
||||||
|
|
||||||
virtual size_t read (char *b, size_t n)
|
virtual size_t read (char *b, size_t n)
|
||||||
{
|
{
|
||||||
if (m_pos + n > m_length) {
|
if (m_pos + n > m_length) {
|
||||||
|
|
@ -170,7 +179,9 @@ private:
|
||||||
InputMemoryStream &operator= (const InputMemoryStream &);
|
InputMemoryStream &operator= (const InputMemoryStream &);
|
||||||
|
|
||||||
const char *mp_data;
|
const char *mp_data;
|
||||||
size_t m_length, m_pos;
|
size_t m_length;
|
||||||
|
bool m_owns_data;
|
||||||
|
size_t m_pos;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -163,6 +163,23 @@ TEST(TextInputStream)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(DataInputStream)
|
||||||
|
{
|
||||||
|
tl::InputStream is ("data:SGVsbG8sIHdvcmxkIQpXaXRoIGFub3RoZXIgbGluZQoNDQpzZXBhcmF0ZWQgYnkgYSBMRkNSIGFuZCBDUkxGLg==");
|
||||||
|
tl::TextInputStream tis (is);
|
||||||
|
EXPECT_EQ (tis.get_line (), "Hello, world!");
|
||||||
|
EXPECT_EQ (tis.line_number (), size_t (1));
|
||||||
|
EXPECT_EQ (tis.get_line (), "With another line");
|
||||||
|
EXPECT_EQ (tis.line_number (), size_t (2));
|
||||||
|
EXPECT_EQ (tis.peek_char (), '\n');
|
||||||
|
EXPECT_EQ (tis.get_line (), "");
|
||||||
|
EXPECT_EQ (tis.line_number (), size_t (3));
|
||||||
|
EXPECT_EQ (tis.peek_char (), 's');
|
||||||
|
EXPECT_EQ (tis.get_line (), "separated by a LFCR and CRLF.");
|
||||||
|
EXPECT_EQ (tis.line_number (), size_t (4));
|
||||||
|
EXPECT_EQ (tis.at_end (), true);
|
||||||
|
}
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue