1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
/* Test of 'd(i,u)' specification.
$Id: sprintf-2.c,v 1.1 2007/02/18 13:43:51 dmix Exp $ */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "progmem.h"
#ifndef __AVR__
# define sprintf_P sprintf
#endif
void Check (int line,
const char *expstr,
int retval, const char *retstr)
{
int code;
if (retval != (int)strlen (retstr))
code = 1000 + line;
else if (strcmp_P (retstr, expstr))
code = line;
else
return;
#if !defined(__AVR__)
if (code) {
printf ("\nLine %3d: expect: %3d, \"%s\","
"\n output: %3d, \"%s\"\n",
line, strlen (expstr), expstr, retval, retstr);
code = (line < 256 ? line : 255); /* common OS restriction */
}
#elif defined(DEBUG)
exit ((int)retstr);
#endif
exit (code);
}
/* 'vp' is used to avoid gcc warnings about format string. */
#define CHECK(expstr, fmt, ...) do { \
char s[260]; \
int i; \
int (* volatile vp)(char *, const char *, ...) = sprintf_P; \
memset (s, 0, sizeof(s)); \
i = vp (s, PSTR(fmt), ##__VA_ARGS__); \
Check (__LINE__, PSTR(expstr), i, s); \
} while (0)
int main ()
{
/* '%d' specification */
CHECK ("0", "%d", 0);
CHECK ("12345", "%d", 12345);
CHECK ("-32768 -32767 -1 0 1 32767",
"%d %d %d %d %d %d",
(int)-32768, -32767, -1, 0, 1, 32767);
CHECK ("0 1 -1", "%0d %0d %0d", 0, 1, -1);
CHECK ("+0 +1 -1", "%+d %+d %+d", 0, 1, -1);
CHECK ("0 1 -1", "%-d %-d %-d", 0, 1, -1);
CHECK ("0 1 -1", "%#d %#d %#d", 0, 1, -1);
CHECK (" 0 1 -1", "% d % d % d", 0, 1, -1);
CHECK ("0000.0001.-001.1234.-123.12345.-1234",
"%04d.%04d.%04d.%04d.%04d.%04d.%04d",
0, 1, -1, 1234, -123, 12345, -1234);
CHECK (" 0001", "%08.4d", 1); /* 0 - ignored */
CHECK (" 1", "%08.0d", 1);
CHECK (" 1", "%08.d", 1);
#ifdef __AVR__
CHECK ("0", "%.0d", 0);
#endif
CHECK ("1 -1", "%.0d %.0d", 1, -1);
CHECK ("0 1 -1", "%.1d %.1d %.1d", 0, 1, -1);
CHECK ("00 01 -01", "%.2d %.2d %.2d", 0, 1, -1);
CHECK ("0000 0001 0012 0123 1234 12345",
"%.4d %.4d %.4d %.4d %.4d %.4d",
0, 1, 12, 123, 1234, 12345);
CHECK ("0.1.-1", "%1d.%1d.%1d", 0, 1, -1);
CHECK (" 1.12.123", "%2d.%2d.%2d", 1, 12, 123);
CHECK (" -1. -12.-123.-1234", "%4d.%4d.%4d.%4d", -1, -12, -123, -1234);
CHECK (" 12. -13", "%#4d.%#4d", 12, -13);
CHECK (" 14. -15", "% 4d.% 4d", 14, -15);
CHECK (" +16. -17", "%+4d.%+4d", 16, -17);
CHECK ("18 .-19 ", "%-4d.%-4d", 18, -19);
CHECK (" 0001. -0001. 1234. -1234",
"%8.4d.%8.4d.%8.4d.%8.4d", 1, -1, 1234, -1234);
CHECK (" 0012. 0013. 0014. +0015",
"%08.4d.%#8.4d.% 8.4d.%+8.4d", 12, 13, 14, 15);
CHECK ("0001 .0123 .1234 .12345 ",
"%-8.4d.%-8.4d.%-8.4d.%-8.4d", 1, 123, 1234, 12345);
CHECK ("-0001 .-0123 .-1234 .-12345 ",
"%-8.4d.%-8.4d.%-8.4d.%-8.4d", -1, -123, -1234, -12345);
CHECK (" "
" "
" "
" 1",
"%255d", 1);
CHECK ("1 "
" "
" "
" ",
"%-255d", 1);
CHECK ("0000000000000000000000000000000000000000000000000000000000000000"
"0000000000000000000000000000000000000000000000000000000000000000"
"0000000000000000000000000000000000000000000000000000000000000000"
"000000000000000000000000000000000000000000000000000000000000002",
"%.255d", 2);
/* long arg */
CHECK ("0 1 -1 2147483647 -2147483647 -2147483648",
"%ld %ld %ld %ld %ld %ld",
0L, 1L, -1L, 2147483647L, -2147483647L, 0x80000000L);
/* short arg */
CHECK ("0 2 -2", "%hd %hd %hd", 0, 2, -2);
/* '%i' specification */
CHECK ("-9", "%i", -9);
/* '%u' specification */
CHECK ("0 1 32767 32768 32769 65535",
"%u %u %u %u %u %u",
0, 1, 0x7fff, 0x8000, 0x8001, 0xffff);
return 0;
}
|