21 #if defined(__clang_analyzer__)
22 #define SDL_DISABLE_ANALYZE_MACROS 1
25 #include "../SDL_internal.h"
31 #if !defined(HAVE_VSSCANF) || !defined(HAVE_STRTOL) || !defined(HAVE_STRTOUL) || !defined(HAVE_STRTOLL) || !defined(HAVE_STRTOULL) || !defined(HAVE_STRTOD)
32 #define SDL_isupperhex(X) (((X) >= 'A') && ((X) <= 'F'))
33 #define SDL_islowerhex(X) (((X) >= 'a') && ((X) <= 'f'))
36 #define UTF8_IsLeadByte(c) ((c) >= 0xC0 && (c) <= 0xF4)
37 #define UTF8_IsTrailingByte(c) ((c) >= 0x80 && (c) <= 0xBF)
41 if (c >= 0xC0 && c <= 0xDF)
43 else if (c >= 0xE0 && c <= 0xEF)
45 else if (c >= 0xF0 && c <= 0xF4)
51 #if !defined(HAVE_VSSCANF) || !defined(HAVE_STRTOL)
55 const char *textstart =
text;
63 if (radix == 16 &&
SDL_strncmp(text,
"0x", 2) == 0) {
71 v = 10 + (*text -
'A');
73 v = 10 + (*text -
'a');
81 if (valuep && text > textstart) {
82 if (negative && value) {
88 return (text - textstart);
92 #if !defined(HAVE_VSSCANF) || !defined(HAVE_STRTOUL) || !defined(HAVE_STRTOD)
96 const char *textstart =
text;
97 unsigned long value = 0;
99 if (radix == 16 &&
SDL_strncmp(text,
"0x", 2) == 0) {
107 v = 10 + (*text -
'A');
109 v = 10 + (*text -
'a');
117 if (valuep && text > textstart) {
120 return (text - textstart);
128 const char *textstart =
text;
131 if (radix == 16 &&
SDL_strncmp(text,
"0x", 2) == 0) {
139 v = 10 + (*text -
'A');
141 v = 10 + (*text -
'a');
149 if (valuep && text > textstart) {
152 return (text - textstart);
156 #if !defined(HAVE_VSSCANF) || !defined(HAVE_STRTOLL)
160 const char *textstart =
text;
168 if (radix == 16 &&
SDL_strncmp(text,
"0x", 2) == 0) {
176 v = 10 + (*text -
'A');
178 v = 10 + (*text -
'a');
186 if (valuep && text > textstart) {
187 if (negative && value) {
193 return (text - textstart);
197 #if !defined(HAVE_VSSCANF) || !defined(HAVE_STRTOULL)
201 const char *textstart =
text;
204 if (radix == 16 &&
SDL_strncmp(text,
"0x", 2) == 0) {
212 v = 10 + (*text -
'A');
214 v = 10 + (*text -
'a');
222 if (valuep && text > textstart) {
225 return (text - textstart);
229 #if !defined(HAVE_VSSCANF) || !defined(HAVE_STRTOD)
233 const char *textstart =
text;
234 unsigned long lvalue = 0;
248 lvalue = *text -
'0';
249 value += (double) lvalue / mult;
254 if (valuep && text > textstart) {
255 if (negative && value) {
261 return (text - textstart);
268 #if defined(HAVE_MEMSET)
269 return memset(dst, c, len);
284 while ((intptr_t)dstp1 & 0x3) {
292 value4 = (c | (c << 8) | (c << 16) | (c << 24));
300 dstp1 = (
Uint8 *) dstp4;
321 return __builtin_memcpy(dst, src, len);
322 #elif defined(HAVE_MEMCPY)
323 return memcpy(dst, src, len);
324 #elif defined(HAVE_BCOPY)
325 bcopy(src, dst, len);
332 if (((intptr_t)src & 0x3) || ((intptr_t)dst & 0x3)) {
341 size_t left = (len % 4);
343 Uint8 *srcp1, *dstp1;
352 srcp1 = (
Uint8 *) srcp4;
353 dstp1 = (
Uint8 *) dstp4;
370 #if defined(HAVE_MEMMOVE)
373 char *srcp = (
char *) src;
374 char *dstp = (
char *) dst;
394 #if defined(HAVE_MEMCMP)
395 return memcmp(s1, s2, len);
397 char *s1p = (
char *) s1;
398 char *s2p = (
char *) s2;
401 return (*s1p - *s2p);
413 #if defined(HAVE_STRLEN)
414 return strlen(
string);
438 #if defined(HAVE_WCSLEN)
439 return wcslen(
string);
452 #if defined(HAVE_WCSLCPY)
453 return wcslcpy(dst, src, maxlen);
468 #if defined(HAVE_WCSLCAT)
469 return wcslcat(dst, src, maxlen);
473 if (dstlen < maxlen) {
476 return dstlen + srclen;
483 #if defined(HAVE_WCSCMP)
484 return wcscmp(str1, str2);
486 while (*str1 && *str2) {
492 return (
int)(*str1 - *str2);
499 #if defined(HAVE_STRLCPY)
500 return strlcpy(dst, src, maxlen);
516 size_t bytes =
SDL_min(src_bytes, dst_bytes - 1);
518 char trailing_bytes = 0;
521 unsigned char c = (
unsigned char)src[bytes - 1];
526 for (i = bytes - 1; i != 0; --
i)
528 c = (
unsigned char)src[i];
532 if (bytes - i != trailing_bytes + 1)
552 while ((ch = *(p++))) {
554 if ((ch & 0xc0) != 0x80) {
565 #if defined(HAVE_STRLCAT)
566 return strlcat(dst, src, maxlen);
570 if (dstlen < maxlen) {
573 return dstlen + srclen;
591 #if defined(HAVE__STRREV)
592 return _strrev(
string);
595 char *
a = &
string[0];
596 char *
b = &
string[len - 1];
610 #if defined(HAVE__STRUPR)
611 return _strupr(
string);
625 #if defined(HAVE__STRLWR)
626 return _strlwr(
string);
642 #elif defined(HAVE_INDEX)
660 #elif defined(HAVE_RINDEX)
663 const char *bufp =
string +
SDL_strlen(
string) - 1;
664 while (bufp >=
string) {
666 return (
char *) bufp;
677 #if defined(HAVE_STRSTR)
683 return (
char *) haystack;
691 #if !defined(HAVE__LTOA) || !defined(HAVE__I64TOA) || \
692 !defined(HAVE__ULTOA) || !defined(HAVE__UI64TOA)
694 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
695 'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
696 'K',
'L',
'M',
'N',
'O',
'P',
'Q',
'R',
'S',
'T',
697 'U',
'V',
'W',
'X',
'Y',
'Z'
705 return itoa(value,
string, radix);
707 return SDL_ltoa((
long)value,
string, radix);
715 return _uitoa(value,
string, radix);
717 return SDL_ultoa((
unsigned long)value,
string, radix);
724 #if defined(HAVE__LTOA)
725 return _ltoa(value,
string, radix);
743 #if defined(HAVE__ULTOA)
744 return _ultoa(value,
string, radix);
750 *bufp++ = ntoa_table[value % radix];
768 #if defined(HAVE__I64TOA)
769 return _i64toa(value,
string, radix);
787 #if defined(HAVE__UI64TOA)
788 return _ui64toa(value,
string, radix);
794 *bufp++ = ntoa_table[value % radix];
821 return (
double) atof(
string);
830 #if defined(HAVE_STRTOL)
831 return strtol(
string, endp, base);
846 *endp = (
char *)
string + len;
855 #if defined(HAVE_STRTOUL)
856 return strtoul(
string, endp, base);
859 unsigned long value = 0;
871 *endp = (
char *)
string + len;
880 #if defined(HAVE_STRTOLL)
881 return strtoll(
string, endp, base);
896 *endp = (
char *)
string + len;
905 #if defined(HAVE_STRTOULL)
906 return strtoull(
string, endp, base);
921 *endp = (
char *)
string + len;
930 #if defined(HAVE_STRTOD)
931 return strtod(
string, endp);
938 *endp = (
char *)
string + len;
947 #if defined(HAVE_STRCMP)
948 return strcmp(str1, str2);
950 while (*str1 && *str2) {
956 return (
int)((
unsigned char) *str1 - (
unsigned char) *str2);
963 #if defined(HAVE_STRNCMP)
964 return strncmp(str1, str2, maxlen);
966 while (*str1 && *str2 && maxlen) {
976 return (
int) ((
unsigned char) *str1 - (
unsigned char) *str2);
983 #ifdef HAVE_STRCASECMP
984 return strcasecmp(str1, str2);
985 #elif defined(HAVE__STRICMP)
986 return _stricmp(str1, str2);
990 while (*str1 && *str2) {
1000 return (
int) ((
unsigned char) a - (
unsigned char)
b);
1007 #ifdef HAVE_STRNCASECMP
1008 return strncasecmp(str1, str2, maxlen);
1009 #elif defined(HAVE__STRNICMP)
1010 return _strnicmp(str1, str2, maxlen);
1014 while (*str1 && *str2 && maxlen) {
1028 return (
int) ((
unsigned char) a - (
unsigned char)
b);
1048 return vsscanf(text, fmt, ap);
1056 if (!text || !*text) {
1106 char *valuep = va_arg(ap,
char *);
1108 *valuep++ = *text++;
1126 if (inttype > DO_SHORT) {
1131 if (inttype < DO_LONGLONG) {
1138 inttype = DO_LONGLONG;
1144 if (text[index] ==
'-') {
1147 if (text[index] ==
'0') {
1148 if (
SDL_tolower((
unsigned char) text[index + 1]) ==
'x') {
1157 if (inttype == DO_LONGLONG) {
1161 if (advance && !suppress) {
1170 if (advance && !suppress) {
1174 short *valuep = va_arg(ap,
short *);
1175 *valuep = (short) value;
1180 int *valuep = va_arg(ap,
int *);
1181 *valuep = (int) value;
1186 long *valuep = va_arg(ap,
long *);
1211 if (inttype == DO_LONGLONG) {
1215 if (advance && !suppress) {
1221 unsigned long value = 0;
1224 if (advance && !suppress) {
1228 short *valuep = va_arg(ap,
short *);
1229 *valuep = (short) value;
1234 int *valuep = va_arg(ap,
int *);
1235 *valuep = (int) value;
1240 long *valuep = va_arg(ap,
long *);
1258 if (advance && !suppress) {
1259 void **valuep = va_arg(ap,
void **);
1260 *valuep = (
void *) value;
1271 if (advance && !suppress) {
1272 float *valuep = va_arg(ap,
float *);
1273 *valuep = (float) value;
1290 char *valuep = va_arg(ap,
char *);
1292 *valuep++ = *text++;
1312 if (*text == *fmt) {
1338 #if defined(HAVE_LIBC) && defined(__WATCOMC__)
1344 retval = _vsnprintf(text, maxlen, fmt, ap);
1345 if (maxlen > 0) text[maxlen-1] =
'\0';
1346 if (retval < 0) retval = (int) maxlen;
1349 #elif defined(HAVE_VSNPRINTF)
1355 return vsnprintf(text, maxlen, fmt, ap);
1384 if (
string ==
NULL) {
1389 if (info && info->
width > 0 && (
size_t)info->
width > sz) {
1394 while (width-- > 0 && maxlen > 0) {
1402 length +=
SDL_min(slen, maxlen);
1407 if (slen < maxlen) {
1409 length -= (sz - slen);
1424 size_t sz, pad, have_sign;
1430 if (*num ==
'-' || *num ==
'+') {
1438 if (pad + sz + 1 <= maxlen) {
1450 if (pad + sz + 1 <= maxlen) {
1511 size_t left = maxlen;
1512 char *textstart =
text;
1516 unsigned long value;
1532 value = (
unsigned long) arg;
1535 text += (left > 1) ? left - 1 : 0;
1553 value = (
unsigned long) (arg * mult);
1556 text += (left > 1) ? left - 1 : 0;
1562 arg -= (double) value / mult;
1581 width = info->
width - (int)(text - textstart);
1584 char *
end = text+left-1;
1585 len = (text - textstart);
1586 for (len = (text - textstart); len--; ) {
1587 if ((textstart+len+width) <
end) {
1588 *(textstart+len+
width) = *(textstart+len);
1593 text += (left > 1) ? left - 1 : 0;
1600 if (textstart+len < end) {
1601 textstart[
len] = fill;
1606 return (text - textstart);
1612 size_t left = maxlen;
1613 char *textstart =
text;
1618 while (*fmt && left > 1) {
1636 while (check_flag) {
1657 if (*fmt >=
'0' && *fmt <=
'9') {
1660 else if (*fmt ==
'*') {
1662 info.
width = va_arg(ap,
int);
1667 if (*fmt >=
'0' && *fmt <=
'9') {
1669 }
else if (*fmt ==
'*') {
1692 *text = (char) va_arg(ap,
int);
1701 if (inttype < DO_LONGLONG) {
1708 inttype = DO_LONGLONG;
1719 (
long) va_arg(ap,
int));
1740 if (info.
radix == 10) {
1748 if (info.
radix == 10) {
1761 va_arg(ap,
unsigned int));
1765 va_arg(ap,
unsigned long));
1781 wchar_t *wide_arg = va_arg(ap,
wchar_t *);
1801 text += (left > 1) ? left - 1 : 0;
1815 return (
int)(text - textstart);