1199 lines
35 KiB
C
1199 lines
35 KiB
C
|
/**
|
||
|
* @file bson.h
|
||
|
* @brief BSON Declarations
|
||
|
*/
|
||
|
|
||
|
/* Copyright 2009-2011 10gen Inc.
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
|
||
|
#ifndef _BSON_H_
|
||
|
#define _BSON_H_
|
||
|
|
||
|
#include <time.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include <stdio.h>
|
||
|
#include <stdarg.h>
|
||
|
#include "defines.h"
|
||
|
|
||
|
typedef long long int int64_t;
|
||
|
typedef unsigned long long int uint64_t;
|
||
|
|
||
|
#define BSON_OK 0
|
||
|
#define BSON_ERROR -1
|
||
|
|
||
|
static const char bson_numstrs[1000][4] = {
|
||
|
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
|
||
|
"10", "11", "12", "13", "14", "15", "16", "17", "18", "19",
|
||
|
"20", "21", "22", "23", "24", "25", "26", "27", "28", "29",
|
||
|
"30", "31", "32", "33", "34", "35", "36", "37", "38", "39",
|
||
|
"40", "41", "42", "43", "44", "45", "46", "47", "48", "49",
|
||
|
"50", "51", "52", "53", "54", "55", "56", "57", "58", "59",
|
||
|
"60", "61", "62", "63", "64", "65", "66", "67", "68", "69",
|
||
|
"70", "71", "72", "73", "74", "75", "76", "77", "78", "79",
|
||
|
"80", "81", "82", "83", "84", "85", "86", "87", "88", "89",
|
||
|
"90", "91", "92", "93", "94", "95", "96", "97", "98", "99",
|
||
|
|
||
|
"100", "101", "102", "103", "104", "105", "106", "107", "108", "109",
|
||
|
"110", "111", "112", "113", "114", "115", "116", "117", "118", "119",
|
||
|
"120", "121", "122", "123", "124", "125", "126", "127", "128", "129",
|
||
|
"130", "131", "132", "133", "134", "135", "136", "137", "138", "139",
|
||
|
"140", "141", "142", "143", "144", "145", "146", "147", "148", "149",
|
||
|
"150", "151", "152", "153", "154", "155", "156", "157", "158", "159",
|
||
|
"160", "161", "162", "163", "164", "165", "166", "167", "168", "169",
|
||
|
"170", "171", "172", "173", "174", "175", "176", "177", "178", "179",
|
||
|
"180", "181", "182", "183", "184", "185", "186", "187", "188", "189",
|
||
|
"190", "191", "192", "193", "194", "195", "196", "197", "198", "199",
|
||
|
|
||
|
"200", "201", "202", "203", "204", "205", "206", "207", "208", "209",
|
||
|
"210", "211", "212", "213", "214", "215", "216", "217", "218", "219",
|
||
|
"220", "221", "222", "223", "224", "225", "226", "227", "228", "229",
|
||
|
"230", "231", "232", "233", "234", "235", "236", "237", "238", "239",
|
||
|
"240", "241", "242", "243", "244", "245", "246", "247", "248", "249",
|
||
|
"250", "251", "252", "253", "254", "255", "256", "257", "258", "259",
|
||
|
"260", "261", "262", "263", "264", "265", "266", "267", "268", "269",
|
||
|
"270", "271", "272", "273", "274", "275", "276", "277", "278", "279",
|
||
|
"280", "281", "282", "283", "284", "285", "286", "287", "288", "289",
|
||
|
"290", "291", "292", "293", "294", "295", "296", "297", "298", "299",
|
||
|
|
||
|
"300", "301", "302", "303", "304", "305", "306", "307", "308", "309",
|
||
|
"310", "311", "312", "313", "314", "315", "316", "317", "318", "319",
|
||
|
"320", "321", "322", "323", "324", "325", "326", "327", "328", "329",
|
||
|
"330", "331", "332", "333", "334", "335", "336", "337", "338", "339",
|
||
|
"340", "341", "342", "343", "344", "345", "346", "347", "348", "349",
|
||
|
"350", "351", "352", "353", "354", "355", "356", "357", "358", "359",
|
||
|
"360", "361", "362", "363", "364", "365", "366", "367", "368", "369",
|
||
|
"370", "371", "372", "373", "374", "375", "376", "377", "378", "379",
|
||
|
"380", "381", "382", "383", "384", "385", "386", "387", "388", "389",
|
||
|
"390", "391", "392", "393", "394", "395", "396", "397", "398", "399",
|
||
|
|
||
|
"400", "401", "402", "403", "404", "405", "406", "407", "408", "409",
|
||
|
"410", "411", "412", "413", "414", "415", "416", "417", "418", "419",
|
||
|
"420", "421", "422", "423", "424", "425", "426", "427", "428", "429",
|
||
|
"430", "431", "432", "433", "434", "435", "436", "437", "438", "439",
|
||
|
"440", "441", "442", "443", "444", "445", "446", "447", "448", "449",
|
||
|
"450", "451", "452", "453", "454", "455", "456", "457", "458", "459",
|
||
|
"460", "461", "462", "463", "464", "465", "466", "467", "468", "469",
|
||
|
"470", "471", "472", "473", "474", "475", "476", "477", "478", "479",
|
||
|
"480", "481", "482", "483", "484", "485", "486", "487", "488", "489",
|
||
|
"490", "491", "492", "493", "494", "495", "496", "497", "498", "499",
|
||
|
|
||
|
"500", "501", "502", "503", "504", "505", "506", "507", "508", "509",
|
||
|
"510", "511", "512", "513", "514", "515", "516", "517", "518", "519",
|
||
|
"520", "521", "522", "523", "524", "525", "526", "527", "528", "529",
|
||
|
"530", "531", "532", "533", "534", "535", "536", "537", "538", "539",
|
||
|
"540", "541", "542", "543", "544", "545", "546", "547", "548", "549",
|
||
|
"550", "551", "552", "553", "554", "555", "556", "557", "558", "559",
|
||
|
"560", "561", "562", "563", "564", "565", "566", "567", "568", "569",
|
||
|
"570", "571", "572", "573", "574", "575", "576", "577", "578", "579",
|
||
|
"580", "581", "582", "583", "584", "585", "586", "587", "588", "589",
|
||
|
"590", "591", "592", "593", "594", "595", "596", "597", "598", "599",
|
||
|
|
||
|
"600", "601", "602", "603", "604", "605", "606", "607", "608", "609",
|
||
|
"610", "611", "612", "613", "614", "615", "616", "617", "618", "619",
|
||
|
"620", "621", "622", "623", "624", "625", "626", "627", "628", "629",
|
||
|
"630", "631", "632", "633", "634", "635", "636", "637", "638", "639",
|
||
|
"640", "641", "642", "643", "644", "645", "646", "647", "648", "649",
|
||
|
"650", "651", "652", "653", "654", "655", "656", "657", "658", "659",
|
||
|
"660", "661", "662", "663", "664", "665", "666", "667", "668", "669",
|
||
|
"670", "671", "672", "673", "674", "675", "676", "677", "678", "679",
|
||
|
"680", "681", "682", "683", "684", "685", "686", "687", "688", "689",
|
||
|
"690", "691", "692", "693", "694", "695", "696", "697", "698", "699",
|
||
|
|
||
|
"700", "701", "702", "703", "704", "705", "706", "707", "708", "709",
|
||
|
"710", "711", "712", "713", "714", "715", "716", "717", "718", "719",
|
||
|
"720", "721", "722", "723", "724", "725", "726", "727", "728", "729",
|
||
|
"730", "731", "732", "733", "734", "735", "736", "737", "738", "739",
|
||
|
"740", "741", "742", "743", "744", "745", "746", "747", "748", "749",
|
||
|
"750", "751", "752", "753", "754", "755", "756", "757", "758", "759",
|
||
|
"760", "761", "762", "763", "764", "765", "766", "767", "768", "769",
|
||
|
"770", "771", "772", "773", "774", "775", "776", "777", "778", "779",
|
||
|
"780", "781", "782", "783", "784", "785", "786", "787", "788", "789",
|
||
|
"790", "791", "792", "793", "794", "795", "796", "797", "798", "799",
|
||
|
|
||
|
"800", "801", "802", "803", "804", "805", "806", "807", "808", "809",
|
||
|
"810", "811", "812", "813", "814", "815", "816", "817", "818", "819",
|
||
|
"820", "821", "822", "823", "824", "825", "826", "827", "828", "829",
|
||
|
"830", "831", "832", "833", "834", "835", "836", "837", "838", "839",
|
||
|
"840", "841", "842", "843", "844", "845", "846", "847", "848", "849",
|
||
|
"850", "851", "852", "853", "854", "855", "856", "857", "858", "859",
|
||
|
"860", "861", "862", "863", "864", "865", "866", "867", "868", "869",
|
||
|
"870", "871", "872", "873", "874", "875", "876", "877", "878", "879",
|
||
|
"880", "881", "882", "883", "884", "885", "886", "887", "888", "889",
|
||
|
"890", "891", "892", "893", "894", "895", "896", "897", "898", "899",
|
||
|
|
||
|
"900", "901", "902", "903", "904", "905", "906", "907", "908", "909",
|
||
|
"910", "911", "912", "913", "914", "915", "916", "917", "918", "919",
|
||
|
"920", "921", "922", "923", "924", "925", "926", "927", "928", "929",
|
||
|
"930", "931", "932", "933", "934", "935", "936", "937", "938", "939",
|
||
|
"940", "941", "942", "943", "944", "945", "946", "947", "948", "949",
|
||
|
"950", "951", "952", "953", "954", "955", "956", "957", "958", "959",
|
||
|
"960", "961", "962", "963", "964", "965", "966", "967", "968", "969",
|
||
|
"970", "971", "972", "973", "974", "975", "976", "977", "978", "979",
|
||
|
"980", "981", "982", "983", "984", "985", "986", "987", "988", "989",
|
||
|
"990", "991", "992", "993", "994", "995", "996", "997", "998", "999",
|
||
|
};
|
||
|
|
||
|
enum bson_error_t {
|
||
|
BSON_SIZE_OVERFLOW = 1 /**< Trying to create a BSON object larger than INT_MAX. */
|
||
|
};
|
||
|
|
||
|
enum bson_validity_t {
|
||
|
BSON_VALID = 0, /**< BSON is valid and UTF-8 compliant. */
|
||
|
BSON_NOT_UTF8 = ( 1<<1 ), /**< A key or a string is not valid UTF-8. */
|
||
|
BSON_FIELD_HAS_DOT = ( 1<<2 ), /**< Warning: key contains '.' character. */
|
||
|
BSON_FIELD_INIT_DOLLAR = ( 1<<3 ), /**< Warning: key starts with '$' character. */
|
||
|
BSON_ALREADY_FINISHED = ( 1<<4 ) /**< Trying to modify a finished BSON object. */
|
||
|
};
|
||
|
|
||
|
enum bson_binary_subtype_t {
|
||
|
BSON_BIN_BINARY = 0,
|
||
|
BSON_BIN_FUNC = 1,
|
||
|
BSON_BIN_BINARY_OLD = 2,
|
||
|
BSON_BIN_UUID = 3,
|
||
|
BSON_BIN_MD5 = 5,
|
||
|
BSON_BIN_USER = 128
|
||
|
};
|
||
|
|
||
|
typedef enum {
|
||
|
BSON_EOO = 0,
|
||
|
BSON_DOUBLE = 1,
|
||
|
BSON_STRING = 2,
|
||
|
BSON_OBJECT = 3,
|
||
|
BSON_ARRAY = 4,
|
||
|
BSON_BINDATA = 5,
|
||
|
BSON_UNDEFINED = 6,
|
||
|
BSON_OID = 7,
|
||
|
BSON_BOOL = 8,
|
||
|
BSON_DATE = 9,
|
||
|
BSON_NULL = 10,
|
||
|
BSON_REGEX = 11,
|
||
|
BSON_DBREF = 12, /**< Deprecated. */
|
||
|
BSON_CODE = 13,
|
||
|
BSON_SYMBOL = 14,
|
||
|
BSON_CODEWSCOPE = 15,
|
||
|
BSON_INT = 16,
|
||
|
BSON_TIMESTAMP = 17,
|
||
|
BSON_LONG = 18
|
||
|
} bson_type;
|
||
|
|
||
|
typedef int bson_bool_t;
|
||
|
|
||
|
typedef struct {
|
||
|
const char *cur;
|
||
|
bson_bool_t first;
|
||
|
} bson_iterator;
|
||
|
|
||
|
typedef struct {
|
||
|
char *data;
|
||
|
char *cur;
|
||
|
int dataSize;
|
||
|
bson_bool_t finished;
|
||
|
int stack[32];
|
||
|
int stackPos;
|
||
|
int err; /**< Bitfield representing errors or warnings on this buffer */
|
||
|
char *errstr; /**< A string representation of the most recent error or warning. */
|
||
|
} bson;
|
||
|
|
||
|
#pragma pack(1)
|
||
|
typedef union {
|
||
|
char bytes[12];
|
||
|
int ints[3];
|
||
|
} bson_oid_t;
|
||
|
#pragma pack()
|
||
|
|
||
|
typedef int64_t bson_date_t; /* milliseconds since epoch UTC */
|
||
|
|
||
|
typedef struct {
|
||
|
int i; /* increment */
|
||
|
int t; /* time in seconds */
|
||
|
} bson_timestamp_t;
|
||
|
|
||
|
/* ----------------------------
|
||
|
READING
|
||
|
------------------------------ */
|
||
|
|
||
|
/**
|
||
|
* Size of a BSON object.
|
||
|
*
|
||
|
* @param b the BSON object.
|
||
|
*
|
||
|
* @return the size.
|
||
|
*/
|
||
|
int bson_size( const bson *b );
|
||
|
|
||
|
/**
|
||
|
* Print a string representation of a BSON object.
|
||
|
*
|
||
|
* @param b the BSON object to print.
|
||
|
*/
|
||
|
void bson_print( bson *b );
|
||
|
|
||
|
/**
|
||
|
* Return a pointer to the raw buffer stored by this bson object.
|
||
|
*
|
||
|
* @param b a BSON object
|
||
|
*/
|
||
|
const char *bson_data( bson *b );
|
||
|
|
||
|
/**
|
||
|
* Print a string representation of a BSON object.
|
||
|
*
|
||
|
* @param bson the raw data to print.
|
||
|
* @param depth the depth to recurse the object.x
|
||
|
*/
|
||
|
void bson_print_raw( const char *bson , int depth );
|
||
|
|
||
|
/**
|
||
|
* Advance a bson_iterator to the named field.
|
||
|
*
|
||
|
* @param it the bson_iterator to use.
|
||
|
* @param obj the BSON object to use.
|
||
|
* @param name the name of the field to find.
|
||
|
*
|
||
|
* @return the type of the found object or BSON_EOO if it is not found.
|
||
|
*/
|
||
|
bson_type bson_find( bson_iterator *it, const bson *obj, const char *name );
|
||
|
|
||
|
/**
|
||
|
* Initialize a bson_iterator.
|
||
|
*
|
||
|
* @param i the bson_iterator to initialize.
|
||
|
* @param bson the BSON object to associate with the iterator.
|
||
|
*/
|
||
|
void bson_iterator_init( bson_iterator *i , const bson *b );
|
||
|
|
||
|
/**
|
||
|
* Initialize a bson iterator from a const char* buffer. Note
|
||
|
* that this is mostly used internally.
|
||
|
*
|
||
|
* @param i the bson_iterator to initialize.
|
||
|
* @param buffer the buffer to point to.
|
||
|
*/
|
||
|
void bson_iterator_from_buffer( bson_iterator *i, const char *buffer );
|
||
|
|
||
|
/* more returns true for eoo. best to loop with bson_iterator_next(&it) */
|
||
|
/**
|
||
|
* Check to see if the bson_iterator has more data.
|
||
|
*
|
||
|
* @param i the iterator.
|
||
|
*
|
||
|
* @return returns true if there is more data.
|
||
|
*/
|
||
|
bson_bool_t bson_iterator_more( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Point the iterator at the next BSON object.
|
||
|
*
|
||
|
* @param i the bson_iterator.
|
||
|
*
|
||
|
* @return the type of the next BSON object.
|
||
|
*/
|
||
|
bson_type bson_iterator_next( bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Get the type of the BSON object currently pointed to by the iterator.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the type of the current BSON object.
|
||
|
*/
|
||
|
bson_type bson_iterator_type( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Get the key of the BSON object currently pointed to by the iterator.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the key of the current BSON object.
|
||
|
*/
|
||
|
const char *bson_iterator_key( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Get the value of the BSON object currently pointed to by the iterator.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the value of the current BSON object.
|
||
|
*/
|
||
|
const char *bson_iterator_value( const bson_iterator *i );
|
||
|
|
||
|
/* these convert to the right type (return 0 if non-numeric) */
|
||
|
/**
|
||
|
* Get the double value of the BSON object currently pointed to by the
|
||
|
* iterator.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the value of the current BSON object.
|
||
|
*/
|
||
|
double bson_iterator_double( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Get the int value of the BSON object currently pointed to by the iterator.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the value of the current BSON object.
|
||
|
*/
|
||
|
int bson_iterator_int( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Get the long value of the BSON object currently pointed to by the iterator.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the value of the current BSON object.
|
||
|
*/
|
||
|
int64_t bson_iterator_long( const bson_iterator *i );
|
||
|
|
||
|
/* return the bson timestamp as a whole or in parts */
|
||
|
/**
|
||
|
* Get the timestamp value of the BSON object currently pointed to by
|
||
|
* the iterator.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the value of the current BSON object.
|
||
|
*/
|
||
|
bson_timestamp_t bson_iterator_timestamp( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Get the boolean value of the BSON object currently pointed to by
|
||
|
* the iterator.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the value of the current BSON object.
|
||
|
*/
|
||
|
/* false: boolean false, 0 in any type, or null */
|
||
|
/* true: anything else (even empty strings and objects) */
|
||
|
bson_bool_t bson_iterator_bool( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Get the double value of the BSON object currently pointed to by the
|
||
|
* iterator. Assumes the correct type is used.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the value of the current BSON object.
|
||
|
*/
|
||
|
/* these assume you are using the right type */
|
||
|
double bson_iterator_double_raw( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Get the int value of the BSON object currently pointed to by the
|
||
|
* iterator. Assumes the correct type is used.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the value of the current BSON object.
|
||
|
*/
|
||
|
int bson_iterator_int_raw( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Get the long value of the BSON object currently pointed to by the
|
||
|
* iterator. Assumes the correct type is used.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the value of the current BSON object.
|
||
|
*/
|
||
|
int64_t bson_iterator_long_raw( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Get the bson_bool_t value of the BSON object currently pointed to by the
|
||
|
* iterator. Assumes the correct type is used.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the value of the current BSON object.
|
||
|
*/
|
||
|
bson_bool_t bson_iterator_bool_raw( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Get the bson_oid_t value of the BSON object currently pointed to by the
|
||
|
* iterator.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the value of the current BSON object.
|
||
|
*/
|
||
|
bson_oid_t *bson_iterator_oid( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Get the string value of the BSON object currently pointed to by the
|
||
|
* iterator.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the value of the current BSON object.
|
||
|
*/
|
||
|
/* these can also be used with bson_code and bson_symbol*/
|
||
|
const char *bson_iterator_string( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Get the string length of the BSON object currently pointed to by the
|
||
|
* iterator.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the length of the current BSON object.
|
||
|
*/
|
||
|
int bson_iterator_string_len( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Get the code value of the BSON object currently pointed to by the
|
||
|
* iterator. Works with bson_code, bson_codewscope, and BSON_STRING
|
||
|
* returns NULL for everything else.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the code value of the current BSON object.
|
||
|
*/
|
||
|
/* works with bson_code, bson_codewscope, and BSON_STRING */
|
||
|
/* returns NULL for everything else */
|
||
|
const char *bson_iterator_code( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Calls bson_empty on scope if not a bson_codewscope
|
||
|
*
|
||
|
* @param i the bson_iterator.
|
||
|
* @param scope the bson scope.
|
||
|
*/
|
||
|
/* calls bson_empty on scope if not a bson_codewscope */
|
||
|
void bson_iterator_code_scope( const bson_iterator *i, bson *scope );
|
||
|
|
||
|
/**
|
||
|
* Get the date value of the BSON object currently pointed to by the
|
||
|
* iterator.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the date value of the current BSON object.
|
||
|
*/
|
||
|
/* both of these only work with bson_date */
|
||
|
bson_date_t bson_iterator_date( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Get the time value of the BSON object currently pointed to by the
|
||
|
* iterator.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the time value of the current BSON object.
|
||
|
*/
|
||
|
time_t bson_iterator_time_t( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Get the length of the BSON binary object currently pointed to by the
|
||
|
* iterator.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the length of the current BSON binary object.
|
||
|
*/
|
||
|
int bson_iterator_bin_len( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Get the type of the BSON binary object currently pointed to by the
|
||
|
* iterator.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the type of the current BSON binary object.
|
||
|
*/
|
||
|
char bson_iterator_bin_type( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Get the value of the BSON binary object currently pointed to by the
|
||
|
* iterator.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the value of the current BSON binary object.
|
||
|
*/
|
||
|
const char *bson_iterator_bin_data( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Get the value of the BSON regex object currently pointed to by the
|
||
|
* iterator.
|
||
|
*
|
||
|
* @param i the bson_iterator
|
||
|
*
|
||
|
* @return the value of the current BSON regex object.
|
||
|
*/
|
||
|
const char *bson_iterator_regex( const bson_iterator *i );
|
||
|
|
||
|
/**
|
||
|
* Get the options of the BSON regex object currently pointed to by the
|
||
|
* iterator.
|
||
|
*
|
||
|
* @param i the bson_iterator.
|
||
|
*
|
||
|
* @return the options of the current BSON regex object.
|
||
|
*/
|
||
|
const char *bson_iterator_regex_opts( const bson_iterator *i );
|
||
|
|
||
|
/* these work with BSON_OBJECT and BSON_ARRAY */
|
||
|
/**
|
||
|
* Get the BSON subobject currently pointed to by the
|
||
|
* iterator.
|
||
|
*
|
||
|
* @param i the bson_iterator.
|
||
|
* @param sub the BSON subobject destination.
|
||
|
*/
|
||
|
void bson_iterator_subobject( const bson_iterator *i, bson *sub );
|
||
|
|
||
|
/**
|
||
|
* Get a bson_iterator that on the BSON subobject.
|
||
|
*
|
||
|
* @param i the bson_iterator.
|
||
|
* @param sub the iterator to point at the BSON subobject.
|
||
|
*/
|
||
|
void bson_iterator_subiterator( const bson_iterator *i, bson_iterator *sub );
|
||
|
|
||
|
/* str must be at least 24 hex chars + null byte */
|
||
|
/**
|
||
|
* Create a bson_oid_t from a string.
|
||
|
*
|
||
|
* @param oid the bson_oid_t destination.
|
||
|
* @param str a null terminated string comprised of at least 24 hex chars.
|
||
|
*/
|
||
|
void bson_oid_from_string( bson_oid_t *oid, const char *str );
|
||
|
|
||
|
/**
|
||
|
* Create a string representation of the bson_oid_t.
|
||
|
*
|
||
|
* @param oid the bson_oid_t source.
|
||
|
* @param str the string representation destination.
|
||
|
*/
|
||
|
void bson_oid_to_string( const bson_oid_t *oid, char *str );
|
||
|
|
||
|
/**
|
||
|
* Create a bson_oid object.
|
||
|
*
|
||
|
* @param oid the destination for the newly created bson_oid_t.
|
||
|
*/
|
||
|
void bson_oid_gen( bson_oid_t *oid );
|
||
|
|
||
|
/**
|
||
|
* Set a function to be used to generate the second four bytes
|
||
|
* of an object id.
|
||
|
*
|
||
|
* @param func a pointer to a function that returns an int.
|
||
|
*/
|
||
|
void bson_set_oid_fuzz( int ( *func )( void ) );
|
||
|
|
||
|
/**
|
||
|
* Set a function to be used to generate the incrementing part
|
||
|
* of an object id (last four bytes). If you need thread-safety
|
||
|
* in generating object ids, you should set this function.
|
||
|
*
|
||
|
* @param func a pointer to a function that returns an int.
|
||
|
*/
|
||
|
void bson_set_oid_inc( int ( *func )( void ) );
|
||
|
|
||
|
/**
|
||
|
* Get the time a bson_oid_t was created.
|
||
|
*
|
||
|
* @param oid the bson_oid_t.
|
||
|
*/
|
||
|
time_t bson_oid_generated_time( bson_oid_t *oid ); /* Gives the time the OID was created */
|
||
|
|
||
|
/* ----------------------------
|
||
|
BUILDING
|
||
|
------------------------------ */
|
||
|
|
||
|
/**
|
||
|
* Initialize a new bson object. If not created
|
||
|
* with bson_new, you must initialize each new bson
|
||
|
* object using this function.
|
||
|
*
|
||
|
* @note When finished, you must pass the bson object to
|
||
|
* bson_destroy( ).
|
||
|
*/
|
||
|
void bson_init( bson *b );
|
||
|
|
||
|
/**
|
||
|
* Initialize a BSON object, and point its data
|
||
|
* pointer to the provided char*.
|
||
|
*
|
||
|
* @param b the BSON object to initialize.
|
||
|
* @param data the raw BSON data.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_init_data( bson *b , char *data );
|
||
|
|
||
|
/**
|
||
|
* Initialize a BSON object, and point its data
|
||
|
* pointer to the provided char*. We assume
|
||
|
* that the data represents a finished BSON object.
|
||
|
*
|
||
|
* @param b the BSON object to initialize.
|
||
|
* @param data the raw BSON data.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_init_finished_data( bson *b, char *data );
|
||
|
|
||
|
/**
|
||
|
* Initialize a BSON object, and set its
|
||
|
* buffer to the given size.
|
||
|
*
|
||
|
* @param b the BSON object to initialize.
|
||
|
* @param size the initial size of the buffer.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
void bson_init_size( bson *b, int size );
|
||
|
|
||
|
/**
|
||
|
* Grow a bson object.
|
||
|
*
|
||
|
* @param b the bson to grow.
|
||
|
* @param bytesNeeded the additional number of bytes needed.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR with the bson error object set.
|
||
|
* Exits if allocation fails.
|
||
|
*/
|
||
|
int bson_ensure_space( bson *b, const int bytesNeeded );
|
||
|
|
||
|
/**
|
||
|
* Finalize a bson object.
|
||
|
*
|
||
|
* @param b the bson object to finalize.
|
||
|
*
|
||
|
* @return the standard error code. To deallocate memory,
|
||
|
* call bson_destroy on the bson object.
|
||
|
*/
|
||
|
int bson_finish( bson *b );
|
||
|
|
||
|
/**
|
||
|
* Destroy a bson object.
|
||
|
*
|
||
|
* @param b the bson object to destroy.
|
||
|
*
|
||
|
*/
|
||
|
void bson_destroy( bson *b );
|
||
|
|
||
|
/**
|
||
|
* Returns a pointer to a static empty BSON object.
|
||
|
*
|
||
|
* @param obj the BSON object to initialize.
|
||
|
*
|
||
|
* @return the empty initialized BSON object.
|
||
|
*/
|
||
|
/* returns pointer to static empty bson object */
|
||
|
bson *bson_empty( bson *obj );
|
||
|
|
||
|
/**
|
||
|
* Make a complete copy of the a BSON object.
|
||
|
* The source bson object must be in a finished
|
||
|
* state; otherwise, the copy will fail.
|
||
|
*
|
||
|
* @param out the copy destination BSON object.
|
||
|
* @param in the copy source BSON object.
|
||
|
*/
|
||
|
int bson_copy( bson *out, const bson *in ); /* puts data in new buffer. NOOP if out==NULL */
|
||
|
|
||
|
/**
|
||
|
* Append a previously created bson_oid_t to a bson object.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the bson_oid_t.
|
||
|
* @param oid the bson_oid_t to append.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_oid( bson *b, const char *name, const bson_oid_t *oid );
|
||
|
|
||
|
/**
|
||
|
* Append a bson_oid_t to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the bson_oid_t.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_new_oid( bson *b, const char *name );
|
||
|
|
||
|
/**
|
||
|
* Append an int to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the int.
|
||
|
* @param i the int to append.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_int( bson *b, const char *name, const int i );
|
||
|
|
||
|
/**
|
||
|
* Append an long to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the long.
|
||
|
* @param i the long to append.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_long( bson *b, const char *name, const int64_t i );
|
||
|
|
||
|
/**
|
||
|
* Append an double to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the double.
|
||
|
* @param d the double to append.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_double( bson *b, const char *name, const double d );
|
||
|
|
||
|
/**
|
||
|
* Append a string to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the string.
|
||
|
* @param str the string to append.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_string( bson *b, const char *name, const char *str );
|
||
|
|
||
|
/**
|
||
|
* Append len bytes of a string to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the string.
|
||
|
* @param str the string to append.
|
||
|
* @param len the number of bytes from str to append.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_string_n( bson *b, const char *name, const char *str, int len );
|
||
|
|
||
|
/**
|
||
|
* Append a symbol to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the symbol.
|
||
|
* @param str the symbol to append.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_symbol( bson *b, const char *name, const char *str );
|
||
|
|
||
|
/**
|
||
|
* Append len bytes of a symbol to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the symbol.
|
||
|
* @param str the symbol to append.
|
||
|
* @param len the number of bytes from str to append.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_symbol_n( bson *b, const char *name, const char *str, int len );
|
||
|
|
||
|
/**
|
||
|
* Append code to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the code.
|
||
|
* @param str the code to append.
|
||
|
* @param len the number of bytes from str to append.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_code( bson *b, const char *name, const char *str );
|
||
|
|
||
|
/**
|
||
|
* Append len bytes of code to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the code.
|
||
|
* @param str the code to append.
|
||
|
* @param len the number of bytes from str to append.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_code_n( bson *b, const char *name, const char *str, int len );
|
||
|
|
||
|
/**
|
||
|
* Append code to a bson with scope.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the code.
|
||
|
* @param str the string to append.
|
||
|
* @param scope a BSON object containing the scope.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_code_w_scope( bson *b, const char *name, const char *code, const bson *scope );
|
||
|
|
||
|
/**
|
||
|
* Append len bytes of code to a bson with scope.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the code.
|
||
|
* @param str the string to append.
|
||
|
* @param len the number of bytes from str to append.
|
||
|
* @param scope a BSON object containing the scope.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_code_w_scope_n( bson *b, const char *name, const char *code, int size, const bson *scope );
|
||
|
|
||
|
/**
|
||
|
* Append binary data to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the data.
|
||
|
* @param type the binary data type.
|
||
|
* @param str the binary data.
|
||
|
* @param len the length of the data.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_binary( bson *b, const char *name, char type, const char *str, int len );
|
||
|
|
||
|
/**
|
||
|
* Append a bson_bool_t to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the boolean value.
|
||
|
* @param v the bson_bool_t to append.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_bool( bson *b, const char *name, const bson_bool_t v );
|
||
|
|
||
|
/**
|
||
|
* Append a null value to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the null value.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_null( bson *b, const char *name );
|
||
|
|
||
|
/**
|
||
|
* Append an undefined value to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the undefined value.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_undefined( bson *b, const char *name );
|
||
|
|
||
|
/**
|
||
|
* Append a regex value to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the regex value.
|
||
|
* @param pattern the regex pattern to append.
|
||
|
* @param the regex options.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_regex( bson *b, const char *name, const char *pattern, const char *opts );
|
||
|
|
||
|
/**
|
||
|
* Append bson data to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the bson data.
|
||
|
* @param bson the bson object to append.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_bson( bson *b, const char *name, const bson *bson );
|
||
|
|
||
|
/**
|
||
|
* Append a BSON element to a bson from the current point of an iterator.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name_or_null the key for the BSON element, or NULL.
|
||
|
* @param elem the bson_iterator.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_element( bson *b, const char *name_or_null, const bson_iterator *elem );
|
||
|
|
||
|
/**
|
||
|
* Append a bson_timestamp_t value to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the timestampe value.
|
||
|
* @param ts the bson_timestamp_t value to append.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_timestamp( bson *b, const char *name, bson_timestamp_t *ts );
|
||
|
|
||
|
/* these both append a bson_date */
|
||
|
/**
|
||
|
* Append a bson_date_t value to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the date value.
|
||
|
* @param millis the bson_date_t to append.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_date( bson *b, const char *name, bson_date_t millis );
|
||
|
|
||
|
/**
|
||
|
* Append a time_t value to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the key for the date value.
|
||
|
* @param secs the time_t to append.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_time_t( bson *b, const char *name, time_t secs );
|
||
|
|
||
|
/**
|
||
|
* Start appending a new object to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the name of the new object.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_start_object( bson *b, const char *name );
|
||
|
|
||
|
/**
|
||
|
* Start appending a new array to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
* @param name the name of the new array.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_start_array( bson *b, const char *name );
|
||
|
|
||
|
/**
|
||
|
* Finish appending a new object or array to a bson.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_finish_object( bson *b );
|
||
|
|
||
|
/**
|
||
|
* Finish appending a new object or array to a bson. This
|
||
|
* is simply an alias for bson_append_finish_object.
|
||
|
*
|
||
|
* @param b the bson to append to.
|
||
|
*
|
||
|
* @return BSON_OK or BSON_ERROR.
|
||
|
*/
|
||
|
int bson_append_finish_array( bson *b );
|
||
|
|
||
|
void bson_numstr( char *str, int i );
|
||
|
|
||
|
void bson_incnumstr( char *str );
|
||
|
|
||
|
/* Error handling and stadard library function over-riding. */
|
||
|
/* -------------------------------------------------------- */
|
||
|
|
||
|
/* bson_err_handlers shouldn't return!!! */
|
||
|
typedef void( *bson_err_handler )( const char *errmsg );
|
||
|
|
||
|
typedef int (*bson_printf_func)( const char *, ... );
|
||
|
typedef int (*bson_fprintf_func)( FILE *, const char *, ... );
|
||
|
typedef int (*bson_sprintf_func)( char *, const char *, ... );
|
||
|
|
||
|
extern void *( *bson_malloc_func )( size_t );
|
||
|
extern void *( *bson_realloc_func )( void *, size_t );
|
||
|
extern void ( *bson_free )( void * );
|
||
|
|
||
|
extern bson_printf_func bson_printf;
|
||
|
extern bson_fprintf_func bson_fprintf;
|
||
|
extern bson_sprintf_func bson_sprintf;
|
||
|
|
||
|
extern bson_printf_func bson_errprintf;
|
||
|
|
||
|
/**
|
||
|
* Allocates memory and checks return value, exiting fatally if malloc() fails.
|
||
|
*
|
||
|
* @param size bytes to allocate.
|
||
|
*
|
||
|
* @return a pointer to the allocated memory.
|
||
|
*
|
||
|
* @sa malloc(3)
|
||
|
*/
|
||
|
void *bson_malloc( int size );
|
||
|
|
||
|
/**
|
||
|
* Changes the size of allocated memory and checks return value,
|
||
|
* exiting fatally if realloc() fails.
|
||
|
*
|
||
|
* @param ptr pointer to the space to reallocate.
|
||
|
* @param size bytes to allocate.
|
||
|
*
|
||
|
* @return a pointer to the allocated memory.
|
||
|
*
|
||
|
* @sa realloc()
|
||
|
*/
|
||
|
void *bson_realloc( void *ptr, int size );
|
||
|
|
||
|
/**
|
||
|
* Set a function for error handling.
|
||
|
*
|
||
|
* @param func a bson_err_handler function.
|
||
|
*
|
||
|
* @return the old error handling function, or NULL.
|
||
|
*/
|
||
|
bson_err_handler set_bson_err_handler( bson_err_handler func );
|
||
|
|
||
|
/* does nothing if ok != 0 */
|
||
|
/**
|
||
|
* Exit fatally.
|
||
|
*
|
||
|
* @param ok exits if ok is equal to 0.
|
||
|
*/
|
||
|
void bson_fatal( int ok );
|
||
|
|
||
|
/**
|
||
|
* Exit fatally with an error message.
|
||
|
*
|
||
|
* @param ok exits if ok is equal to 0.
|
||
|
* @param msg prints to stderr before exiting.
|
||
|
*/
|
||
|
void bson_fatal_msg( int ok, const char *msg );
|
||
|
|
||
|
/**
|
||
|
* Invoke the error handler, but do not exit.
|
||
|
*
|
||
|
* @param b the buffer object.
|
||
|
*/
|
||
|
void bson_builder_error( bson *b );
|
||
|
|
||
|
/* encoding.h */
|
||
|
|
||
|
/*
|
||
|
* Copyright 2009-2011 10gen, Inc.
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Check that a field name is valid UTF8, does not start with a '$',
|
||
|
* and contains no '.' characters. Set bson bit field appropriately.
|
||
|
* Note that we don't need to check for '\0' because we're using
|
||
|
* strlen(3), which stops at '\0'.
|
||
|
*
|
||
|
* @param b The bson object to which field name will be appended.
|
||
|
* @param string The field name as char*.
|
||
|
* @param length The length of the field name.
|
||
|
*
|
||
|
* @return BSON_OK if valid UTF8 and BSON_ERROR if not. All BSON strings must be
|
||
|
* valid UTF8. This function will also check whether the string
|
||
|
* contains '.' or starts with '$', since the validity of this depends on context.
|
||
|
* Set the value of b->err appropriately.
|
||
|
*/
|
||
|
int bson_check_field_name( bson *b, const char *string,
|
||
|
const int length );
|
||
|
|
||
|
/**
|
||
|
* Check that a string is valid UTF8. Sets the buffer bit field appropriately.
|
||
|
*
|
||
|
* @param b The bson object to which string will be appended.
|
||
|
* @param string The string to check.
|
||
|
* @param length The length of the string.
|
||
|
*
|
||
|
* @return BSON_OK if valid UTF-8; otherwise, BSON_ERROR.
|
||
|
* Sets b->err on error.
|
||
|
*/
|
||
|
bson_bool_t bson_check_string( bson *b, const char *string,
|
||
|
const int length );
|
||
|
|
||
|
/* platform.h */
|
||
|
|
||
|
/** Copyright 2009-2011 10gen Inc.
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
|
||
|
|
||
|
/* all platform-specific ifdefs should go here */
|
||
|
|
||
|
/* big endian is only used for OID generation. little is used everywhere else */
|
||
|
//#ifdef BIG_ENDIAN
|
||
|
//#define bson_little_endian64(out, in) ( bson_swap_endian64(out, in) )
|
||
|
//#define bson_little_endian32(out, in) ( bson_swap_endian32(out, in) )
|
||
|
//#define bson_big_endian64(out, in) ( memcpy(out, in, 8) )
|
||
|
//#define bson_big_endian32(out, in) ( memcpy(out, in, 4) )
|
||
|
//#else
|
||
|
#define bson_little_endian64(out, in) ( memcpy(out, in, 8) )
|
||
|
#define bson_little_endian32(out, in) ( memcpy(out, in, 4) )
|
||
|
#define bson_big_endian64(out, in) ( bson_swap_endian64(out, in) )
|
||
|
#define bson_big_endian32(out, in) ( bson_swap_endian32(out, in) )
|
||
|
//#endif
|
||
|
|
||
|
static TPT_INLINE void bson_swap_endian64( void *outp, const void *inp ) {
|
||
|
const char *in = ( const char * )inp;
|
||
|
char *out = ( char * )outp;
|
||
|
|
||
|
out[0] = in[7];
|
||
|
out[1] = in[6];
|
||
|
out[2] = in[5];
|
||
|
out[3] = in[4];
|
||
|
out[4] = in[3];
|
||
|
out[5] = in[2];
|
||
|
out[6] = in[1];
|
||
|
out[7] = in[0];
|
||
|
|
||
|
}
|
||
|
static TPT_INLINE void bson_swap_endian32( void *outp, const void *inp ) {
|
||
|
const char *in = ( const char * )inp;
|
||
|
char *out = ( char * )outp;
|
||
|
|
||
|
out[0] = in[3];
|
||
|
out[1] = in[2];
|
||
|
out[2] = in[1];
|
||
|
out[3] = in[0];
|
||
|
}
|
||
|
|
||
|
#endif
|