source: tests/io/manipulatorsInput.cfa

Last change on this file was da22726, checked in by Peter A. Buhr <pabuhr@…>, 2 months ago

switch from '\n' to nl, update test data

  • Property mode set to 100644
File size: 9.9 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2019 University of Waterloo
3//
4// manipulatorsInput.cfa --
5//
6// Author           : Peter A. Buhr
7// Created On       : Sat Jun  8 17:58:54 2019
8// Last Modified By : Peter A. Buhr
9// Last Modified On : Mon Feb  5 21:54:49 2024
10// Update Count     : 134
11//
12
13#include <fstream.hfa>
14#include <stdio.h>                                      // scanf
15
16int main() {
17        {
18                // Upfront checks to ensure buffer safety.  Once these pass, the simpler `wdi(sizeof(s),s)`
19                // usage, as in the scanf alignment cases below, is justified.
20                struct {
21                        char buf[8];
22                        char canary;
23                } data;
24                static_assert( sizeof(data.buf) == 8 );
25                static_assert( &data.buf[8] == &data.canary );  // canary comes right after buf
26
27                void rep(const char* casename) {
28                        data.canary = 42;
29                        bool caught = false;
30                        try {
31                                sin | wdi( sizeof(data.buf), data.buf );
32                        } catch (cstring_length*) {
33                                caught = true;
34                        }
35                        printf( "%s \"%s\"", casename, data.buf );
36                        if ( caught ) {
37                                printf(", exception occurred");
38                        }
39                        if ( data.canary == 42 ) {
40                                printf(", canary ok");
41                        } else {
42                                printf(", canary overwritten to %d", data.canary);
43                        }
44                        printf("\n");
45                }
46
47                rep("pre1");    // 123456     |  123456
48                rep("pre2");    // 1234567    |  1234567
49                rep("pre3a");   // 12345678   |  1234567
50                rep("pre3b");   //            |  8
51                rep("pre4a");   // 123456789  |  1234567
52                rep("pre4b");   //            |  89
53
54                scanf("\n");  // next test does not start with %s so does not tolerate leading whitespace
55        }
56        {
57                char s[] = "yyyyyyyyyyyyyyyyyyyy";                                                                                                      // Input characters consumed:
58                const char sk_fmt[] = "%*[abc]";
59                scanf( "abc " ); scanf( sk_fmt ); for ( 5 ) scanf( "%*c" ); printf( "1 %s\n", s );      // |abc |\ncccccb| \nxx\n|
60                scanf( "%s", s );                                                               printf( "2 %s\n", s );                          // |abcxxx|
61                scanf( "%*s" );                                                                 printf( "3 %s\n", s );                          // |\nabcyyy|
62                scanf( "%8s", s );                                                              printf( "4 %s\n", s );                          // |\naaaaaaaa|
63                scanf( "%*8s" );                                                                printf( "5 %s\n", s );                          // |xxxxxxxx|
64
65                scanf( "%[abc]", s );                                                   printf( "6 %s\n", s );                          // |aabbccbb|
66                scanf( "%[^abc]", s );                                                  printf( "7 %s\n", s );                          // |dddwww|
67                scanf( "%*[abc]" );                                                             printf( "8 %s\n", s );                          // |bbbbbbbb|
68                scanf( "%*[^abc]" );                                                    printf( "9 %s\n", s );                          // |wwwwwwww|
69                scanf( "%8[abc]", s );                                                  printf( "10 %s\n", s );                         // |aaaaaaaa|
70                scanf( "%8[^abc]", s );                                                 printf( "11 %s\n", s );                         // |wwwwwwww|
71                scanf( "%*8[abc]" );                                                    printf( "12 %s\n", s );                         // |aaaaaaaa|
72                scanf( "%*8[^abc]" );                                                   printf( "13 %s\n", s );                         // |wwwwwwww|
73                scanf( "\n" );                                                                  // must start next line                         // |\n|
74
75                int rc;
76                s[0] = 'q'; s[1] = '\0'; rc = 99;
77                rc = scanf( "%[abc]", s );                                              printf( "14 rc=%d, %s\n", rc, s );      // ||
78                s[0] = 'q'; s[1] = '\0'; rc = 99;
79                rc = scanf( "%[^u]", s );                                               printf( "15 rc=%d, %s\n", rc, s );      // ||
80                scanf( "%*[u]\n" );                                                                                                                                     // |uuuuu\n|
81                scanf( "%[^\n]\n", s );                                                 printf( "16 %s\n", s );                         // |get this line\n|
82                scanf( "%[^%%]%%\n", s );                                               printf( "17 %s\n", s );                         // |@# this line 1)-{}%\n|
83                scanf( "%*[^%%]%%\n", s );                                              printf( "18 %s\n", s );                         // |@# this line 1)-{}%\n|
84
85                scanf( "%*[ \f\n\r\t\v]" );                                             // ignore whitespace                            // ||
86                scanf( "\"%[^\"]\"", s );                                               printf( "19 %s\n", s );                         // |"abc"|
87                scanf( "%*[ \f\n\r\t\v]" );                                             // ignore whitespace                            // |\n|
88                scanf( "'%[^']'", s );                                                  printf( "20 %s\n", s );                         // |'abc  '|
89                scanf( "%*[ \f\n\r\t\v]" );                                             // ignore whitespace                            // |\n|
90                scanf( "{%[^}]}", s );                                                  printf( "21 %s\n", s );                         // |{ d d\n\nd }|
91                scanf( "%*[ \f\n\r\t\v]" );                                             // ignore whitespace                            // |\n|
92                scanf( "X%[^Y]Y", s );                                                  printf( "22 %s\n", s );                         // |X           ZC44%Y|
93                scanf( "%*[ \f\n\r\t\v]" );                                             // ignore whitespace                            // |\n|
94                scanf( "X%*[^Y]Y", s );                                                 printf( "23 %s\n", s );                         // |X           ZC44%Y|
95                scanf( "\n" );                                                                  // must start next line                         // |\n|
96
97                char ch;
98                scanf( "%*[ \f\n\r\t\v]" );                                             // ignore whitespace                            // |\n|
99                scanf( "'%c'", &ch );                                                   printf( "24 %c\n", ch );                        // |x|
100                scanf( "%*[ \f\n\r\t\v]" );                                             // ignore whitespace                            // |\n|
101                scanf( "\"%c\"", &ch );                                                 printf( "25 %c\n", ch );                        // |x|
102                scanf( "%*[ \f\n\r\t\v]" );                                             // ignore whitespace                            // |\n|
103                scanf( "{%c}", &ch );                                                   printf( "26 %c\n", ch );                        // |x|
104                scanf( "%*[ \f\n\r\t\v]" );                                             // ignore whitespace                            // |\n|
105                scanf( "X%cY", &ch );                                                   printf( "27 %c\n", ch );                        // |x|
106                scanf( "%*[ \f\n\r\t\v]" );                                             // ignore whitespace                            // |\n|
107                scanf( "X%*cY", &ch );                                                  printf( "28 %c\n", ch );                        // |x|
108                scanf( "\n" );                                                                  // must start next line                         // |\n|
109        }
110        {
111                char s[] = "yyyyyyyyyyyyyyyyyyyy";
112                char sk[] = "abc";
113                sin | "abc " | skip( sk ) | skip( 5 );                  sout | "1" | s;
114                sin | wdi( sizeof(s), s );                                              sout | "2" | s;
115                sin | ignore( s );                                                              sout | "3" | s;
116                sin | wdi( sizeof(s), 8, s );                                   sout | "4" | s;
117                sin | ignore( wdi( sizeof(s), 8, s ) );                 sout | "5" | s;
118
119                sin | incl( "abc", wdi( sizeof(s), s ) );               sout | "6" | s;
120                sin | excl( "abc", wdi( sizeof(s), s ) );               sout | "7" | s;
121                sin | ignore( incl( "abc", wdi( sizeof(s), s ) ) ); sout | "8" | s;
122                sin | ignore( excl( "abc", wdi( sizeof(s), s ) ) ); sout | "9" | s;
123                sin | incl( "abc", wdi( sizeof(s), 8, s ) );    sout | "10" | s;
124                sin | excl( "abc", wdi( sizeof(s), 8, s ) );    sout | "11" | s;
125                sin | ignore( incl( "abc", wdi( sizeof(s), 8, s ) ) ); sout | "12" | s;
126                sin | ignore( excl( "abc", wdi( sizeof(s), 8, s ) ) ); sout | "13" | s;
127                sin | nl;
128
129                s[0] = 'q'; s[1] = '\0';
130                sin | incl( "abc", wdi( sizeof(s), s ) );               sout | "14" | s;
131                s[0] = 'q'; s[1] = '\0';
132                sin | excl( "u", wdi( sizeof(s), s ) );                 sout | "15" | s;
133                sin | skip( "u" ) | nl;
134                sin | getline( wdi( sizeof(s), s ) );                   sout | "16" | s;
135                sin | getline( wdi( sizeof(s), s ), '%' ) | nl; sout | "17" | s;
136                sin | ignore( getline( wdi( sizeof(s), s ), '%' ) ) | nl; sout | "18" | s;
137
138                sin | quoted( wdi( sizeof(s), s ) );                    sout | "19" | s;
139                sin | quoted( wdi( sizeof(s), s ), '\'' );              sout | "20" | s;
140                sin | quoted( wdi( sizeof(s), s ), '{', '}' );  sout | "21" | s;
141                sin | quoted( wdi( sizeof(s), s ), 'X', 'Y' );  sout | "22" | s;
142                sin | ignore( quoted( wdi( sizeof(s), s ), 'X', 'Y' ) ); sout | "23" | s;
143
144                char ch;
145                sin | quoted( ch );                                                             sout | "24 " | ch;
146                sin | quoted( ch, '\"' );                                               sout | "25 " | ch;
147                sin | quoted( ch, '{', '}' );                                   sout | "26 " | ch;
148                sin | quoted( ch, 'X', 'Y' );                                   sout | "27 " | ch;
149                sin | ignore( quoted( ch, 'X', 'Y' ) );                 sout | "28 " | ch;
150                sin | nl;
151        }
152        // Keep harmonized with collections/string-istream-manip
153        {
154                char c;
155                sin | c;                                                                                sout | c;
156                sin | ignore( c );                                                              sout | c;
157                sin | nl;
158
159                char ca[3] = { 'a', 'b', 'c' };
160                sin | wdi( sizeof(ca), ca[0] );                                 sout | ca[0] | ca[1] | ca[2];
161                sin | ignore( wdi( sizeof(ca), ca[0] ) );               sout | ca[0] | ca[1] | ca[2];
162                sin | nl;
163
164                signed char sc;
165                sin | sc;                                                                               sout | sc;
166                sin | wdi( 3, sc );                                                             sout | sc;
167                sin | ignore( sc );                                                             sout | sc;
168                sin | ignore( wdi( 3, sc ) );                                   sout | sc;
169
170                unsigned char usc;
171                sin | usc;                                                                              sout | usc;
172                sin | wdi( 3, usc );                                                    sout | usc;
173                sin | ignore( usc );                                                    sout | usc;
174                sin | ignore( wdi( 3, usc ) );                                  sout | usc;
175
176                signed short int ssi;
177                sin | ssi;                                                                              sout | ssi;
178                sin | wdi( 3, ssi );                                                    sout | ssi;
179                sin | ignore( ssi );                                                    sout | ssi;
180                sin | ignore( wdi( 3, ssi ) );                                  sout | ssi;
181
182                unsigned short int usi;
183                sin | usi;                                                                              sout | usi;
184                sin | wdi( 3, usi );                                                    sout | usi;
185                sin | ignore( usi );                                                    sout | usi;
186                sin | ignore( wdi( 3, usi ) );                                  sout | usi;
187
188                signed int si;
189                sin | si;                                                                               sout | si;
190                sin | wdi( 3, si );                                                             sout | si;
191                sin | ignore( si );                                                             sout | si;
192                sin | ignore( wdi( 3, si ) );                                   sout | si;
193
194                unsigned int ui;
195                sin | ui;                                                                               sout | ui;
196                sin | wdi( 3, ui );                                                             sout | ui;
197                sin | ignore( ui );                                                             sout | ui;
198                sin | ignore( wdi( 3, ui ) );                                   sout | ui;
199
200                signed long int sli;
201                sin | sli;                                                                              sout | sli;
202                sin | wdi( 3, sli );                                                    sout | sli;
203                sin | ignore( sli );                                                    sout | sli;
204                sin | ignore( wdi( 3, sli ) );                                  sout | sli;
205
206                unsigned long int uli;
207                sin | uli;                                                                              sout | uli;
208                sin | wdi( 3, uli );                                                    sout | uli;
209                sin | ignore( uli );                                                    sout | uli;
210                sin | ignore( wdi( 3, uli ) );                                  sout | uli;
211
212                signed long long int slli;
213                sin | slli;                                                                             sout | slli;
214                sin | wdi( 3, slli );                                                   sout | slli;
215                sin | ignore( slli );                                                   sout | slli;
216                sin | ignore( wdi( 3, slli ) );                                 sout | slli;
217
218                unsigned long long int ulli;
219                sin | ulli;                                                                             sout | ulli;
220                sin | wdi( 3, ulli );                                                   sout | ulli;
221                sin | ignore( ulli );                                                   sout | ulli;
222                sin | ignore( wdi( 3, ulli ) );                                 sout | ulli;
223
224                float f;
225                sin | f;                                                                                sout | f;
226                sin | wdi( 8, f );                                                              sout | f;
227                sin | ignore( f );                                                              sout | f;
228                sin | ignore( wdi( 8, f ) );                                    sout | f;
229
230                double d;
231                sin | d;                                                                                sout | d;
232                sin | wdi( 8, d );                                                              sout | d;
233                sin | ignore( d );                                                              sout | d;
234                sin | ignore( wdi( 8, d ) );                                    sout | d;
235
236                long double ld;
237                sin | ld;                                                                               sout | ld;
238                sin | wdi( 8, ld );                                                             sout | ld;
239                sin | ignore( ld );                                                             sout | ld;
240                sin | ignore( wdi( 8, ld ) );                                   sout | ld;
241
242                float _Complex fc;
243                sin | fc;                                                                               sout | fc;
244                sin | wdi( 8, fc );                                                             sout | fc;
245                sin | ignore( fc );                                                             sout | fc;
246                sin | ignore( wdi( 8, fc ) );                                   sout | fc;
247
248                double _Complex dc;
249                sin | dc;                                                                               sout | dc;
250                sin | wdi( 8, dc );                                                             sout | dc;
251                sin | ignore( dc );                                                             sout | dc;
252                sin | ignore( wdi( 8, dc ) );                                   sout | dc;
253
254                long double _Complex ldc;
255                sin | ldc;                                                                              sout | ldc;
256                sin | wdi( 8, ldc );                                                    sout | ldc;
257                sin | ignore( ldc );                                                    sout | ldc;
258                sin | ignore( wdi( 8, ldc ) );                                  sout | ldc;
259        }
260        #if defined( __SIZEOF_INT128__ )
261        {
262                int128 val;
263                for ( 15 ) {
264                        sin | val;
265                        sout | val;
266                }
267        }
268        #endif // __SIZEOF_INT128__
269} // main
270
271// Local Variables: //
272// tab-width: 4 //
273// compile-command: "cfa -Wall -Wextra manipulatorsInput.cfa" //
274// End: //
Note: See TracBrowser for help on using the repository browser.