43#if (BPARSER_VERSION_DEV == 1) && !defined(BPARSER_DEV_WARN)
44#error You're using a dev build of BinaryParser. It is still in development and it's VERY volatile! Use with caution.
53#define BPARSER_UINT8 0
61#define BPARSER_UINT16 1
69#define BPARSER_UINT24 2
77#define BPARSER_UINT32 3
85#define BPARSER_UINT64 4
93#define BPARSER_UINT128 5
101#define BPARSER_INT8 6
109#define BPARSER_INT16 7
117#define BPARSER_INT24 8
125#define BPARSER_INT32 9
133#define BPARSER_INT64 10
141#define BPARSER_INT128 11
149#define BPARSER_STR 12
157#define BPARSER_N_BYTES 13
165#define BPARSER_FIXED_STR 14
173#define BPARSER_FLOAT 15
181#define BPARSER_DOUBLE 16
189#define BPARSER_UNIX_TIME 17
197#define BPARSER_UNICODE_FROM_UTF8_STR 18
205#define BPARSER_UNICODE_FROM_UTF8_F_STR 19
213#define BPARSER_UTF8_STR 20
221#define BPARSER_UTF8_F_STR 21
229#define BPARSER_BOOLS 22
237#define BPARSER_BOOL_RUN 23
247#define BPARSER_SEEK_TO 150
255#define BPARSER_SEEK_FORWARD 151
263#define BPARSER_SEEK_BACKWARD 152
271#define BPARSER_SEEK_FROM_END 153
278#define BPARSER_NO_SEEK 154
289#define BPARSER_RO_ARRAY_ERROR -20
296#define BPARSER_MALLOC_ERROR -21
303#define BPARSER_NO_FUNC_PASSED -22
310#define BPARSER_SPRINTF_ERROR -23
319#define BPARSER_BACKWARD_SEEK_ERROR -24
327#define BPARSER_SEEK_FROM_END_ERROR -25
335#define BPARSER_EOF_ERROR -26
343#define BPARSER_CALLOC_ERROR -27
352#define BPARSER_UNKNOWN_ENDIAN -28
361#define BPARSER_UNKNOWN_READ_TYPE -29
368#define BPARSER_FOPEN_ERROR -30
377#define BPARSER_FSEEK_ERROR -31
386#define BPARSER_FTELL_ERROR -32
393#define BPARSER_FREAD_EOF_ERROR -33
401#define BPARSER_SEEK_ERROR -34
409#define BPARSER_BAD_INTEGRAL_TYPE -35
417#define BPARSER_BAD_REALLOC_METHOD -36
424#define BPARSER_REALLOC_FACTOR_TOO_SMALL -37
431#define BPARSER_RENAME_NOT_FOUND -38
438#define BPARSER_PDC_INIT_ERROR -39
445#define BPARSER_PDC_RO_COPY_ERROR -40
452#define BPARSER_NULL_NAME -41
459#define BPARSER_SHORT_NAME -42
466#define BPARSER_NO_PARSER -43
473#define BPARSER_ZERO_LENGTH -44
481#define BPARSER_NAME_IS_NOT_UNIQUE -45
488#define BPARSER_NO_BOOLS_TO_READ -46
495#define BPARSER_PDC_DATA_COPY_ERROR -47
502#define BPARSER_FREAD_ERROR -48
509#define BPARSER_FREAD_UNKNOWN_ERROR -49
516#define BPARSER_NULL_DATA -50
523#define BPARSER_NOTHING_TO_PARSE -51
530#define BPARSER_EMPTY_FILE -52
537#define BPARSER_BAD_OVERRIDE -53
544#define BPARSER_OK(expr) ((expr)>=(BPARSER_RO_ARRAY_ERROR))
551#define BPARSER_LITTLE_ENDIAN 0
558#define BPARSER_BIG_ENDIAN 1
565#define BPARSER_DEFAULT_ENDIAN 2
572#define BPARSER_REALLOC_METHOD_PLUS 240
579#define BPARSER_REALLOC_METHOD_MULT 241
585#define bparser_read_uint8(Parser, Name) bparser_read_integral(Parser, Name, BPARSER_UINT8, BPARSER_DEFAULT_ENDIAN)
591#define bparser_read_int8(Parser, Name) bparser_read_integral(Parser, Name, BPARSER_INT8, BPARSER_DEFAULT_ENDIAN)
597#define bparser_read_uint16(Parser, Name) bparser_read_integral(Parser, Name, BPARSER_UINT16, BPARSER_DEFAULT_ENDIAN)
603#define bparser_read_int16(Parser, Name) bparser_read_integral(Parser, Name, BPARSER_INT16, BPARSER_DEFAULT_ENDIAN)
609#define bparser_read_uint24(Parser, Name) bparser_read_integral(Parser, Name, BPARSER_UINT24, BPARSER_DEFAULT_ENDIAN)
615#define bparser_read_int24(Parser, Name) bparser_read_integral(Parser, Name, BPARSER_INT24, BPARSER_DEFAULT_ENDIAN)
621#define bparser_read_uint32(Parser, Name) bparser_read_integral(Parser, Name, BPARSER_UINT32, BPARSER_DEFAULT_ENDIAN)
627#define bparser_read_int32(Parser, Name) bparser_read_integral(Parser, Name, BPARSER_INT32, BPARSER_DEFAULT_ENDIAN)
633#define bparser_read_uint64(Parser, Name) bparser_read_integral(Parser, Name, BPARSER_UINT64, BPARSER_DEFAULT_ENDIAN)
639#define bparser_read_int64(Parser, Name) bparser_read_integral(Parser, Name, BPARSER_INT64, BPARSER_DEFAULT_ENDIAN)
645#define bparser_read_uint128(Parser, Name) bparser_read_integral(Parser, Name, BPARSER_UINT128, BPARSER_DEFAULT_ENDIAN)
651#define bparser_read_int128(Parser, Name) bparser_read_integral(Parser, Name, BPARSER_INT128, BPARSER_DEFAULT_ENDIAN)
658struct bparser_parser_s;
665#define BPARSER_BYTES_F_ARGS struct bparser_parser_s* MParser, uint8_t* Bytes, size_t Length
672#define BPARSER_BYTES_SEQ_F_ARGS struct bparser_parser_s* MParser, uint8_t Byte, size_t Index
679#define BPARSER_OVERRIDE_ERROR 99
686#define BPARSER_OVERRIDE_TRUE 100
693#define BPARSER_OVERRIDE_SKIP 101
700#define BPARSER_OVERRIDE_DO_NOTHING 102
719#define BPARSER_BOOL_HANDLER_F_ARGS uint8_t Boolean
726#define BPARSER_BOOL_F_ARGS struct bparser_parser_s* MParser
744typedef struct bparser_bool_funcs_s
755typedef struct bparser_seek_data_s
771typedef struct bparser_read_s
792typedef struct bparser_data_s
805typedef void* (*bparser_calloc_like_f)(
size_t num,
size_t size);
817typedef void* (*bparser_malloc_like_f)(
size_t size);
823typedef void* (*bparser_realloc_like_f)(
void* ptr,
size_t size);
831typedef struct bparser_parser_s
835 size_t ReadOrderLength;
836 size_t ReadOrderMaxLength;
849 double ReallocFactor;
850 uint8_t ReallocMethod;
1349#ifdef BPARSER_IMPLEMENTATION
1368 _New->ReadOrderLength = 0;
1369 _New->ReadOrderMaxLength = 2;
1371 _New->DataCount = 0;
1376 _New->ReallocF = _R;
1385 _New->ReallocFactor = 2.0;
1400 MParser->FreeF(MParser);
1409 MParser->FreeF(MParser);
1414 if (!MParser) {
return NULL; }
1415 MParser->MallocF = (Malloc) ? Malloc : malloc;
1416 return (MParser->MallocF);
1421 if (!MParser) {
return NULL; }
1422 MParser->CallocF = (Calloc) ? Calloc : calloc;
1423 return (MParser->CallocF);
1428 if (!MParser) {
return NULL; }
1429 MParser->ReallocF = (Realloc) ? Realloc : realloc;
1430 return (MParser->ReallocF);
1435 if (!MParser) {
return NULL; }
1436 MParser->FreeF = (Free) ? Free : free;
1437 return (MParser->FreeF);
1442 if (MParser->ReadOrderLength + 1 > MParser->ReadOrderMaxLength)
1446 switch (MParser->ReallocMethod)
1449 NewSize = (size_t)(((
double)MParser->ReadOrderMaxLength) * MParser->ReallocFactor);
1453 NewSize = (size_t)(((
double)MParser->ReadOrderMaxLength) + MParser->ReallocFactor);
1457 void* _New = MParser->ReallocF(MParser->ReadOrder,
sizeof(
bparser_read_t) * (NewSize));
1460 MParser->ReadOrder = _New;
1461 MParser->ReadOrderMaxLength = NewSize;
1471 bparser_read_t* _Temp = &( MParser->ReadOrder[MParser->ReadOrderLength] );
1473 _Temp->Endian = MParser->Endian;
1474 _Temp->Parameter1 = 0;
1475 _Temp->Parameter2 = NULL;
1477 _Temp->Parameter4 = NULL;
1478 _Temp->Seek = MParser->Seek;
1485 for (
size_t I = 0; I < MParser->ReadOrderLength; I++)
1487 if (!MParser->ReadOrder[I].Name)
1492 if ( strcmp(MParser->ReadOrder[I].Name, Name) == 0 )
1494 return &(MParser->ReadOrder[I]);
1506 _CollidedWith = _find_collision(MParser, Name);
1511 switch (MParser->Override)
1518 return _CollidedWith;
1527 MParser->ReadOrderLength++;
1543 if (strlen(Name) < 1)
1558 if(!_resize_ro_array(MParser))
1563 void* _Name = MParser->MallocF( strlen(Name) + 1 );
1571 bparser_read_t* _Temp = _get_read_rule_to_set(MParser, Name, &Error);
1578 _Temp->Name = (
char*)_Name;
1579 strcpy(_Temp->Name, Name);
1584 _Temp->Endian = Endian;
1588 MParser->Seek.Pos = 0;
1605 if (strlen(Name) < 1)
1610 if(!_resize_ro_array(MParser))
1615 void* _Name = MParser->MallocF( strlen(Name) + 1 );
1623 bparser_read_t* _Temp = _get_read_rule_to_set(MParser, Name, &Error);
1630 _Temp->Name = (
char*)_Name;
1631 strcpy(_Temp->Name, Name);
1633 MParser->Seek.Pos = 0;
1650 if (strlen(Name) < 1)
1655 if(!_resize_ro_array(MParser))
1660 void* _Name = MParser->MallocF( strlen(Name) + 1 );
1668 bparser_read_t* _Temp = _get_read_rule_to_set(MParser, Name, &Error);
1675 _Temp->Name = (
char*)_Name;
1676 strcpy(_Temp->Name, Name);
1678 MParser->Seek.Pos = 0;
1695 if (strlen(Name) < 1)
1700 if(!_resize_ro_array(MParser))
1705 void* _Name = MParser->MallocF( strlen(Name) + 1 );
1713 bparser_read_t* _Temp = _get_read_rule_to_set(MParser, Name, &Error);
1720 _Temp->Name = (
char*)_Name;
1721 strcpy(_Temp->Name, Name);
1723 MParser->Seek.Pos = 0;
1740 if (strlen(Name) < 1)
1750 if(!_resize_ro_array(MParser))
1755 void* _Name = MParser->MallocF( strlen(Name) + 1 );
1763 bparser_read_t* _Temp = _get_read_rule_to_set(MParser, Name, &Error);
1770 _Temp->Name = (
char*)_Name;
1771 strcpy(_Temp->Name, Name);
1773 _Temp->Parameter1 = Length;
1774 MParser->Seek.Pos = 0;
1791 if (strlen(Name) < 1)
1801 if(!_resize_ro_array(MParser))
1806 void* _Name = MParser->MallocF( strlen(Name) + 1 );
1814 bparser_read_t* _Temp = _get_read_rule_to_set(MParser, Name, &Error);
1821 _Temp->Name = (
char*)_Name;
1822 strcpy(_Temp->Name, Name);
1824 _Temp->Parameter1 = Length;
1825 MParser->Seek.Pos = 0;
1842 if (strlen(Name) < 1)
1852 if(!_resize_ro_array(MParser))
1857 void* _Name = MParser->MallocF( strlen(Name) + 1 );
1865 bparser_read_t* _Temp = _get_read_rule_to_set(MParser, Name, &Error);
1872 _Temp->Name = (
char*)_Name;
1873 strcpy(_Temp->Name, Name);
1875 _Temp->Parameter1 = Length;
1876 MParser->Seek.Pos = 0;
1893 if (strlen(Name) < 1)
1903 if(!_resize_ro_array(MParser))
1908 void* _Name = MParser->MallocF( strlen(Name) + 1 );
1916 bparser_read_t* _Temp = _get_read_rule_to_set(MParser, Name, &Error);
1923 _Temp->Name = (
char*)_Name;
1924 strcpy(_Temp->Name, Name);
1926 _Temp->Parameter1 = NBytes;
1927 MParser->Seek.Pos = 0;
1944 if(!_resize_ro_array(MParser))
1951 _Temp->Parameter1 = NBytes;
1957 _Temp->Parameter2 = Func;
1959 MParser->Seek.Pos = 0;
1961 MParser->ReadOrderLength++;
1977 if(!_resize_ro_array(MParser))
1984 _Temp->Parameter1 = NBytes;
1990 _Temp->Parameter4 = Func;
1992 MParser->Seek.Pos = 0;
1994 MParser->ReadOrderLength++;
2010 if (strlen(Name) < 1)
2025 for (
size_t Item = 0; Item < Items; Item++)
2027 if(!_resize_ro_array(MParser))
2032 void* _Name = MParser->MallocF( strlen(Name) + 16 );
2039 if(sprintf((
char*)_Name,
"%s[%lld]", Name, Item) < 0)
2045 bparser_read_t* _Temp = _get_read_rule_to_set(MParser, (
char*)_Name, &Error);
2052 _Temp->Name = (
char*)_Name;
2053 _Temp->Type = ItemType;
2054 MParser->Seek.Pos = 0;
2072 if (strlen(Name) < 1)
2077 if ((!Cols) || (!Rows))
2087 for (
size_t Y = 0; Y < Rows; Y++)
2089 for (
size_t X = 0; X < Cols; X++)
2091 if(!_resize_ro_array(MParser))
2096 void* _Name = MParser->MallocF( strlen(Name) + 16 );
2103 if(sprintf((
char*)_Name,
"%s[%lld][%lld]", Name, Y, X) < 0)
2109 bparser_read_t* _Temp = _get_read_rule_to_set(MParser, (
char*)_Name, &Error);
2116 _Temp->Name = _Name;
2117 _Temp->Type = ItemType;
2118 MParser->Seek.Pos = 0;
2137 if (strlen(Name) < 1)
2142 if(!_resize_ro_array(MParser))
2147 void* _Name = MParser->MallocF( strlen(Name) + 1 );
2155 bparser_read_t* _Temp = _get_read_rule_to_set(MParser, Name, &Error);
2162 _Temp->Name = (
char*)_Name;
2163 strcpy(_Temp->Name, Name);
2165 MParser->Seek.Pos = 0;
2182 if (strlen(Name) < 1)
2187 if(!_resize_ro_array(MParser))
2192 void* _Name = MParser->MallocF( strlen(Name) + 1 );
2200 bparser_read_t* _Temp = _get_read_rule_to_set(MParser, Name, &Error);
2207 _Temp->Name = (
char*)_Name;
2208 strcpy(_Temp->Name, Name);
2210 MParser->Seek.Pos = 0;
2227 if (strlen(Name) < 1)
2232 if(!_resize_ro_array(MParser))
2237 void* _Name = MParser->MallocF( strlen(Name) + 1 );
2245 bparser_read_t* _Temp = _get_read_rule_to_set(MParser, Name, &Error);
2252 _Temp->Name = (
char*)_Name;
2253 strcpy(_Temp->Name, Name);
2255 MParser->Seek.Pos = 0;
2272 if (strlen(Name) < 1)
2282 for (
size_t U = 0; U < A; U++)
2284 for (
size_t W = 0; W < 8; W++)
2286 if(!_resize_ro_array(MParser))
2291 void* _Name = MParser->MallocF( strlen(Name) + 16 );
2298 if(sprintf((
char*)_Name,
"%s[%lld]", Name, W + (U * 8)) < 0)
2304 bparser_read_t* _Temp = _get_read_rule_to_set(MParser, _Name, &Error);
2311 _Temp->Name = _Name;
2313 _Temp->Parameter1 = W;
2314 MParser->Seek.Pos = 0;
2324 return _bparser_bool(MParser, Name, 1);
2329 return _bparser_bool(MParser, Name, 2);
2334 return _bparser_bool(MParser, Name, 3);
2339 return _bparser_bool(MParser, Name, 4);
2344 return _bparser_bool(MParser, Name, 8);
2349 return _bparser_bool(MParser, Name, 16);
2352char _bparser_default_hfunc(uint8_t Boolean)
2354 return (Boolean > 0);
2364 if(!_resize_ro_array(MParser))
2372 _Temp->Parameter3.HFunc = (HFunc) ? HFunc : _bparser_default_hfunc;
2377 _Temp->Parameter3.Func = Func;
2379 MParser->Seek.Pos = 0;
2381 MParser->ReadOrderLength++;
2385void _utf8_get_length(
const uint8_t* Data,
size_t* Chars,
size_t* LengthInBytes,
size_t FixedLen)
2390 while (Char < FixedLen)
2392 uint8_t Curr = *(Data + Pos);
2396 *LengthInBytes += 1;
2404 *LengthInBytes += 1;
2406 else if ( Curr >= 192 && Curr <= 223 )
2410 *LengthInBytes += 2;
2412 else if ( Curr >= 224 && Curr <= 239 )
2416 *LengthInBytes += 3;
2418 else if ( Curr >= 240 && Curr <= 247 )
2422 *LengthInBytes += 4;
2434uint32_t _utf8_read(
const uint8_t* Data,
size_t* Offset)
2436 uint8_t First = *(Data);
2438 if ( First >= 128 && First <= 191 )
2449 return (uint32_t)First;
2452 uint8_t Second = *(Data + 1);
2454 if ( First >= 192 && First <= 223 )
2459 if ( (First == 0xC0 || First == 0xC1) && Second < 0xA0)
2464 if ( Second >= 128 && Second <= 191 )
2468 uint32_t _1 = (((uint32_t)First) & 31) << 6;
2469 uint32_t _2 = ((uint32_t)Second) & 63;
2470 uint32_t _F = (_1 | _2);
2473 if (_F >= 0xD800 && _F <= 0xDFFF)
2487 uint8_t Third = *(Data + 2);
2489 if ( First >= 224 && First <= 239 )
2494 if ( First == 0xE0 && Second < 0xA0 )
2500 if ( Second < 128 || Second > 191 )
2504 if ( Third < 128 || Third > 191 )
2509 uint32_t _1 = (((uint32_t)First) & 15) << 12;
2510 uint32_t _2 = (((uint32_t)Second) & 63) << 6;
2511 uint32_t _3 = ((uint32_t)Third) & 63;
2512 return (_1 | _2 | _3);
2515 uint8_t Fourth = *(Data + 3);
2517 if ( First >= 240 && First <= 247 )
2525 if (First == 0xF0 && Second < 0x90)
2531 if ( Second < 128 || Second > 191 )
2535 if ( Third < 128 || Third > 191 )
2539 if ( Fourth < 128 || Fourth > 191 )
2544 uint32_t _1 = (((uint32_t)First) & 7) << 18;
2545 uint32_t _2 = (((uint32_t)Second) & 63) << 12;
2546 uint32_t _3 = (((uint32_t)Third) & 63) << 6;
2547 uint32_t _4 = ((uint32_t)Fourth) & 63;
2548 uint32_t _F = (_1 | _2 | _3 | _4);
2580 MParser->Data = NULL;
2582 void* _DataPtr = MParser->MallocF(
sizeof(
bparser_data_t) * MParser->ReadOrderLength );
2589 memset(_DataPtr, 0,
sizeof(
bparser_data_t) * MParser->ReadOrderLength);
2591 MParser->DataCount = MParser->ReadOrderLength;
2595 for (
size_t ReadPos = 0; ReadPos < MParser->ReadOrderLength; ReadPos++)
2597 uint8_t ReadType = MParser->ReadOrder[ReadPos].Type;
2598 size_t Parameter1 = MParser->ReadOrder[ReadPos].Parameter1;
2600 uint8_t Endianess = MParser->ReadOrder[ReadPos].Endian;
2605 MParser->Data[ReadPos].Name = NULL;
2606 MParser->Data[ReadPos].Type = 0;
2607 MParser->Data[ReadPos].DataPtr = NULL;
2608 MParser->Data[ReadPos].NBytesLength = 0;
2612 Pos = SeekData->Pos;
2616 Pos += SeekData->Pos;
2620 if (SeekData->Pos > Pos)
2624 Pos -= SeekData->Pos;
2628 if ( ((int64_t)Size) - ((int64_t)SeekData->Pos + 1) < 0 )
2632 Pos = Size - (SeekData->Pos + 1);
2640 void* _DataTypePtr = NULL;
2644 _DataTypePtr = MParser->MallocF(1);
2651 uint8_t* _Temp = (uint8_t*)_DataTypePtr;
2652 *_Temp = *(Data + Pos);
2653 MParser->Data[ReadPos].DataPtr = (
void*)_Temp;
2658 _DataTypePtr = MParser->MallocF(2);
2665 uint16_t* _Temp = (uint16_t*)_DataTypePtr;
2666 uint16_t B1 = *(Data + Pos);
2667 uint16_t B2 = *(Data + Pos + 1);
2671 *_Temp = (B1 << 8) + B2;
2675 *_Temp = (B2 << 8) + B1;
2682 MParser->Data[ReadPos].DataPtr = (
void*)_Temp;
2687 _DataTypePtr = MParser->MallocF(4);
2694 uint32_t* _Temp = (uint32_t*)_DataTypePtr;
2695 uint32_t B1 = *(Data + Pos);
2696 uint32_t B2 = *(Data + Pos + 1);
2697 uint32_t B3 = *(Data + Pos + 2);
2698 uint32_t B4 = *(Data + Pos + 3);
2702 *_Temp = (B1 << 24) + (B2 << 16) + (B3 << 8) + B4;
2706 *_Temp = (B4 << 24) + (B3 << 16) + (B2 << 8) + B1;
2713 MParser->Data[ReadPos].DataPtr = (
void*)_Temp;
2718 _DataTypePtr = MParser->MallocF(8);
2725 uint64_t* _Temp = (uint64_t*)_DataTypePtr;
2726 uint64_t B1 = *(Data + Pos);
2727 uint64_t B2 = *(Data + Pos + 1);
2728 uint64_t B3 = *(Data + Pos + 2);
2729 uint64_t B4 = *(Data + Pos + 3);
2730 uint64_t B5 = *(Data + Pos + 4);
2731 uint64_t B6 = *(Data + Pos + 5);
2732 uint64_t B7 = *(Data + Pos + 6);
2733 uint64_t B8 = *(Data + Pos + 7);
2737 *_Temp = (B1 << 56) + (B2 << 48) + (B3 << 40) + (B4 << 32) + (B5 << 24) + (B6 << 16) + (B7 << 8) + B8;
2741 *_Temp = (B8 << 56) + (B7 << 48) + (B6 << 40) + (B5 << 32) + (B4 << 24) + (B3 << 16) + (B2 << 8) + B1;
2748 MParser->Data[ReadPos].DataPtr = (
void*)_Temp;
2753 _DataTypePtr = MParser->MallocF(16);
2763 uint64_t B1 = *(Data + Pos);
2764 uint64_t B2 = *(Data + Pos + 1);
2765 uint64_t B3 = *(Data + Pos + 2);
2766 uint64_t B4 = *(Data + Pos + 3);
2767 uint64_t B5 = *(Data + Pos + 4);
2768 uint64_t B6 = *(Data + Pos + 5);
2769 uint64_t B7 = *(Data + Pos + 6);
2770 uint64_t B8 = *(Data + Pos + 7);
2771 uint64_t B9 = *(Data + Pos + 8);
2772 uint64_t B10 = *(Data + Pos + 8 + 1);
2773 uint64_t B11 = *(Data + Pos + 8 + 2);
2774 uint64_t B12 = *(Data + Pos + 8 + 3);
2775 uint64_t B13 = *(Data + Pos + 8 + 4);
2776 uint64_t B14 = *(Data + Pos + 8 + 5);
2777 uint64_t B15 = *(Data + Pos + 8 + 6);
2778 uint64_t B16 = *(Data + Pos + 8 + 7);
2782 _1 = (B1 << 56) + (B2 << 48) + (B3 << 40) + (B4 << 32) + (B5 << 24) + (B6 << 16) + (B7 << 8) + B8;
2783 _2 = (B9 << 56) + (B10 << 48) + (B11 << 40) + (B12 << 32) + (B13 << 24) + (B14 << 16) + (B15 << 8) + B16;
2787 _1 = (B16 << 56) + (B15 << 48) + (B14 << 40) + (B13 << 32) + (B12 << 24) + (B11 << 16) + (B10 << 8) + B9;
2788 _2 = (B8 << 56) + (B7 << 48) + (B6 << 40) + (B5 << 32) + (B4 << 24) + (B3 << 16) + (B2 << 8) + B1;
2795 memcpy(((uint64_t*)_DataTypePtr), &_1, 8);
2796 memcpy(((uint64_t*)_DataTypePtr) + 1, &_2, 8);
2798 MParser->Data[ReadPos].DataPtr = (
void*)_DataTypePtr;
2803 size_t Length = strlen( (
const char*)(Data + Pos) ) + 1;
2805 _DataTypePtr = MParser->CallocF(Length, 1);
2812 strcpy(_DataTypePtr, (
const char*)(Data + Pos));
2814 MParser->Data[ReadPos].DataPtr = _DataTypePtr;
2819 size_t LengthInBytes = 0;
2824 _DataTypePtr = MParser->CallocF(Chars + 1,
sizeof(uint32_t));
2832 uint32_t* String = (uint32_t*)_DataTypePtr;
2835 for (
size_t Char = 0; Char < Chars; Char++)
2837 String[Char] = _utf8_read(Data + Pos + Offset, &Offset);
2840 MParser->Data[ReadPos].DataPtr = _DataTypePtr;
2841 Pos += LengthInBytes;
2845 void* _DataTypePtr = MParser->CallocF(Parameter1 + 1, 1);
2846 memcpy(_DataTypePtr, Data + Pos, Parameter1);
2847 MParser->Data[ReadPos].DataPtr = _DataTypePtr;
2853 _utf8_get_length(Data + Pos, NULL, &Bytes, Parameter1);
2854 void* _DataTypePtr = MParser->CallocF(Bytes + 1, 1);
2855 memcpy(_DataTypePtr, Data + Pos, Bytes);
2856 MParser->Data[ReadPos].DataPtr = _DataTypePtr;
2861 void* _DataTypePtr = MParser->CallocF(Parameter1, 1);
2868 uint8_t* Bytes = (uint8_t*)_DataTypePtr;
2869 memcpy(Bytes, Data + Pos, Parameter1);
2875 MParser->Data[ReadPos].DataPtr = NULL;
2876 MParser->FreeF(_DataTypePtr);
2878 else if (Parameter4)
2880 for (
size_t I = 0; I < Parameter1; I++)
2884 MParser->Data[ReadPos].DataPtr = NULL;
2885 MParser->FreeF(_DataTypePtr);
2889 MParser->Data[ReadPos].DataPtr = _DataTypePtr;
2890 MParser->Data[ReadPos].NBytesLength = Parameter1;
2897 _DataTypePtr = MParser->MallocF(4);
2905 uint32_t B1 = *(Data + Pos);
2906 uint32_t B2 = *(Data + Pos + 1);
2907 uint32_t B3 = *(Data + Pos + 2);
2908 uint32_t B4 = *(Data + Pos + 3);
2912 Temp = (B1 << 24) + (B2 << 16) + (B3 << 8) + B4;
2916 Temp = (B4 << 24) + (B3 << 16) + (B2 << 8) + B1;
2923 memcpy(_DataTypePtr, &Temp, 4);
2925 MParser->Data[ReadPos].DataPtr = _DataTypePtr;
2930 _DataTypePtr = MParser->MallocF(8);
2938 uint64_t B1 = *(Data + Pos);
2939 uint64_t B2 = *(Data + Pos + 1);
2940 uint64_t B3 = *(Data + Pos + 2);
2941 uint64_t B4 = *(Data + Pos + 3);
2942 uint64_t B5 = *(Data + Pos + 4);
2943 uint64_t B6 = *(Data + Pos + 5);
2944 uint64_t B7 = *(Data + Pos + 6);
2945 uint64_t B8 = *(Data + Pos + 7);
2949 Temp = (B1 << 56) + (B2 << 48) + (B3 << 40) + (B4 << 32) + (B5 << 24) + (B6 << 16) + (B7 << 8) + B8;
2953 Temp = (B8 << 56) + (B7 << 48) + (B6 << 40) + (B5 << 32) + (B4 << 24) + (B3 << 16) + (B2 << 8) + B1;
2960 memcpy(_DataTypePtr, &Temp, 8);
2962 MParser->Data[ReadPos].DataPtr = _DataTypePtr;
2967 _DataTypePtr = MParser->MallocF(
sizeof(time_t) );
2974 time_t* Temp = (time_t*)_DataTypePtr;
2975 uint32_t B1 = *(Data + Pos);
2976 uint32_t B2 = *(Data + Pos + 1);
2977 uint32_t B3 = *(Data + Pos + 2);
2978 uint32_t B4 = *(Data + Pos + 3);
2982 *Temp = (B1 << 24) + (B2 << 16) + (B3 << 8) + B4;
2986 *Temp = (B4 << 24) + (B3 << 16) + (B2 << 8) + B1;
2993 MParser->Data[ReadPos].DataPtr = (
void*)Temp;
2998 _DataTypePtr = MParser->MallocF(4);
3005 uint32_t* _Temp = (uint32_t*)_DataTypePtr;
3006 uint32_t B1 = *(Data + Pos);
3007 uint32_t B2 = *(Data + Pos + 1);
3008 uint32_t B3 = *(Data + Pos + 2);
3012 *_Temp = (B1 << 16) + (B2 << 8) + B3;
3016 *_Temp = (B3 << 16) + (B2 << 8) + B1;
3025 *_Temp -= (0x1000000);
3028 MParser->Data[ReadPos].DataPtr = (
void*)_Temp;
3033 _DataTypePtr = MParser->MallocF(1);
3040 if (*(Data + Pos) & (1 << (7 - Parameter1)))
3042 *((uint8_t*)_DataTypePtr) = 1;
3046 *((uint8_t*)_DataTypePtr) = 0;
3049 MParser->Data[ReadPos].DataPtr = _DataTypePtr;
3051 if (Parameter1 == 7)
3058 if ( Parameter3->HFunc(*(Data + Pos)) )
3060 Parameter3->Func(MParser);
3069 if (MParser->ReadOrder[ReadPos].Name)
3071 void* _Name = MParser->MallocF(strlen(MParser->ReadOrder[ReadPos].Name) + 1);
3078 MParser->Data[ReadPos].Name = (
char*)_Name;
3079 strcpy(MParser->Data[ReadPos].Name, MParser->ReadOrder[ReadPos].Name);
3083 MParser->Data[ReadPos].Name = NULL;
3086 MParser->Data[ReadPos].Type = ReadType;
3104 if (strlen(Filename) < 1)
3109 FILE* _F = fopen(Filename,
"rb");
3116 if( fseek(_F, 0, SEEK_END) )
3122 long Size = ftell(_F);
3135 uint8_t* Data = calloc(Size + 1, 1);
3143 if ( fread(Data, 1, Size, _F) != Size )
3160 if ( (!Data) || (!MagicNum) )
3170 for (
size_t N = 0; N < Length; N++)
3172 if ( *(Data + N) != *(MagicNum + N) )
3182 if ( (!Data) || (!MagicNum) )
3192 for (
size_t N = 0; N < Length; N++)
3194 if ( *(Data + N) != (uint8_t)(*(MagicNum + N)) )
3214 if (strlen(Name) < 1)
3219 for (
size_t D = 0; D < MParser->ReadOrderLength; D++)
3221 if (!MParser->Data[D].Name)
3226 if ( strcmp(MParser->Data[D].Name, Name) == 0 )
3228 return MParser->Data[D].DataPtr;
3236 if (!MParser) {
return; }
3242 if (!MParser) {
return; }
3255 MParser->Seek.Pos = Pos;
3256 MParser->Seek.Mode = Mode;
3278 return "realloc (or user-defined function replacing realloc) has errored out and caused the Read Order array not to resize.";
3281 return "malloc (or user-defined function replacing malloc) has returned NULLPTR.";
3284 return "Either bparser_read_bytes_and_run or bparser_read_bool_and_run have been called with their Func parameter set to NULLPTR.";
3287 return "When reading array, 2D array or bool array, sprintf has errored out when creating name string.";
3290 return "Seeking backward caused the position marker to go into negative range.";
3293 return "Seeking from the end caused the position marker to go into negative range.";
3296 return "Position marker reached EOF when there was more data instructed to read.";
3299 return "calloc (or user-defined function replacing calloc) has returned NULLPTR.";
3302 return "When reading an integer, unknown endianess was detected.";
3305 return "Unknown read type.";
3308 return "In bparser_fread(), fopen() errored out.";
3311 return "In bparser_fread(), fseek() errored out.";
3314 return "In bparser_fread(), ftell() errored out.";
3317 return "In bparser_fread(), fread() errored out on an unexpected EOF.";
3320 return "Seeking mode out of range.";
3323 return "bparser_read_integral() was supplied with an illegal integral type.";
3326 return "bparser_parser_set_realloc_method() was supplied with an illegal realloc method (neither BPARSER_REALLOC_METHOD_PLUS or BPARSER_REALLOC_METHOD_MULT).";
3329 return "bparser_parser_set_realloc_method() was supplied with a realloc factor smaller than 1.0.";
3332 return "bparser_rename() cannot find data object of name supplied by `Src` argument.";
3335 return "bparser_init() has failed when called in bparser_parser_deep_copy().";
3338 return "bparser_read_order_deep_copy() has failed when called in bparser_parser_deep_copy().";
3341 return "A string argument of the function is a NULL pointer.";
3344 return "A string argument of the function is too short.";
3347 return "A function that changes or reads a parser instance, has no parser instance specified.";
3350 return "`Size`, `Length`, `Count` or the like are too low.";
3353 return "A read rule that was about to be created was given a name that is in use by another read rule. Use `bparser_set_override()` to disable this error.";
3356 return "Argument `A` of `_bparser_bool` is zero.";
3359 return "bparser_data_deep_copy() has failed when called in bparser_parser_deep_copy().";
3362 return "In bparser_fread(), fread() errored out.";
3365 return "In bparser_fread(), fread() returned an unknown error...";
3368 return "bparser_read() argument `Data` is NULL!";
3371 return "bparser_read() argument `Size` is zero!";
3374 return "bparser_fread() tried to read an empty file!";
3377 return "bparser_set_override() has been specified with an unknown override method.";
3386 return (MParser->DataCount);
3391 return (MParser->ReadOrderLength);
3401 if (Index > MParser->ReadOrderLength)
3405 return &(MParser->ReadOrder[Index]);
3419 void* Placeholder = MParser->CallocF(MParser->ReadOrderMaxLength,
sizeof(
bparser_read_t));
3429 memcpy(_D, MParser->ReadOrder,
sizeof(
bparser_read_t) * MParser->ReadOrderLength);
3444 void* Placeholder = MParser->CallocF(MParser->ReadOrderMaxLength,
sizeof(
bparser_read_t));
3454 for (
size_t Indx = 0; Indx < MParser->ReadOrderLength; Indx++)
3457 if (MParser->ReadOrder[Indx].Name)
3459 _D[Indx].Name = MParser->CallocF(strlen(MParser->ReadOrder[Indx].Name) + 1,
sizeof(
char));
3460 strcpy(_D[Indx].Name, MParser->ReadOrder[Indx].Name);
3464 _D[Indx].Name = NULL;
3468 _D[Indx].Endian = MParser->ReadOrder[Indx].Endian;
3469 _D[Indx].Type = MParser->ReadOrder[Indx].Type;
3470 _D[Indx].Seek = MParser->ReadOrder[Indx].Seek;
3471 _D[Indx].Parameter1 = MParser->ReadOrder[Indx].Parameter1;
3472 _D[Indx].Parameter2 = MParser->ReadOrder[Indx].Parameter2;
3473 _D[Indx].Parameter3 = MParser->ReadOrder[Indx].Parameter3;
3474 _D[Indx].Parameter4 = MParser->ReadOrder[Indx].Parameter4;
3497 MParser->ReallocFactor = N;
3498 MParser->ReallocMethod = ReallocMethod;
3512 void* Placeholder = MParser->CallocF(MParser->DataCount,
sizeof(
bparser_data_t));
3521 memcpy(_D, MParser->Data,
sizeof(
bparser_data_t) * MParser->DataCount);
3528 char* _F = (Failure) ? Failure : &_Temp;
3540 void* Placeholder = MParser->CallocF(MParser->DataCount,
sizeof(
bparser_data_t));
3554 _D[Indx].Name = MParser->CallocF(strlen(MParser->Data[Indx].Name) + 1,
sizeof(
char));
3556 if (!(_D[Indx].Name))
3562 strcpy(_D[Indx].Name, MParser->Data[Indx].Name);
3564 _D[Indx].Type = MParser->Data[Indx].Type;
3565 _D[Indx].NBytesLength = 0;
3568 switch (_D[Indx].Type)
3573 _D[Indx].DataPtr = MParser->MallocF(1);
3574 if (!(_D[Indx].DataPtr))
3579 *((uint8_t*)_D[Indx].DataPtr) = *((uint8_t*)MParser->Data[Indx].DataPtr);
3586 _D[Indx].DataPtr = MParser->MallocF(2);
3587 if (!(_D[Indx].DataPtr))
3592 *((uint16_t*)_D[Indx].DataPtr) = *((uint16_t*)MParser->Data[Indx].DataPtr);
3599 _D[Indx].DataPtr = MParser->MallocF(4);
3600 if (!(_D[Indx].DataPtr))
3605 *((uint32_t*)_D[Indx].DataPtr) = *((uint32_t*)MParser->Data[Indx].DataPtr);
3612 _D[Indx].DataPtr = MParser->MallocF(8);
3613 if (!(_D[Indx].DataPtr))
3618 *((uint64_t*)_D[Indx].DataPtr) = *((uint64_t*)MParser->Data[Indx].DataPtr);
3625 _D[Indx].DataPtr = MParser->MallocF(16);
3626 if (!(_D[Indx].DataPtr))
3631 *((uint64_t*)_D[Indx].DataPtr) = *((uint64_t*)MParser->Data[Indx].DataPtr);
3632 *((uint64_t*)_D[Indx].DataPtr + 1) = *((uint64_t*)MParser->Data[Indx].DataPtr + 1);
3641 _D[Indx].DataPtr = MParser->CallocF(strlen( (
const char*)MParser->Data[Indx].DataPtr ) + 1, 1);
3642 if (!(_D[Indx].DataPtr))
3647 strcpy((
char*)_D[Indx].DataPtr, (
const char*)MParser->Data[Indx].DataPtr);
3661 while ( *(((uint32_t*)(MParser->Data[Indx].DataPtr) + Count)) != 0 );
3663 _D[Indx].DataPtr = MParser->CallocF(Count,
sizeof(uint32_t));
3664 if (!(_D[Indx].DataPtr))
3669 memcpy(_D[Indx].DataPtr, MParser->Data[Indx].DataPtr,
sizeof(uint32_t) * Count);
3675 _D[Indx].DataPtr = MParser->CallocF(MParser->Data[Indx].NBytesLength, 1);
3676 if (!(_D[Indx].DataPtr))
3681 memcpy(_D[Indx].DataPtr, MParser->Data[Indx].DataPtr, MParser->Data[Indx].NBytesLength);
3682 _D[Indx].NBytesLength = MParser->Data[Indx].NBytesLength;
3688 _D[Indx].DataPtr = MParser->MallocF(4);
3689 if (!(_D[Indx].DataPtr))
3694 *((
float*)_D[Indx].DataPtr) = *((
float*)MParser->Data[Indx].DataPtr);
3700 _D[Indx].DataPtr = MParser->MallocF(8);
3701 if (!(_D[Indx].DataPtr))
3706 *((
double*)_D[Indx].DataPtr) = *((
double*)MParser->Data[Indx].DataPtr);
3712 _D[Indx].DataPtr = MParser->MallocF(
sizeof(time_t) );
3713 if (!(_D[Indx].DataPtr))
3718 *((time_t*)_D[Indx].DataPtr) = *((time_t*)MParser->Data[Indx].DataPtr);
3725 _D[Indx].DataPtr = MParser->MallocF(4);
3726 if (!(_D[Indx].DataPtr))
3731 *((uint32_t*)_D[Indx].DataPtr) = *((uint32_t*)MParser->Data[Indx].DataPtr);
3737 _D[Indx].DataPtr = MParser->MallocF(1);
3738 if (!(_D[Indx].DataPtr))
3743 *((uint8_t*)_D[Indx].DataPtr) = *((uint8_t*)MParser->Data[Indx].DataPtr);
3770 return &(MParser->Data[Indx]);
3779 for (
size_t I = 0; I < Length; I++)
3783 FreeF(Array[I].Name);
3796 for (
size_t D = 0; D < Length; D++)
3799 if (Array[D].DataPtr)
3801 FreeF(Array[D].DataPtr);
3806 FreeF(Array[D].Name);
3820 if ( (!Src) || (!New) )
3825 if ( (strlen(Src) < 1) || (strlen(New) < 1) )
3830 for (
size_t D = 0; D < MParser->ReadOrderLength; D++)
3832 if ( strcmp(MParser->Data[D].Name, Src) == 0 )
3834 void* _Temp = MParser->CallocF( strlen(New) + 1, 1 );
3842 if (MParser->Data[D].Name)
3844 MParser->FreeF(MParser->Data[D].Name);
3847 MParser->Data[D].Name = _Temp;
3849 strcpy(MParser->Data[D].Name, New);
3867 _Dest =
bparser_init(Src->MallocF, Src->CallocF, Src->ReallocF, Src->FreeF);
3883 char* _E = (Error) ? Error : &_Temp;
3894 if (Dest->ReadOrder)
3924 _Dest->ReadOrder = _RO;
3925 _Dest->ReadOrderLength = Src->ReadOrderLength;
3926 _Dest->ReadOrderMaxLength = Src->ReadOrderMaxLength;
3939 _Dest->DataCount = Src->DataCount;
3952 if (Dest->ReadOrder)
3977 MParser->Override = Override;
3989#undef _BPARSER_INIT_ARGS
#define BPARSER_SEEK_FROM_END
Enum value used to specify seeking from the end.
Definition parser.h:271
char bparser_read_null_str(bparser_parser_t *MParser, const char *Name)
Read a null-terminated string from the file.
#define BPARSER_FOPEN_ERROR
Error code for when fopen errors out in bparser_fread.
Definition parser.h:368
char bparser_read_utf8_null_str(bparser_parser_t *MParser, const char *Name)
Read an UTF8 null terminated string from the file.
char bparser_read_8_booleans(bparser_parser_t *MParser, const char *Name)
Read 8bits from the file and store each bit as boolean.
char bparser_check_magic_num(const uint8_t *Data, const uint8_t *MagicNum, size_t Length)
Check magic number.
void(* bparser_free_like_f)(void *ptr)
Shortcut for a custom callback for a free-like function.
Definition parser.h:811
size_t bparser_get_data_count(const bparser_parser_t *MParser)
Get how many data entries have been stored so far.
const char * bparser_error_str(char Error)
Translate BPARSER_*_ERROR codes into strings.
void * bparser_data_shallow_copy(const bparser_parser_t *MParser, bparser_data_t *Dest)
Shallowly copies the data array.
char bparser_read_utf8_fixed_len_str(bparser_parser_t *MParser, const char *Name, size_t Length)
Read an UTF8 string of specified length from the file.
#define BPARSER_OVERRIDE_SKIP
When a read rule has a name that is already used by some other, simply do not create it.
Definition parser.h:693
#define BPARSER_BAD_OVERRIDE
Error code for when bparser_set_override has been specified with an unknown override method.
Definition parser.h:537
char bparser_read_fixed_len_str(bparser_parser_t *MParser, const char *Name, size_t Length)
Read a string of specified length from the file.
void *(* bparser_malloc_like_f)(size_t size)
Shortcut for a custom callback for a malloc-like function.
Definition parser.h:817
#define BPARSER_UTF8_STR
Enum value for reading a null-terminated UTF8 string.
Definition parser.h:213
#define BPARSER_BOOLS
Enum value for a boolean array.
Definition parser.h:229
#define BPARSER_UINT8
Enum value for an uint8 value.
Definition parser.h:53
char bparser_read_2d_array(bparser_parser_t *MParser, const char *Name, size_t Cols, size_t Rows, uint8_t ItemType)
Read a 2D array of size NxM items of specified type.
#define BPARSER_SHORT_NAME
Error code for when a bparser_read_* function recieves a string shorter than 1 char for its' Name arg...
Definition parser.h:459
const bparser_data_t * bparser_get_data_at(const bparser_parser_t *MParser, size_t Indx)
Get the raw bparser_data_t object from the parser.
#define BPARSER_UTF8_F_STR
Enum value for reading a fixed length UTF8 string.
Definition parser.h:221
char bparser_read_unicode_from_utf8_fixed_str(bparser_parser_t *MParser, const char *Name, size_t Length)
Read unicode codepoints (uint32) from an UTF8 string of specified length from the file.
void(* bparser_bool_f)(BPARSER_BOOL_F_ARGS)
Shortcut for the function that runs as specified by bparser_read_bool_and_run.
Definition parser.h:738
#define BPARSER_NOTHING_TO_PARSE
Error code for when bparser_read's Size arg is zero.
Definition parser.h:523
void * bparser_set_free(bparser_parser_t *MParser, bparser_free_like_f Free)
Override the free function used internally by the parser.
#define BPARSER_BAD_REALLOC_METHOD
Error code for when bparser_parser_set_realloc_method is fed a bad / unknown realloc method.
Definition parser.h:417
#define BPARSER_NULL_NAME
Error code for when a bparser_read_* function recieves a NULL pointer for its' Name argument.
Definition parser.h:452
#define BPARSER_NO_BOOLS_TO_READ
Error code for _bparser_bool's argument A is equal to zero.
Definition parser.h:488
#define BPARSER_SPRINTF_ERROR
Error code for when sprintf fails.
Definition parser.h:310
#define BPARSER_BIG_ENDIAN
Used internally, tells us to read an integer in big endian mode.
Definition parser.h:558
#define BPARSER_NO_FUNC_PASSED
Error code for when bparser_read_bytes_and_run or bparser_read_bool_and_run have no function given.
Definition parser.h:303
#define BPARSER_UNKNOWN_READ_TYPE
Error code for when the parser encounters an unknown data type.
Definition parser.h:361
bparser_parser_t * bparser_init(bparser_malloc_like_f MallocLikeFunc, bparser_calloc_like_f CallocLikeFunc, bparser_realloc_like_f ReallocLikeFunc, bparser_free_like_f FreeLikeFunc)
Create a new parser instance.
#define BPARSER_UINT128
Enum value for an uint128 value.
Definition parser.h:93
#define BPARSER_BAD_INTEGRAL_TYPE
Error code for bparser_read_integral was given a bad integral type.
Definition parser.h:409
char bparser_read_array(bparser_parser_t *MParser, const char *Name, size_t Items, uint8_t ItemType)
Read an array with N items of specified type.
void bparser_use_little_endian(bparser_parser_t *MParser)
Instruct the parser to use little endian when reading multibyte integral values.
char bparser_check_magic_num_char(const uint8_t *Data, const char *MagicNum, size_t Length)
Check magic number.
#define BPARSER_OVERRIDE_DO_NOTHING
When a read rule has a name that is already used by some other, the library does not care....
Definition parser.h:700
void * bparser_set_realloc(bparser_parser_t *MParser, bparser_realloc_like_f Realloc)
Override the realloc function used internally by the parser.
#define BPARSER_SEEK_TO
Enum value used to specify seeking to a certain position.
Definition parser.h:247
#define BPARSER_NO_SEEK
Internal value, don't use.
Definition parser.h:278
char bparser_unwind(bparser_parser_t *MParser)
Seek to the end of the file.
void * bparser_data_deep_copy(const bparser_parser_t *MParser, bparser_data_t *Dest, char *Failure)
Deeply copies the data array.
void bparser_use_big_endian(bparser_parser_t *MParser)
Instruct the parser to use big endian when reading multibyte integral values.
#define BPARSER_N_BYTES
Enum value for a byte array.
Definition parser.h:157
#define BPARSER_NAME_IS_NOT_UNIQUE
Error code for when a name of a read rule that is about to be created is not unique.
Definition parser.h:481
#define BPARSER_UINT24
Enum value for an uint24 value.
Definition parser.h:69
#define BPARSER_FIXED_STR
Enum value for a string datatype of a set length.
Definition parser.h:165
#define BPARSER_SEEK_ERROR
Error code for when an invalid seeking mode is specified to bparser_seek.
Definition parser.h:401
#define BPARSER_REALLOC_FACTOR_TOO_SMALL
Error code for when bparser_parser_set_realloc_method N arg is smaller than 1.
Definition parser.h:424
char bparser_read_64_booleans(bparser_parser_t *MParser, const char *Name)
Read 64bits from the file and store each bit as boolean.
#define BPARSER_LITTLE_ENDIAN
Used internally, tells us to read an integer in little endian mode.
Definition parser.h:551
char bparser_rename(bparser_parser_t *MParser, const char *Src, const char *New)
Renames an object in the data array.
#define BPARSER_BACKWARD_SEEK_ERROR
Error code for when seeking backwards beyond the beginning of the file.
Definition parser.h:319
char bparser_set_override(bparser_parser_t *MParser, uint8_t Override)
Set custom override behaviour.
char bparser_read_bytes_and_run_sequential(bparser_parser_t *MParser, size_t NBytes, bparser_bytes_seq_f Func)
Read a specified amount of bytes and run a function on each one.
#define BPARSER_RO_ARRAY_ERROR
Error code for when reallocating the RO array failed.
Definition parser.h:289
#define BPARSER_UINT16
Enum value for an uint16 value.
Definition parser.h:61
void * bparser_read_order_shallow_copy(const bparser_parser_t *MParser, bparser_read_t *Dest)
Shallowly copies the RO array.
#define BPARSER_INT16
Enum value for an int16 value.
Definition parser.h:109
#define BPARSER_EMPTY_FILE
Error code for when bparser_fread tries to read an empty file.
Definition parser.h:530
void bparser_shallow_destroy(bparser_parser_t *MParser)
Destroys a shallow copy of a parser instance.
char bparser_read(bparser_parser_t *MParser, uint8_t *Data, size_t Size)
Read data and parse according to saved rules.
#define BPARSER_RENAME_NOT_FOUND
Error code for when bparser_rename cannot find a data object of name Src.
Definition parser.h:431
#define BPARSER_UNKNOWN_ENDIAN
Error code for when the parser encounters an unknown endianess.
Definition parser.h:352
#define BPARSER_FREAD_UNKNOWN_ERROR
Error code for when fread() errored out with an unknown reason.
Definition parser.h:509
#define BPARSER_BOOL_HANDLER_F_ARGS
Shortcut for argument list of bparser_bool_handler_f function. You can use it while making your own.
Definition parser.h:719
void bparser_destroy(bparser_parser_t *MParser)
Destroy a parser instance.
#define BPARSER_FREAD_EOF_ERROR
Error code for when fread errors out on an unexpected EOF in bparser_fread.
Definition parser.h:393
#define BPARSER_SEEK_BACKWARD
Enum value used to specify seeking backward.
Definition parser.h:263
char bparser_read_24_booleans(bparser_parser_t *MParser, const char *Name)
Read 24bits from the file and store each bit as boolean.
#define BPARSER_UINT32
Enum value for an uint32 value.
Definition parser.h:77
void * bparser_parser_deep_copy(bparser_parser_t *Src, bparser_parser_t *Dest, char *Error)
Deeply copies Src parser instance into Dest parser instance.
#define BPARSER_INT32
Enum value for an int32 value.
Definition parser.h:125
char(* bparser_bool_handler_f)(BPARSER_BOOL_HANDLER_F_ARGS)
Shortcut for handler function that controls whether bparser_bool_f runs.
Definition parser.h:732
void(* bparser_bytes_seq_f)(BPARSER_BYTES_SEQ_F_ARGS)
Shortcut for the function to run as specified by bparser_read_bytes_and_run_sequential.
Definition parser.h:712
#define BPARSER_REALLOC_METHOD_MULT
Tells the parser to calculate new size to realloc as: new_size = old_size * N a.k....
Definition parser.h:579
char bparser_read_bytes_and_run(bparser_parser_t *MParser, size_t NBytes, bparser_bytes_f Func)
Read a specified amount of bytes from the file and run a function on them.
#define BPARSER_PDC_INIT_ERROR
Error code for when bparser_init fails from within bparser_parser_deep_copy.
Definition parser.h:438
char bparser_read_unicode_from_utf8_null_str(bparser_parser_t *MParser, const char *Name)
Read unicode codepoints (uint32) from an UTF8 null terminated string from the file.
#define BPARSER_FTELL_ERROR
Error code for when ftell errors out in bparser_fread.
Definition parser.h:386
#define BPARSER_BOOL_F_ARGS
Shortcut for argument list of bparser_bool_f function. You can use it while making your own.
Definition parser.h:726
char bparser_read_unix_time(bparser_parser_t *MParser, const char *Name)
Read a 4 byte unsigned integer number and parse it as an Unix timestamp.
#define BPARSER_FSEEK_ERROR
Error code for when fseek errors out in bparser_fread.
Definition parser.h:377
#define BPARSER_FREAD_ERROR
Error code for when fread() errored out.
Definition parser.h:502
void * bparser_parser_shallow_copy(bparser_parser_t *Src, bparser_parser_t *Dest)
Shallowly copies Src parser instance into Dest parser instance.
char bparser_read_float(bparser_parser_t *MParser, const char *Name)
Read a float from the file.
char bparser_seek(bparser_parser_t *MParser, uint64_t Pos, uint8_t Mode)
Seek to a position in the file.
char bparser_fread(bparser_parser_t *MParser, const char *Filename)
Read file and parse according to saved rules.
#define BPARSER_UINT64
Enum value for an uint64 value.
Definition parser.h:85
void * bparser_set_calloc(bparser_parser_t *MParser, bparser_calloc_like_f Calloc)
Override the calloc function used internally by the parser.
void bparser_destroy_data(bparser_data_t *Array, size_t Length, bparser_free_like_f FreeCallback)
Unallocates a data (bparser_data_t) array.
#define BPARSER_CALLOC_ERROR
Error code for when calloc fails.
Definition parser.h:343
#define BPARSER_DOUBLE
Enum value for a double datatype.
Definition parser.h:181
void * bparser_set_malloc(bparser_parser_t *MParser, bparser_malloc_like_f Malloc)
Override the malloc function used internally by the parser.
void * bparser_read_order_deep_copy(const bparser_parser_t *MParser, bparser_read_t *Dest)
Deeply copies the RO array.
void *(* bparser_realloc_like_f)(void *ptr, size_t size)
Shortcut for a custom callback for a realloc-like function.
Definition parser.h:823
void *(* bparser_calloc_like_f)(size_t num, size_t size)
Shortcut for a custom callback for a calloc-like function.
Definition parser.h:805
char bparser_read_32_booleans(bparser_parser_t *MParser, const char *Name)
Read 32bits from the file and store each bit as boolean.
#define BPARSER_OVERRIDE_TRUE
When a read rule has a name that is already used by some other, override it.
Definition parser.h:686
char bparser_rewind(bparser_parser_t *MParser)
Seek to beginning of the file.
char bparser_read_double(bparser_parser_t *MParser, const char *Name)
Read a double from the file.
void bparser_destroy_read_order(bparser_read_t *Array, size_t Length, bparser_free_like_f FreeCallback)
Unallocates a read order (bparser_read_t) array.
#define BPARSER_ZERO_LENGTH
Error code for when an argument passed to a function is not of satisfactory length.
Definition parser.h:473
size_t bparser_get_read_order_count(const bparser_parser_t *MParser)
Get how many entries have been stored so far in the RO array.
#define BPARSER_PDC_RO_COPY_ERROR
Error code for when bparser_read_order_deep_copy fails from within bparser_parser_deep_copy.
Definition parser.h:445
char bparser_read_bytes(bparser_parser_t *MParser, const char *Name, size_t NBytes)
Read a specified amount of bytes from the file and store as a simple uint8 array.
char bparser_read_bool_and_run(bparser_parser_t *MParser, bparser_bool_handler_f HFunc, bparser_bool_f Func)
Read a single byte and run a function on it.
bparser_read_t * bparser_get_read_order_at(const bparser_parser_t *MParser, size_t Index)
Get an entry from RO array.
#define BPARSER_DEFAULT_ENDIAN
Use with bparser_read_integral, to use the currently set endianess of the parser.
Definition parser.h:565
#define BPARSER_NO_PARSER
Error code for when a function that changes or reads a parser instance, has no parser instance specif...
Definition parser.h:466
void * bparser_parser_move(bparser_parser_t *Src, bparser_parser_t *Dest)
Using memmove, moves a parser instance.
#define BPARSER_INT24
Enum value for an int24 value.
Definition parser.h:117
#define BPARSER_REALLOC_METHOD_PLUS
Tells the parser to calculate new size to realloc as: new_size = old_size + N.
Definition parser.h:572
char bparser_read_16_booleans(bparser_parser_t *MParser, const char *Name)
Read 16bits from the file and store each bit as boolean.
char bparser_read_integral(bparser_parser_t *MParser, const char *Name, uint8_t Type, uint8_t Endian)
Read an integral from the file.
#define BPARSER_BYTES_SEQ_F_ARGS
Shortcut for argument list of bparser_bytes_seq_f function. You can use it while making your own.
Definition parser.h:672
#define BPARSER_PDC_DATA_COPY_ERROR
Error code for when bparser_data_deep_copy fails from within bparser_parser_deep_copy.
Definition parser.h:495
#define BPARSER_UNICODE_FROM_UTF8_F_STR
Enum value for reading unicode codepoints from a fixed length UTF8 string.
Definition parser.h:205
#define BPARSER_OVERRIDE_ERROR
When a read rule has a name that is already used by some other, error out.
Definition parser.h:679
#define BPARSER_INT8
Enum value for an int8 value.
Definition parser.h:101
char bparser_parser_set_realloc_method(bparser_parser_t *MParser, double N, uint8_t ReallocMethod)
Set the realloc method.
#define BPARSER_BOOL_RUN
Enum value for reading a boolean and running a function if it's true.
Definition parser.h:237
#define BPARSER_UNICODE_FROM_UTF8_STR
Enum value for reading unicode codepoints from a null-terminated UTF8 string.
Definition parser.h:197
#define BPARSER_STR
Enum value for a string datatype.
Definition parser.h:149
#define BPARSER_SEEK_FORWARD
Enum value used to specify seeking forward.
Definition parser.h:255
#define BPARSER_SEEK_FROM_END_ERROR
Error code for when seeking from the end goes beyond the beginning of the file.
Definition parser.h:327
#define BPARSER_MALLOC_ERROR
Returned when malloc (or the user-defined function replacing malloc) fails.
Definition parser.h:296
#define BPARSER_FLOAT
Enum value for a float datatype.
Definition parser.h:173
#define BPARSER_BYTES_F_ARGS
Shortcut for argument list of bparser_bytes_f function. You can use it while making your own.
Definition parser.h:665
#define BPARSER_UNIX_TIME
Enum value for the unix timestamp.
Definition parser.h:189
#define BPARSER_INT128
Enum value for an int128 value.
Definition parser.h:141
#define BPARSER_INT64
Enum value for an int64 value.
Definition parser.h:133
#define BPARSER_NULL_DATA
Error code for when bparser_read's Data arg is null.
Definition parser.h:516
char bparser_read_128_booleans(bparser_parser_t *MParser, const char *Name)
Read 128bits from the file and store each bit as boolean.
void * bparser_get(const bparser_parser_t *MParser, const char *Name)
Get parsed data.
void(* bparser_bytes_f)(BPARSER_BYTES_F_ARGS)
Shortcut for the function to run as specified by bparser_read_bytes_and_run.
Definition parser.h:706
#define BPARSER_EOF_ERROR
Error code for when the parser reaches EOF.
Definition parser.h:335
A small struct that keeps track of the handler function and the actual function to run,...
Definition parser.h:745
Stores parsed data.
Definition parser.h:793
The parser.
Definition parser.h:832
Describes a read rule.
Definition parser.h:772
A small struct keeping track of the parsers position in the file.
Definition parser.h:756