// // Cforall Version 1.0.0 Copyright (C) 2019 University of Waterloo // // manipulatorsInput.cfa -- // // Author : Peter A. Buhr // Created On : Sat Jun 8 17:58:54 2019 // Last Modified By : Peter A. Buhr // Last Modified On : Mon Feb 5 21:54:49 2024 // Update Count : 134 // #include #include // scanf int main() { { // Upfront checks to ensure buffer safety. Once these pass, the simpler `wdi(sizeof(s),s)` // usage, as in the scanf alignment cases below, is justified. struct { char buf[8]; char canary; } data; static_assert( sizeof(data.buf) == 8 ); static_assert( &data.buf[8] == &data.canary ); // canary comes right after buf void rep(const char* casename) { data.canary = 42; bool caught = false; try { sin | wdi( sizeof(data.buf), data.buf ); } catch (cstring_length*) { caught = true; } printf( "%s \"%s\"", casename, data.buf ); if ( caught ) { printf(", exception occurred"); } if ( data.canary == 42 ) { printf(", canary ok"); } else { printf(", canary overwritten to %d", data.canary); } printf("\n"); } rep("pre1"); // 123456 | 123456 rep("pre2"); // 1234567 | 1234567 rep("pre3a"); // 12345678 | 1234567 rep("pre3b"); // | 8 rep("pre4a"); // 123456789 | 1234567 rep("pre4b"); // | 89 scanf("\n"); // next test does not start with %s so does not tolerate leading whitespace } { char s[] = "yyyyyyyyyyyyyyyyyyyy"; // Input characters consumed: const char sk_fmt[] = "%*[abc]"; scanf( "abc " ); scanf( sk_fmt ); for ( 5 ) scanf( "%*c" ); printf( "1 %s\n", s ); // |abc |\ncccccb| \nxx\n| scanf( "%s", s ); printf( "2 %s\n", s ); // |abcxxx| scanf( "%*s" ); printf( "3 %s\n", s ); // |\nabcyyy| scanf( "%8s", s ); printf( "4 %s\n", s ); // |\naaaaaaaa| scanf( "%*8s" ); printf( "5 %s\n", s ); // |xxxxxxxx| scanf( "%[abc]", s ); printf( "6 %s\n", s ); // |aabbccbb| scanf( "%[^abc]", s ); printf( "7 %s\n", s ); // |dddwww| scanf( "%*[abc]" ); printf( "8 %s\n", s ); // |bbbbbbbb| scanf( "%*[^abc]" ); printf( "9 %s\n", s ); // |wwwwwwww| scanf( "%8[abc]", s ); printf( "10 %s\n", s ); // |aaaaaaaa| scanf( "%8[^abc]", s ); printf( "11 %s\n", s ); // |wwwwwwww| scanf( "%*8[abc]" ); printf( "12 %s\n", s ); // |aaaaaaaa| scanf( "%*8[^abc]" ); printf( "13 %s\n", s ); // |wwwwwwww| scanf( "\n" ); // must start next line // |\n| int rc; s[0] = 'q'; s[1] = '\0'; rc = 99; rc = scanf( "%[abc]", s ); printf( "14 rc=%d, %s\n", rc, s ); // || s[0] = 'q'; s[1] = '\0'; rc = 99; rc = scanf( "%[^u]", s ); printf( "15 rc=%d, %s\n", rc, s ); // || scanf( "%*[u]\n" ); // |uuuuu\n| scanf( "%[^\n]\n", s ); printf( "16 %s\n", s ); // |get this line\n| scanf( "%[^%%]%%\n", s ); printf( "17 %s\n", s ); // |@# this line 1)-{}%\n| scanf( "%*[^%%]%%\n", s ); printf( "18 %s\n", s ); // |@# this line 1)-{}%\n| scanf( "%*[ \f\n\r\t\v]" ); // ignore whitespace // || scanf( "\"%[^\"]\"", s ); printf( "19 %s\n", s ); // |"abc"| scanf( "%*[ \f\n\r\t\v]" ); // ignore whitespace // |\n| scanf( "'%[^']'", s ); printf( "20 %s\n", s ); // |'abc '| scanf( "%*[ \f\n\r\t\v]" ); // ignore whitespace // |\n| scanf( "{%[^}]}", s ); printf( "21 %s\n", s ); // |{ d d\n\nd }| scanf( "%*[ \f\n\r\t\v]" ); // ignore whitespace // |\n| scanf( "X%[^Y]Y", s ); printf( "22 %s\n", s ); // |X ZC44%Y| scanf( "%*[ \f\n\r\t\v]" ); // ignore whitespace // |\n| scanf( "X%*[^Y]Y", s ); printf( "23 %s\n", s ); // |X ZC44%Y| scanf( "\n" ); // must start next line // |\n| char ch; scanf( "%*[ \f\n\r\t\v]" ); // ignore whitespace // |\n| scanf( "'%c'", &ch ); printf( "24 %c\n", ch ); // |x| scanf( "%*[ \f\n\r\t\v]" ); // ignore whitespace // |\n| scanf( "\"%c\"", &ch ); printf( "25 %c\n", ch ); // |x| scanf( "%*[ \f\n\r\t\v]" ); // ignore whitespace // |\n| scanf( "{%c}", &ch ); printf( "26 %c\n", ch ); // |x| scanf( "%*[ \f\n\r\t\v]" ); // ignore whitespace // |\n| scanf( "X%cY", &ch ); printf( "27 %c\n", ch ); // |x| scanf( "%*[ \f\n\r\t\v]" ); // ignore whitespace // |\n| scanf( "X%*cY", &ch ); printf( "28 %c\n", ch ); // |x| scanf( "\n" ); // must start next line // |\n| } { char s[] = "yyyyyyyyyyyyyyyyyyyy"; char sk[] = "abc"; sin | "abc " | skip( sk ) | skip( 5 ); sout | "1" | s; sin | wdi( sizeof(s), s ); sout | "2" | s; sin | ignore( s ); sout | "3" | s; sin | wdi( sizeof(s), 8, s ); sout | "4" | s; sin | ignore( wdi( sizeof(s), 8, s ) ); sout | "5" | s; sin | incl( "abc", wdi( sizeof(s), s ) ); sout | "6" | s; sin | excl( "abc", wdi( sizeof(s), s ) ); sout | "7" | s; sin | ignore( incl( "abc", wdi( sizeof(s), s ) ) ); sout | "8" | s; sin | ignore( excl( "abc", wdi( sizeof(s), s ) ) ); sout | "9" | s; sin | incl( "abc", wdi( sizeof(s), 8, s ) ); sout | "10" | s; sin | excl( "abc", wdi( sizeof(s), 8, s ) ); sout | "11" | s; sin | ignore( incl( "abc", wdi( sizeof(s), 8, s ) ) ); sout | "12" | s; sin | ignore( excl( "abc", wdi( sizeof(s), 8, s ) ) ); sout | "13" | s; sin | nl; s[0] = 'q'; s[1] = '\0'; sin | incl( "abc", wdi( sizeof(s), s ) ); sout | "14" | s; s[0] = 'q'; s[1] = '\0'; sin | excl( "u", wdi( sizeof(s), s ) ); sout | "15" | s; sin | skip( "u" ) | nl; sin | getline( wdi( sizeof(s), s ) ); sout | "16" | s; sin | getline( wdi( sizeof(s), s ), '%' ) | nl; sout | "17" | s; sin | ignore( getline( wdi( sizeof(s), s ), '%' ) ) | nl; sout | "18" | s; sin | quoted( wdi( sizeof(s), s ) ); sout | "19" | s; sin | quoted( wdi( sizeof(s), s ), '\'' ); sout | "20" | s; sin | quoted( wdi( sizeof(s), s ), '{', '}' ); sout | "21" | s; sin | quoted( wdi( sizeof(s), s ), 'X', 'Y' ); sout | "22" | s; sin | ignore( quoted( wdi( sizeof(s), s ), 'X', 'Y' ) ); sout | "23" | s; char ch; sin | quoted( ch ); sout | "24 " | ch; sin | quoted( ch, '\"' ); sout | "25 " | ch; sin | quoted( ch, '{', '}' ); sout | "26 " | ch; sin | quoted( ch, 'X', 'Y' ); sout | "27 " | ch; sin | ignore( quoted( ch, 'X', 'Y' ) ); sout | "28 " | ch; sin | nl; } // Keep harmonized with collections/string-istream-manip { char c; sin | c; sout | c; sin | ignore( c ); sout | c; sin | nl; char ca[3] = { 'a', 'b', 'c' }; sin | wdi( sizeof(ca), ca[0] ); sout | ca[0] | ca[1] | ca[2]; sin | ignore( wdi( sizeof(ca), ca[0] ) ); sout | ca[0] | ca[1] | ca[2]; sin | nl; signed char sc; sin | sc; sout | sc; sin | wdi( 3, sc ); sout | sc; sin | ignore( sc ); sout | sc; sin | ignore( wdi( 3, sc ) ); sout | sc; unsigned char usc; sin | usc; sout | usc; sin | wdi( 3, usc ); sout | usc; sin | ignore( usc ); sout | usc; sin | ignore( wdi( 3, usc ) ); sout | usc; signed short int ssi; sin | ssi; sout | ssi; sin | wdi( 3, ssi ); sout | ssi; sin | ignore( ssi ); sout | ssi; sin | ignore( wdi( 3, ssi ) ); sout | ssi; unsigned short int usi; sin | usi; sout | usi; sin | wdi( 3, usi ); sout | usi; sin | ignore( usi ); sout | usi; sin | ignore( wdi( 3, usi ) ); sout | usi; signed int si; sin | si; sout | si; sin | wdi( 3, si ); sout | si; sin | ignore( si ); sout | si; sin | ignore( wdi( 3, si ) ); sout | si; unsigned int ui; sin | ui; sout | ui; sin | wdi( 3, ui ); sout | ui; sin | ignore( ui ); sout | ui; sin | ignore( wdi( 3, ui ) ); sout | ui; signed long int sli; sin | sli; sout | sli; sin | wdi( 3, sli ); sout | sli; sin | ignore( sli ); sout | sli; sin | ignore( wdi( 3, sli ) ); sout | sli; unsigned long int uli; sin | uli; sout | uli; sin | wdi( 3, uli ); sout | uli; sin | ignore( uli ); sout | uli; sin | ignore( wdi( 3, uli ) ); sout | uli; signed long long int slli; sin | slli; sout | slli; sin | wdi( 3, slli ); sout | slli; sin | ignore( slli ); sout | slli; sin | ignore( wdi( 3, slli ) ); sout | slli; unsigned long long int ulli; sin | ulli; sout | ulli; sin | wdi( 3, ulli ); sout | ulli; sin | ignore( ulli ); sout | ulli; sin | ignore( wdi( 3, ulli ) ); sout | ulli; float f; sin | f; sout | f; sin | wdi( 8, f ); sout | f; sin | ignore( f ); sout | f; sin | ignore( wdi( 8, f ) ); sout | f; double d; sin | d; sout | d; sin | wdi( 8, d ); sout | d; sin | ignore( d ); sout | d; sin | ignore( wdi( 8, d ) ); sout | d; long double ld; sin | ld; sout | ld; sin | wdi( 8, ld ); sout | ld; sin | ignore( ld ); sout | ld; sin | ignore( wdi( 8, ld ) ); sout | ld; float _Complex fc; sin | fc; sout | fc; sin | wdi( 8, fc ); sout | fc; sin | ignore( fc ); sout | fc; sin | ignore( wdi( 8, fc ) ); sout | fc; double _Complex dc; sin | dc; sout | dc; sin | wdi( 8, dc ); sout | dc; sin | ignore( dc ); sout | dc; sin | ignore( wdi( 8, dc ) ); sout | dc; long double _Complex ldc; sin | ldc; sout | ldc; sin | wdi( 8, ldc ); sout | ldc; sin | ignore( ldc ); sout | ldc; sin | ignore( wdi( 8, ldc ) ); sout | ldc; } #if defined( __SIZEOF_INT128__ ) { int128 val; for ( 15 ) { sin | val; sout | val; } } #endif // __SIZEOF_INT128__ } // main // Local Variables: // // tab-width: 4 // // compile-command: "cfa -Wall -Wextra manipulatorsInput.cfa" // // End: //