summaryrefslogtreecommitdiff
path: root/db/json.cpp
diff options
context:
space:
mode:
authorAaron <aaron@10gen.com>2009-01-14 17:17:24 -0500
committerAaron <aaron@10gen.com>2009-01-14 17:17:24 -0500
commit248a6dd8deab804423944ad1d0bdf234200fef84 (patch)
treeafd4a0e40f8818187903108e4c38a34bf4097482 /db/json.cpp
parentad1f6b3cbdd1183eedc04f98fa813e63ce68a408 (diff)
downloadmongo-248a6dd8deab804423944ad1d0bdf234200fef84.tar.gz
Replace tab indentation with spaces
Diffstat (limited to 'db/json.cpp')
-rw-r--r--db/json.cpp202
1 files changed, 104 insertions, 98 deletions
diff --git a/db/json.cpp b/db/json.cpp
index 24ea7e8d16f..05cc669486e 100644
--- a/db/json.cpp
+++ b/db/json.cpp
@@ -25,9 +25,13 @@ using namespace boost::spirit;
namespace mongo {
struct ObjectBuilder {
- BSONObjBuilder *back() { return builders.back().get(); }
+ BSONObjBuilder *back() {
+ return builders.back().get();
+ }
// Storage for field names of elements within builders.back().
- const char *fieldName() { return fieldNames.back().c_str(); }
+ const char *fieldName() {
+ return fieldNames.back().c_str();
+ }
void push() {
boost::shared_ptr< BSONObjBuilder > b( new BSONObjBuilder() );
builders.push_back( b );
@@ -42,7 +46,7 @@ struct ObjectBuilder {
return ret;
}
void nameFromIndex() {
- fieldNames.back() = BSONObjBuilder::numStr( indexes.back() );
+ fieldNames.back() = BSONObjBuilder::numStr( indexes.back() );
}
string popString() {
string ret = ss.str();
@@ -101,33 +105,33 @@ struct chE {
chE( ObjectBuilder &_b ) : b( _b ) {}
void operator() ( const char c ) const {
char o = '\0';
- switch( c ) {
- case '\"':
- o = '\"';
- break;
- case '\\':
- o = '\\';
- break;
- case '/':
- o = '/';
- break;
- case 'b':
- o = '\b';
- break;
- case 'f':
- o = '\f';
- break;
- case 'n':
- o = '\n';
- break;
- case 'r':
- o = '\r';
- break;
- case 't':
- o = '\t';
- break;
- default:
- assert( false );
+ switch ( c ) {
+ case '\"':
+ o = '\"';
+ break;
+ case '\\':
+ o = '\\';
+ break;
+ case '/':
+ o = '/';
+ break;
+ case 'b':
+ o = '\b';
+ break;
+ case 'f':
+ o = '\f';
+ break;
+ case 'n':
+ o = '\n';
+ break;
+ case 'r':
+ o = '\r';
+ break;
+ case 't':
+ o = '\t';
+ break;
+ default:
+ assert( false );
}
b.ss << o;
}
@@ -135,19 +139,19 @@ struct chE {
};
namespace hex {
- int val( char c ) {
- if ( '0' <= c && c <= '9' )
- return c - '0';
- if ( 'a' <= c && c <= 'f' )
- return c - 'a' + 10;
- if ( 'A' <= c && c <= 'F' )
- return c - 'A' + 10;
- assert( false );
- return 0xff;
- }
- char val( const char *c ) {
- return ( val( c[ 0 ] ) << 4 ) | val( c[ 1 ] );
- }
+int val( char c ) {
+ if ( '0' <= c && c <= '9' )
+ return c - '0';
+ if ( 'a' <= c && c <= 'f' )
+ return c - 'a' + 10;
+ if ( 'A' <= c && c <= 'F' )
+ return c - 'A' + 10;
+ assert( false );
+ return 0xff;
+}
+char val( const char *c ) {
+ return ( val( c[ 0 ] ) << 4 ) | val( c[ 1 ] );
+}
} // namespace hex
struct chU {
@@ -182,16 +186,16 @@ struct fieldNameEnd {
void operator() ( const char *start, const char *end ) const {
string name = b.popString();
massert( "Invalid use of reserved field name",
- name != "$ns" &&
- name != "$id" &&
- name != "$binary" &&
- name != "$type" &&
- name != "$date" &&
- name != "$regex" &&
- name != "$options" );
+ name != "$ns" &&
+ name != "$id" &&
+ name != "$binary" &&
+ name != "$type" &&
+ name != "$date" &&
+ name != "$regex" &&
+ name != "$options" );
b.fieldNames.back() = name;
}
- ObjectBuilder &b;
+ ObjectBuilder &b;
};
struct stringEnd {
@@ -264,7 +268,7 @@ struct dbrefNS {
OID stringToOid( const char *s ) {
OID oid;
char *oidP = (char *)( &oid );
- for( int i = 0; i < 12; ++i )
+ for ( int i = 0; i < 12; ++i )
oidP[ i ] = hex::val( s[ i * 2 ] );
return oid;
}
@@ -301,23 +305,23 @@ struct oidEnd {
// boost's conversion.
struct binDataBinary {
typedef
- boost::archive::iterators::transform_width
- < boost::archive::iterators::binary_from_base64
- < string::const_iterator >, 8, 6
- > binary_t;
+ boost::archive::iterators::transform_width
+ < boost::archive::iterators::binary_from_base64
+ < string::const_iterator >, 8, 6
+ > binary_t;
binDataBinary( ObjectBuilder &_b ) : b( _b ) {}
void operator() ( const char *start, const char *end ) const {
massert( "Badly formatted bindata", ( end - start ) % 4 == 0 );
string base64( start, end );
int len = base64.length();
int pad = 0;
- for(; len - pad > 0 && base64[ len - 1 - pad ] == '='; ++pad )
+ for (; len - pad > 0 && base64[ len - 1 - pad ] == '='; ++pad )
base64[ len - 1 - pad ] = 'A';
massert( "Badly formatted bindata", pad < 3 );
b.binData = string( binary_t( base64.begin() ), binary_t( base64.end() ) );
b.binData.resize( b.binData.length() - pad );
}
- ObjectBuilder &b;
+ ObjectBuilder &b;
};
struct binDataType {
@@ -332,7 +336,7 @@ struct binDataEnd {
binDataEnd( ObjectBuilder &_b ) : b( _b ) {}
void operator() ( const char *start, const char *end ) const {
b.back()->appendBinData( b.fieldName(), b.binData.length(),
- b.binDataType, b.binData.data() );
+ b.binDataType, b.binData.data() );
}
ObjectBuilder &b;
};
@@ -358,7 +362,7 @@ struct regexValue {
void operator() ( const char *start, const char *end ) const {
b.regex = b.popString();
}
- ObjectBuilder &b;
+ ObjectBuilder &b;
};
struct regexOptions {
@@ -366,16 +370,16 @@ struct regexOptions {
void operator() ( const char *start, const char *end ) const {
b.regexOptions = string( start, end );
}
- ObjectBuilder &b;
+ ObjectBuilder &b;
};
struct regexEnd {
regexEnd( ObjectBuilder &_b ) : b( _b ) {}
void operator() ( const char *start, const char *end ) const {
b.back()->appendRegex( b.fieldName(), b.regex.c_str(),
- b.regexOptions.c_str() );
+ b.regexOptions.c_str() );
}
- ObjectBuilder &b;
+ ObjectBuilder &b;
};
// One gotcha with this parsing library is probably best ilustrated with an
@@ -395,7 +399,7 @@ struct regexEnd {
struct JsonGrammar : public grammar< JsonGrammar > {
public:
JsonGrammar( ObjectBuilder &_b ) : b( _b ) {}
-
+
template < typename ScannerT >
struct definition {
definition( JsonGrammar const &self ) {
@@ -420,38 +424,38 @@ public:
lexeme_d[ str_p( "null" ) ][ nullValue( self.b ) ];
// lexeme_d and rules don't mix well, so we have this mess
str = lexeme_d[ ch_p( '"' )[ chClear( self.b ) ] >>
- *( ( ch_p( '\\' ) >>
- ( ch_p( '"' )[ chE( self.b ) ] |
- ch_p( '\\' )[ chE( self.b ) ] |
- ch_p( '/' )[ chE( self.b ) ] |
- ch_p( 'b' )[ chE( self.b ) ] |
- ch_p( 'f' )[ chE( self.b ) ] |
- ch_p( 'n' )[ chE( self.b ) ] |
- ch_p( 'r' )[ chE( self.b ) ] |
- ch_p( 't' )[ chE( self.b ) ] |
- ( ch_p( 'u' ) >> ( repeat_p( 4 )[ xdigit_p ][ chU( self.b ) ] ) ) ) ) |
- ch_p( '\x7f' )[ ch( self.b ) ] |
- ( ~cntrl_p & ~ch_p( '"' ) & ( ~ch_p( '\\' ) )[ ch( self.b ) ] ) ) >> '"' ];
+ *( ( ch_p( '\\' ) >>
+ ( ch_p( '"' )[ chE( self.b ) ] |
+ ch_p( '\\' )[ chE( self.b ) ] |
+ ch_p( '/' )[ chE( self.b ) ] |
+ ch_p( 'b' )[ chE( self.b ) ] |
+ ch_p( 'f' )[ chE( self.b ) ] |
+ ch_p( 'n' )[ chE( self.b ) ] |
+ ch_p( 'r' )[ chE( self.b ) ] |
+ ch_p( 't' )[ chE( self.b ) ] |
+ ( ch_p( 'u' ) >> ( repeat_p( 4 )[ xdigit_p ][ chU( self.b ) ] ) ) ) ) |
+ ch_p( '\x7f' )[ ch( self.b ) ] |
+ ( ~cntrl_p & ~ch_p( '"' ) & ( ~ch_p( '\\' ) )[ ch( self.b ) ] ) ) >> '"' ];
// real_p accepts numbers with nonsignificant zero prefixes, which
// aren't allowed in JSON. Oh well.
number = real_p[ numberValue( self.b ) ];
dbref = dbrefS | dbrefT;
dbrefS = ch_p( '{' ) >> "\"$ns\"" >> ':' >>
- str[ dbrefNS( self.b ) ] >> ',' >> "\"$id\"" >> ':' >> quotedOid >> '}';
+ str[ dbrefNS( self.b ) ] >> ',' >> "\"$id\"" >> ':' >> quotedOid >> '}';
dbrefT = str_p( "Dbref" ) >> '(' >> str[ dbrefNS( self.b ) ] >> ',' >>
- quotedOid >> ')';
+ quotedOid >> ')';
// FIXME Only object id if top level field?
oid = oidS | oidT;
oidS = str_p( "\"_id\"" ) >> ':' >> quotedOid;
oidT = str_p( "\"_id\"" ) >> ':' >> "ObjectId" >> '(' >> quotedOid >> ')';
-
+
quotedOid = lexeme_d[ '"' >> ( repeat_p( 24 )[ xdigit_p ] )[ oidValue( self.b ) ] >> '"' ];
-
+
bindata = ch_p( '{' ) >> "\"$binary\"" >> ':' >>
- lexeme_d[ '"' >> ( *( range_p( 'A', 'Z' ) | range_p( 'a', 'z' ) | range_p( '0', '9' ) | ch_p( '+' ) | ch_p( '/' ) ) >> *ch_p( '=' ) )[ binDataBinary( self.b ) ] >> '"' ] >> ',' >> "\"$type\"" >> ':' >>
- lexeme_d[ '"' >> ( repeat_p( 2 )[ xdigit_p ] )[ binDataType( self.b ) ] >> '"' ] >> '}';
+ lexeme_d[ '"' >> ( *( range_p( 'A', 'Z' ) | range_p( 'a', 'z' ) | range_p( '0', '9' ) | ch_p( '+' ) | ch_p( '/' ) ) >> *ch_p( '=' ) )[ binDataBinary( self.b ) ] >> '"' ] >> ',' >> "\"$type\"" >> ':' >>
+ lexeme_d[ '"' >> ( repeat_p( 2 )[ xdigit_p ] )[ binDataType( self.b ) ] >> '"' ] >> '}';
date = dateS | dateT;
dateS = ch_p( '{' ) >> "\"$date\"" >> ':' >> uint_parser< unsigned long long >()[ dateValue( self.b ) ] >> '}';
@@ -461,24 +465,26 @@ public:
regexS = ch_p( '{' ) >> "\"$regex\"" >> ':' >> str[ regexValue( self.b ) ] >> ',' >> "\"$options\"" >> ':' >> lexeme_d[ '"' >> ( *( alpha_p ) )[ regexOptions( self.b ) ] >> '"' ] >> '}';
// FIXME Obviously it would be nice to unify this with str.
regexT = lexeme_d[ ch_p( '/' )[ chClear( self.b ) ] >>
- *( ( ch_p( '\\' ) >>
- ( ch_p( '"' )[ chE( self.b ) ] |
- ch_p( '\\' )[ chE( self.b ) ] |
- ch_p( '/' )[ chE( self.b ) ] |
- ch_p( 'b' )[ chE( self.b ) ] |
- ch_p( 'f' )[ chE( self.b ) ] |
- ch_p( 'n' )[ chE( self.b ) ] |
- ch_p( 'r' )[ chE( self.b ) ] |
- ch_p( 't' )[ chE( self.b ) ] |
- ( ch_p( 'u' ) >> ( repeat_p( 4 )[ xdigit_p ][ chU( self.b ) ] ) ) ) ) |
- ch_p( '\x7f' )[ ch( self.b ) ] |
- ( ~cntrl_p & ~ch_p( '/' ) & ( ~ch_p( '\\' ) )[ ch( self.b ) ] ) ) >> str_p( "/" )[ regexValue( self.b ) ]
- >> ( *( ch_p( 'i' ) | ch_p( 'g' ) | ch_p( 'm' ) ) )[ regexOptions( self.b ) ] ];
+ *( ( ch_p( '\\' ) >>
+ ( ch_p( '"' )[ chE( self.b ) ] |
+ ch_p( '\\' )[ chE( self.b ) ] |
+ ch_p( '/' )[ chE( self.b ) ] |
+ ch_p( 'b' )[ chE( self.b ) ] |
+ ch_p( 'f' )[ chE( self.b ) ] |
+ ch_p( 'n' )[ chE( self.b ) ] |
+ ch_p( 'r' )[ chE( self.b ) ] |
+ ch_p( 't' )[ chE( self.b ) ] |
+ ( ch_p( 'u' ) >> ( repeat_p( 4 )[ xdigit_p ][ chU( self.b ) ] ) ) ) ) |
+ ch_p( '\x7f' )[ ch( self.b ) ] |
+ ( ~cntrl_p & ~ch_p( '/' ) & ( ~ch_p( '\\' ) )[ ch( self.b ) ] ) ) >> str_p( "/" )[ regexValue( self.b ) ]
+ >> ( *( ch_p( 'i' ) | ch_p( 'g' ) | ch_p( 'm' ) ) )[ regexOptions( self.b ) ] ];
}
rule< ScannerT > object, members, pair, array, elements, value, str, number,
- dbref, dbrefS, dbrefT, oid, oidS, oidT, bindata, date, dateS, dateT,
- regex, regexS, regexT, quotedOid;
- const rule< ScannerT > &start() const { return object; }
+ dbref, dbrefS, dbrefT, oid, oidS, oidT, bindata, date, dateS, dateT,
+ regex, regexS, regexT, quotedOid;
+ const rule< ScannerT > &start() const {
+ return object;
+ }
};
ObjectBuilder &b;
};