[ca8824d] | 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
|
---|
[5764204] | 9 | // Last Modified On : Wed Jan 24 18:36:32 2024
|
---|
| 10 | // Update Count : 104
|
---|
[ca8824d] | 11 | //
|
---|
| 12 |
|
---|
| 13 | #include <fstream.hfa>
|
---|
| 14 | #include <stdio.h> // scanf
|
---|
| 15 |
|
---|
| 16 | int main() {
|
---|
[2fa0237] | 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 |
|
---|
[0860d9c] | 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 |
|
---|
[2fa0237] | 54 | scanf("\n"); // next test does not start with %s so does not tolerate leading whitespace
|
---|
| 55 | }
|
---|
[ca8824d] | 56 | {
|
---|
[8a33777] | 57 | char s[] = "yyyyyyyyyyyyyyyyyyyy"; // Input characters consumed:
|
---|
[bf1cbde] | 58 | const char sk_fmt[] = "%*[abc]";
|
---|
[8a33777] | 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|
|
---|
[329487c] | 64 |
|
---|
[8a33777] | 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|
|
---|
[8cffa4f] | 74 |
|
---|
| 75 | int rc;
|
---|
| 76 | s[0] = 'q'; s[1] = '\0'; rc = 99;
|
---|
[8a33777] | 77 | rc = scanf( "%[abc]", s ); printf( "14 rc=%d, %s\n", rc, s ); // ||
|
---|
[8cffa4f] | 78 | s[0] = 'q'; s[1] = '\0'; rc = 99;
|
---|
[8a33777] | 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|
|
---|
[5764204] | 83 | scanf( "%*[^%%]%%\n", s ); printf( "18 %s\n", s ); // |@# this line 1)-{}%\n|
|
---|
[ca2feff] | 84 |
|
---|
[8a33777] | 85 | scanf( "%*[ \f\n\r\t\v]" ); // ignore whitespace // ||
|
---|
[5764204] | 86 | scanf( "\"%[^\"]\"", s ); printf( "19 %s\n", s ); // |"abc"|
|
---|
[8a33777] | 87 | scanf( "%*[ \f\n\r\t\v]" ); // ignore whitespace // |\n|
|
---|
[5764204] | 88 | scanf( "'%[^']'", s ); printf( "20 %s\n", s ); // |'abc '|
|
---|
[8a33777] | 89 | scanf( "%*[ \f\n\r\t\v]" ); // ignore whitespace // |\n|
|
---|
[5764204] | 90 | scanf( "{%[^}]}", s ); printf( "21 %s\n", s ); // |{ d d\n\nd }|
|
---|
[8a33777] | 91 | scanf( "%*[ \f\n\r\t\v]" ); // ignore whitespace // |\n|
|
---|
[5764204] | 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|
|
---|
[8a33777] | 95 | scanf( "\n" ); // must start next line // |\n|
|
---|
[ca8824d] | 96 | }
|
---|
| 97 | {
|
---|
| 98 | char s[] = "yyyyyyyyyyyyyyyyyyyy";
|
---|
[dc5072f] | 99 | char sk[] = "abc";
|
---|
[389fbf5] | 100 | sin | "abc " | skip( sk ) | skip( 5 ); sout | "1" | s;
|
---|
[329487c] | 101 | sin | wdi( sizeof(s), s ); sout | "2" | s;
|
---|
| 102 | sin | ignore( s ); sout | "3" | s;
|
---|
| 103 | sin | wdi( sizeof(s), 8, s ); sout | "4" | s;
|
---|
| 104 | sin | ignore( wdi( sizeof(s), 8, s ) ); sout | "5" | s;
|
---|
| 105 |
|
---|
| 106 | sin | incl( "abc", wdi( sizeof(s), s ) ); sout | "6" | s;
|
---|
| 107 | sin | excl( "abc", wdi( sizeof(s), s ) ); sout | "7" | s;
|
---|
[74c6748] | 108 | sin | ignore( incl( "abc", wdi( sizeof(s), s ) ) ); sout | "8" | s;
|
---|
| 109 | sin | ignore( excl( "abc", wdi( sizeof(s), s ) ) ); sout | "9" | s;
|
---|
[329487c] | 110 | sin | incl( "abc", wdi( sizeof(s), 8, s ) ); sout | "10" | s;
|
---|
| 111 | sin | excl( "abc", wdi( sizeof(s), 8, s ) ); sout | "11" | s;
|
---|
| 112 | sin | ignore( incl( "abc", wdi( sizeof(s), 8, s ) ) ); sout | "12" | s;
|
---|
| 113 | sin | ignore( excl( "abc", wdi( sizeof(s), 8, s ) ) ); sout | "13" | s;
|
---|
[8a33777] | 114 | sin | "\n";
|
---|
[8cffa4f] | 115 |
|
---|
| 116 | s[0] = 'q'; s[1] = '\0';
|
---|
| 117 | sin | incl( "abc", wdi( sizeof(s), s ) ); sout | "14" | s;
|
---|
| 118 | s[0] = 'q'; s[1] = '\0';
|
---|
| 119 | sin | excl( "u", wdi( sizeof(s), s ) ); sout | "15" | s;
|
---|
[ca2feff] | 120 | sin | skip( "u" ) | "\n";
|
---|
| 121 | sin | getline( wdi( sizeof(s), s ) ); sout | "16" | s;
|
---|
| 122 | sin | getline( wdi( sizeof(s), s ), '%' ) | "\n"; sout | "17" | s;
|
---|
[5764204] | 123 | sin | ignore( getline( wdi( sizeof(s), s ), '%' ) ) | "\n"; sout | "18" | s;
|
---|
[ca2feff] | 124 |
|
---|
[5764204] | 125 | sin | quoted( wdi( sizeof(s), s ) ); sout | "19" | s;
|
---|
| 126 | sin | quoted( wdi( sizeof(s), s ), '\'' ); sout | "20" | s;
|
---|
| 127 | sin | quoted( wdi( sizeof(s), s ), '{', '}' ); sout | "21" | s;
|
---|
| 128 | sin | quoted( wdi( sizeof(s), s ), 'X', 'Y' ); sout | "22" | s;
|
---|
| 129 | sin | ignore( quoted( wdi( sizeof(s), s ), 'X', 'Y' ) ); sout | "23" | s;
|
---|
[ca8824d] | 130 | }
|
---|
[ca2feff] | 131 | // Keep harmonized with collections/string-istream-manip
|
---|
[ca8824d] | 132 | {
|
---|
| 133 | char c;
|
---|
[329487c] | 134 | sin | c; sout | c;
|
---|
| 135 | sin | ignore( c ); sout | c;
|
---|
[ca8824d] | 136 |
|
---|
| 137 | signed char sc;
|
---|
[329487c] | 138 | sin | sc; sout | sc;
|
---|
| 139 | sin | wdi( 3, sc ); sout | sc;
|
---|
| 140 | sin | ignore( sc ); sout | sc;
|
---|
| 141 | sin | ignore( wdi( 3, sc ) ); sout | sc;
|
---|
[ca8824d] | 142 |
|
---|
| 143 | unsigned char usc;
|
---|
[329487c] | 144 | sin | usc; sout | usc;
|
---|
| 145 | sin | wdi( 3, usc ); sout | usc;
|
---|
| 146 | sin | ignore( usc ); sout | usc;
|
---|
| 147 | sin | ignore( wdi( 3, usc ) ); sout | usc;
|
---|
[ca8824d] | 148 |
|
---|
| 149 | signed short int ssi;
|
---|
[329487c] | 150 | sin | ssi; sout | ssi;
|
---|
| 151 | sin | wdi( 3, ssi ); sout | ssi;
|
---|
| 152 | sin | ignore( ssi ); sout | ssi;
|
---|
| 153 | sin | ignore( wdi( 3, ssi ) ); sout | ssi;
|
---|
[ca8824d] | 154 |
|
---|
| 155 | unsigned short int usi;
|
---|
[329487c] | 156 | sin | usi; sout | usi;
|
---|
| 157 | sin | wdi( 3, usi ); sout | usi;
|
---|
| 158 | sin | ignore( usi ); sout | usi;
|
---|
| 159 | sin | ignore( wdi( 3, usi ) ); sout | usi;
|
---|
[ca8824d] | 160 |
|
---|
| 161 | signed int si;
|
---|
[329487c] | 162 | sin | si; sout | si;
|
---|
| 163 | sin | wdi( 3, si ); sout | si;
|
---|
| 164 | sin | ignore( si ); sout | si;
|
---|
| 165 | sin | ignore( wdi( 3, si ) ); sout | si;
|
---|
[ca8824d] | 166 |
|
---|
| 167 | unsigned int ui;
|
---|
[329487c] | 168 | sin | ui; sout | ui;
|
---|
| 169 | sin | wdi( 3, ui ); sout | ui;
|
---|
| 170 | sin | ignore( ui ); sout | ui;
|
---|
| 171 | sin | ignore( wdi( 3, ui ) ); sout | ui;
|
---|
[ca8824d] | 172 |
|
---|
| 173 | signed long int sli;
|
---|
[329487c] | 174 | sin | sli; sout | sli;
|
---|
| 175 | sin | wdi( 3, sli ); sout | sli;
|
---|
| 176 | sin | ignore( sli ); sout | sli;
|
---|
| 177 | sin | ignore( wdi( 3, sli ) ); sout | sli;
|
---|
[ca8824d] | 178 |
|
---|
| 179 | unsigned long int uli;
|
---|
[329487c] | 180 | sin | uli; sout | uli;
|
---|
| 181 | sin | wdi( 3, uli ); sout | uli;
|
---|
| 182 | sin | ignore( uli ); sout | uli;
|
---|
| 183 | sin | ignore( wdi( 3, uli ) ); sout | uli;
|
---|
[ca8824d] | 184 |
|
---|
| 185 | signed long long int slli;
|
---|
[329487c] | 186 | sin | slli; sout | slli;
|
---|
| 187 | sin | wdi( 3, slli ); sout | slli;
|
---|
| 188 | sin | ignore( slli ); sout | slli;
|
---|
| 189 | sin | ignore( wdi( 3, slli ) ); sout | slli;
|
---|
[ca8824d] | 190 |
|
---|
| 191 | unsigned long long int ulli;
|
---|
[329487c] | 192 | sin | ulli; sout | ulli;
|
---|
| 193 | sin | wdi( 3, ulli ); sout | ulli;
|
---|
| 194 | sin | ignore( ulli ); sout | ulli;
|
---|
| 195 | sin | ignore( wdi( 3, ulli ) ); sout | ulli;
|
---|
[ca8824d] | 196 |
|
---|
| 197 | float f;
|
---|
[329487c] | 198 | sin | f; sout | f;
|
---|
| 199 | sin | wdi( 8, f ); sout | f;
|
---|
| 200 | sin | ignore( f ); sout | f;
|
---|
| 201 | sin | ignore( wdi( 8, f ) ); sout | f;
|
---|
[ca8824d] | 202 |
|
---|
| 203 | double d;
|
---|
[329487c] | 204 | sin | d; sout | d;
|
---|
| 205 | sin | wdi( 8, d ); sout | d;
|
---|
| 206 | sin | ignore( d ); sout | d;
|
---|
| 207 | sin | ignore( wdi( 8, d ) ); sout | d;
|
---|
[ca8824d] | 208 |
|
---|
| 209 | long double ld;
|
---|
[329487c] | 210 | sin | ld; sout | ld;
|
---|
| 211 | sin | wdi( 8, ld ); sout | ld;
|
---|
| 212 | sin | ignore( ld ); sout | ld;
|
---|
| 213 | sin | ignore( wdi( 8, ld ) ); sout | ld;
|
---|
[ca8824d] | 214 |
|
---|
| 215 | float _Complex fc;
|
---|
[329487c] | 216 | sin | fc; sout | fc;
|
---|
| 217 | sin | wdi( 8, fc ); sout | fc;
|
---|
| 218 | sin | ignore( fc ); sout | fc;
|
---|
| 219 | sin | ignore( wdi( 8, fc ) ); sout | fc;
|
---|
[ca8824d] | 220 |
|
---|
| 221 | double _Complex dc;
|
---|
[329487c] | 222 | sin | dc; sout | dc;
|
---|
| 223 | sin | wdi( 8, dc ); sout | dc;
|
---|
| 224 | sin | ignore( dc ); sout | dc;
|
---|
| 225 | sin | ignore( wdi( 8, dc ) ); sout | dc;
|
---|
[ca8824d] | 226 |
|
---|
| 227 | long double _Complex ldc;
|
---|
[329487c] | 228 | sin | ldc; sout | ldc;
|
---|
| 229 | sin | wdi( 8, ldc ); sout | ldc;
|
---|
| 230 | sin | ignore( ldc ); sout | ldc;
|
---|
| 231 | sin | ignore( wdi( 8, ldc ) ); sout | ldc;
|
---|
[ca8824d] | 232 | }
|
---|
[6527150] | 233 | #if defined( __SIZEOF_INT128__ )
|
---|
[20f5eb8] | 234 | {
|
---|
| 235 | int128 val;
|
---|
| 236 | for ( 15 ) {
|
---|
| 237 | sin | val;
|
---|
| 238 | sout | val;
|
---|
| 239 | }
|
---|
| 240 | }
|
---|
[6527150] | 241 | #endif // __SIZEOF_INT128__
|
---|
[ca8824d] | 242 | } // main
|
---|
| 243 |
|
---|
| 244 | // Local Variables: //
|
---|
| 245 | // tab-width: 4 //
|
---|
[dc5072f] | 246 | // compile-command: "cfa -Wall -Wextra manipulatorsInput.cfa" //
|
---|
[ca8824d] | 247 | // End: //
|
---|