1#! /usr/bin/env python
2
3import re
4import sys
5
6fmt_name = sys.argv[1]
7templates = sys.argv[2:]
8
9times = (#  D  HH  MM     SS
10         (  0,  0,  0,  0.00),
11         (  1,  4, 50, 38.68),
12         (  5, 12, 31, 35.82),
13         (  0, 12, 47, 53.41),
14         (  3,  1, 26,  0.69),
15         (  1, 20, 58, 11.19),
16         ( 12,  7, 36,  5.98),
17         ( 52, 15, 43, 49.27),
18         (  7,  4, 25,  9.24),
19         (  0,  6, 49, 27.89),
20         ( 20,  2, 57, 52.56),
21         (555, 16, 45, 44.12),
22         (120, 21, 30, 57.27),
23         (  0,  4, 25,  9.98),
24         (  3,  6, 49, 27.24),
25         (  5,  2, 57, 52.13),
26         (  0, 16, 45, 44.35),
27         (  1, 21, 30, 57.32),
28         ( 10, 22, 30,  4.27),
29         ( 22,  1, 56, 51.18))
30
31syntax_file = open('%s.sps' % fmt_name, 'w')
32syntax_file.write('''\
33DATA LIST NOTABLE FILE='%(fmt_name)s.input'/%(fmt_name)s 1-40 (%(fmt_name)s).
34PRINT OUTFILE='%(fmt_name)s.output'/%(fmt_name)s (F16.2).
35EXECUTE.
36''' % {'fmt_name': fmt_name})
37syntax_file.close()
38
39expout_file = open('expout', 'w')
40input_file = open('%s.input' % fmt_name, 'w')
41
42def print_all_formats(d, h, m, s, template, formatted, expected, sign):
43    if template != '':
44        c = template[0]
45        template = template[1:]
46        if c == '+':
47            assert sign == ''
48            for new_sign in ('', '-', '+'):
49                print_all_formats(d, h, m, s, template,
50                                  formatted + new_sign, expected, new_sign)
51        elif c == 'D':
52            for f in ('%d', '%02d'):
53                print_all_formats(0, h, m, s, template,
54                                  formatted + (f % d), expected + d * 86400,
55                                  sign)
56        elif c == 'H':
57            for f in ('%d', '%02d'):
58                print_all_formats(0, 0, m, s, template,
59                                  formatted + (f % (h + d * 24)),
60                                  expected + h * 3600 + d * 86400,
61                                  sign)
62        elif c == 'M':
63            for f in ('%d', '%02d'):
64                print_all_formats(0, 0, 0, s, template,
65                                  formatted + (f % (m + h * 60 + d * 1440)),
66                                  expected + m * 60 + h * 3600 + d * 86400,
67                                  sign)
68        elif c == 'S':
69            for f in ('%.0f', '%02.0f', '%.1f', '%.2f'):
70                ns = s + m * 60 + h * 3600 + d * 86400
71                formatted_s = f % ns
72                print_all_formats(0, 0, 0, 0, template,
73                                  formatted + formatted_s,
74                                  expected + float(formatted_s),
75                                  sign)
76        elif c == ':':
77            for f in (' ', ':'):
78                print_all_formats(d, h, m, s, template, formatted + f,
79                                  expected, sign)
80        elif c == ' ':
81            print_all_formats(d, h, m, s, template, formatted + ' ',
82                              expected, sign)
83        else:
84            assert False
85    else:
86        # Write the formatted value to fmt_name.input.
87        input_file.write('%s\n' % formatted)
88
89        # Write the expected value to 'expout'.
90        if sign == '-' and expected > 0:
91            expected = -expected
92        expected_s = '%17.2f\n' % expected
93        expected_s = expected_s.replace(' 0.', '  .')
94        expout_file.write(expected_s)
95
96
97for template in templates:
98    for time in times:
99        d, h, m, s = time
100        print_all_formats(d, h, m, s, template, '', 0, '')
101
102