Click here to Skip to main content
15,890,185 members
Articles / Web Development / HTML

JSON Spirit: A C++ JSON Parser/Generator Implemented with Boost Spirit

Rate me:
Please Sign up or sign in to vote.
4.92/5 (110 votes)
10 May 2014MIT12 min read 4.1M   24.3K   287   637
A C++ JSON parser/generator written using Boost::spirit

Table of Contents

Introduction

JSON is a text file format similar to XML, but less verbose. It has been called "XML lite". This article describes JSON Spirit, a C++ library that reads and writes JSON files or streams. It is written using the Boost Spirit parser generator. If you are already using Boost, you can use JSON Spirit without any additional dependencies.

Key features:

  • supports ASCII or Unicode
  • std::vector or std::map implementations for JSON Objects
  • object library or header file only use

Using the Code

The JSON Spirit source code is available as a Microsoft Visual Studio 2005 C++ "solution". However, it should compile and work on any platform compatible with Boost. JSON Spirit has been built and tested with Visual C++ 2005, 2008, 2010, and G++ version 4.2.3 on Linux. It has been tested with Visual C++ using Boost versions 1.34.0, 1.37.0, 1.39.0, and 1.42.0. It has also been tested with STLPort.

Platform independent CMake files are included, kindly supplied by Uwe Arzt, with CPack declarations for packaging and a "make install" target supplied by Amzlkej.

The Visual C++ solution consists of five projects:

  • The JSON Spirit library and header files
  • An application running the library's unit tests
  • Three small programs demonstrating how to use JSON Spirit

JSON Spirit Value

A JSON value can hold either a JSON array, JSON object, string, integer, double, bool, or null. The interface of the JSON Spirit Value class is shown below. The Value class for Unicode is analogous; for details, see the section on Unicode support.

C++
enum Value_type{ obj_type, array_type, str_type,
     bool_type, int_type, real_type, null_type };

class Value
{
    public:

        Value();  // creates null value

        Value( const char*          value );
        Value( const std::string&   value );
        Value( const Object&        value );
        Value( const Array&         value );
        Value( bool                 value );
        Value( int                  value );
        Value_impl( boost::int64_t  value );
        Value_impl( boost::uint64_t value );
        Value( double               value );

        bool operator==( const Value& lhs ) const;

        Value_type type() const;

        const std::string& get_str()   const;
        const Object&      get_obj()   const;
        const Array&       get_array() const;
        bool               get_bool()  const;
        int                get_int()   const;
        boost::int64_t     get_int64()  const;
        boost::uint64_t    get_uint64() const;
        double             get_real()  const;

        Object& get_obj();
        Array&  get_array();

        template< typename > T get_value() const;

        bool is_uint64() const;
        bool is_null() const;

        static const Value null;

    private:

        ...
};

You obtain the Value's type by calling Value::type(). You can then call the appropriate getter function. Generally, you will know a file's format, so you will know what type the JSON values should have. A std::runtime_error exception is thrown if you try to get a value of the wrong type, for example, if you try to extract a string from a value containing an integer.

The template getter function get_value() is an alternative to get_int(), get_real(), etc. Example usage would be:

C++
int    i = value_1.get_value< int >();
double d = value_2.get_value< double >();

A top level Value read from a file or stream normally contains an Array or an Object. An Array is a std::vector of values. An Object is, by default, a std::vector of JSON pairs.

C++
typedef std::vector< Pair > Object;
typedef std::vector< Value > Array;

A Pair is a structure that holds a std::string and a Value.

C++
struct Pair
{
    Pair( const std::string& name, const Value& value );

    bool operator==( const Pair& lhs ) const;

    std::string name_;
    Value value_;
};

JSON Arrays and Objects can themselves contain other Arrays or Objects, forming a tree.

Note, JSON Spirit provides an alternative std::map based Object; see the Map Implementation section below. In this case, a Pair type is not needed as an mObject is a std::map of names to values.

C++
typedef std::map< std::string, mValue > mObject;

Reading JSON

You can read JSON data from a stream or a string:

C++
bool read( const std::string&  s, Value& value );
bool read( std::istream&  is,     Value& value );

For example:

C++
ifstream is( "json.txt" );
Value value;
read( is, value );

You can also read JSON data by supplying a pair of string iterators.

C++
bool read( std::string::const_iterator& begin,
           std::string::const_iterator  end, Value& value );

After a successful read, the iterator "begin" will point one past the last character of the text for the value just read. This allows the decoding of a string containing multiple top level values. A subsequent call to read will read the next value in the string.

Similarly the stream reading functions now allow a sequence of top-level values to be read one at a time. Before version 3.0, a stream was converted to a string before being parsed. This was fine for files, but not if, for example, you wanted to read multiple JSON values from a socket.

Writing JSON

To output JSON, you first create a Value object containing your data, then write the created Value to a stream or string. For example, the following code will create a small JSON file containing an object with three members:

C++
Object addr_obj;

addr_obj.push_back( Pair( "house_number", 42 ) );
addr_obj.push_back( Pair( "road",         "East Street" ) );
addr_obj.push_back( Pair( "town",         "Newtown" ) );

ofstream os( "address.txt" );

write( addr_obj, os, pretty_print );

os.close();

The object addr_obj is automatically converted into a Value as it is passed to the write function. The file address.txt will contain:

{
    "house_number" : 42,
    "road" : "East Street",
    "town" : "Newtown"
}

There are two versions of each function, one to write to strings, the other to write to files:

C++
std::string write( const Value&  value, Output_options options = none, unsigned int precision_of_doubles = 0 );
void write( const Value& value, std::ostream&  os, Output_options options = none, unsigned int precision_of_doubles = 0 );

The options parameter controls how the data is written:

C++
enum Output_options
{  
    none = 0,
    pretty_print = 0x01, 
    raw_utf8 = 0x02, 
    remove_trailing_zeros = 0x04,
    single_line_arrays = 0x08,
    always_escape_nonascii = 0x10   
}; 

The pretty_print option causes white-space and line breaks to be added to the JSON text.

The raw_utf8 option is an extension to the JSON standard. It disables the escaping of non-printable characters, allowing UTF-8 sequences held in 8 bit char strings to pass through unaltered.

The remove_trailing_zeros option is really only present for backwards compatibility purposes. It is no longer needed as trailing spaces are now removed by default. The only effect it now has is to set the default number of decimal places used for outputting double to 16 instead of the normal default of 17.

The single_line_arrays option has the same effect as the pretty printing option except that arrays printed on single lines unless they contain composite elements, i.e. objects or arrays. This produced output like:

{
    "1" : [ 0, 0, 0, 0, 0 ],
    "2" : [
        [ 0, 0, 0, 0, 0 ],
        [ 0, 1, 2, 3, 4 ],
        [ 0, 2, 4, 6, 8 ],
        [ 0, 3, 6, 9, 12 ],
        [ 0, 4, 8, 12, 16 ]
    ]
}

The always_escape_nonascii option means that all unicode wide characters are escaped, i.e. outputted as "\uXXXX", even if they are printable under the current locale, ASCII printable chars are not escaped.

The precision_of_doubles parameter determines the precision used when outputting doubles. The default is 17.

You can apply more than one option by using the OR operator, i.e.:

C++
write( addr_obj, os, pretty_print | raw_utf8 ); 

The default is to write the JSON text without any white-space and to escape non-printable characters. There is also a function called write_formatted. This is equivalent to:

C++
write( addr_obj, os, pretty_print );

Error Detection

From version 3.00, JSON Spirit provides functions that report the position of format errors in the text being parsed. These functions are identical to the normal read functions except that instead of returning false if an error is found, they throw a json_spirit::Error_position exception. Note, these functions run about three times slower than the normal read functions.

The Error_position structure holds the line and column number where the first error was found.

C++
struct Error_position
{
    ...
    unsigned int line_;
    unsigned int column_;
    std::string reason_;
};

Unicode Support

Unicode support is provided by std::wstring versions of the JSON Spirit Value, Array, Object, and Pair types. These are called wValue, wArray, wObject, and wPair. There are also std::wstring versions of each reader and writer function.

Note that there is no support for reading Unicode files and converting them to wstrings as this is not a task specific to JSON.

The Value and wValue classes are actually instantiations of the template class Value_impl.

Std::map Implementation

Before version 4.00, the JSON Spirit Object type was a std::vector of name/value Pairs. You now have the option of using mObject which is a name/value std::map. For the std::map version, use mValue instead of Value, mObject instead of Object, and mArray instead of Array. For the Unicode map version, use wmValue, wmObject, and wmArray.

The following table shows the time in seconds it takes on my PC to extract the data from a single object of varying sizes. The methods used are as per the demo programs. The vector version is faster until the number of object members reach around 10, but then gets exponentially slower.

sizevectormap
22.03253e-0073.24672e-007
57.63788e-0079.59516e-007
102.26948e-0062.00929e-006
154.68965e-0063.28509e-006
208.19667e-0064.75871e-006
301.72695e-0057.64189e-006
504.63171e-0051.39316e-005
750.0001024182.27205e-005
1000.0001799233.17732e-005
2000.0007093357.3061e-005
5000.004403680.00022076
10000.01753850.000495554
100001.765330.00658268
100000178.7180.127325
100000017800.7181.99467

Note: with a vector, object members will be written out in the same order they were read in. A map will sort members alphabetically. A vector object also allows members to have duplicate names. This might be useful in some circumstances but would be non-standard.

Stream_reader Class

There is a Stream_reader class to work around a bug that prevents multiple top level values that are not separated by white space from being read from a stream. The standard stream reading functions would fail in this case.

C++
istringstream is( "[1][1,2][1,2,3]" );  // no white space separating arrays

Stream_reader< istringstream, Value > reader( is );

Value value;

const bool ok = reader.read_next( value ); // read first array
reader.read_next( value );                 // read second array
reader.read_next( value );                 // read third array

I originally thought that this was caused by a bug in the boost.multi_pass iterator. However, I now realise that it basically results from the intrinsic behaviour of the std::istream_iterator constructor in immediately reading a character from its stream.

Compiling and linking

There are two ways to use the library:

  • Build and link in the JSON Spirit an object library.
  • Just include the relevant header files, i.e., "header only" use.

Linking to the object library has the advantage that the heavily templated code only has to be compiled once. Compiling the code can take some time. If you just include the header file implementation, the code will be compiled each time it is included. The use of precompiled headers should help, but I have not investigated this.

The include files needed to read JSON text using the object library are json_spirit_reader.h and json_spirit_value.h. To generate JSON text, you need json_spirit_writer.h and json_spirit_value.h. Alternately, you can include json_spirit.h, which includes all three of the above.

The include files needed when using the header only implementation are json_spirit_reader_template.h and json_spirit_writer_template.h.

All JSON Spirit declarations are in the namespace json_spirit.

Reducing Build Times

As already described, you can choose between four different types of JSON value classes: Value, mValue, wValue and wmValue. You would normally chose a single type and stick with it, however the compiler will process the templates to generate sets of classes for all four types. This results in longer than necessary build times and larger intermediate files. You can disable value types you don't want by commenting out the relevant lines in json_spirit_value.h below:

C++
#define JSON_SPIRIT_VALUE_ENABLED
#define JSON_SPIRIT_WVALUE_ENABLED
#define JSON_SPIRIT_MVALUE_ENABLED
#define JSON_SPIRIT_WMVALUE_ENABLED

Using JSON Spirit with Multiple Threads

If you intend to use JSON Spirit in more than one thread, you will need to uncomment the following line near the top of json_spirit_reader.cpp.

C++
//#define BOOST_SPIRIT_THREADSAFE

In this case, Boost Spirit will require you to link against Boost Threads.

Advanced

Container Constructor

An advanced feature introduced in version 4.05 is a constructor in the Value classes for containers. A container is passed in as an iterator range. This allows you to create an Array from a container such as an std::vector. For example, the following code creates and outputs the array "[1,2,3]":

C++
std::vector< int > int_vect;

int_vect.push_back( 1 );
int_vect.push_back( 2 );
int_vect.push_back( 3 );

const Value val( int_vect.begin(), int_vect.end() );

cout << write( val );

Any compatible container type can be used. The following code creates and outputs the array "[1.0,2.0,3.0]":

C++
std::list< float > float_list;

double_vect.push_back( 1.0 );
double_vect.push_back( 2.0 );
double_vect.push_back( 3.0 );

const Value val( double_vect.begin(), double_vect.end() );

cout << write( val, remove_trailing_zeros );

Variant Constructor

Another advanced feature introduced in version 4.05 is a constructor in the Value classes for boost::variant objects. Any compatible variant type can be used. For example:

C++
boost::variant< int, string, std::vector< bool > > var;

var = 1;
Value val( var );
cout << write( val ) << endl;

var = string( "hello" );
val = var;
cout << write( val ) << endl;

std::vector< bool > bool_vect;
bool_vect.push_back( true );
bool_vect.push_back( false );
bool_vect.push_back( true );
var = bool_vect;
val = var;
cout << write( val ) << endl;

Output:

1
"hello"
[true,false,true]

History

  • Version 1.00, 10 August 2007
  • 12 August 2007
    • Part of the Boost Spirit Applications Repository
  • Version 1.01, 20 August 2007
    • Fixed bug outputting escape characters
  • Version 1.02, 9 October 2007
    • Fixed bug inputting "\/"
    • No longer attaches a semantic action c_ecscape_ch_p, simplifying the code
    • Speed optimizations
  • Version 2.00, 9 November 2007
    • Unicode support
    • Writes out "/" without a "\" escape character
  • Version 2.01, 14 December 2007
    • Increased precision of floating point number output
  • Version 2.02, 12 February 2008, bug fixes
    • Value construction from explicit const char*
    • Writes out extended ASCII
  • Version 2.03, 1 March 2008
    • Added support for 64-bit integers
  • Version 2.04, 22 April 2008.
    • Allows the reading of top level values other than Arrays and Objects, see Daniel Friederich's message thread below
    • Fixed bug where, e.g., "[ 1 2 ]" is read as "[ 1, 2 ]"
    • Added template getter function get_value()
  • Version 2.05, 2 June 2008
    • Linux version added
    • Added commented out #define BOOST_SPIRIT_THREADSAFE
  • Version 2.06, 12 September 2008
    • Now works when MSVC 2005 is using STLPort
  • Version 3.00, 31 January 2009
    • Multiple top-level objects can now be read from a string or stream
    • Addition of functions that take a pair of string iterators
    • Addition of functions that report the position of format errors
    • Speed optimisations
    • Added utility functions obj_to_map, map_to_obj, find_value
  • Version 3.01, 11 May 2009
    • Added CMake files, many thanks to Uwe Arzt for supplying these
    • json_spirit_writer_test.cpp now includes limits.h, needed on some platforms
  • Version 4.00, 9 June 2009
    • Added alternative std::map implementation for objects
    • Added support for unsigned 64 bit integers
    • Allows numbers such as 3 to be read as integers or floating point numbers
  • Version 4.01, 13 June 2009
    • Changed source code license to the MIT License
    • Stopped GCC warning about missing switch statement
  • Version 4.02, 11 September 2009
    • Fixed compilation errors in the unit tests that occurred with 64 bit Linux GCC
    • Changed the internals of the Value_impl class to use boost variant, giving a speed improvement
    • Small changes to prevent some pedantic warning messages
  • Version 4.03, 12 January 2010
    • Implementation moved to header files to allow header only use
    • Now compiles under MSVC 2010 beta
    • Added Stream_reader class to work around a bug in boost spirit::multi_pass
    • Added CPack declarations to the CMake file
    • A std:runtime_error is now thrown instead of an assert firing on an attempt to get a value of the wrong type
    • CMake minimum boost version is 1.34, not 1.37
  • Version 4.04, 8 January 2011
    • Added the raw_utf8 feature to the write functions
    • Added a << std::dec before writing to a stream to ensure that integer variables appear in base 10 notation
    • Added additional .h files to CMakeLists.txt
    • Output doubles using precision of 17 instead of 16
    • Added option to remove trailing zeros when outputting doubles
    • Ensures that write functions return the state of a given IO stream to its original state on completion
  • Version 4.05, 12 September 2011
    • Added a new output option for single line arrays
    • Fixed non-standard zero digits following decimal point with "remove trailing zeros" output option
    • Reduced build times with new JSON_SPIRIT_VALUE_ENABLED type #defines
    • Added a constructor for variant types
    • Added a constructor for container iterators
  • Version 4.06, 14 May 2013
    • Added support for Javascript type comments, i.e. // and /* */
    • Added json_spirit_writer_options.h to CMake install
    • Improved error message on attempt to extract the wrong type of data from a value
    • Correct bug that reduced write performance
    • Added always_escape_nonascii writer flag
  • Version 4.07, 14 April 2014
    • Trailing zeros are now removed by default when writing out doubles
    • Added the precision_of_doubles parameter to write functions
  • Version 4.08, 10 May 2014
    • Undone change made in v4.07 where the parameters to the writer functions were changed from being ints to enums. This prevented the options from being or'ed.

License

This article, along with any associated source code and files, is licensed under The MIT License


Written By
Software Developer (Senior) Spirent Communications Plc
United Kingdom United Kingdom
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralRe: Ubuntu 13.04 package? Pin
John W. Wilkinson26-Apr-14 9:57
John W. Wilkinson26-Apr-14 9:57 
GeneralRe: Ubuntu 13.04 package? Pin
Member 1017528828-Apr-14 3:29
Member 1017528828-Apr-14 3:29 
GeneralRe: Ubuntu 13.04 package? Pin
Member 1017528828-Apr-14 5:09
Member 1017528828-Apr-14 5:09 
GeneralRe: Ubuntu 13.04 package? Pin
John W. Wilkinson28-Apr-14 9:28
John W. Wilkinson28-Apr-14 9:28 
QuestionPatch For unicode reading / writing for narrow strings Pin
Member 1005762522-Jul-13 10:50
Member 1005762522-Jul-13 10:50 
QuestionRe: Patch For unicode reading / writing for narrow strings Pin
David Wilcox22-Jul-13 12:04
David Wilcox22-Jul-13 12:04 
AnswerRe: Patch For unicode reading / writing for narrow strings Pin
John W. Wilkinson23-Jul-13 10:10
John W. Wilkinson23-Jul-13 10:10 
GeneralRe: Patch For unicode reading / writing for narrow strings Pin
David Wilcox23-Jul-13 11:53
David Wilcox23-Jul-13 11:53 
Since we don't have any way to make an attachment, here is the base-64 encoded patch. The form seems to be stripping out things between angle brackets. We're converting unicode sequences to utf-8 sequences especially since utf-8 is considered the standard representation for unicode in byte-oriented json and is really the only sensible way to encode general unicode in a byte-stream.

Let us know if you have any other problems. Thanks.

ZGlmZiAtLWdpdCBhL3ZsaWIvZXh0L2pzb25fc3Bpcml0L2pzb25fc3Bpcml0X3JlYWRlcl90ZW1w
bGF0ZS5oIGIvdmxpYi9leHQvanNvbl9zcGlyaXQvanNvbl9zcGlyaXRfcmVhZGVyX3RlbXBsYXRl
LmgKaW5kZXggYTI0M2MyZC4uNWY2MjU1OSAxMDA2NDQKLS0tIGEvdmxpYi9leHQvanNvbl9zcGly
aXQvanNvbl9zcGlyaXRfcmVhZGVyX3RlbXBsYXRlLmgKKysrIGIvdmxpYi9leHQvanNvbl9zcGly
aXQvanNvbl9zcGlyaXRfcmVhZGVyX3RlbXBsYXRlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNs
dWRlIDxib29zdC9iaW5kLmhwcD4NCiAjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPg0KICNp
bmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4NCisjaW5jbHVkZSA8d2NoYXIuaD4NCiANCiAjaWYg
Qk9PU1RfVkVSU0lPTiA+PSAxMDM4MDANCiAgICAgI2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNs
dWRlL2NsYXNzaWNfY29yZS5ocHA+DQpAQCAtNjksMTAgKzcwLDEwIEBAIG5hbWVzcGFjZSBqc29u
X3NwaXJpdAogICAgICAgICBjb25zdCBDaGFyX3R5cGUgYzIoICooICsrYmVnaW4gKSApOw0KIA0K
ICAgICAgICAgcmV0dXJuICggaGV4X3RvX251bSggYzEgKSA8PCA0ICkgKyBoZXhfdG9fbnVtKCBj
MiApOw0KLSAgICB9ICAgICAgIA0KKyAgICB9DQogDQogICAgIHRlbXBsYXRlPCBjbGFzcyBDaGFy
X3R5cGUsIGNsYXNzIEl0ZXJfdHlwZSA+DQotICAgIENoYXJfdHlwZSB1bmljb2RlX3N0cl90b19j
aGFyKCBJdGVyX3R5cGUmIGJlZ2luICkNCisgICAgQ2hhcl90eXBlIHVuaWNvZGVfc3RyX3RvX3Jh
d19jb2RlcG9pbnQoIEl0ZXJfdHlwZSYgYmVnaW4gKQ0KICAgICB7DQogICAgICAgICBjb25zdCBD
aGFyX3R5cGUgYzEoICooICsrYmVnaW4gKSApOw0KICAgICAgICAgY29uc3QgQ2hhcl90eXBlIGMy
KCAqKCArK2JlZ2luICkgKTsNCkBAIC04NSw2ICs4NiwxMjEgQEAgbmFtZXNwYWNlIGpzb25fc3Bp
cml0CiAgICAgICAgICAgICAgICBoZXhfdG9fbnVtKCBjNCApOw0KICAgICB9DQogDQorICAgIHRl
bXBsYXRlPCB0eXBlbmFtZSBJdGVyX3R5cGUgPg0KKyAgICB2b2lkIHRocm93X2Vycm9yKCBzcGly
aXRfbmFtZXNwYWNlOjpwb3NpdGlvbl9pdGVyYXRvcjwgSXRlcl90eXBlID4gaSwgY29uc3Qgc3Rk
OjpzdHJpbmcmIHJlYXNvbiApDQorICAgIHsNCisgICAgICAgIHRocm93IEVycm9yX3Bvc2l0aW9u
KCBpLmdldF9wb3NpdGlvbigpLmxpbmUsIGkuZ2V0X3Bvc2l0aW9uKCkuY29sdW1uLCByZWFzb24g
KTsNCisgICAgfQ0KKw0KKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgSXRlcl90eXBlID4NCisgICAg
dm9pZCB0aHJvd19lcnJvciggSXRlcl90eXBlIGksIGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24g
KQ0KKyAgICB7DQorICAgICAgIHRocm93IHJlYXNvbjsNCisgICAgfQ0KKw0KKyAgICB0ZW1wbGF0
ZTwgY2xhc3MgQ2hhcl90eXBlLCBjbGFzcyBJdGVyX3R5cGUgPg0KKyAgICB1aW50MzJfdCB1bmlj
b2RlX3N0cl90b19jaGFyKCBJdGVyX3R5cGUmIGJlZ2luLCBJdGVyX3R5cGUgZW5kICkNCisgICAg
ew0KKyAgICAgICAgdWludDMyX3QgY2ggPSB1bmljb2RlX3N0cl90b19yYXdfY29kZXBvaW50PENo
YXJfdHlwZT4oIGJlZ2luICk7DQorICAgICAgICAvLyB3ZSBrbm93IHdlIGdvdCBhIHN1cnJvZ2F0
ZSBwYWlyDQorICAgICAgICBpZiAoIGNoID49IDB4RDgwMCAmJiBjaCA8PSAweERCRkYgKSB7DQor
ICAgICAgICAgICAgaWYgKCBlbmQgLSBiZWdpbiA8IDcgKSB7DQorICAgICAgICAgICAgICAgIHRo
cm93X2Vycm9yKGJlZ2luLCAiSGFsZiBvZiBzdXJyb2dhdGUgcGFpci4iKTsNCisgICAgICAgICAg
ICB9DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgaWYgKCBiZWdpblsxXSAhPSAnXFwnIHx8
IGJlZ2luWzJdICE9ICd1JyApIHsNCisgICAgICAgICAgICAgICAgdGhyb3dfZXJyb3IoYmVnaW4s
ICJNaXNzaW5nIHNlY29uZCBoYWxmIG9mIHN1cnJvZ2F0ZS4iKTsNCisgICAgICAgICAgICB9DQor
ICAgICAgICAgICAgYmVnaW4rPTI7DQorICAgICAgICAgICAgdWludDMyX3Qgc3Vycm9nYXRlID0g
dW5pY29kZV9zdHJfdG9fcmF3X2NvZGVwb2ludDxDaGFyX3R5cGU+KGJlZ2luKTsNCisgICAgICAg
ICAgICBpZiAoIHN1cnJvZ2F0ZSA8IDB4REMwMCB8fCBzdXJyb2dhdGUgPiAweERGRkYgKQ0KKyAg
ICAgICAgICAgICAgICB0aHJvd19lcnJvcihiZWdpbiwgIkludmFsaWQgbG93ZXIgc3Vycm9nYXRl
LiIpOw0KKyAgICAgICAgICAgIGNoIC09IDB4RDgwMDsNCisgICAgICAgICAgICBzdXJyb2dhdGUg
LT0gMHhEQzAwOw0KKyAgICAgICAgICAgIGNoIDw8PSAxMDsNCisgICAgICAgICAgICBjaCArPSBz
dXJyb2dhdGU7DQorICAgICAgICAgICAgY2ggKz0gMHgxMDAwMDsNCisgICAgICAgIH0NCisNCisg
ICAgICAgIHJldHVybiBjaDsNCisgICAgfQ0KKyANCisgICAgaW5saW5lIHZvaWQgdXRmOF9jb250
aW51YXRpb25zKHVpbnQzMl90IHZhbHVlLCB1bnNpZ25lZCBpbnQgY291bnQsIHN0ZDo6c3RyaW5n
JiBzKSB7DQorICAgICAgICBmb3IodW5zaWduZWQgaT1jb3VudDsgaS0tOykgew0KKyAgICAgICAg
ICAgIGNvbnN0IHVuc2lnbmVkIGludCBpbnRlcmVzdGluZ19iaXRzID0gKHZhbHVlID4+IChpICog
NikpICYgMHgzRjsNCisgICAgICAgICAgICBzLnB1c2hfYmFjayhpbnRlcmVzdGluZ19iaXRzIHwg
MHg4MCk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgaW5saW5lIHZvaWQgY29udmVydF90
b191dGY4KHVpbnQzMl90IHZhbHVlLCBzdGQ6OnN0cmluZyYgcykgew0KKyAgICAgICAgaWYodmFs
dWUgPCAxPDw3KSB7DQorICAgICAgICAgICAgcy5wdXNoX2JhY2sodmFsdWUpOw0KKyAgICAgICAg
fSBlbHNlIGlmICh2YWx1ZSA8IDE8PDExKSB7DQorICAgICAgICAgICAgcy5wdXNoX2JhY2soKCh2
YWx1ZT4+NikgJiAweDFGKSB8IDB4QzApOw0KKyAgICAgICAgICAgIHV0ZjhfY29udGludWF0aW9u
cyh2YWx1ZSwgMSwgcyk7DQorICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMTw8MTYpIHsNCisg
ICAgICAgICAgICBzLnB1c2hfYmFjaygoKHZhbHVlPj4xMikgJiAweDBGKSB8IDB4RTApOw0KKyAg
ICAgICAgICAgIHV0ZjhfY29udGludWF0aW9ucyh2YWx1ZSwgMiwgcyk7DQorICAgICAgICB9IGVs
c2UgaWYgKHZhbHVlIDwgMTw8MjEpIHsNCisgICAgICAgICAgICBzLnB1c2hfYmFjaygoKHZhbHVl
Pj4xOCkgJiAweDA3KSB8IDB4RjApOw0KKyAgICAgICAgICAgIHV0ZjhfY29udGludWF0aW9ucyh2
YWx1ZSwgMywgcyk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgdGVtcGxhdGU8Ym9vbCBJ
U19IRVg+DQorICAgIHZvaWQgYWRkX3V0ZjhfY29kZV9wb2ludChzdGQ6OnN0cmluZyYgcywNCisg
ICAgICAgIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciYgYmVnaW4sDQorICAgICAgICBzdGQ6
OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgZW5kKQ0KKyAgICB7DQorICAgICAgICB1aW50MzJfdCBj
b2RlX3BvaW50Ow0KKyAgICAgICAgaWYgKCBJU19IRVggKQ0KKyAgICAgICAgICAgIGNvZGVfcG9p
bnQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaGV4X3N0cl90b19jaGFyPHdjaGFyX3Q+KGJlZ2lu
KSk7DQorICAgICAgICBlbHNlDQorICAgICAgICAgICAgY29kZV9wb2ludCA9IHVuaWNvZGVfc3Ry
X3RvX2NoYXI8d2NoYXJfdD4oYmVnaW4sZW5kKTsNCisgICAgICAgIGNvbnZlcnRfdG9fdXRmOChj
b2RlX3BvaW50LHMpOw0KKyAgICB9DQorDQorICAgIHRlbXBsYXRlPCBib29sIElTX0hFWCwgY2xh
c3MgU3RyaW5nX3R5cGUgPg0KKyAgICB2b2lkIGFkZF91bmljb2RlX2NvZGVfcG9pbnQoDQorICAg
ICAgICBTdHJpbmdfdHlwZSYgcywNCisgICAgICAgIHR5cGVuYW1lIFN0cmluZ190eXBlOjpjb25z
dF9pdGVyYXRvciYgYmVnaW4sDQorICAgICAgICB0eXBlbmFtZSBTdHJpbmdfdHlwZTo6Y29uc3Rf
aXRlcmF0b3IgZW5kKQ0KKyAgICB7DQorICAgICAgICBpZiggSVNfSEVYICkgew0KKyAgICAgICAg
ICAgIGlmKCBlbmQgLSBiZWdpbiA+PSAzICkgIC8vICBleHBlY3RpbmcgInhISC4uLiINCisgICAg
ICAgICAgICB7DQorICAgICAgICAgICAgICAgIHMgKz0gaGV4X3N0cl90b19jaGFyPCB0eXBlbmFt
ZSBTdHJpbmdfdHlwZTo6dmFsdWVfdHlwZSA+KCBiZWdpbiApOyAgDQorICAgICAgICAgICAgfQ0K
KyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgaWYoIGVuZCAtIGJlZ2lu
ID49IDUgKSAgLy8gIGV4cGVjdGluZyAidUhISEguLi4iDQorICAgICAgICAgICAgew0KKyAgICAg
ICAgICAgICAgICBzICs9IHVuaWNvZGVfc3RyX3RvX2NoYXI8IHR5cGVuYW1lIFN0cmluZ190eXBl
Ojp2YWx1ZV90eXBlID4oIGJlZ2luLCBlbmQgKTsgIA0KKyAgICAgICAgICAgIH0NCisgICAgICAg
IH0NCisgICAgfQ0KKw0KKyAgICB0ZW1wbGF0ZTw+DQorICAgIGlubGluZSB2b2lkIGFkZF91bmlj
b2RlX2NvZGVfcG9pbnQ8dHJ1ZSxzdGQ6OnN0cmluZz4oDQorICAgICAgICBzdGQ6OnN0cmluZyYg
cywNCisgICAgICAgIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciYgYmVnaW4sDQorICAgICAg
ICBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgZW5kKQ0KKyAgICB7DQorICAgICAgICBpZiAo
IGVuZCAtIGJlZ2luID49IDMgKQ0KKyAgICAgICAgICAgIGFkZF91dGY4X2NvZGVfcG9pbnQ8dHJ1
ZT4ocyxiZWdpbixlbmQpOw0KKyAgICB9DQorDQorICAgIHRlbXBsYXRlPD4NCisgICAgaW5saW5l
IHZvaWQgYWRkX3VuaWNvZGVfY29kZV9wb2ludDxmYWxzZSxzdGQ6OnN0cmluZz4oDQorICAgICAg
ICBzdGQ6OnN0cmluZyYgcywNCisgICAgICAgIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciYg
YmVnaW4sDQorICAgICAgICBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgZW5kKQ0KKyAgICB7
DQorICAgICAgICBpZiAoIGVuZCAtIGJlZ2luID49IDUgKQ0KKyAgICAgICAgICAgIGFkZF91dGY4
X2NvZGVfcG9pbnQ8ZmFsc2U+KHMsYmVnaW4sZW5kKTsNCisgICAgfQ0KKyAgICAgICAgDQorDQog
ICAgIHRlbXBsYXRlPCBjbGFzcyBTdHJpbmdfdHlwZSA+DQogICAgIHZvaWQgYXBwZW5kX2VzY19j
aGFyX2FuZF9pbmNyX2l0ZXIoIFN0cmluZ190eXBlJiBzLCANCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgU3RyaW5nX3R5cGU6OmNvbnN0X2l0ZXJhdG9y
JiBiZWdpbiwgDQpAQCAtMTA2LDE4ICsyMjIsMTIgQEAgbmFtZXNwYWNlIGpzb25fc3Bpcml0CiAg
ICAgICAgICAgICBjYXNlICciJzogIHMgKz0gJyInOyAgYnJlYWs7DQogICAgICAgICAgICAgY2Fz
ZSAneCc6ICANCiAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKCBlbmQgLSBiZWdp
biA+PSAzICkgIC8vICBleHBlY3RpbmcgInhISC4uLiINCi0gICAgICAgICAgICAgICAgew0KLSAg
ICAgICAgICAgICAgICAgICAgcyArPSBoZXhfc3RyX3RvX2NoYXI8IENoYXJfdHlwZSA+KCBiZWdp
biApOyAgDQotICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYWRkX3VuaWNvZGVf
Y29kZV9wb2ludDx0cnVlPihzLGJlZ2luLGVuZCk7DQogICAgICAgICAgICAgICAgIGJyZWFrOw0K
ICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICBjYXNlICd1JzogIA0KICAgICAgICAgICAgIHsN
Ci0gICAgICAgICAgICAgICAgaWYoIGVuZCAtIGJlZ2luID49IDUgKSAgLy8gIGV4cGVjdGluZyAi
dUhISEguLi4iDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHMgKz0g
dW5pY29kZV9zdHJfdG9fY2hhcjwgQ2hhcl90eXBlID4oIGJlZ2luICk7ICANCi0gICAgICAgICAg
ICAgICAgfQ0KKyAgICAgICAgICAgICAgICBhZGRfdW5pY29kZV9jb2RlX3BvaW50PGZhbHNlPihz
LGJlZ2luLGVuZCk7DQogICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgIH0NCiAg
ICAgICAgIH0NCkBAIC0zNTYsMTggKzQ2Niw2IEBAIG5hbWVzcGFjZSBqc29uX3NwaXJpdAogICAg
ICAgICBTdHJpbmdfdHlwZSBuYW1lXzsgICAgICAgICAgICAgIC8vIG9mIGN1cnJlbnQgbmFtZS92
YWx1ZSBwYWlyDQogICAgIH07DQogDQotICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBJdGVyX3R5cGUg
Pg0KLSAgICB2b2lkIHRocm93X2Vycm9yKCBzcGlyaXRfbmFtZXNwYWNlOjpwb3NpdGlvbl9pdGVy
YXRvcjwgSXRlcl90eXBlID4gaSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJlYXNvbiApDQotICAgIHsN
Ci0gICAgICAgIHRocm93IEVycm9yX3Bvc2l0aW9uKCBpLmdldF9wb3NpdGlvbigpLmxpbmUsIGku
Z2V0X3Bvc2l0aW9uKCkuY29sdW1uLCByZWFzb24gKTsNCi0gICAgfQ0KLQ0KLSAgICB0ZW1wbGF0
ZTwgdHlwZW5hbWUgSXRlcl90eXBlID4NCi0gICAgdm9pZCB0aHJvd19lcnJvciggSXRlcl90eXBl
IGksIGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24gKQ0KLSAgICB7DQotICAgICAgIHRocm93IHJl
YXNvbjsNCi0gICAgfQ0KLQ0KICAgICAvLyB0aGUgc3Bpcml0IGdyYW1tZXIgDQogICAgIC8vDQog
ICAgIHRlbXBsYXRlPCBjbGFzcyBWYWx1ZV90eXBlLCBjbGFzcyBJdGVyX3R5cGUgPg0KZGlmZiAt
LWdpdCBhL3ZsaWIvZXh0L2pzb25fc3Bpcml0L2pzb25fc3Bpcml0X3dyaXRlcl90ZW1wbGF0ZS5o
IGIvdmxpYi9leHQvanNvbl9zcGlyaXQvanNvbl9zcGlyaXRfd3JpdGVyX3RlbXBsYXRlLmgKaW5k
ZXggN2MxYTYyYi4uNTI2N2RjYSAxMDA2NDQKLS0tIGEvdmxpYi9leHQvanNvbl9zcGlyaXQvanNv
bl9zcGlyaXRfd3JpdGVyX3RlbXBsYXRlLmgKKysrIGIvdmxpYi9leHQvanNvbl9zcGlyaXQvanNv
bl9zcGlyaXRfd3JpdGVyX3RlbXBsYXRlLmgKQEAgLTY1LDYgKzY1LDkxIEBAIG5hbWVzcGFjZSBq
c29uX3NwaXJpdAogICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgIH0NCiANCisgICAgLy8gYm91
bmRzIGNoZWNraW5nIG9uIGl0ZXIuDQorICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBFUlJPUl9D
SEFSID0gMHhGRkZEOw0KKw0KKyAgICBpbmxpbmUgdWludDMyX3QgY29udmVydF9mcm9tX3V0Zjgo
DQorICAgICAgICBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3ImIGl0ZXIsDQorICAgICAgICBz
dGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgZW5kKQ0KKyAgICB7DQorICAgICAgICAvLyB0aGlz
IHdvdWxkIGJlIGFuIGVycm9yLg0KKyAgICAgICAgaWYgKCBpdGVyID09IGVuZCApIHsNCisgICAg
ICAgICAgICByZXR1cm4gRVJST1JfQ0hBUjsNCisgICAgICAgIH0NCisgICAgICAgIGNvbnN0IHVu
c2lnbmVkIGNoYXIgZnJvbnQgPSAqaXRlcisrOw0KKyAgICAgICAgdWludDMyX3QgbmV3X3ZhbCA9
IDA7DQorICAgICAgICBpbnQgY29udGludWF0aW9uX2NvdW50ID0gMDsNCisNCisgICAgICAgIC8v
IDEgYnl0ZQ0KKyAgICAgICAgaWYgKCBmcm9udCA8PSAweDdGICkgew0KKyAgICAgICAgICAgIHJl
dHVybiBmcm9udDsNCisgICAgICAgIH0NCisgICAgICAgIC8vIDEwMTEgMTExMS4gY29udGludWF0
aW9uIGF0IHRoZSBmcm9udC4uLiBlcnJvcg0KKyAgICAgICAgZWxzZSBpZiAoIGZyb250IDw9IDB4
QkYgKSB7DQorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0NIQVI7DQorICAgICAgICB9DQorICAg
ICAgICAvLyAxMTAxIDExMTEuIDIgYnl0ZXMuDQorICAgICAgICBlbHNlIGlmICggZnJvbnQgPD0g
MHhERiApIHsNCisgICAgICAgICAgICBuZXdfdmFsID0gZnJvbnQgJiAweDFGOw0KKyAgICAgICAg
ICAgIGNvbnRpbnVhdGlvbl9jb3VudCA9IDE7DQorICAgICAgICB9DQorICAgICAgICAvLyAxMTEw
IDExMTEuIDMgYnl0ZXMuDQorICAgICAgICBlbHNlIGlmICggZnJvbnQgPD0gMHhFRiApIHsNCisg
ICAgICAgICAgICBuZXdfdmFsID0gZnJvbnQgJiAweDBGOw0KKyAgICAgICAgICAgIGNvbnRpbnVh
dGlvbl9jb3VudCA9IDI7DQorICAgICAgICB9DQorICAgICAgICAvLyAxMTExIDAxMTEuIDQgYnl0
ZXMuDQorICAgICAgICBlbHNlIGlmICggZnJvbnQgPD0gMHhGNyApIHsNCisgICAgICAgICAgICBu
ZXdfdmFsID0gZnJvbnQgJiAweDA3Ow0KKyAgICAgICAgICAgIGNvbnRpbnVhdGlvbl9jb3VudCA9
IDM7DQorICAgICAgICB9DQorICAgICAgICAvLyBpbnZhbGlkIHV0ZjgNCisgICAgICAgIGVsc2Ug
ew0KKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9DSEFSOw0KKyAgICAgICAgfQ0KKw0KKyAgICAg
ICAgLy8gaXQgd291bGQgYmUgYW4gZXJyb3IgZm9yIGl0ZXIgPT0gZW5kLg0KKyAgICAgICAgd2hp
bGUgKCBjb250aW51YXRpb25fY291bnQtLSAmJiBpdGVyICE9IGVuZCApDQorICAgICAgICB7DQor
ICAgICAgICAgICAgdWludDhfdCBjdXJ2YWwgPSAqaXRlcjsNCisNCisgICAgICAgICAgICBpZiAo
IChjdXJ2YWwgJiAweEMwKSAhPSAweDgwICkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRVJS
T1JfQ0hBUjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbmV3X3ZhbCA8PD0gNjsNCisg
ICAgICAgICAgICBuZXdfdmFsIHw9IGN1cnZhbCAmIDB4M0Y7DQorICAgICAgICAgICAgKytpdGVy
Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIG5ld192YWw7DQorICAgIH0NCisNCisgICAg
dGVtcGxhdGU8IGNsYXNzIFN0cmluZ190eXBlID4NCisgICAgdm9pZCBhZGRfdW5pY29kZV9jb2Rl
X3BvaW50KCBTdHJpbmdfdHlwZSYgcywgdHlwZW5hbWUgU3RyaW5nX3R5cGU6OmNvbnN0X2l0ZXJh
dG9yJiBpdGVyLCB0eXBlbmFtZSBTdHJpbmdfdHlwZTo6Y29uc3RfaXRlcmF0b3IgZW5kICkNCisg
ICAgew0KKyAgICAgICAgY29uc3Qgd2ludF90IHVuc2lnbmVkX2MoICggKml0ZXIgPj0gMCApID8g
Kml0ZXIgOiAyNTYgKyAqaXRlciApOw0KKyAgICAgICAgcyArPSBub25fcHJpbnRhYmxlX3RvX3N0
cmluZzwgU3RyaW5nX3R5cGUgPiggdW5zaWduZWRfYyApOw0KKyAgICB9DQorDQorICAgIHRlbXBs
YXRlPD4NCisgICAgaW5saW5lIHZvaWQgYWRkX3VuaWNvZGVfY29kZV9wb2ludDxzdGQ6OnN0cmlu
Zz4oIHN0ZDo6c3RyaW5nJiBzLCBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3ImIGl0ZXIsIHN0
ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBlbmQgKQ0KKyAgICB7DQorICAgICAgICB1bnNpZ25l
ZCB1bnNpZ25lZF9jID0gY29udmVydF9mcm9tX3V0ZjgoaXRlcixlbmQpOw0KKyAgICAgICAgaWYg
KCB1bnNpZ25lZF9jID4gMHhGRkZGICkgew0KKyAgICAgICAgICAgIHVuc2lnbmVkX2MgLT0gMHgx
MDAwMDsNCisgICAgICAgICAgICB1bnNpZ25lZCBmaXJzdCA9ICh1bnNpZ25lZF9jID4+IDEwKSAr
IDB4RDgwMDsNCisgICAgICAgICAgICB1bnNpZ25lZCBzZWNvbmQgPSAoKHVuc2lnbmVkX2MgJiAw
eDAzRkYpICsgMHhEQzAwKTsNCisNCisgICAgICAgICAgICBzICs9IG5vbl9wcmludGFibGVfdG9f
c3RyaW5nPCBzdGQ6OnN0cmluZyA+KCBmaXJzdCApOw0KKyAgICAgICAgICAgIHMgKz0gbm9uX3By
aW50YWJsZV90b19zdHJpbmc8IHN0ZDo6c3RyaW5nID4oIHNlY29uZCApOw0KKyAgICAgICAgfQ0K
KyAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgcyArPSBub25fcHJpbnRhYmxlX3RvX3N0cmlu
Zzwgc3RkOjpzdHJpbmcgPiggdW5zaWduZWRfYyApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgLS1p
dGVyOw0KKyAgICB9DQorDQorDQorDQogICAgIHRlbXBsYXRlPCBjbGFzcyBTdHJpbmdfdHlwZSA+
DQogICAgIFN0cmluZ190eXBlIGFkZF9lc2NfY2hhcnMoIGNvbnN0IFN0cmluZ190eXBlJiBzLCBi
b29sIHJhd191dGY4LCBib29sIGVzY19ub25hc2NpaSApDQogICAgIHsNCkBAIC05NSwxMiArMTgw
LDEyIEBAIG5hbWVzcGFjZSBqc29uX3NwaXJpdAogICAgICAgICAgICAgICAgIH0NCiAgICAgICAg
ICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBy
ZXN1bHQgKz0gbm9uX3ByaW50YWJsZV90b19zdHJpbmc8IFN0cmluZ190eXBlID4oIHVuc2lnbmVk
X2MgKTsNCisgICAgICAgICAgICAgICAgICAgIGFkZF91bmljb2RlX2NvZGVfcG9pbnQ8U3RyaW5n
X3R5cGU+KHJlc3VsdCwgaSwgZW5kKTsNCiAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAg
IH0NCiAgICAgICAgIH0NCiANCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICByZXR1
cm4gcmVzdWx0OyAgICAgICAgDQogICAgIH0NCiANCiAgICAgdGVtcGxhdGU8IGNsYXNzIE9zdHJl
YW0gPg0K
GeneralRe: Patch For unicode reading / writing for narrow strings Pin
John W. Wilkinson24-Jul-13 9:01
John W. Wilkinson24-Jul-13 9:01 
GeneralRe: Patch For unicode reading / writing for narrow strings Pin
David Wilcox24-Jul-13 9:23
David Wilcox24-Jul-13 9:23 
GeneralRe: Patch For unicode reading / writing for narrow strings Pin
David Wilcox24-Jul-13 9:51
David Wilcox24-Jul-13 9:51 
GeneralRe: Patch For unicode reading / writing for narrow strings Pin
John W. Wilkinson25-Jul-13 10:20
John W. Wilkinson25-Jul-13 10:20 
GeneralRe: Patch For unicode reading / writing for narrow strings Pin
David Wilcox25-Jul-13 11:03
David Wilcox25-Jul-13 11:03 
GeneralRe: Patch For unicode reading / writing for narrow strings Pin
John W. Wilkinson26-Jul-13 8:52
John W. Wilkinson26-Jul-13 8:52 
GeneralRe: Patch For unicode reading / writing for narrow strings Pin
David Wilcox26-Jul-13 9:48
David Wilcox26-Jul-13 9:48 
GeneralRe: Patch For unicode reading / writing for narrow strings Pin
John W. Wilkinson26-Jul-13 10:15
John W. Wilkinson26-Jul-13 10:15 
GeneralRe: Patch For unicode reading / writing for narrow strings Pin
David Wilcox26-Jul-13 10:36
David Wilcox26-Jul-13 10:36 
GeneralRe: Patch For unicode reading / writing for narrow strings Pin
David Wilcox26-Jul-13 10:37
David Wilcox26-Jul-13 10:37 
GeneralRe: Patch For unicode reading / writing for narrow strings Pin
John W. Wilkinson28-Jul-13 3:17
John W. Wilkinson28-Jul-13 3:17 
GeneralRe: Patch For unicode reading / writing for narrow strings Pin
David Wilcox26-Jul-13 10:44
David Wilcox26-Jul-13 10:44 
GeneralRe: Patch For unicode reading / writing for narrow strings Pin
John W. Wilkinson28-Jul-13 3:32
John W. Wilkinson28-Jul-13 3:32 
GeneralRe: Patch For unicode reading / writing for narrow strings Pin
David Wilcox29-Jul-13 5:30
David Wilcox29-Jul-13 5:30 
GeneralRe: Patch For unicode reading / writing for narrow strings Pin
John W. Wilkinson29-Jul-13 9:04
John W. Wilkinson29-Jul-13 9:04 
GeneralRe: Patch For unicode reading / writing for narrow strings Pin
David Wilcox29-Jul-13 10:05
David Wilcox29-Jul-13 10:05 
GeneralRe: Patch For unicode reading / writing for narrow strings Pin
David Wilcox26-Jul-13 12:19
David Wilcox26-Jul-13 12:19 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.