| 870 | #if !HAVE_SNPRINTF |
| 871 | # include <stdarg.h> |
| 872 | ATTRIBUTE_FORMAT((printf, 3, 4)) static int |
| 873 | my_snprintf(char *s, size_t size, char const *format, ...) |
| 874 | { |
| 875 | int n; |
| 876 | va_list args; |
| 877 | char const *arg; |
| 878 | char *cp; |
| 879 | size_t arglen, slen; |
| 880 | char buf[1024]; |
| 881 | va_start(args, format); |
| 882 | if (strcmp(format, "%s") == 0) { |
| 883 | arg = va_arg(args, char const *); |
| 884 | arglen = strlen(arg); |
| 885 | } else { |
| 886 | n = vsprintf(buf, format, args); |
| 887 | if (n < 0) { |
| 888 | va_end(args); |
| 889 | return n; |
| 890 | } |
| 891 | arg = buf; |
| 892 | arglen = n; |
| 893 | } |
| 894 | slen = arglen < size ? arglen : size - 1; |
| 895 | cp = s; |
| 896 | cp = mempcpy(cp, arg, slen); |
| 897 | *cp = '\0'; |
| 898 | n = arglen <= INT_MAX ? arglen : -1; |
| 899 | va_end(args); |
| 900 | return n; |
| 901 | } |
| 902 | # define snprintf my_snprintf |
| 903 | #endif |
| 904 | |