|
|
@ -320,6 +320,7 @@ int sxtrdb_escan_va(sxtrdb_t *b, const char *fmt, int argc, va_list ap)
|
|
|
|
uint64_t *_u64;
|
|
|
|
uint64_t *_u64;
|
|
|
|
void **_dp;
|
|
|
|
void **_dp;
|
|
|
|
char **_cstr;
|
|
|
|
char **_cstr;
|
|
|
|
|
|
|
|
sxtrdb_t **_rdb;
|
|
|
|
} d;
|
|
|
|
} d;
|
|
|
|
const char *t, *last;
|
|
|
|
const char *t, *last;
|
|
|
|
uint32_t len, clen;
|
|
|
|
uint32_t len, clen;
|
|
|
@ -396,6 +397,50 @@ int sxtrdb_escan_va(sxtrdb_t *b, const char *fmt, int argc, va_list ap)
|
|
|
|
d._dp = NULL;
|
|
|
|
d._dp = NULL;
|
|
|
|
r = SXT_SUCCESS;
|
|
|
|
r = SXT_SUCCESS;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'P':
|
|
|
|
|
|
|
|
d._dp = va_arg(ap, void **);
|
|
|
|
|
|
|
|
*d._dp = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
len = sxtrdb_read_u32(b, &clen);
|
|
|
|
|
|
|
|
if(len != sizeof(uint32_t)) {
|
|
|
|
|
|
|
|
r = SXT_ERDBRD;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if((*d._dp = malloc(clen)) == NULL) {
|
|
|
|
|
|
|
|
r = SXT_ENOMEM;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
len = sxtrdb_read_raw(b, *d._dp, clen);
|
|
|
|
|
|
|
|
if(len != clen) {
|
|
|
|
|
|
|
|
free(*d._dp);
|
|
|
|
|
|
|
|
goto __errrbread;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
d._dp = NULL;
|
|
|
|
|
|
|
|
r = SXT_SUCCESS;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'R':
|
|
|
|
|
|
|
|
d._rdb = va_arg(ap, sxtrdb_t **);
|
|
|
|
|
|
|
|
*d._rdb = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
len = sxtrdb_read_u32(b, &clen);
|
|
|
|
|
|
|
|
if(len != sizeof(uint32_t)) {
|
|
|
|
|
|
|
|
r = SXT_ERDBRD;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/* allocate rdb and write to it */
|
|
|
|
|
|
|
|
if((*d._rdb = sxtrdb_new_palloc(clen)) == NULL) {
|
|
|
|
|
|
|
|
r = SXT_ENOMEM;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
} else sxtrdb_setflags(*d._rdb, SXTRDB_BURN);
|
|
|
|
|
|
|
|
len = sxtrdb_read_raw(b, sxtrdb_rdata(*d._rdb), clen);
|
|
|
|
|
|
|
|
if(len != clen) {
|
|
|
|
|
|
|
|
sxtrdb_free(*d._dp);
|
|
|
|
|
|
|
|
goto __errrbread;
|
|
|
|
|
|
|
|
} else sxtrdb_setlength(*d._rdb, clen);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
d._rdb = NULL;
|
|
|
|
|
|
|
|
r = SXT_SUCCESS;
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(r != SXT_SUCCESS) break;
|
|
|
|
if(r != SXT_SUCCESS) break;
|
|
|
@ -429,8 +474,13 @@ int sxtrdb_escan_va(sxtrdb_t *b, const char *fmt, int argc, va_list ap)
|
|
|
|
free(*d._cstr);
|
|
|
|
free(*d._cstr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'R':
|
|
|
|
|
|
|
|
d._rdb = va_arg(ap_copy, sxtrdb_t **);
|
|
|
|
|
|
|
|
if(*d._rdb) sxtrdb_free(*d._rdb);
|
|
|
|
|
|
|
|
break;
|
|
|
|
case 'p':
|
|
|
|
case 'p':
|
|
|
|
(void)va_arg(ap_copy, size_t);
|
|
|
|
(void)va_arg(ap_copy, size_t);
|
|
|
|
|
|
|
|
case 'P':
|
|
|
|
d._dp = va_arg(ap_copy, void **);
|
|
|
|
d._dp = va_arg(ap_copy, void **);
|
|
|
|
if(*d._dp) free(*d._dp);
|
|
|
|
if(*d._dp) free(*d._dp);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
@ -462,6 +512,7 @@ uint32_t sxtrdb_print_va(sxtrdb_t *b, const char *fmt, int argc, va_list ap)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
const char *t;
|
|
|
|
const char *t;
|
|
|
|
char *cstr;
|
|
|
|
char *cstr;
|
|
|
|
|
|
|
|
sxtrdb_t *rdb;
|
|
|
|
union {
|
|
|
|
union {
|
|
|
|
uint8_t _u8;
|
|
|
|
uint8_t _u8;
|
|
|
|
uint16_t _u16;
|
|
|
|
uint16_t _u16;
|
|
|
@ -509,6 +560,27 @@ uint32_t sxtrdb_print_va(sxtrdb_t *b, const char *fmt, int argc, va_list ap)
|
|
|
|
if(r != clen) return 0;
|
|
|
|
if(r != clen) return 0;
|
|
|
|
else len += clen;
|
|
|
|
else len += clen;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'R':
|
|
|
|
|
|
|
|
rdb = (sxtrdb_t *)va_arg(ap, sxtrdb_t *);
|
|
|
|
|
|
|
|
clen = sxtrdb_length(rdb);
|
|
|
|
|
|
|
|
r = sxtrdb_write_u32(b, (uint32_t)clen);
|
|
|
|
|
|
|
|
if(r != sizeof(uint32_t)) return 0;
|
|
|
|
|
|
|
|
else len += r;
|
|
|
|
|
|
|
|
r = sxtrdb_write_raw(b, sxtrdb_rdata(rdb), (uint32_t)clen);
|
|
|
|
|
|
|
|
if(r != clen) return 0;
|
|
|
|
|
|
|
|
else len += clen;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'P':
|
|
|
|
|
|
|
|
clen = va_arg(ap, size_t);
|
|
|
|
|
|
|
|
d._dp = va_arg(ap, void *);
|
|
|
|
|
|
|
|
count++;
|
|
|
|
|
|
|
|
r = sxtrdb_write_u32(b, (uint32_t)clen);
|
|
|
|
|
|
|
|
if(r != sizeof(uint32_t)) return 0;
|
|
|
|
|
|
|
|
else len += r;
|
|
|
|
|
|
|
|
r = sxtrdb_write_raw(b, d._dp, (uint32_t)clen);
|
|
|
|
|
|
|
|
if(r != clen) return 0;
|
|
|
|
|
|
|
|
else len += clen;
|
|
|
|
|
|
|
|
break;
|
|
|
|
case 'p':
|
|
|
|
case 'p':
|
|
|
|
clen = va_arg(ap, size_t);
|
|
|
|
clen = va_arg(ap, size_t);
|
|
|
|
d._dp = va_arg(ap, void *);
|
|
|
|
d._dp = va_arg(ap, void *);
|
|
|
@ -610,6 +682,16 @@ void sxtrdb_exflags(sxtrdb_t *b, int nf)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int sxtrdb_setlength(sxtrdb_t *b, uint32_t s)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!b) return SXT_EINVAL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(s > b->rlength) return SXT_EINVAL;
|
|
|
|
|
|
|
|
else b->ulength = s;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return SXT_SUCCESS;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* let the buffer to use actually used bytes, not all allocated space
|
|
|
|
/* let the buffer to use actually used bytes, not all allocated space
|
|
|
|
* will return SXT_SUCCESS on success (or in case if it doesn't required),
|
|
|
|
* will return SXT_SUCCESS on success (or in case if it doesn't required),
|
|
|
|
* SXT_ENOMEM or other error if fails
|
|
|
|
* SXT_ENOMEM or other error if fails
|
|
|
|