/************************************ asprintf.h ****************************************/
/* Sources:
https://stackoverflow.com/questions/40159892/using-asprintf-on-
https://stackoverflow.com/questions/4785381/replacement-for-ms-vscprintf-on-macos-linux
*/
#include <stdio.h> /* needed for vsnprintf */
#include <stdlib.h> /* needed for malloc-free */
#include <stdarg.h> /* needed for va_list */
#ifndef _vscprintf
/* For some reason, MSVC fails to honour this #ifndef. */
/* Hence the function was renamed to _vscprintf_so(). */
int _vscprintf_so(const char * format, va_list pargs) {
int retval;
va_list argcopy;
retval = vsnprintf(NULL, 0, format, argcopy);
return retval;
}
#endif // _vscprintf
#ifndef vasprintf
int vasprintf(char **strp, const char *fmt, va_list ap) {
int len = _vscprintf_so(fmt, ap);
if (len == -1) return -1;
char *str
= malloc((size_t) len
+ 1); if (!str) return -1;
int r = vsnprintf(str, len + 1, fmt, ap); /* "secure" version of vsprintf */
if (r
== -1) return free(str
), -1; *strp = str;
return r;
}
#endif // vasprintf
#ifndef asprintf
int asprintf(char *strp[], const char *fmt, ...) {
va_list ap;
int r = vasprintf(strp, fmt, ap);
return r;
}
#endif // asprintf
/************************************** main.c ******************************************/
#include <stdio.h> /* needed for puts */
#include <stdlib.h> /* needed for free */
// #include "asprintf.h" /* Commented out for online compilers. Uncomment in desktop compiler. */
int main(void) {
char *b;
asprintf(&b, "Mama %s is equal %d.", "John", 58);
puts(b
); /* Expected: "Mama John is equal 58." */ free(b
); /* Important! */ return 0;
}
LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBhc3ByaW50Zi5oICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBTb3VyY2VzOgogICAgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDAxNTk4OTIvdXNpbmctYXNwcmludGYtb24tIAogICAgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDc4NTM4MS9yZXBsYWNlbWVudC1mb3ItbXMtdnNjcHJpbnRmLW9uLW1hY29zLWxpbnV4CiovCgojaW5jbHVkZSA8c3RkaW8uaD4gLyogbmVlZGVkIGZvciB2c25wcmludGYgKi8KI2luY2x1ZGUgPHN0ZGxpYi5oPiAvKiBuZWVkZWQgZm9yIG1hbGxvYy1mcmVlICovCiNpbmNsdWRlIDxzdGRhcmcuaD4gLyogbmVlZGVkIGZvciB2YV9saXN0ICovCgojaWZuZGVmIF92c2NwcmludGYgCi8qIEZvciBzb21lIHJlYXNvbiwgTVNWQyBmYWlscyB0byBob25vdXIgdGhpcyAjaWZuZGVmLiAqLwovKiBIZW5jZSB0aGUgZnVuY3Rpb24gd2FzIHJlbmFtZWQgdG8gX3ZzY3ByaW50Zl9zbygpLiAqLwppbnQgX3ZzY3ByaW50Zl9zbyhjb25zdCBjaGFyICogZm9ybWF0LCB2YV9saXN0IHBhcmdzKSB7CiAgICBpbnQgcmV0dmFsOwogICAgdmFfbGlzdCBhcmdjb3B5OwogICAgdmFfY29weShhcmdjb3B5LCBwYXJncyk7CiAgICByZXR2YWwgPSB2c25wcmludGYoTlVMTCwgMCwgZm9ybWF0LCBhcmdjb3B5KTsKICAgIHZhX2VuZChhcmdjb3B5KTsKICAgIHJldHVybiByZXR2YWw7Cn0KI2VuZGlmIC8vIF92c2NwcmludGYKCiNpZm5kZWYgdmFzcHJpbnRmCmludCB2YXNwcmludGYoY2hhciAqKnN0cnAsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkgewogICAgaW50IGxlbiA9IF92c2NwcmludGZfc28oZm10LCBhcCk7CiAgICBpZiAobGVuID09IC0xKSByZXR1cm4gLTE7CiAgICBjaGFyICpzdHIgPSBtYWxsb2MoKHNpemVfdCkgbGVuICsgMSk7CiAgICBpZiAoIXN0cikgcmV0dXJuIC0xOwogICAgaW50IHIgPSB2c25wcmludGYoc3RyLCBsZW4gKyAxLCBmbXQsIGFwKTsgLyogInNlY3VyZSIgdmVyc2lvbiBvZiB2c3ByaW50ZiAqLwogICAgaWYgKHIgPT0gLTEpIHJldHVybiBmcmVlKHN0ciksIC0xOwogICAgKnN0cnAgPSBzdHI7CiAgICByZXR1cm4gcjsKfQojZW5kaWYgLy8gdmFzcHJpbnRmCgojaWZuZGVmIGFzcHJpbnRmCmludCBhc3ByaW50ZihjaGFyICpzdHJwW10sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7CiAgICB2YV9saXN0IGFwOwogICAgdmFfc3RhcnQoYXAsIGZtdCk7CiAgICBpbnQgciA9IHZhc3ByaW50ZihzdHJwLCBmbXQsIGFwKTsKICAgIHZhX2VuZChhcCk7CiAgICByZXR1cm4gcjsKfQojZW5kaWYgLy8gYXNwcmludGYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBtYWluLmMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+IC8qIG5lZWRlZCBmb3IgcHV0cyAqLwojaW5jbHVkZSA8c3RkbGliLmg+IC8qIG5lZWRlZCBmb3IgZnJlZSAqLwovLyAjaW5jbHVkZSAiYXNwcmludGYuaCIgLyogQ29tbWVudGVkIG91dCBmb3Igb25saW5lIGNvbXBpbGVycy4gVW5jb21tZW50IGluIGRlc2t0b3AgY29tcGlsZXIuICovCgppbnQgbWFpbih2b2lkKSB7CiAgICBjaGFyICpiOwogICAgYXNwcmludGYoJmIsICJNYW1hICVzIGlzIGVxdWFsICVkLiIsICJKb2huIiwgNTgpOwogICAgcHV0cyhiKTsgLyogRXhwZWN0ZWQ6ICJNYW1hIEpvaG4gaXMgZXF1YWwgNTguIiAqLwogICAgZnJlZShiKTsgLyogSW1wb3J0YW50ISAqLwogICAgcmV0dXJuIDA7Cn0=