~ubuntu-branches/ubuntu/raring/avr-libc/raring-proposed

« back to all changes in this revision

Viewing changes to tests/simulate/stdlib/dtostrf.h

  • Committer: Bazaar Package Importer
  • Author(s): Hakan Ardo
  • Date: 2008-08-10 09:59:16 UTC
  • mfrom: (1.1.7 upstream) (4.1.1 lenny)
  • Revision ID: james.westby@ubuntu.com-20080810095916-wwyigh3vt0e9s7ud
Tags: 1:1.6.2.cvs20080610-2
Added build-depends on texlive-extra-utils (closes: #493454)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Header+source file to test the dtostrf() function.
 
2
   $Id: dtostrf.h,v 1.1 2007/02/06 12:36:58 dmix Exp $
 
3
 */
 
4
 
 
5
#ifndef PATTERN_SIZE
 
6
# define PATTERN_SIZE   15
 
7
#endif
 
8
 
 
9
struct dtostrf_s {
 
10
    union {
 
11
        long lo;
 
12
        float fl;
 
13
    };
 
14
    signed char width;
 
15
    unsigned char prec;
 
16
    char pattern[PATTERN_SIZE];
 
17
};
 
18
 
 
19
#ifndef __AVR__
 
20
 
 
21
# include <stdio.h>
 
22
# include <string.h>
 
23
 
 
24
/* This function is intended for run of test cases on the host computer.
 
25
 */
 
26
char * dtostrf (double val, signed char width, unsigned char prec, char *s)
 
27
{
 
28
    char fmt[16];       /* "%-110.100F" */
 
29
    
 
30
    sprintf (fmt, "%%%d.%dF", width, prec);
 
31
    sprintf (s, fmt, val);
 
32
    return s;
 
33
}
 
34
#endif  /* !__AVR__ */
 
35
 
 
36
#define PZLEN   5       /* protected zone length        */
 
37
 
 
38
void run_dtostrf (const struct dtostrf_s *pt, int testno)
 
39
{
 
40
    union {
 
41
        long lo;
 
42
        float fl;
 
43
    } val;
 
44
    signed char width;
 
45
    unsigned char prec;
 
46
    static char s[2*PZLEN + sizeof(pt->pattern)];
 
47
    char c, *ps;
 
48
    void *pv;
 
49
    
 
50
    memset (s, testno, sizeof(s));
 
51
 
 
52
#ifdef  __AVR__
 
53
    val.lo = pgm_read_dword (& pt->lo);
 
54
    width  = pgm_read_byte (& pt->width);
 
55
    prec   = pgm_read_byte (& pt->prec);
 
56
#else
 
57
    val.lo = pt->lo;
 
58
    width  = pt->width;
 
59
    prec   = pt->prec;
 
60
#endif
 
61
    ps = dtostrf (val.fl, width, prec, s + PZLEN);
 
62
 
 
63
    if (ps != s + PZLEN)
 
64
        exit (testno + 0x1000);
 
65
    for (ps = s; ps != s + PZLEN; ps++) {
 
66
        if ((unsigned char)*ps != (testno & 0377))
 
67
            exit (testno + 0x2000);
 
68
    }
 
69
 
 
70
    pv = & pt->pattern;
 
71
#ifdef  __AVR__
 
72
    do {
 
73
        c = pgm_read_byte(pv++);
 
74
        if (*ps++ != c) {
 
75
            exit (testno + 0x3000);
 
76
        }
 
77
    } while (c);
 
78
#else
 
79
    do {
 
80
        c = *(char *)(pv++);
 
81
        if (*ps++ != c) {
 
82
            printf ("*** testno= %d:  must= %s  was= %s\n",
 
83
                testno, pt->pattern, s + PZLEN);
 
84
            exit (testno + 0x3000);
 
85
        }
 
86
    } while (c);
 
87
#endif
 
88
 
 
89
    for (; ps != s + sizeof(s); ps++) {
 
90
        if ((unsigned char)*ps != (testno & 0377))
 
91
            exit (testno + 0x4000);
 
92
    }
 
93
}