| 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 | 
 | 
|---|
| 16 | int 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: //
 | 
|---|