source: tests/configs/parsenums.cfa @ b0fcd0e

Last change on this file since b0fcd0e was 025f9c5, checked in by Michael Brooks <mlbrooks@…>, 8 weeks ago

Update 'fork+exec' test utility to be valid also in C and C++.

  • Property mode set to 100644
File size: 6.2 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2022 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// configs/parsenums.cfa
8// Testing parsing of integer arguments
9//
10// Author           : Thierry Delisle
11// Created On       : Wed Oct 12 15:28:01 2022
12// Last Modified By :
13// Last Modified On :
14// Update Count     :
15//
16
17#include <fstream.hfa>
18
19#include "../meta/fork+exec.hfa"
20
21// last as workaround to parser bug
22#include <parseargs.hfa>
23
24#if __SIZEOF_LONG__ == 4
25        #define BIG_UNSIGNED_LONG "4294967295"
26        #define TOO_BIG_UNSIGNED_LONG "4294967296"
27#elif  __SIZEOF_LONG__ == 8
28        #define BIG_UNSIGNED_LONG "18446744073709551615"
29        #define TOO_BIG_UNSIGNED_LONG "18446744073709551616"
30#else
31        #error unexpected size of long
32#endif
33
34int true_main( const char * exec );
35
36int main( int argc, char * argv[]) {
37        check_main( argv[0]);
38
39        int i = -3;
40        unsigned u = 3;
41        unsigned long ul = 3;
42        unsigned long long ull = 3;
43        double d = 3.3;
44
45
46        array( cfa_option, 5 ) options;
47        options[0] = (cfa_option){ 'i', "int",              "test int",                i   };
48        options[1] = (cfa_option){ 'u', "unsigned",         "test unsigned",           u   };
49        options[2] = (cfa_option){ 'l', "unsignedlong",     "test unsigned long",      ul  };
50        options[3] = (cfa_option){ 'L', "unsignedlonglong", "test unsigned long long", ull };
51        options[4] = (cfa_option){ 'd', "double",           "test double",             d   };
52
53        char **left;
54        parse_args( options, "[OPTIONS]...\ntesting bool parameters", left );
55
56        sout | "int                :" | i;
57        sout | "unsigned           :" | u;
58        sout | "unsigned long      :" | ul;
59        sout | "unsigned long long :" | ull;
60        sout | "double             :" | d;
61}
62
63int true_main( const char * path, const char * env[] ) {
64        printf( "no arg:\n" );
65        if ( pid_t child = strict_fork(); child == 0 ) {
66                int ret = execle( path, "parsenums", (const char*)0p, env );
67                if ( ret < 0 ) {
68                        fprintf( stderr, "Execl 2 returned with error: %d '%s'\n", errno, strerror( errno ) );
69                        exit( 1 );
70                } // if
71        } else {
72                int status = do_wait( child );
73                print_status( status );
74        } // if
75
76        printf( "all 0 arg:\n" );
77        if ( pid_t child = strict_fork(); child == 0 ) {
78                int ret = execle( path, "parsenums", "-i=0", "-u=0", "-l=0", "-L=0", "-d=0", (const char*)0p, env );
79                if ( ret < 0 ) {
80                        fprintf( stderr, "Execl 2 returned with error: %d '%s'\n", errno, strerror( errno ) );
81                        exit( 1 );
82                } // if
83        } else {
84                int status = do_wait( child );
85                print_status( status );
86        } // if
87
88        printf( "negative vals arg:\n" );
89        if ( pid_t child = strict_fork(); child == 0 ) {
90                int ret = execle( path, "parsenums", "-i=-1", "-d=-1", (const char*)0p, env );
91                if ( ret < 0 ) {
92                        fprintf( stderr, "Execl 2 returned with error: %d '%s'\n", errno, strerror( errno ) );
93                        exit( 1 );
94                } // if
95        } else {
96                int status = do_wait( child );
97                print_status( status );
98        } // if
99
100        printf( "funky notation arg:\n" );
101        if ( pid_t child = strict_fork(); child == 0 ) {
102                int ret = execle( path, "parsenums", "-i=0x10", "-u=0x20", "-l=0x300", "-L=0x4000", "-d=5e6", (const char*)0p, env );
103                if ( ret < 0 ) {
104                        fprintf( stderr, "Execl 2 returned with error: %d '%s'\n", errno, strerror( errno ) );
105                        exit( 1 );
106                } // if
107        } else {
108                int status = do_wait( child );
109                print_status( status );
110        } // if
111
112        printf( "big values arg:\n" );
113        if ( pid_t child = strict_fork(); child == 0 ) {
114                int ret = execle( path, "parsenums", "-i=2147483647", "-u=4294967295", "-l=" BIG_UNSIGNED_LONG, "-L=18446744073709551615", "-d=5e6", (const char*)0p, env );
115                if ( ret < 0 ) {
116                        fprintf( stderr, "Execl 2 returned with error: %d '%s'\n", errno, strerror( errno ) );
117                        exit( 1 );
118                } // if
119        } else {
120                int status = do_wait( child );
121                print_status( status );
122        } // if
123
124        printf( "too big values arg:\n" );
125        if ( pid_t child = strict_fork(); child == 0 ) {
126                int ret = execle( path, "parsenums", "-i=2147483648", (const char*)0p, env );
127                if ( ret < 0 ) {
128                        fprintf( stderr, "Execl 2 returned with error: %d '%s'\n", errno, strerror( errno ) );
129                        exit( 1 );
130                } // if
131        } else {
132                int status = do_wait( child );
133                print_status( status );
134        } // if
135
136        if ( pid_t child = strict_fork(); child == 0 ) {
137                int ret = execle( path, "parsenums", "-u=4294967296", (const char*)0p, env );
138                if ( ret < 0 ) {
139                        fprintf( stderr, "Execl 2 returned with error: %d '%s'\n", errno, strerror( errno ) );
140                        exit( 1 );
141                } // if
142        } else {
143                int status = do_wait( child );
144                print_status( status );
145        } // if
146
147        if ( pid_t child = strict_fork(); child == 0 ) {
148                int ret = execle( path, "parsenums", "-l=" TOO_BIG_UNSIGNED_LONG, (const char*)0p, env );
149                if ( ret < 0 ) {
150                        fprintf( stderr, "Execl 2 returned with error: %d '%s'\n", errno, strerror( errno ) );
151                        exit( 1 );
152                } // if
153        } else {
154                int status = do_wait( child );
155                print_status( status );
156        } // if
157
158        if ( pid_t child = strict_fork(); child == 0 ) {
159                int ret = execle( path, "parsenums", "-L=18446744073709551616", (const char*)0p, env );
160                if ( ret < 0 ) {
161                        fprintf( stderr, "Execl 2 returned with error: %d '%s'\n", errno, strerror( errno ) );
162                        exit( 1 );
163                } // if
164        } else {
165                int status = do_wait( child );
166                print_status( status );
167        } // if
168
169        printf( "negative errors arg:\n" );
170        if ( pid_t child = strict_fork(); child == 0 ) {
171                int ret = execle( path, "parsenums", "-u=-1", (const char*)0p, env );
172                if ( ret < 0 ) {
173                        fprintf( stderr, "Execl 2 returned with error: %d '%s'\n", errno, strerror( errno ) );
174                        exit( 1 );
175                } // if
176        } else {
177                int status = do_wait( child );
178                print_status( status );
179        } // if
180
181        if ( pid_t child = strict_fork(); child == 0 ) {
182                int ret = execle( path, "parsenums", "-l=-1", (const char*)0p, env );
183                if ( ret < 0 ) {
184                        fprintf( stderr, "Execl 2 returned with error: %d '%s'\n", errno, strerror( errno ) );
185                        exit( 1 );
186                } // if
187        } else {
188                int status = do_wait( child );
189                print_status( status );
190        } // if
191
192        if ( pid_t child = strict_fork(); child == 0 ) {
193                int ret = execle( path, "parsenums", "-L=-1", (const char*)0p, env );
194                if ( ret < 0 ) {
195                        fprintf( stderr, "Execl 2 returned with error: %d '%s'\n", errno, strerror( errno ) );
196                        exit( 1 );
197                } // if
198        } else {
199                int status = do_wait( child );
200                print_status( status );
201        } // if
202
203        printf( "All Done!\n" );
204
205        return 0;
206}
Note: See TracBrowser for help on using the repository browser.