[FL-2870] Printf function attributes (#1841)

* Furi strings: printf attribute
* Logs: printf attribute
* Plugins: adapt
* Plugins: accommodate
* Unit tests: accommodate

Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
Sergey Gavrilov
2022-10-07 23:35:15 +10:00
committed by GitHub
parent 1f742b611a
commit 4000f0cac5
78 changed files with 187 additions and 156 deletions
+1 -1
View File
@@ -338,7 +338,7 @@ static int32_t lfrfid_raw_emulate_worker_thread(void* thread_context) {
}
if(data->ctx.overrun_count) {
FURI_LOG_E(TAG_EMULATE, "overruns: %lu", data->ctx.overrun_count);
FURI_LOG_E(TAG_EMULATE, "overruns: %u", data->ctx.overrun_count);
}
furi_stream_buffer_free(data->ctx.stream);
+1 -1
View File
@@ -276,7 +276,7 @@ void protocol_gallagher_render_data(ProtocolGallagher* protocol, FuriString* res
uint32_t card_id = bit_lib_get_bits_32(protocol->data, 32, 32);
furi_string_cat_printf(result, "Region: %u, Issue Level: %u\r\n", rc, il);
furi_string_cat_printf(result, "FC: %u, C: %lu\r\n", fc, card_id);
furi_string_cat_printf(result, "FC: %lu, C: %lu\r\n", fc, card_id);
};
const ProtocolBase protocol_gallagher = {
+1 -1
View File
@@ -218,7 +218,7 @@ void protocol_keri_render_data(ProtocolKeri* protocol, FuriString* result) {
uint32_t fc = 0;
uint32_t cn = 0;
protocol_keri_descramble(&fc, &cn, &data);
furi_string_printf(result, "Internal ID: %u\r\nFC: %u, Card: %u\r\n", internal_id, fc, cn);
furi_string_printf(result, "Internal ID: %lu\r\nFC: %lu, Card: %lu\r\n", internal_id, fc, cn);
}
bool protocol_keri_write_data(ProtocolKeri* protocol, void* data) {
+1 -1
View File
@@ -142,7 +142,7 @@ void protocol_paradox_render_data(ProtocolParadox* protocol, FuriString* result)
uint16_t card_id = bit_lib_get_bits_16(decoded_data, 18, 16);
furi_string_cat_printf(result, "Facility: %u\r\n", fc);
furi_string_cat_printf(result, "Card: %lu\r\n", card_id);
furi_string_cat_printf(result, "Card: %u\r\n", card_id);
furi_string_cat_printf(result, "Data: ");
for(size_t i = 0; i < PARADOX_DECODED_DATA_SIZE; i++) {
furi_string_cat_printf(result, "%02X", decoded_data[i]);
+1 -1
View File
@@ -243,7 +243,7 @@ void protocol_pyramid_render_data(ProtocolPyramid* protocol, FuriString* result)
uint8_t* decoded_data = protocol->data;
uint8_t format_length = decoded_data[0];
furi_string_cat_printf(result, "Format: 26\r\n", format_length);
furi_string_cat_printf(result, "Format: %d\r\n", format_length);
if(format_length == 26) {
uint8_t facility;
bit_lib_copy_bits(&facility, 0, 8, decoded_data, 8);
+1 -1
View File
@@ -87,7 +87,7 @@ MfClassicDict* mf_classic_dict_alloc(MfClassicDictType dict_type) {
stream_rewind(dict->stream);
dict_loaded = true;
FURI_LOG_I(TAG, "Loaded dictionary with %d keys", dict->total_keys);
FURI_LOG_I(TAG, "Loaded dictionary with %ld keys", dict->total_keys);
} while(false);
if(!dict_loaded) {
+1 -1
View File
@@ -92,7 +92,7 @@ void mfkey32_set_callback(Mfkey32* instance, Mfkey32ParseDataCallback callback,
static bool mfkey32_write_params(Mfkey32* instance, Mfkey32Params* params) {
FuriString* str = furi_string_alloc_printf(
"Sec %d key %c cuid %08x nt0 %08x nr0 %08x ar0 %08x nt1 %08x nr1 %08x ar1 %08x\n",
"Sec %d key %c cuid %08lx nt0 %08lx nr0 %08lx ar0 %08lx nt1 %08lx nr1 %08lx ar1 %08lx\n",
params->sector,
params->key == MfClassicKeyA ? 'A' : 'B',
params->cuid,
+2 -1
View File
@@ -522,7 +522,8 @@ void nfc_worker_mf_classic_dict_attack(NfcWorker* nfc_worker) {
return;
}
FURI_LOG_D(TAG, "Start Dictionary attack, Key Count %d", mf_classic_dict_get_total_keys(dict));
FURI_LOG_D(
TAG, "Start Dictionary attack, Key Count %ld", mf_classic_dict_get_total_keys(dict));
for(size_t i = 0; i < total_sectors; i++) {
FURI_LOG_I(TAG, "Sector %d", i);
nfc_worker->callback(NfcWorkerEventNewSector, nfc_worker->context);
+1 -1
View File
@@ -108,6 +108,6 @@ bool all_in_one_parser_parse(NfcDeviceData* dev_data) {
// Format string for rides count
furi_string_printf(
dev_data->parsed_data, "\e#All-In-One\nNumber: %u\nRides left: %u", serial, ride_count);
dev_data->parsed_data, "\e#All-In-One\nNumber: %lu\nRides left: %u", serial, ride_count);
return true;
}
+1 -1
View File
@@ -132,7 +132,7 @@ bool plantain_4k_parser_parse(NfcDeviceData* dev_data) {
furi_string_printf(
dev_data->parsed_data,
"\e#Plantain\nN:%s\nBalance:%d\n",
"\e#Plantain\nN:%s\nBalance:%ld\n",
furi_string_get_cstr(card_number_str),
balance);
furi_string_free(card_number_str);
+1 -1
View File
@@ -105,7 +105,7 @@ bool plantain_parser_parse(NfcDeviceData* dev_data) {
furi_string_printf(
dev_data->parsed_data,
"\e#Plantain\nN:%s\nBalance:%d\n",
"\e#Plantain\nN:%s\nBalance:%ld\n",
furi_string_get_cstr(card_number_str),
balance);
furi_string_free(card_number_str);
+1 -1
View File
@@ -149,7 +149,7 @@ bool two_cities_parser_parse(NfcDeviceData* dev_data) {
furi_string_printf(
dev_data->parsed_data,
"\e#Troika+Plantain\nPN: %s\nPB: %d rur.\nTN: %d\nTB: %d rur.\n",
"\e#Troika+Plantain\nPN: %s\nPB: %ld rur.\nTN: %ld\nTB: %d rur.\n",
furi_string_get_cstr(card_number_str),
balance,
troika_number,
+2 -2
View File
@@ -847,7 +847,7 @@ bool mf_classic_emulator(MfClassicEmulator* emulator, FuriHalNfcTxRxContext* tx_
FURI_LOG_D(
TAG,
"%08x key%c block %d nt/nr/ar: %08x %08x %08x",
"%08lx key%c block %d nt/nr/ar: %08lx %08lx %08lx",
emulator->cuid,
access_key == MfClassicKeyA ? 'A' : 'B',
sector_trailer_block,
@@ -858,7 +858,7 @@ bool mf_classic_emulator(MfClassicEmulator* emulator, FuriHalNfcTxRxContext* tx_
crypto1_word(&emulator->crypto, nr, 1);
uint32_t cardRr = ar ^ crypto1_word(&emulator->crypto, 0, 0);
if(cardRr != prng_successor(nonce, 64)) {
FURI_LOG_T(TAG, "Wrong AUTH! %08X != %08X", cardRr, prng_successor(nonce, 64));
FURI_LOG_T(TAG, "Wrong AUTH! %08lX != %08lX", cardRr, prng_successor(nonce, 64));
// Don't send NACK, as the tag doesn't send it
command_processed = true;
break;
+4 -4
View File
@@ -108,7 +108,7 @@ void mf_df_cat_version(MifareDesfireVersion* version, FuriString* out) {
}
void mf_df_cat_free_mem(MifareDesfireFreeMemory* free_mem, FuriString* out) {
furi_string_cat_printf(out, "freeMem %d\n", free_mem->bytes);
furi_string_cat_printf(out, "freeMem %ld\n", free_mem->bytes);
}
void mf_df_cat_key_settings(MifareDesfireKeySettings* ks, FuriString* out) {
@@ -191,10 +191,10 @@ void mf_df_cat_file(MifareDesfireFile* file, FuriString* out) {
case MifareDesfireFileTypeValue:
size = 4;
furi_string_cat_printf(
out, "lo %d hi %d\n", file->settings.value.lo_limit, file->settings.value.hi_limit);
out, "lo %ld hi %ld\n", file->settings.value.lo_limit, file->settings.value.hi_limit);
furi_string_cat_printf(
out,
"limit %d enabled %d\n",
"limit %ld enabled %d\n",
file->settings.value.limited_credit_value,
file->settings.value.limited_credit_enabled);
break;
@@ -203,7 +203,7 @@ void mf_df_cat_file(MifareDesfireFile* file, FuriString* out) {
size = file->settings.record.size;
num = file->settings.record.cur;
furi_string_cat_printf(out, "size %d\n", size);
furi_string_cat_printf(out, "num %d max %d\n", num, file->settings.record.max);
furi_string_cat_printf(out, "num %d max %ld\n", num, file->settings.record.max);
break;
}
uint8_t* data = file->contents;
+2 -2
View File
@@ -193,7 +193,7 @@ bool mf_ultralight_authenticate(FuriHalNfcTxRxContext* tx_rx, uint32_t key, uint
*pack = (tx_rx->rx_data[1] << 8) | tx_rx->rx_data[0];
}
FURI_LOG_I(TAG, "Auth success. Password: %08X. PACK: %04X", key, *pack);
FURI_LOG_I(TAG, "Auth success. Password: %08lX. PACK: %04X", key, *pack);
authenticated = true;
} while(false);
@@ -1050,7 +1050,7 @@ static void mf_ul_make_ascii_mirror(MfUltralightEmulator* emulator, FuriString*
if(mirror_conf == MfUltralightMirrorUidCounter)
furi_string_cat(str, uid_printed ? "x" : " ");
furi_string_cat_printf(str, "%06X", emulator->data.counter[2]);
furi_string_cat_printf(str, "%06lX", emulator->data.counter[2]);
}
}
}
+7 -4
View File
@@ -34,6 +34,7 @@
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
@@ -54,7 +55,7 @@ void _putchar(char character);
* \param format A string that specifies the format of the output
* \return The number of characters that are written into the array, not counting the terminating null character
*/
int printf_(const char* format, ...);
int printf_(const char* format, ...) _ATTRIBUTE((__format__(__printf__, 1, 2)));
/**
* Tiny sprintf implementation
@@ -63,7 +64,7 @@ int printf_(const char* format, ...);
* \param format A string that specifies the format of the output
* \return The number of characters that are WRITTEN into the buffer, not counting the terminating null character
*/
int sprintf_(char* buffer, const char* format, ...);
int sprintf_(char* buffer, const char* format, ...) _ATTRIBUTE((__format__(__printf__, 2, 3)));
/**
* Tiny snprintf/vsnprintf implementation
@@ -75,7 +76,8 @@ int sprintf_(char* buffer, const char* format, ...);
* null character. A value equal or larger than count indicates truncation. Only when the returned value
* is non-negative and less than count, the string has been completely written.
*/
int snprintf_(char* buffer, size_t count, const char* format, ...);
int snprintf_(char* buffer, size_t count, const char* format, ...)
_ATTRIBUTE((__format__(__printf__, 3, 4)));
int vsnprintf_(char* buffer, size_t count, const char* format, va_list va);
/**
@@ -94,7 +96,8 @@ int vprintf_(const char* format, va_list va);
* \param format A string that specifies the format of the output
* \return The number of characters that are sent to the output function, not counting the terminating null character
*/
int fctprintf(void (*out)(char character, void* arg), void* arg, const char* format, ...);
int fctprintf(void (*out)(char character, void* arg), void* arg, const char* format, ...)
_ATTRIBUTE((__format__(__printf__, 3, 4)));
#ifdef __cplusplus
}
+1 -1
View File
@@ -338,7 +338,7 @@ void subghz_protocol_decoder_came_atomo_get_string(void* context, FuriString* ou
"%s %db\r\n"
"Key:0x%lX%08lX\r\n"
"Sn:0x%08lX Btn:0x%01X\r\n"
"Cnt:0x%03X\r\n",
"Cnt:0x%03lX\r\n",
instance->generic.protocol_name,
instance->generic.data_count_bit,
+1 -1
View File
@@ -457,7 +457,7 @@ void subghz_protocol_decoder_came_twee_get_string(void* context, FuriString* out
output,
"%s %db\r\n"
"Key:0x%lX%08lX\r\n"
"Btn:%lX\r\n"
"Btn:%X\r\n"
"DIP:" DIP_PATTERN "\r\n",
instance->generic.protocol_name,
instance->generic.data_count_bit,
+1 -1
View File
@@ -345,7 +345,7 @@ void subghz_protocol_decoder_doitrand_get_string(void* context, FuriString* outp
output,
"%s %dbit\r\n"
"Key:%02lX%08lX\r\n"
"Btn:%lX\r\n"
"Btn:%X\r\n"
"DIP:" DIP_PATTERN "\r\n",
instance->generic.protocol_name,
instance->generic.data_count_bit,
+1 -1
View File
@@ -222,7 +222,7 @@ void subghz_protocol_decoder_faac_slh_get_string(void* context, FuriString* outp
"Key:%lX%08lX\r\n"
"Fix:%08lX \r\n"
"Hop:%08lX \r\n"
"Sn:%07lX Btn:%lX\r\n",
"Sn:%07lX Btn:%X\r\n",
instance->generic.protocol_name,
instance->generic.data_count_bit,
(uint32_t)(instance->generic.data >> 32),
+1 -1
View File
@@ -325,7 +325,7 @@ void subghz_protocol_decoder_gate_tx_get_string(void* context, FuriString* outpu
output,
"%s %dbit\r\n"
"Key:%06lX\r\n"
"Sn:%05lX Btn:%lX\r\n",
"Sn:%05lX Btn:%X\r\n",
instance->generic.protocol_name,
instance->generic.data_count_bit,
(uint32_t)(instance->generic.data & 0xFFFFFF),
+1 -1
View File
@@ -385,7 +385,7 @@ void subghz_protocol_decoder_honeywell_wdb_get_string(void* context, FuriString*
"Key:0x%lX%08lX\r\n"
"Sn:0x%05lX\r\n"
"DT:%s Al:%s\r\n"
"SK:%01lX R:%01lX LBat:%01lX\r\n",
"SK:%01X R:%01X LBat:%01X\r\n",
instance->generic.protocol_name,
instance->generic.data_count_bit,
(uint32_t)((instance->generic.data >> 32) & 0xFFFFFFFF),
+1 -1
View File
@@ -221,7 +221,7 @@ void subghz_protocol_decoder_ido_get_string(void* context, FuriString* output) {
"Key:0x%lX%08lX\r\n"
"Fix:%06lX \r\n"
"Hop:%06lX \r\n"
"Sn:%05lX Btn:%lX\r\n",
"Sn:%05lX Btn:%X\r\n",
instance->generic.protocol_name,
instance->generic.data_count_bit,
(uint32_t)(instance->generic.data >> 32),
+2 -2
View File
@@ -700,8 +700,8 @@ void subghz_protocol_decoder_keeloq_get_string(void* context, FuriString* output
output,
"%s %dbit\r\n"
"Key:%08lX%08lX\r\n"
"Fix:0x%08lX Cnt:%04X\r\n"
"Hop:0x%08lX Btn:%01lX\r\n"
"Fix:0x%08lX Cnt:%04lX\r\n"
"Hop:0x%08lX Btn:%01X\r\n"
"MF:%s\r\n"
"Sn:0x%07lX \r\n",
instance->generic.protocol_name,
+1 -1
View File
@@ -268,7 +268,7 @@ void subghz_protocol_decoder_kia_get_string(void* context, FuriString* output) {
output,
"%s %dbit\r\n"
"Key:%08lX%08lX\r\n"
"Sn:%07lX Btn:%lX Cnt:%04X\r\n",
"Sn:%07lX Btn:%X Cnt:%04lX\r\n",
instance->generic.protocol_name,
instance->generic.data_count_bit,
code_found_hi,
+1 -1
View File
@@ -432,7 +432,7 @@ void subghz_protocol_decoder_magellen_get_string(void* context, FuriString* outp
output,
"%s %dbit\r\n"
"Key:0x%08lX\r\n"
"Sn:%03d%03d, Event:0x%02X\r\n"
"Sn:%03ld%03ld, Event:0x%02X\r\n"
"Stat:",
instance->generic.protocol_name,
instance->generic.data_count_bit,
+1 -1
View File
@@ -383,7 +383,7 @@ void subghz_protocol_decoder_marantec_get_string(void* context, FuriString* outp
"%s %db\r\n"
"Key:0x%lX%08lX\r\n"
"Sn:0x%07lX \r\n"
"Btn:%lX\r\n",
"Btn:%X\r\n",
instance->generic.protocol_name,
instance->generic.data_count_bit,
(uint32_t)(instance->generic.data >> 32),
+2 -2
View File
@@ -417,8 +417,8 @@ void subghz_protocol_decoder_megacode_get_string(void* context, FuriString* outp
output,
"%s %dbit\r\n"
"Key:0x%06lX\r\n"
"Sn:0x%04lX - %d\r\n"
"Facility:%X Btn:%X\r\n",
"Sn:0x%04lX - %ld\r\n"
"Facility:%lX Btn:%X\r\n",
instance->generic.protocol_name,
instance->generic.data_count_bit,
(uint32_t)instance->generic.data,
+1 -1
View File
@@ -368,7 +368,7 @@ void subghz_protocol_decoder_nice_flor_s_get_string(void* context, FuriString* o
"%s %dbit\r\n"
"Key:0x%lX%08lX\r\n"
"Sn:%05lX\r\n"
"Cnt:%04X Btn:%02lX\r\n",
"Cnt:%04lX Btn:%02X\r\n",
instance->generic.protocol_name,
instance->generic.data_count_bit,
code_found_hi,
+2 -2
View File
@@ -253,7 +253,7 @@ static void
val = ((var_data >> 4) & 0xF) * 10 + ((var_data >> 8) & 0xF);
furi_string_cat_printf(
output,
"Temp: %s%d.%d C\r\n",
"Temp: %s%ld.%ld C\r\n",
(var_data & 0xF) ? "-" : "+",
val,
(uint32_t)(var_data >> 12) & 0xF);
@@ -286,7 +286,7 @@ void subghz_protocol_decoder_oregon2_get_string(void* context, FuriString* outpu
furi_string_cat_printf(
output,
"%s\r\n"
"ID: 0x%04lX, ch: %d%s, rc: 0x%02lX\r\n",
"ID: 0x%04lX, ch: %ld%s, rc: 0x%02lX\r\n",
instance->generic.protocol_name,
(uint32_t)sensor_id,
(uint32_t)(instance->generic.data >> 12) & 0xF,
+1 -1
View File
@@ -329,7 +329,7 @@ void subghz_protocol_decoder_phoenix_v2_get_string(void* context, FuriString* ou
"%s %dbit\r\n"
"Key:%02lX%08lX\r\n"
"Sn:0x%07lX \r\n"
"Btn:%lX\r\n",
"Btn:%X\r\n",
instance->generic.protocol_name,
instance->generic.data_count_bit,
(uint32_t)(instance->generic.data >> 32) & 0xFFFFFFFF,
+1 -1
View File
@@ -364,7 +364,7 @@ void subghz_protocol_decoder_princeton_get_string(void* context, FuriString* out
"Key:0x%08lX\r\n"
"Yek:0x%08lX\r\n"
"Sn:0x%05lX Btn:%01X\r\n"
"Te:%dus\r\n",
"Te:%ldus\r\n",
instance->generic.protocol_name,
instance->generic.data_count_bit,
(uint32_t)(instance->generic.data & 0xFFFFFF),
+1 -1
View File
@@ -94,7 +94,7 @@ void subghz_encoder_princeton_for_testing_print_log(void* context) {
((float)instance->time_high / (instance->time_high + instance->time_low)) * 100;
FURI_LOG_I(
TAG "Encoder",
"Radio tx_time=%dus ON=%dus, OFF=%dus, DutyCycle=%d,%d%%",
"Radio tx_time=%ldus ON=%ldus, OFF=%ldus, DutyCycle=%ld,%ld%%",
instance->time_high + instance->time_low,
instance->time_high,
instance->time_low,
+1 -1
View File
@@ -115,7 +115,7 @@ bool subghz_protocol_raw_save_to_file_init(
// Open file
if(!flipper_format_file_open_always(
instance->flipper_file, furi_string_get_cstr(temp_str))) {
FURI_LOG_E(TAG, "Unable to open file for write: %s", temp_str);
FURI_LOG_E(TAG, "Unable to open file for write: %s", furi_string_get_cstr(temp_str));
break;
}
+1 -1
View File
@@ -274,7 +274,7 @@ void subghz_protocol_decoder_scher_khan_get_string(void* context, FuriString* ou
output,
"%s %dbit\r\n"
"Key:0x%lX%08lX\r\n"
"Sn:%07lX Btn:%lX Cnt:%04X\r\n"
"Sn:%07lX Btn:%X Cnt:%04lX\r\n"
"Pt: %s\r\n",
instance->generic.protocol_name,
instance->generic.data_count_bit,
+2 -2
View File
@@ -606,7 +606,7 @@ void subghz_protocol_decoder_secplus_v1_get_string(void* context, FuriString* ou
furi_string_cat_printf(
output,
"Sn:0x%08lX\r\n"
"Cnt:0x%03X\r\n"
"Cnt:0x%03lX\r\n"
"Sw_id:0x%X\r\n",
instance->generic.serial,
instance->generic.cnt,
@@ -625,7 +625,7 @@ void subghz_protocol_decoder_secplus_v1_get_string(void* context, FuriString* ou
furi_string_cat_printf(
output,
"Sn:0x%08lX\r\n"
"Cnt:0x%03X\r\n"
"Cnt:0x%03lX\r\n"
"Sw_id:0x%X\r\n",
instance->generic.serial,
instance->generic.cnt,
+1 -1
View File
@@ -821,7 +821,7 @@ void subghz_protocol_decoder_secplus_v2_get_string(void* context, FuriString* ou
"Pk1:0x%lX%08lX\r\n"
"Pk2:0x%lX%08lX\r\n"
"Sn:0x%08lX Btn:0x%01X\r\n"
"Cnt:0x%03X\r\n",
"Cnt:0x%03lX\r\n",
instance->generic.protocol_name,
instance->generic.data_count_bit,
+1 -1
View File
@@ -437,7 +437,7 @@ void subghz_protocol_decoder_somfy_keytis_get_string(void* context, FuriString*
"%s %db\r\n"
"%lX%08lX%06lX\r\n"
"Sn:0x%06lX \r\n"
"Cnt:0x%04X\r\n"
"Cnt:0x%04lX\r\n"
"Btn:%s\r\n",
instance->generic.protocol_name,
+1 -1
View File
@@ -374,7 +374,7 @@ void subghz_protocol_decoder_somfy_telis_get_string(void* context, FuriString* o
"%s %db\r\n"
"Key:0x%lX%08lX\r\n"
"Sn:0x%06lX \r\n"
"Cnt:0x%04X\r\n"
"Cnt:0x%04lX\r\n"
"Btn:%s\r\n",
instance->generic.protocol_name,
+2 -2
View File
@@ -373,8 +373,8 @@ void subghz_protocol_decoder_star_line_get_string(void* context, FuriString* out
output,
"%s %dbit\r\n"
"Key:%08lX%08lX\r\n"
"Fix:0x%08lX Cnt:%04X\r\n"
"Hop:0x%08lX Btn:%02lX\r\n"
"Fix:0x%08lX Cnt:%04lX\r\n"
"Hop:0x%08lX Btn:%02X\r\n"
"MF:%s\r\n"
"Sn:0x%07lX \r\n",
instance->generic.protocol_name,
+6 -3
View File
@@ -143,7 +143,8 @@ size_t stream_write_cstring(Stream* stream, const char* string);
* @param ...
* @return size_t how many bytes was written
*/
size_t stream_write_format(Stream* stream, const char* format, ...);
size_t stream_write_format(Stream* stream, const char* format, ...)
_ATTRIBUTE((__format__(__printf__, 2, 3)));
/**
* Write formatted string to the stream, va_list version
@@ -200,7 +201,8 @@ bool stream_insert_cstring(Stream* stream, const char* string);
* @return true if the operation was successful
* @return false on error
*/
bool stream_insert_format(Stream* stream, const char* format, ...);
bool stream_insert_format(Stream* stream, const char* format, ...)
_ATTRIBUTE((__format__(__printf__, 2, 3)));
/**
* Insert formatted string to the stream, va_list version
@@ -251,7 +253,8 @@ bool stream_delete_and_insert_cstring(Stream* stream, size_t delete_size, const
* @return true if the operation was successful
* @return false on error
*/
bool stream_delete_and_insert_format(Stream* stream, size_t delete_size, const char* format, ...);
bool stream_delete_and_insert_format(Stream* stream, size_t delete_size, const char* format, ...)
_ATTRIBUTE((__format__(__printf__, 3, 4)));
/**
* Delete N chars from the stream and insert formatted string to the stream, va_list version