2017-11-15 11:32 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
* include/hbjson.h
* src/rtl/hbjson.c
* changed 3-rd parameter 'HB_BOOL fHuman' in hb_jsonEncode() and
hb_jsonEncodeCP() C functions to 'int iIndent'
char * hb_jsonEncode( PHB_ITEM pValue, HB_SIZE * pnLen,
int iIndent );
char * hb_jsonEncodeCP( PHB_ITEM pValue, HB_SIZE * pnLen,
int iIndent, PHB_CODEPAGE cdp );
Positive iIndent value defines number of spaces used for indenting,
0 disables indenting and -1 means TAB ( ASCII:9 ) indenting.
This modification is binary compatible though in C code using HB_TRUE
as 3-rd parameter it changes indenting from 2 spaces to 1 so please
update the code if it's significant.
+ added optional support for numeric value in 2-nd parameter of
hb_jsonEncode() PRG function. Current syntax is:
hb_jsonEncode( <xValue>, [ <lHuman> | <nIndent> ], [ <cDestCP> ] )
-> <cJSONString>
* contrib/rddads/ads1.c
* minor simplification
* include/hbapigt.h
* formatting
This commit is contained in:
@@ -7,6 +7,32 @@
|
||||
Entries may not always be in chronological/commit order.
|
||||
See license at the end of file. */
|
||||
|
||||
2017-11-15 11:32 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
|
||||
* include/hbjson.h
|
||||
* src/rtl/hbjson.c
|
||||
* changed 3-rd parameter 'HB_BOOL fHuman' in hb_jsonEncode() and
|
||||
hb_jsonEncodeCP() C functions to 'int iIndent'
|
||||
char * hb_jsonEncode( PHB_ITEM pValue, HB_SIZE * pnLen,
|
||||
int iIndent );
|
||||
char * hb_jsonEncodeCP( PHB_ITEM pValue, HB_SIZE * pnLen,
|
||||
int iIndent, PHB_CODEPAGE cdp );
|
||||
Positive iIndent value defines number of spaces used for indenting,
|
||||
0 disables indenting and -1 means TAB ( ASCII:9 ) indenting.
|
||||
This modification is binary compatible though in C code using HB_TRUE
|
||||
as 3-rd parameter it changes indenting from 2 spaces to 1 so please
|
||||
update the code if it's significant.
|
||||
|
||||
+ added optional support for numeric value in 2-nd parameter of
|
||||
hb_jsonEncode() PRG function. Current syntax is:
|
||||
hb_jsonEncode( <xValue>, [ <lHuman> | <nIndent> ], [ <cDestCP> ] )
|
||||
-> <cJSONString>
|
||||
|
||||
* contrib/rddads/ads1.c
|
||||
* minor simplification
|
||||
|
||||
* include/hbapigt.h
|
||||
* formatting
|
||||
|
||||
2017-11-14 20:44 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
|
||||
* contrib/hbwin/hbwin.hbx
|
||||
* contrib/hbwin/wapi_winbase_2.c
|
||||
|
||||
@@ -2468,12 +2468,11 @@ static HB_ERRCODE adsGetValue( ADSAREAP pArea, HB_USHORT uiIndex, PHB_ITEM pItem
|
||||
else if( u16Type == ADS_BINARY || u16Type == ADS_IMAGE )
|
||||
{
|
||||
u32RetVal = AdsGetBinaryLength( pArea->hTable, ADSFIELD( uiIndex ), &u32Length );
|
||||
if( u32RetVal != AE_SUCCESS )
|
||||
if( u32RetVal != AE_SUCCESS || u32Length == 0 )
|
||||
hb_itemPutC( pItem, NULL );
|
||||
else
|
||||
{
|
||||
u32Length++; /* make room for NULL */
|
||||
pucBuf = ( UNSIGNED8 * ) hb_xgrab( u32Length );
|
||||
pucBuf = ( UNSIGNED8 * ) hb_xgrab( ++u32Length ); /* ++ to make room for NULL */
|
||||
u32RetVal = AdsGetBinary( pArea->hTable, ADSFIELD( uiIndex ), 0, pucBuf, &u32Length );
|
||||
if( u32RetVal != AE_SUCCESS )
|
||||
{
|
||||
@@ -2503,8 +2502,7 @@ static HB_ERRCODE adsGetValue( ADSAREAP pArea, HB_USHORT uiIndex, PHB_ITEM pItem
|
||||
#endif
|
||||
else
|
||||
{
|
||||
u32Length++; /* make room for NULL */
|
||||
pucBuf = ( UNSIGNED8 * ) hb_xgrab( u32Length );
|
||||
pucBuf = ( UNSIGNED8 * ) hb_xgrab( ++u32Length ); /* ++ to make room for NULL */
|
||||
u32RetVal = AdsGetString( pArea->hTable, ADSFIELD( uiIndex ), pucBuf, &u32Length, ADS_NONE );
|
||||
if( u32RetVal != AE_SUCCESS )
|
||||
hb_itemPutC( pItem, NULL );
|
||||
|
||||
@@ -52,8 +52,8 @@
|
||||
|
||||
HB_EXTERN_BEGIN
|
||||
|
||||
extern HB_EXPORT char * hb_jsonEncode( PHB_ITEM pValue, HB_SIZE * pnLen, HB_BOOL fHuman );
|
||||
extern HB_EXPORT char * hb_jsonEncodeCP( PHB_ITEM pValue, HB_SIZE * pnLen, HB_BOOL fHuman, PHB_CODEPAGE cdp );
|
||||
extern HB_EXPORT char * hb_jsonEncode( PHB_ITEM pValue, HB_SIZE * pnLen, int iIndent );
|
||||
extern HB_EXPORT char * hb_jsonEncodeCP( PHB_ITEM pValue, HB_SIZE * pnLen, int iIndent, PHB_CODEPAGE cdp );
|
||||
extern HB_EXPORT HB_SIZE hb_jsonDecode( const char * szSource, PHB_ITEM pValue );
|
||||
extern HB_EXPORT HB_SIZE hb_jsonDecodeCP( const char * szSource, PHB_ITEM pValue, PHB_CODEPAGE cdp );
|
||||
|
||||
|
||||
@@ -55,11 +55,11 @@
|
||||
https://tools.ietf.org/html/rfc4627
|
||||
|
||||
C level functions:
|
||||
char * hb_jsonEncode( PHB_ITEM pValue, HB_SIZE * pnLen, HB_BOOL fHuman );
|
||||
char * hb_jsonEncode( PHB_ITEM pValue, HB_SIZE * pnLen, int iIndent );
|
||||
pValue - value to encode;
|
||||
pnLen - if pnLen is not NULL, length of returned buffer is
|
||||
stored to *pnLen;
|
||||
fHuman - format to be human readable;
|
||||
iIndent - indenting to be human readable;
|
||||
returns pointer to encoded JSON buffer. buffer must be fried
|
||||
by the caller.
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
purposes. Returns 0 on error.
|
||||
|
||||
Harbour level functions:
|
||||
hb_jsonEncode( xValue [, lHuman = .F. ] ) --> cJSON
|
||||
hb_jsonEncode( xValue [, lHuman = .F. | nIndent = 0 ] ) --> cJSON
|
||||
hb_jsonDecode( cJSON ) --> xValue
|
||||
hb_jsonDecode( cJSON, @xValue ) --> nLengthDecoded
|
||||
|
||||
@@ -98,7 +98,7 @@ typedef struct
|
||||
HB_SIZE nAlloc;
|
||||
void ** pId;
|
||||
HB_SIZE nAllocId;
|
||||
HB_BOOL fHuman;
|
||||
int iIndent;
|
||||
int iEolLen;
|
||||
const char * szEol;
|
||||
} HB_JSON_ENCODE_CTX, * PHB_JSON_ENCODE_CTX;
|
||||
@@ -123,10 +123,11 @@ static void _hb_jsonCtxAdd( PHB_JSON_ENCODE_CTX pCtx, const char * szString, HB_
|
||||
}
|
||||
}
|
||||
|
||||
static void _hb_jsonCtxAddIndent( PHB_JSON_ENCODE_CTX pCtx, HB_SIZE nCount )
|
||||
static void _hb_jsonCtxAddIndent( PHB_JSON_ENCODE_CTX pCtx, HB_SIZE nLevel )
|
||||
{
|
||||
if( nCount > 0 )
|
||||
if( nLevel > 0 )
|
||||
{
|
||||
HB_SIZE nCount = nLevel * ( pCtx->iIndent > 0 ? pCtx->iIndent : 1 );
|
||||
if( pCtx->pHead + nCount >= pCtx->pBuffer + pCtx->nAlloc )
|
||||
{
|
||||
HB_SIZE nSize = pCtx->pHead - pCtx->pBuffer;
|
||||
@@ -135,7 +136,7 @@ static void _hb_jsonCtxAddIndent( PHB_JSON_ENCODE_CTX pCtx, HB_SIZE nCount )
|
||||
pCtx->pBuffer = ( char * ) hb_xrealloc( pCtx->pBuffer, pCtx->nAlloc );
|
||||
pCtx->pHead = pCtx->pBuffer + nSize;
|
||||
}
|
||||
hb_xmemset( pCtx->pHead, ' ', nCount );
|
||||
hb_xmemset( pCtx->pHead, pCtx->iIndent > 0 ? ' ' : '\t', nCount );
|
||||
pCtx->pHead += nCount;
|
||||
}
|
||||
}
|
||||
@@ -153,8 +154,8 @@ static void _hb_jsonEncode( PHB_ITEM pValue, PHB_JSON_ENCODE_CTX pCtx,
|
||||
{
|
||||
if( pCtx->pId[ nIndex ] == id )
|
||||
{
|
||||
if( ! fEOL && pCtx->fHuman )
|
||||
_hb_jsonCtxAddIndent( pCtx, nLevel * INDENT_SIZE );
|
||||
if( ! fEOL && pCtx->iIndent )
|
||||
_hb_jsonCtxAddIndent( pCtx, nLevel );
|
||||
_hb_jsonCtxAdd( pCtx, "null", 4 );
|
||||
return;
|
||||
}
|
||||
@@ -301,8 +302,8 @@ static void _hb_jsonEncode( PHB_ITEM pValue, PHB_JSON_ENCODE_CTX pCtx,
|
||||
{
|
||||
HB_SIZE nIndex;
|
||||
|
||||
if( pCtx->fHuman )
|
||||
_hb_jsonCtxAddIndent( pCtx, nLevel * INDENT_SIZE );
|
||||
if( pCtx->iIndent )
|
||||
_hb_jsonCtxAddIndent( pCtx, nLevel );
|
||||
|
||||
_hb_jsonCtxAdd( pCtx, "[", 1 );
|
||||
|
||||
@@ -313,20 +314,20 @@ static void _hb_jsonEncode( PHB_ITEM pValue, PHB_JSON_ENCODE_CTX pCtx,
|
||||
if( nIndex > 1 )
|
||||
_hb_jsonCtxAdd( pCtx, ",", 1 );
|
||||
|
||||
if( pCtx->fHuman )
|
||||
if( pCtx->iIndent )
|
||||
_hb_jsonCtxAdd( pCtx, pCtx->szEol, pCtx->iEolLen );
|
||||
|
||||
if( pCtx->fHuman &&
|
||||
if( pCtx->iIndent &&
|
||||
! ( ( HB_IS_ARRAY( pItem ) || HB_IS_HASH( pItem ) ) &&
|
||||
hb_itemSize( pItem ) > 0 ) )
|
||||
_hb_jsonCtxAddIndent( pCtx, ( nLevel + 1 ) * INDENT_SIZE );
|
||||
_hb_jsonCtxAddIndent( pCtx, ( nLevel + 1 ) );
|
||||
|
||||
_hb_jsonEncode( pItem, pCtx, nLevel + 1, HB_FALSE, cdp );
|
||||
}
|
||||
if( pCtx->fHuman )
|
||||
if( pCtx->iIndent )
|
||||
{
|
||||
_hb_jsonCtxAdd( pCtx, pCtx->szEol, pCtx->iEolLen );
|
||||
_hb_jsonCtxAddIndent( pCtx, nLevel * INDENT_SIZE );
|
||||
_hb_jsonCtxAddIndent( pCtx, nLevel );
|
||||
}
|
||||
_hb_jsonCtxAdd( pCtx, "]", 1 );
|
||||
}
|
||||
@@ -341,8 +342,8 @@ static void _hb_jsonEncode( PHB_ITEM pValue, PHB_JSON_ENCODE_CTX pCtx,
|
||||
{
|
||||
HB_SIZE nIndex;
|
||||
|
||||
if( pCtx->fHuman )
|
||||
_hb_jsonCtxAddIndent( pCtx, nLevel * INDENT_SIZE );
|
||||
if( pCtx->iIndent )
|
||||
_hb_jsonCtxAddIndent( pCtx, nLevel );
|
||||
|
||||
_hb_jsonCtxAdd( pCtx, "{", 1 );
|
||||
|
||||
@@ -357,14 +358,14 @@ static void _hb_jsonEncode( PHB_ITEM pValue, PHB_JSON_ENCODE_CTX pCtx,
|
||||
if( nIndex > 1 )
|
||||
_hb_jsonCtxAdd( pCtx, ",", 1 );
|
||||
|
||||
if( pCtx->fHuman )
|
||||
if( pCtx->iIndent )
|
||||
{
|
||||
_hb_jsonCtxAdd( pCtx, pCtx->szEol, pCtx->iEolLen );
|
||||
_hb_jsonCtxAddIndent( pCtx, ( nLevel + 1 ) * INDENT_SIZE );
|
||||
_hb_jsonCtxAddIndent( pCtx, ( nLevel + 1 ) );
|
||||
}
|
||||
_hb_jsonEncode( pKey, pCtx, nLevel + 1, HB_FALSE, cdp );
|
||||
|
||||
if( pCtx->fHuman )
|
||||
if( pCtx->iIndent )
|
||||
{
|
||||
_hb_jsonCtxAdd( pCtx, ": ", 2 );
|
||||
fEOL = ( HB_IS_ARRAY( pItem ) || HB_IS_HASH( pItem ) ) && hb_itemSize( pItem ) > 0;
|
||||
@@ -378,10 +379,10 @@ static void _hb_jsonEncode( PHB_ITEM pValue, PHB_JSON_ENCODE_CTX pCtx,
|
||||
_hb_jsonEncode( pItem, pCtx, nLevel + 1, fEOL, cdp );
|
||||
}
|
||||
}
|
||||
if( pCtx->fHuman )
|
||||
if( pCtx->iIndent )
|
||||
{
|
||||
_hb_jsonCtxAdd( pCtx, pCtx->szEol, pCtx->iEolLen );
|
||||
_hb_jsonCtxAddIndent( pCtx, nLevel * INDENT_SIZE );
|
||||
_hb_jsonCtxAddIndent( pCtx, nLevel );
|
||||
}
|
||||
_hb_jsonCtxAdd( pCtx, "}", 1 );
|
||||
}
|
||||
@@ -659,7 +660,7 @@ static const char * _hb_jsonDecode( const char * szSource, PHB_ITEM pValue, PHB_
|
||||
|
||||
/* C level API functions */
|
||||
|
||||
char * hb_jsonEncodeCP( PHB_ITEM pValue, HB_SIZE * pnLen, HB_BOOL fHuman, PHB_CODEPAGE cdp )
|
||||
char * hb_jsonEncodeCP( PHB_ITEM pValue, HB_SIZE * pnLen, int iIndent, PHB_CODEPAGE cdp )
|
||||
{
|
||||
PHB_JSON_ENCODE_CTX pCtx;
|
||||
char * szRet;
|
||||
@@ -670,14 +671,14 @@ char * hb_jsonEncodeCP( PHB_ITEM pValue, HB_SIZE * pnLen, HB_BOOL fHuman, PHB_CO
|
||||
pCtx->pHead = pCtx->pBuffer = ( char * ) hb_xgrab( pCtx->nAlloc );
|
||||
pCtx->nAllocId = 8;
|
||||
pCtx->pId = ( void ** ) hb_xgrab( sizeof( void * ) * pCtx->nAllocId );
|
||||
pCtx->fHuman = fHuman;
|
||||
pCtx->iIndent = iIndent;
|
||||
pCtx->szEol = hb_setGetEOL();
|
||||
if( ! pCtx->szEol || ! pCtx->szEol[ 0 ] )
|
||||
pCtx->szEol = hb_conNewLine();
|
||||
pCtx->iEolLen = ( int ) strlen( pCtx->szEol );
|
||||
|
||||
_hb_jsonEncode( pValue, pCtx, 0, HB_FALSE, cdp );
|
||||
if( fHuman )
|
||||
if( iIndent )
|
||||
_hb_jsonCtxAdd( pCtx, pCtx->szEol, pCtx->iEolLen );
|
||||
|
||||
nLen = pCtx->pHead - pCtx->pBuffer;
|
||||
@@ -690,9 +691,9 @@ char * hb_jsonEncodeCP( PHB_ITEM pValue, HB_SIZE * pnLen, HB_BOOL fHuman, PHB_CO
|
||||
return szRet;
|
||||
}
|
||||
|
||||
char * hb_jsonEncode( PHB_ITEM pValue, HB_SIZE * pnLen, HB_BOOL fHuman )
|
||||
char * hb_jsonEncode( PHB_ITEM pValue, HB_SIZE * pnLen, int iIndent )
|
||||
{
|
||||
return hb_jsonEncodeCP( pValue, pnLen, fHuman, NULL );
|
||||
return hb_jsonEncodeCP( pValue, pnLen, iIndent, NULL );
|
||||
}
|
||||
|
||||
HB_SIZE hb_jsonDecodeCP( const char * szSource, PHB_ITEM pValue, PHB_CODEPAGE cdp )
|
||||
@@ -734,7 +735,8 @@ HB_FUNC( HB_JSONENCODE )
|
||||
if( pItem )
|
||||
{
|
||||
HB_SIZE nLen;
|
||||
char * szRet = hb_jsonEncodeCP( pItem, &nLen, hb_parl( 2 ), _hb_jsonCdpPar( 3 ) );
|
||||
int iIndent = hb_parl( 2 ) ? INDENT_SIZE : hb_parni( 2 );
|
||||
char * szRet = hb_jsonEncodeCP( pItem, &nLen, iIndent, _hb_jsonCdpPar( 3 ) );
|
||||
hb_retclen_buffer( szRet, nLen );
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user