/* * M_SQRT1_2 * Expand 0.70710678118654752440 */ static void JX9_M_SQRT1_2_Const(jx9_value *pVal, void *pUserData) { SXUNUSED(pUserData); /* cc warning */ jx9_value_double(pVal, 0.70710678118654752440); }
/* * M_SQRT2 * Expand 1.41421356237309504880 */ static void JX9_M_SQRT2_Const(jx9_value *pVal, void *pUserData) { SXUNUSED(pUserData); /* cc warning */ jx9_value_double(pVal, 1.41421356237309504880); }
/* * M_SQRT3 * Expand 1.73205080756887729352 */ static void JX9_M_SQRT3_Const(jx9_value *pVal, void *pUserData) { SXUNUSED(pUserData); /* cc warning */ jx9_value_double(pVal, 1.73205080756887729352); }
/* * M_SQRTPI * Expand 1.77245385090551602729 */ static void JX9_M_SQRTPI_Const(jx9_value *pVal, void *pUserData) { SXUNUSED(pUserData); /* cc warning */ jx9_value_double(pVal, 1.77245385090551602729); }
/* * M_2_SQRTPI * Expand 1.12837916709551257390 */ static void JX9_M_2_SQRTPI_Const(jx9_value *pVal, void *pUserData) { SXUNUSED(pUserData); /* cc warning */ jx9_value_double(pVal, 1.12837916709551257390); }
/* * PI * Expand the value of pi. */ static void JX9_M_PI_Const(jx9_value *pVal, void *pUserData) { SXUNUSED(pUserData); /* cc warning */ jx9_value_double(pVal, JX9_PI); }
/* * M_2_PI * Expand 0.63661977236758134308 */ static void JX9_M_2_PI_Const(jx9_value *pVal, void *pUserData) { SXUNUSED(pUserData); /* cc warning */ jx9_value_double(pVal, 0.63661977236758134308); }
/* * M_PI_2 * Expand 1.57079632679489661923 */ static void JX9_M_PI_2_Const(jx9_value *pVal, void *pUserData) { SXUNUSED(pUserData); /* cc warning */ jx9_value_double(pVal, 1.57079632679489661923); }
/* * M_PI_4 * Expand 0.78539816339744830962 */ static void JX9_M_PI_4_Const(jx9_value *pVal, void *pUserData) { SXUNUSED(pUserData); /* cc warning */ jx9_value_double(pVal, 0.78539816339744830962); }
/* * M_LN2 * Expand 0.69314718055994530942 */ static void JX9_M_LN2_Const(jx9_value *pVal, void *pUserData) { SXUNUSED(pUserData); /* cc warning */ jx9_value_double(pVal, 0.69314718055994530942); }
/* * M_LN10 * Expand 2.30258509299404568402 */ static void JX9_M_LN10_Const(jx9_value *pVal, void *pUserData) { SXUNUSED(pUserData); /* cc warning */ jx9_value_double(pVal, 2.30258509299404568402); }
/* * M_LOG10E * Expand 0.4342944819032518276 */ static void JX9_M_LOG10E_Const(jx9_value *pVal, void *pUserData) { SXUNUSED(pUserData); /* cc warning */ jx9_value_double(pVal, 0.4342944819032518276); }
/* * M_LOG2E * Expand 2.7182818284590452354 */ static void JX9_M_LOG2E_Const(jx9_value *pVal, void *pUserData) { SXUNUSED(pUserData); /* cc warning */ jx9_value_double(pVal, 1.4426950408889634074); }
/* * M_E * Expand 2.7182818284590452354 */ static void JX9_M_E_Const(jx9_value *pVal, void *pUserData) { SXUNUSED(pUserData); /* cc warning */ jx9_value_double(pVal, 2.7182818284590452354); }
/* * M_LNPI * Expand 1.14472988584940017414 */ static void JX9_M_LNPI_Const(jx9_value *pVal, void *pUserData) { SXUNUSED(pUserData); /* cc warning */ jx9_value_double(pVal, 1.14472988584940017414); }
/* * M_1_PI * Expand 0.31830988618379067154 */ static void JX9_M_1_PI_Const(jx9_value *pVal, void *pUserData) { SXUNUSED(pUserData); /* cc warning */ jx9_value_double(pVal, 0.31830988618379067154); }
/* * M_EULER * Expand 0.57721566490153286061 */ static void JX9_M_EULER_Const(jx9_value *pVal, void *pUserData) { SXUNUSED(pUserData); /* cc warning */ jx9_value_double(pVal, 0.57721566490153286061); }
/* * Decode a FastJSON binary blob. */ UNQLITE_PRIVATE sxi32 FastJsonDecode( const void *pIn, /* Binary JSON */ sxu32 nByte, /* Chunk delimiter */ jx9_value *pOut, /* Decoded value */ const unsigned char **pzPtr, int iNest /* Nesting limit */ ) { const unsigned char *zIn = (const unsigned char *)pIn; const unsigned char *zEnd = &zIn[nByte]; sxi32 rc = SXRET_OK; int c; if( iNest >= UNQLITE_FAST_JSON_NEST_LIMIT ){ /* Nesting limit reached */ return SXERR_LIMIT; } c = zIn[0]; /* Advance the stream cursor */ zIn++; /* Process the binary token */ switch(c){ case FJSON_NULL: /* null */ jx9_value_null(pOut); break; case FJSON_FALSE: /* Boolean FALSE */ jx9_value_bool(pOut,0); break; case FJSON_TRUE: /* Boolean TRUE */ jx9_value_bool(pOut,1); break; case FJSON_INT64: { /* 64Bit integer */ sxu64 iVal; /* Sanity check */ if( &zIn[8] >= zEnd ){ /* Corrupt chunk */ rc = SXERR_CORRUPT; break; } SyBigEndianUnpack64(zIn,&iVal); /* Advance the pointer */ zIn += 8; jx9_value_int64(pOut,(jx9_int64)iVal); break; } case FJSON_REAL: { /* Real number */ double iVal = 0; /* cc warning */ sxu16 iLen; /* Sanity check */ if( &zIn[2] >= zEnd ){ /* Corrupt chunk */ rc = SXERR_CORRUPT; break; } SyBigEndianUnpack16(zIn,&iLen); if( &zIn[iLen] >= zEnd ){ /* Corrupt chunk */ rc = SXERR_CORRUPT; break; } zIn += 2; SyStrToReal((const char *)zIn,(sxu32)iLen,&iVal,0); /* Advance the pointer */ zIn += iLen; jx9_value_double(pOut,iVal); break; } case FJSON_STRING: { /* UTF-8/Binary chunk */ sxu32 iLength; /* Sanity check */ if( &zIn[4] >= zEnd ){ /* Corrupt chunk */ rc = SXERR_CORRUPT; break; } SyBigEndianUnpack32(zIn,&iLength); if( &zIn[iLength] >= zEnd ){ /* Corrupt chunk */ rc = SXERR_CORRUPT; break; } zIn += 4; /* Invalidate any prior representation */ if( pOut->iFlags & MEMOBJ_STRING ){ /* Reset the string cursor */ SyBlobReset(&pOut->sBlob); } rc = jx9MemObjStringAppend(pOut,(const char *)zIn,iLength); /* Update pointer */ zIn += iLength; break; } case FJSON_ARRAY_START: { /* Binary JSON array */ jx9_hashmap *pMap; jx9_value sVal; /* Allocate a new hashmap */ pMap = (jx9_hashmap *)jx9NewHashmap(pOut->pVm,0,0); if( pMap == 0 ){ rc = SXERR_MEM; break; } jx9MemObjInit(pOut->pVm,&sVal); jx9MemObjRelease(pOut); MemObjSetType(pOut,MEMOBJ_HASHMAP); pOut->x.pOther = pMap; rc = SXRET_OK; for(;;){ /* Jump leading binary commas */ while (zIn < zEnd && zIn[0] == FJSON_COMMA ){ zIn++; } if( zIn >= zEnd || zIn[0] == FJSON_ARRAY_END ){ if( zIn < zEnd ){ zIn++; /* Jump the trailing binary ] */ } break; } /* Decode the value */ rc = FastJsonDecode((const void *)zIn,(sxu32)(zEnd-zIn),&sVal,&zIn,iNest+1); if( rc != SXRET_OK ){ break; } /* Insert the decoded value */ rc = jx9HashmapInsert(pMap,0,&sVal); if( rc != UNQLITE_OK ){ break; } } if( rc != SXRET_OK ){ jx9MemObjRelease(pOut); } jx9MemObjRelease(&sVal); break; } case FJSON_DOC_START: { /* Binary JSON object */ jx9_value sVal,sKey; jx9_hashmap *pMap; /* Allocate a new hashmap */ pMap = (jx9_hashmap *)jx9NewHashmap(pOut->pVm,0,0); if( pMap == 0 ){ rc = SXERR_MEM; break; } jx9MemObjInit(pOut->pVm,&sVal); jx9MemObjInit(pOut->pVm,&sKey); jx9MemObjRelease(pOut); MemObjSetType(pOut,MEMOBJ_HASHMAP); pOut->x.pOther = pMap; rc = SXRET_OK; for(;;){ /* Jump leading binary commas */ while (zIn < zEnd && zIn[0] == FJSON_COMMA ){ zIn++; } if( zIn >= zEnd || zIn[0] == FJSON_DOC_END ){ if( zIn < zEnd ){ zIn++; /* Jump the trailing binary } */ } break; } /* Extract the key */ rc = FastJsonDecode((const void *)zIn,(sxu32)(zEnd-zIn),&sKey,&zIn,iNest+1); if( rc != UNQLITE_OK ){ break; } if( zIn >= zEnd || zIn[0] != FJSON_COLON ){ rc = UNQLITE_CORRUPT; break; } zIn++; /* Jump the binary colon ':' */ if( zIn >= zEnd ){ rc = UNQLITE_CORRUPT; break; } /* Decode the value */ rc = FastJsonDecode((const void *)zIn,(sxu32)(zEnd-zIn),&sVal,&zIn,iNest+1); if( rc != SXRET_OK ){ break; } /* Insert the key and its associated value */ rc = jx9HashmapInsert(pMap,&sKey,&sVal); if( rc != UNQLITE_OK ){ break; } } if( rc != SXRET_OK ){ jx9MemObjRelease(pOut); } jx9MemObjRelease(&sVal); jx9MemObjRelease(&sKey); break; } default: /* Corrupt data */ rc = SXERR_CORRUPT; break; } if( pzPtr ){ *pzPtr = zIn; } return rc; }