~ubuntu-branches/ubuntu/maverick/avr-libc/maverick

« back to all changes in this revision

Viewing changes to tests/simulate/printf/sprintf_min-3.c

  • Committer: Bazaar Package Importer
  • Author(s): Hakan Ardo
  • Date: 2009-10-31 11:52:10 UTC
  • mfrom: (1.1.8 upstream) (4.1.2 squeeze)
  • Revision ID: james.westby@ubuntu.com-20091031115210-x0mlijnegkce86fk
Tags: 1:1.6.7-1
* New upstream relese (closes: #544030)
* Added lintian overrides (closes: #553265)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* Test of sprintf_min(), specification: o.
2
 
   $Id: sprintf_min-3.c,v 1.1.2.1 2008/03/20 21:42:31 joerg_wunsch Exp $        */
3
 
 
4
 
#ifndef __AVR__
5
 
# define PRINTFLN(line, fmt, ...)       \
6
 
    printf("\nLine %2d: " fmt "\n", line, ##__VA_ARGS__)
7
 
# define EXIT(code)     exit ((code) < 255 ? (code) : 255)
8
 
# define sprintf_P      sprintf
9
 
#else
10
 
# if defined(__AVR_ATmega128__)
11
 
  /* ATmega128 has enough RAM for sprintf(), print to 0x2000 in XRAM. */
12
 
#  define PRINTFLN(line, fmt, ...)      \
13
 
    sprintf ((char *)0x2000, "\nLine %d: " fmt "\n", line, ##__VA_ARGS__)
14
 
# else
15
 
   /* small AVR */
16
 
#  define PRINTFLN(args...)
17
 
# endif
18
 
# define EXIT   exit
19
 
#endif
20
 
 
21
 
#include <stdio.h>
22
 
#include <stdlib.h>
23
 
#include <string.h>
24
 
#include "progmem.h"
25
 
 
26
 
void Check (int line,
27
 
            const char *expstr,
28
 
            int retval, const char *retstr)
29
 
{
30
 
    int code;
31
 
 
32
 
    if (retval != (int)strlen (retstr))
33
 
        code = 1000 + line;
34
 
    else if (strcmp_P (retstr, expstr))
35
 
        code = line;
36
 
    else
37
 
        return;
38
 
    PRINTFLN (line, "expect: %3d, \"%s\",\n%8s output: %3d, \"%s\"\n",
39
 
              strlen(expstr), expstr, " ", retval, retstr);
40
 
#ifdef  DEBUG
41
 
    code = (int)retstr;
42
 
#endif
43
 
    EXIT (code);
44
 
}
45
 
 
46
 
/* 'vp' is used to avoid gcc warnings about format string.      */
47
 
#define CHECK(expstr, fmt, ...) do {                            \
48
 
    char s[260];                                                \
49
 
    int i;                                                      \
50
 
    int (* volatile vp)(char *, const char *, ...) = sprintf_P; \
51
 
    memset (s, 0, sizeof(s));                                   \
52
 
    i = vp (s, PSTR(fmt), ##__VA_ARGS__);                       \
53
 
    Check (__LINE__, PSTR(expstr), i, s);                       \
54
 
} while (0)
55
 
 
56
 
int main ()
57
 
{
58
 
    /* '%o' specification       */
59
 
    CHECK ("0", "%o", 0);
60
 
    CHECK ("123456", "%o", 0123456);
61
 
    CHECK ("1 77777 100000 100001 177777",
62
 
           "%o %o %o %o %o",
63
 
           1, 0x7fff, 0x8000, 0x8001, 0xffff);
64
 
 
65
 
    CHECK ("0 1 177777", "%0o %0o %0o", 0, 1, 0xffff);
66
 
    CHECK ("0 1 177777", "% o % o % o", 0, 1, 0xffff);
67
 
    CHECK ("0 1 177777", "%+o %+o %+o", 0, 1, 0xffff);
68
 
    CHECK ("0 1 177777", "%-o %-o %-o", 0, 1, 0xffff);
69
 
    CHECK ("0 01 0177777", "%#o %#o %#o", 0, 1, 0xffff);
70
 
 
71
 
#ifdef  __AVR__
72
 
    CHECK ("0", "%.0o", 0);
73
 
#endif
74
 
    CHECK ("1 177777", "%.0o %.0o", 1, 0xffff);
75
 
    CHECK ("0 1 177777", "%.1o %.1o %.1o", 0, 1, 0xffff);
76
 
#ifdef  __AVR__         /* PRINTF_MIN */
77
 
    CHECK ("0 1 10 177777", "%.2o %.2o %.2o %.2o", 0, 1, 8, 0xffff);
78
 
    CHECK ("0 1 12 123 1234 12345",
79
 
           "%.4o %.4o %.4o %.4o %.4o %.4o",
80
 
           0, 1, 012, 0123, 01234, 012345);
81
 
 
82
 
    CHECK ("0.1.177777", "%1o.%1o.%1o", 0, 1, 0xffff);
83
 
    CHECK ("1.12.123", "%2o.%2o.%2o", 1, 012, 0123);
84
 
    CHECK ("1.12.123.1234.12345",
85
 
           "%4o.%4o.%4o.%4o.%4o", 1, 012, 0123, 01234, 012345);
86
 
    CHECK ("012.0123.01234", "%#4o.%#4o.%#4o", 012, 0123, 01234);
87
 
    CHECK ("14.177777", "% 4o.% 4o", 014, 0xffff);
88
 
    CHECK ("16.177777", "%+4o.%+4o", 016, 0xffff);
89
 
    CHECK ("17.177777", "%-4o.%-4o", 017, 0xffff);
90
 
 
91
 
    CHECK ("0.1.12.123.1234.12345.177777",
92
 
           "%04o.%04o.%04o.%04o.%04o.%04o.%04o",
93
 
           0, 1, 012, 0123, 01234, 012345, 0177777);
94
 
 
95
 
    CHECK ("1", "%08.4o", 1);           /* 0 - ignored  */
96
 
    CHECK ("1", "%08.0o", 1);
97
 
    CHECK ("1", "%08.o", 1);
98
 
 
99
 
    CHECK ("1.123.1234.177777",
100
 
           "%8.4o.%8.4o.%8.4o.%8.4o", 1, 0123, 01234, 0xffff);
101
 
    CHECK ("12.13.14",
102
 
           "%08.4o.% 8.4o.%+8.4o", 012, 013, 014);
103
 
    CHECK ("1.123.1234.12345",
104
 
           "%-8.4o.%-8.4o.%-8.4o.%-8.4o", 1, 0123, 01234, 012345);
105
 
 
106
 
    CHECK ("0.01.012.0123.01234",
107
 
           "%#8.4o.%#8.4o.%#8.4o.%#8.4o.%#8.4o", 0, 1, 012, 0123, 01234);
108
 
 
109
 
    CHECK ("1", "%255o", 1);
110
 
    CHECK ("1", "%-255o", 1);
111
 
    CHECK ("2", "%.255o", 2);
112
 
#endif
113
 
 
114
 
    /* long arg */
115
 
    CHECK ("0 1234567 76543210 17777777777 20000000000 20000000001 37777777777",
116
 
           "%lo %lo %lo %lo %lo %lo %lo",
117
 
           0L, 01234567L, 076543210L,
118
 
           0x7fffffffL, 0x80000000L, 0x80000001L, 0xffffffffL);
119
 
 
120
 
    /* short arg        */
121
 
    CHECK ("0 2 177776", "%ho %ho %ho", 0, 2, 0xfffe);
122
 
 
123
 
    return 0;
124
 
}