#include "ptrarray.h"
#include "utils.h" /* tr_new(), tr_free() */
+#ifndef ENODATA
+ #define ENODATA EIO
+#endif
+
/**
***
**/
***/
int
-tr_bencLoadFile( const char * filename,
- tr_benc * b )
+tr_bencLoadFile( const char * filename, tr_benc * b )
{
int err;
size_t contentLen;
uint8_t * content;
content = tr_loadFile( filename, &contentLen );
- if( !content )
+ if( !content && errno )
err = errno;
+ else if( !content )
+ err = ENODATA;
else
err = tr_bencLoad( content, contentLen, b, NULL );
}
int
-tr_bencLoadJSONFile( const char * filename,
- tr_benc * b )
+tr_bencLoadJSONFile( const char * filename, tr_benc * b )
{
int err;
size_t contentLen;
uint8_t * content;
content = tr_loadFile( filename, &contentLen );
- if( !content )
+ if( !content && errno )
err = errno;
+ else if( !content )
+ err = ENODATA;
else
err = tr_jsonParse( content, contentLen, b, NULL );
tr_free( content );
return err;
}
-
struct json_benc_data
{
- tr_benc * top;
+ tr_bool hasContent;
+ tr_benc * top;
tr_ptrArray stack;
- char * key;
+ char * key;
};
static tr_benc*
switch( type )
{
case JSON_T_ARRAY_BEGIN:
+ data->hasContent = TRUE;
node = getNode( data );
tr_bencInitList( node, 0 );
tr_ptrArrayAppend( &data->stack, node );
break;
case JSON_T_OBJECT_BEGIN:
+ data->hasContent = TRUE;
node = getNode( data );
tr_bencInitDict( node, 0 );
tr_ptrArrayAppend( &data->stack, node );
tr_snprintf( buf, sizeof( buf ), "%f",
(double)value->vu.float_value );
tr_bencInitStr( getNode( data ), buf, -1 );
+ data->hasContent = TRUE;
break;
}
case JSON_T_NULL:
+ data->hasContent = TRUE;
tr_bencInitStr( getNode( data ), "", 0 );
break;
case JSON_T_INTEGER:
+ data->hasContent = TRUE;
tr_bencInitInt( getNode( data ), value->vu.integer_value );
break;
case JSON_T_TRUE:
+ data->hasContent = TRUE;
tr_bencInitInt( getNode( data ), 1 );
break;
case JSON_T_FALSE:
+ data->hasContent = TRUE;
tr_bencInitInt( getNode( data ), 0 );
break;
case JSON_T_STRING:
+ data->hasContent = TRUE;
tr_bencInitStr( getNode( data ),
value->vu.str.value,
value->vu.str.length );
break;
case JSON_T_KEY:
+ data->hasContent = TRUE;
assert( !data->key );
data->key = tr_strdup( value->vu.str.value );
break;
}
int
-tr_jsonParse( const void * vbuf,
+tr_jsonParse( const void * vbuf,
size_t len,
- tr_benc * setme_benc,
+ tr_benc * setme_benc,
const uint8_t ** setme_end )
{
int err = 0;
- const unsigned char * buf = vbuf;
- const void * bufend = buf + len;
+ const unsigned char * buf = vbuf;
+ const void * bufend = buf + len;
struct JSON_config_struct config;
struct JSON_parser_struct * checker;
struct json_benc_data data;
config.callback_ctx = &data;
config.depth = -1;
+ data.hasContent = FALSE;
data.key = NULL;
data.top = setme_benc;
data.stack = TR_PTR_ARRAY_INIT;
if( buf != bufend )
err = EILSEQ;
+ if( !data.hasContent )
+ err = EINVAL;
+
if( setme_end )
*setme_end = (const uint8_t*) buf;