@@ -21,13 +21,17 @@ #include #include #include #include +#include + #import "OFString.h" #import "OFAutoreleasePool.h" #import "asprintf.h" + +#import "macros.h" #define MAX_SUBFMT_LEN 64 struct context { const char *fmt; @@ -167,12 +171,17 @@ } break; case 'l': /* and also ll */ if (ctx->fmt_len > ctx->i + 1 && ctx->fmt[ctx->i + 1] == 'l') { +#ifndef _WIN32 if (!append_subfmt(ctx, ctx->fmt + ctx->i, 2)) return false; +#else + if (!append_subfmt(ctx, "I64", 3)) + return false; +#endif ctx->i++; ctx->len_mod = LENGTH_MODIFIER_LL; } else { if (!append_subfmt(ctx, ctx->fmt + ctx->i, 1)) @@ -181,12 +190,17 @@ ctx->len_mod = LENGTH_MODIFIER_L; } break; case 'j': +#ifndef _WIN32 if (!append_subfmt(ctx, ctx->fmt + ctx->i, 1)) return false; +#else + if (!append_subfmt(ctx, "I64", 3)) + return false; +#endif ctx->len_mod = LENGTH_MODIFIER_J; break; case 'z': @@ -208,10 +222,33 @@ return false; ctx->len_mod = LENGTH_MODIFIER_CAPITAL_L; break; +#ifdef _WIN32 + case 'I': /* win32 strangeness (I64 instead of ll or j) */ + if (ctx->fmt_len > ctx->i + 2 && ctx->fmt[ctx->i + 1] == '6' && + ctx->fmt[ctx->i + 2] == '4') { + if (!append_subfmt(ctx, ctx->fmt + ctx->i, 3)) + return false; + + ctx->i += 2; + ctx->len_mod = LENGTH_MODIFIER_LL; + } else + ctx->i--; + + break; +#endif +#ifdef OF_IOS + case 'q': /* iOS uses this for PRI?64 */ + if (!append_subfmt(ctx, ctx->fmt + ctx->i, 1)) + return false; + + ctx->len_mod = LENGTH_MODIFIER_LL; + + break; +#endif default: ctx->i--; break; }