| 42 | static char *SDL_GetErrorMsg(char *errstr, int maxlen); |
| 43 | |
| 44 | int |
| 45 | SDL_SetError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) |
| 46 | { |
| 47 | va_list ap; |
| 48 | SDL_error *error; |
| 49 | |
| 50 | /* Ignore call if invalid format pointer was passed */ |
| 51 | if (fmt == NULL) return -1; |
| 52 | |
| 53 | /* Copy in the key, mark error as valid */ |
| 54 | error = SDL_GetErrBuf(); |
| 55 | error->error = 1; |
| 56 | SDL_strlcpy((char *) error->key, fmt, sizeof(error->key)); |
| 57 | |
| 58 | va_start(ap, fmt); |
| 59 | error->argc = 0; |
| 60 | while (*fmt) { |
| 61 | if (*fmt++ == '%') { |
| 62 | while (*fmt == '.' || (*fmt >= '0' && *fmt <= '9')) { |
| 63 | ++fmt; |
| 64 | } |
| 65 | switch (*fmt++) { |
| 66 | case 0: /* Malformed format string.. */ |
| 67 | --fmt; |
| 68 | break; |
| 69 | case 'l': |
| 70 | switch (*fmt++) { |
| 71 | case 0: /* Malformed format string.. */ |
| 72 | --fmt; |
| 73 | break; |
| 74 | case 'i': case 'd': case 'u': case 'x': case 'X': |
| 75 | error->args[error->argc++].value_l = va_arg(ap, long); |
| 76 | break; |
| 77 | } |
| 78 | break; |
| 79 | case 'c': |
| 80 | case 'i': |
| 81 | case 'd': |
| 82 | case 'u': |
| 83 | case 'o': |
| 84 | case 'x': |
| 85 | case 'X': |
| 86 | error->args[error->argc++].value_i = va_arg(ap, int); |
| 87 | break; |
| 88 | case 'f': |
| 89 | error->args[error->argc++].value_f = va_arg(ap, double); |
| 90 | break; |
| 91 | case 'p': |
| 92 | error->args[error->argc++].value_ptr = va_arg(ap, void *); |
| 93 | break; |
| 94 | case 's': |
| 95 | { |
| 96 | int i = error->argc; |
| 97 | const char *str = va_arg(ap, const char *); |
| 98 | if (str == NULL) |
| 99 | str = "(null)"; |
| 100 | SDL_strlcpy((char *) error->args[i].buf, str, |
| 101 | ERR_MAX_STRLEN); |