Changes in / [278e162:4d2d7e27]
- Files:
-
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/collections/string.cfa
r278e162 r4d2d7e27 10 10 // Created On : Fri Sep 03 11:00:00 2021 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Oct 18 21:52:09202313 // Update Count : 20 812 // Last Modified On : Sat Sep 2 12:05:57 2023 13 // Update Count : 206 14 14 // 15 15 … … 138 138 139 139 void ?|?( ifstream & in, _Istream_Sstr f ) { 140 (ifstream &)(in | f); 140 (ifstream &)(in | f); ends( in ); 141 141 } 142 142 -
libcfa/src/collections/string_res.cfa
r278e162 r4d2d7e27 10 10 // Created On : Fri Sep 03 11:00:00 2021 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Oct 18 21:54:54202313 // Update Count : 1 512 // Last Modified On : Mon Aug 14 18:06:01 2023 13 // Update Count : 12 14 14 // 15 15 … … 236 236 // get bytes 237 237 try { 238 *(temp.Handle.ulink->EndVbyte) = '\0'; // pre-assign empty cstring239 238 in | wdi( lenReadable, temp.Handle.ulink->EndVbyte ); 240 239 } catch (cstring_length*) { … … 248 247 } 249 248 250 if ( temp.Handle.lnth > 0 )s = temp;249 s = temp; 251 250 return in; 252 251 } 253 252 254 253 void ?|?( ifstream & in, string_res & this ) { 255 (ifstream &)(in | this); 254 (ifstream &)(in | this); ends( in ); 256 255 } 257 256 … … 269 268 cstr[wd] = '\0'; // guard null terminate string 270 269 try { 271 cstr[0] = '\0'; // pre-assign as empty cstring272 270 is | cf; 273 271 } catch( cstring_length * ) { 274 272 cont = true; 275 273 } finally { 276 if ( ! cf.flags.ignore && // ok to initialize string 277 cstr[0] != '\0' ) { // something was read 278 *(f.s) = cstr; 279 } 274 if ( ! cf.flags.ignore ) *(f.s) = cstr; // ok to initialize string 280 275 } // try 281 276 for ( ; cont; ) { // overflow read ? 282 277 cont = false; 283 278 try { 284 cstr[0] = '\0'; // pre-assign as empty cstring285 279 is | cf; 286 280 } catch( cstring_length * ) { 287 281 cont = true; // continue not allowed 288 282 } finally { 289 if ( ! cf.flags.ignore && 290 cstr[0] != '\0' ) { // something was read 291 *(f.s) += cstr; // build string chunk at a time 292 } 283 if ( ! cf.flags.ignore ) *(f.s) += cstr; // build string chunk at a time 293 284 } // try 294 285 } // for … … 297 288 298 289 void ?|?( ifstream & in, _Istream_Rstr f ) { 299 (ifstream &)(in | f); 290 (ifstream &)(in | f); ends( in ); 300 291 } 301 292 -
libcfa/src/concurrency/channel.hfa
r278e162 r4d2d7e27 28 28 unlock( lock ); 29 29 park(); 30 __atomic_thread_fence( __ATOMIC_SEQ_CST );31 30 return sn.extra == 0p; 32 31 } -
libcfa/src/fstream.cfa
r278e162 r4d2d7e27 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Oct 18 22:05:54202313 // Update Count : 54 912 // Last Modified On : Fri Aug 18 10:41:17 2023 13 // Update Count : 541 14 14 // 15 15 … … 230 230 void nlOff( ifstream & os ) { os.nlOnOff$ = false; } 231 231 232 void ends( ifstream & is ) {} 233 232 234 bool eof( ifstream & is ) { return feof( (FILE *)(is.file$) ) != 0; } 233 235 … … 309 311 } // if 310 312 va_end( args ); 311 // if ( len == 0 ) throw ExceptionInst( missing_data );312 313 return len; 313 314 } // fmt -
libcfa/src/fstream.hfa
r278e162 r4d2d7e27 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Oct 18 20:30:12202313 // Update Count : 2 6112 // Last Modified On : Fri Aug 18 10:41:15 2023 13 // Update Count : 258 14 14 // 15 15 … … 117 117 void nlOn( ifstream & ); 118 118 void nlOff( ifstream & ); 119 void ends( ifstream & ); 119 120 int fmt( ifstream &, const char format[], ... ) __attribute__(( format(scanf, 2, 3) )); 120 ifstream & ungetc( ifstream & is, char c );121 bool eof( ifstream & is );122 121 123 122 bool fail( ifstream & is ); 124 123 void clear( ifstream & ); 124 bool eof( ifstream & is ); 125 125 void open( ifstream & is, const char name[], const char mode[] ); // FIX ME: use default = "r" 126 126 void open( ifstream & is, const char name[] ); 127 127 void close( ifstream & is ); 128 128 129 ifstream & read( ifstream & is, char data[], size_t size ); 130 ifstream & ungetc( ifstream & is, char c ); 129 131 130 132 void ?{}( ifstream & is ); -
libcfa/src/iostream.cfa
r278e162 r4d2d7e27 1 1 2 // 2 3 // Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo … … 10 11 // Created On : Wed May 27 17:56:53 2015 11 12 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Oct 19 21:10:10202313 // Update Count : 1 80113 // Last Modified On : Sun Oct 8 12:10:21 2023 14 // Update Count : 1564 14 15 // 15 16 … … 784 785 return is; 785 786 } // ?|? 787 ISTYPE_VOID_IMPL( bool & ) 786 788 787 789 istype & ?|?( istype & is, char & c ) { … … 795 797 return is; 796 798 } // ?|? 799 ISTYPE_VOID_IMPL( char & ) 797 800 798 801 istype & ?|?( istype & is, signed char & sc ) { … … 800 803 return is; 801 804 } // ?|? 805 ISTYPE_VOID_IMPL( signed char & ) 802 806 803 807 istype & ?|?( istype & is, unsigned char & usc ) { … … 805 809 return is; 806 810 } // ?|? 811 ISTYPE_VOID_IMPL( unsigned char & ) 807 812 808 813 istype & ?|?( istype & is, short int & si ) { … … 810 815 return is; 811 816 } // ?|? 817 ISTYPE_VOID_IMPL( short int & ) 812 818 813 819 istype & ?|?( istype & is, unsigned short int & usi ) { … … 815 821 return is; 816 822 } // ?|? 823 ISTYPE_VOID_IMPL( unsigned short int & ) 817 824 818 825 istype & ?|?( istype & is, int & i ) { … … 820 827 return is; 821 828 } // ?|? 829 ISTYPE_VOID_IMPL( int & ) 822 830 823 831 istype & ?|?( istype & is, unsigned int & ui ) { … … 825 833 return is; 826 834 } // ?|? 835 ISTYPE_VOID_IMPL( unsigned int & ) 827 836 828 837 istype & ?|?( istype & is, long int & li ) { … … 830 839 return is; 831 840 } // ?|? 841 ISTYPE_VOID_IMPL( long int & ) 832 842 833 843 istype & ?|?( istype & is, unsigned long int & ulli ) { … … 835 845 return is; 836 846 } // ?|? 847 ISTYPE_VOID_IMPL( unsigned long int & ) 837 848 838 849 istype & ?|?( istype & is, long long int & lli ) { … … 840 851 return is; 841 852 } // ?|? 853 ISTYPE_VOID_IMPL( long long int & ) 842 854 843 855 istype & ?|?( istype & is, unsigned long long int & ulli ) { … … 845 857 return is; 846 858 } // ?|? 859 ISTYPE_VOID_IMPL( unsigned long long int & ) 847 860 848 861 #if defined( __SIZEOF_INT128__ ) … … 850 863 return (istype &)(is | (unsigned int128 &)llli); 851 864 } // ?|? 865 ISTYPE_VOID_IMPL( int128 & ) 852 866 853 867 istype & ?|?( istype & is, unsigned int128 & ullli ) { … … 866 880 return is; 867 881 } // ?|? 882 ISTYPE_VOID_IMPL( unsigned int128 & ) 868 883 #endif // __SIZEOF_INT128__ 869 884 … … 872 887 return is; 873 888 } // ?|? 889 ISTYPE_VOID_IMPL( float & ) 874 890 875 891 istype & ?|?( istype & is, double & d ) { … … 877 893 return is; 878 894 } // ?|? 895 ISTYPE_VOID_IMPL( double & ) 879 896 880 897 istype & ?|?( istype & is, long double & ld ) { … … 882 899 return is; 883 900 } // ?|? 901 ISTYPE_VOID_IMPL( long double & ) 884 902 885 903 istype & ?|?( istype & is, float _Complex & fc ) { … … 889 907 return is; 890 908 } // ?|? 909 ISTYPE_VOID_IMPL( float _Complex & ) 891 910 892 911 istype & ?|?( istype & is, double _Complex & dc ) { … … 896 915 return is; 897 916 } // ?|? 917 ISTYPE_VOID_IMPL( double _Complex & ) 898 918 899 919 istype & ?|?( istype & is, long double _Complex & ldc ) { … … 903 923 return is; 904 924 } // ?|? 925 ISTYPE_VOID_IMPL( long double _Complex & ) 905 926 906 927 istype & ?|?( istype & is, const char fmt[] ) { … … 908 929 return is; 909 930 } // ?|? 931 ISTYPE_VOID_IMPL( const char * ) 910 932 911 933 // manipulators … … 915 937 916 938 void ?|?( istype & is, istype & (* manip)( istype & ) ) { 917 manip( is ); 939 manip( is ); ends( is ); 918 940 } // ?|? 919 941 … … 944 966 char fmtstr[ sizeof("%*[]") + nscanset ]; 945 967 int pos = 0; 946 strcpy( &fmtstr[pos], "%*[" ); pos += 3; 968 fmtstr[pos] = '%'; pos += 1; 969 fmtstr[pos] = '*'; pos += 1; 970 fmtstr[pos] = '['; pos += 1; 947 971 strcpy( &fmtstr[pos], f.scanset ); pos += nscanset; 948 strcpy( &fmtstr[pos], "]" ); 949 fmt( is, fmtstr, "" ); // skip scanset 950 } else { 951 char ch; 952 // fprintf( stderr, "skip " ); 953 for ( f.wd ) { // skip N characters 954 if ( eof( is ) ) break; 955 fmt( is, "%c", &ch ); 956 // fprintf( stderr, "`%c' ", ch ); 957 } // for 958 } // if 972 fmtstr[pos] = ']'; pos += 1; 973 fmtstr[pos] = '\0'; 974 fmt( is, fmtstr, (void*)0 ); // last arg is dummy: suppress gcc warning 975 } 976 else for ( f.wd ) fmt( is, "%*c" ); 959 977 return is; 960 978 } 979 ISTYPE_VOID_IMPL( _Istream_Cskip ) 961 980 962 981 istype & ?|?( istype & is, _Istream_Cstr f ) { 963 const char * scanset; 964 size_t nscanset = 0; 982 const char * scanset = f.scanset; 965 983 if ( f.flags.delimiter ) scanset = f.delimiter; // getline ? 966 else scanset = f.scanset; 967 if ( scanset ) nscanset = strlen( scanset ); 968 969 char fmtstr[nscanset + 32]; // storage for scanset and format codes 984 985 size_t len = 0; 986 if ( scanset ) len = strlen( scanset ); 987 char fmtstr[len + 16]; 988 int start = 1; 970 989 fmtstr[0] = '%'; 971 972 int pos = 1; 973 int args; 974 bool check = true; 975 976 if ( f.flags.ignore ) { check = false; fmtstr[1] = '*'; pos += 1; } 977 int rwd = f.wd; 978 if ( f.wd != -1 ) { // => just ignore versus ignore with width 990 if ( f.flags.ignore ) { fmtstr[1] = '*'; start += 1; } 991 // no maximum width necessary because text ignored => width is read width 992 if ( f.wd != -1 ) { 979 993 // wd is buffer bytes available (for input chars + null terminator) 980 994 // rwd is count of input chars 981 // no maximum width necessary because text ignored => width is read width 982 if ( f.flags.rwd ) check = false; 983 else rwd = f.wd - 1; 984 pos += sprintf( &fmtstr[pos], "%d", rwd ); 995 int rwd; 996 if (f.flags.rwd) { 997 verify (f.wd >= 0); 998 rwd = f.wd; 999 } else { 1000 verify (f.wd >= 1); 1001 rwd = f.wd - 1; 1002 } // if 1003 start += sprintf( &fmtstr[start], "%d", rwd ); 1004 } 1005 1006 if ( ! scanset ) { 1007 // %s, %*s, %ws, %*ws 1008 fmtstr[start] = 's'; fmtstr[start + 1] = '\0'; 1009 // printf( "cstr %s\n", fmtstr ); 1010 } else { 1011 // incl %[xxx], %*[xxx], %w[xxx], %*w[xxx] 1012 // excl %[^xxx], %*[^xxx], %w[^xxx], %*w[^xxx] 1013 fmtstr[start] = '['; start += 1; 1014 if ( f.flags.inex ) { fmtstr[start] = '^'; start += 1; } 1015 strcpy( &fmtstr[start], scanset ); // copy includes '\0' 1016 len += start; 1017 fmtstr[len] = ']'; fmtstr[len + 1] = '\0'; 1018 // printf( "incl/excl %s\n", fmtstr ); 985 1019 } // if 986 1020 987 if ( ! scanset ) { // %s, %*s, %ws, %*ws 988 // fprintf( stderr, "cstr %s\n", f.s ); 989 strcpy( &fmtstr[pos], "s%n" ); 990 int len = 0; // may not be set in fmt 991 if ( f.flags.ignore ) args = fmt( is, fmtstr, &len ); // no string argument for '*' 992 else args = fmt( is, fmtstr, f.s, &len ); 993 // fprintf( stderr, "cstr %s %d %d %d %s\n", fmtstr, args, len, f.wd, f.s ); 994 if ( check && len >= rwd && ! eof( is ) ) { // might not fit 1021 int check = f.wd - 2; 1022 if (! f.flags.ignore ) { 1023 f.s[0] = '\0'; 1024 if ( ! f.flags.rwd ) f.s[check] = '\0'; // insert sentinel 1025 } 1026 len = fmt( is, fmtstr, f.s ); 1027 //fprintf( stderr, "KK %s %zd %d %c %s\n", fmtstr, len, check, f.s[check], f.s ); 1028 1029 if ( ! f.flags.ignore && ! f.flags.rwd && f.s[check] != '\0' ) { // sentinel overwritten ? 1030 // buffer filled, but would we have kept going? 1031 if ( ! eof( is ) ) { 995 1032 char peek; 996 fmt( is, "%c", &peek ); // check for whitespace terminator 997 // fprintf( stderr, "peek %d '%c'\n", args, peek ); 998 if ( ! eof( is ) ) { 999 ungetc( is, peek ); 1000 if ( ! isspace( peek ) ) throw ExceptionInst( cstring_length ); 1001 } // if 1002 } // if 1003 } else { 1004 if ( f.flags.delimiter ) { // getline 1005 // fprintf( stderr, "getline\n" ); 1006 sprintf( &fmtstr[pos], "[%s%s]%%n", f.flags.inex ? "^" : "", scanset ); 1007 // fprintf( stderr, "getline %s %d\n", fmtstr, f.wd ); 1008 int len = 0; // may not be set in fmt 1009 if ( f.flags.ignore ) args = fmt( is, fmtstr, &len ); // no string argument for '*' 1010 else args = fmt( is, fmtstr, f.s, &len ); 1011 // fprintf( stderr, "getline %s %d %d %d\n", fmtstr, args, f.wd, eof( is ) ); 1012 if ( check && len == rwd && ! eof( is ) ) { // might not fit 1013 char peek; 1014 fmt( is, "%c", &peek ); // check for delimiter 1015 // fprintf( stderr, "peek %d '%c'\n", args, peek ); 1016 if ( ! eof( is ) ) { 1017 if ( peek != f.delimiter[0] ) { 1018 ungetc( is, peek ); 1019 throw ExceptionInst( cstring_length ); 1020 } // if 1021 } // if 1022 } else fmt( is, "%*c" ); // remove delimiter 1023 } else { 1024 // incl %[xxx], %*[xxx], %w[xxx], %*w[xxx] 1025 // excl %[^xxx], %*[^xxx], %w[^xxx], %*w[^xxx] 1026 sprintf( &fmtstr[pos], "[%s%s]%%n", f.flags.inex ? "^" : "", scanset ); 1027 // fprintf( stderr, "incl/excl %s %d\n", fmtstr, f.wd ); 1028 int len = 0; // may not be set in fmt 1029 if ( f.flags.ignore ) args = fmt( is, fmtstr, &len ); // no string argument for '*' 1030 else args = fmt( is, fmtstr, f.s, &len ); 1031 // fprintf( stderr, "incl/excl %s \"%s\" %d %d %d %d %d %c\n", fmtstr, f.s, args, f.wd, len, eof( is ), check, f.s[f.wd] ); 1032 if ( check && len == rwd && ! eof( is ) ) { // might not fit 1033 // fprintf( stderr, "overflow\n" ); 1034 char peek; 1035 fmt( is, "%c", &peek ); // check for whitespace terminator 1036 // fprintf( stderr, "peek %d '%c'\n", args, peek ); 1037 if ( ! eof( is ) ) { 1038 ungetc( is, peek ); 1039 if ( f.flags.inex ^ strchr( f.scanset, peek ) != 0p ) throw ExceptionInst( cstring_length ); 1040 } // if 1041 } // if 1033 fmt( is, "%c", &peek ); 1034 ungetc( is, peek ); 1035 bool hasMore; 1036 if (f.flags.delimiter) { // getline 1037 hasMore = (peek != f.delimiter[0]); 1038 } else if (f.scanset) { // incl/excl 1039 bool peekMatch = strchr(f.scanset, peek) != 0p; 1040 hasMore = f.flags.inex ? (!peekMatch) : (peekMatch); 1041 } else { // %s 1042 hasMore = !isspace(peek); 1043 } 1044 if (hasMore) throw (cstring_length){ &cstring_length_vt }; 1042 1045 } // if 1043 1046 } // if 1044 if ( args == 1 && eof( is ) ) { // data but scan ended at EOF 1045 // fprintf( stderr, "clear\n" ); 1046 clear( is ); // => reset EOF => detect again on next read 1047 } // if 1048 return is; 1049 } // ?|? 1047 1048 if ( f.flags.delimiter ) { // getline ? 1049 if ( len == 0 ) f.s[0] = '\0'; // empty read => argument unchanged => set empty 1050 if ( ! eof( is ) ) { // ignore delimiter, may not be present because of width 1051 char delimiter; 1052 fmt( is, "%c", &delimiter ); 1053 if ( delimiter != f.delimiter[0] ) ungetc( is, delimiter ); 1054 } // if 1055 } //if 1056 return is; 1057 } // ?|? 1058 ISTYPE_VOID_IMPL( _Istream_Cstr ) 1050 1059 1051 1060 istype & ?|?( istype & is, _Istream_Char f ) { … … 1053 1062 return is; 1054 1063 } // ?|? 1064 ISTYPE_VOID_IMPL( _Istream_Char ) 1055 1065 } // distribution 1056 1066 … … 1069 1079 return is; \ 1070 1080 } /* ?|? */ \ 1081 ISTYPE_VOID_IMPL( _Istream_Manip(T) ) \ 1071 1082 } // distribution 1072 1083 … … 1096 1107 return is; 1097 1108 } // ?|? 1109 ISTYPE_VOID_IMPL( _Istream_Manip(float _Complex) ) 1098 1110 1099 1111 istype & ?|?( istype & is, _Istream_Manip(double _Complex) dc ) { … … 1106 1118 return is; 1107 1119 } // ?|? 1120 ISTYPE_VOID_IMPL( _Istream_Manip(double _Complex) ) 1108 1121 1109 1122 istype & ?|?( istype & is, _Istream_Manip(long double _Complex) ldc ) { … … 1116 1129 return is; 1117 1130 } // ?|? 1131 ISTYPE_VOID_IMPL( _Istream_Manip(long double _Complex) ) 1118 1132 } // distribution 1119 1133 -
libcfa/src/iostream.hfa
r278e162 r4d2d7e27 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Oct 18 21:21:20202313 // Update Count : 5 8312 // Last Modified On : Sun Oct 8 12:02:55 2023 13 // Update Count : 568 14 14 // 15 15 … … 306 306 // *********************************** istream *********************************** 307 307 308 #define ISTYPE_VOID( T ) void ?|?( istype &, T ) 309 #define ISTYPE_VOID_IMPL( T ) \ 310 void ?|?( istype & is, T t ) { \ 311 (istype &)(is | t); ends( is ); \ 312 } // ?|? 313 308 314 forall( istype & ) 309 315 trait basic_istream { … … 314 320 void nlOn( istype & ); // read newline 315 321 void nlOff( istype & ); // scan newline 322 void ends( istype & os ); // end of output statement 316 323 int fmt( istype &, const char format[], ... ) __attribute__(( format(scanf, 2, 3) )); 317 324 istype & ungetc( istype &, char ); 318 325 bool eof( istype & ); 319 void clear( istype & );320 326 }; // basic_istream 321 327 … … 323 329 trait istream { 324 330 bool fail( istype & ); 325 void open( istype & is, const char name[], const char mode[]);331 void clear( istype & ); 326 332 void open( istype & is, const char name[] ); 327 333 void close( istype & is ); … … 336 342 forall( istype & | basic_istream( istype ) ) { 337 343 istype & ?|?( istype &, bool & ); 344 ISTYPE_VOID( bool & ); 338 345 339 346 istype & ?|?( istype &, char & ); 347 ISTYPE_VOID( char & ); 340 348 istype & ?|?( istype &, signed char & ); 349 ISTYPE_VOID( signed char & ); 341 350 istype & ?|?( istype &, unsigned char & ); 351 ISTYPE_VOID( unsigned char & ); 342 352 343 353 istype & ?|?( istype &, short int & ); 354 ISTYPE_VOID( short int & ); 344 355 istype & ?|?( istype &, unsigned short int & ); 356 ISTYPE_VOID( unsigned short int & ); 345 357 istype & ?|?( istype &, int & ); 358 ISTYPE_VOID( int & ); 346 359 istype & ?|?( istype &, unsigned int & ); 360 ISTYPE_VOID( unsigned int & ); 347 361 istype & ?|?( istype &, long int & ); 362 ISTYPE_VOID( long int & ); 348 363 istype & ?|?( istype &, unsigned long int & ); 364 ISTYPE_VOID( unsigned long int & ); 349 365 istype & ?|?( istype &, long long int & ); 366 ISTYPE_VOID( long long int & ); 350 367 istype & ?|?( istype &, unsigned long long int & ); 368 ISTYPE_VOID( unsigned long long int & ); 351 369 #if defined( __SIZEOF_INT128__ ) 352 370 istype & ?|?( istype &, int128 & ); 371 ISTYPE_VOID( int128 & ); 353 372 istype & ?|?( istype &, unsigned int128 & ); 373 ISTYPE_VOID( unsigned int128 & ); 354 374 #endif // __SIZEOF_INT128__ 355 375 356 376 istype & ?|?( istype &, float & ); 377 ISTYPE_VOID( float & ); 357 378 istype & ?|?( istype &, double & ); 379 ISTYPE_VOID( double & ); 358 380 istype & ?|?( istype &, long double & ); 381 ISTYPE_VOID( long double & ); 359 382 360 383 istype & ?|?( istype &, float _Complex & ); 384 ISTYPE_VOID( float _Complex & ); 361 385 istype & ?|?( istype &, double _Complex & ); 386 ISTYPE_VOID( double _Complex & ); 362 387 istype & ?|?( istype &, long double _Complex & ); 388 ISTYPE_VOID( long double _Complex & ); 363 389 364 390 istype & ?|?( istype &, const char [] ); 391 ISTYPE_VOID( const char [] ); 365 392 366 393 // manipulators 367 394 istype & ?|?( istype &, istype & (*)( istype & ) ); 395 ISTYPE_VOID( istype & (*)( istype & ) ); 368 396 istype & nl( istype & is ); 369 397 istype & nlOn( istype & ); … … 374 402 375 403 ExceptionDecl( cstring_length ); 376 ExceptionDecl( missing_data );377 404 378 405 // *********************************** manipulators *********************************** 379 406 380 // skip does not compose with other C string manipulators.381 407 struct _Istream_Cskip { 382 408 const char * scanset; … … 390 416 forall( istype & | basic_istream( istype ) ) { 391 417 istype & ?|?( istype & is, _Istream_Cskip f ); 418 ISTYPE_VOID( _Istream_Cskip ); 392 419 } 393 420 … … 431 458 forall( istype & | basic_istream( istype ) ) { 432 459 istype & ?|?( istype & is, _Istream_Cstr f ); 460 ISTYPE_VOID( _Istream_Cstr ); 433 461 } 434 462 … … 443 471 forall( istype & | basic_istream( istype ) ) { 444 472 istype & ?|?( istype & is, _Istream_Char f ); 473 ISTYPE_VOID( _Istream_Char ); 445 474 } 446 475 … … 461 490 forall( istype & | basic_istream( istype ) ) { \ 462 491 istype & ?|?( istype & is, _Istream_Manip(T) f ); \ 492 ISTYPE_VOID( _Istream_Manip(T) ); \ 463 493 } // ?|? 464 494 -
src/CodeTools/DeclStats.cc
r278e162 r4d2d7e27 25 25 #include "Common/PassVisitor.h" 26 26 #include "Common/VectorMap.h" // for VectorMap 27 #include "GenPoly/GenPoly.h" // for hasPolyBase 27 28 #include "SynTree/LinkageSpec.h" // for ::NoOfSpecs, Spec 28 29 #include "SynTree/Declaration.h" // for FunctionDecl, TypeDecl, Declaration -
src/GenPoly/BoxNew.cpp
r278e162 r4d2d7e27 39 39 40 40 namespace { 41 42 /// Common field of several sub-passes of box. 43 struct BoxPass { 44 TypeVarMap scopeTypeVars; 45 BoxPass() : scopeTypeVars( ast::TypeData() ) {} 46 }; 47 48 // TODO: Could this be a common helper somewhere? 49 ast::FunctionType * makeFunctionType( ast::FunctionDecl const * decl ) { 50 ast::FunctionType * type = new ast::FunctionType( 51 decl->type->isVarArgs, decl->type->qualifiers 52 ); 53 for ( auto type_param : decl->type_params ) { 54 type->forall.emplace_back( new ast::TypeInstType( type_param ) ); 55 } 56 for ( auto assertion : decl->assertions ) { 57 type->assertions.emplace_back( new ast::VariableExpr( 58 assertion->location, assertion ) ); 59 } 60 for ( auto param : decl->params ) { 61 type->params.emplace_back( param->get_type() ); 62 } 63 for ( auto retval : decl->returns ) { 64 type->returns.emplace_back( retval->get_type() ); 65 } 66 return type; 67 } 41 68 42 69 // -------------------------------------------------------------------------- … … 332 359 /// * Adds appropriate type variables to the function calls. 333 360 struct CallAdapter final : 361 public BoxPass, 334 362 public ast::WithConstTypeSubstitution, 335 363 public ast::WithGuards, … … 410 438 CodeLocation const & location, ast::Type const * type ); 411 439 412 TypeVarMap scopeTypeVars;440 /// Set of adapter functions in the current scope. 413 441 ScopedMap< std::string, ast::DeclWithType const * > adapters; 414 442 std::map< ast::ApplicationExpr const *, ast::Expr const * > retVals; … … 631 659 ptrdiff_t initArgCount = mutExpr->args.size(); 632 660 633 TypeVarMap exprTypeVars ;661 TypeVarMap exprTypeVars = { ast::TypeData() }; 634 662 // TODO: Should this take into account the variables already bound in 635 663 // scopeTypeVars ([ex] remove them from exprTypeVars)? … … 1382 1410 1383 1411 ast::FunctionDecl const * DeclAdapter::previsit( ast::FunctionDecl const * decl ) { 1384 TypeVarMap localTypeVars ;1412 TypeVarMap localTypeVars = { ast::TypeData() }; 1385 1413 makeTypeVarMap( decl, localTypeVars ); 1386 1414 … … 1413 1441 layoutParams.emplace_back( alignParam ); 1414 1442 } 1415 // Assertions should be stored in the main list. 1416 assert( mutParam->assertions.empty() ); 1443 // TODO: These should possibly all be gone. 1444 // More all assertions into parameter list. 1445 for ( ast::ptr<ast::DeclWithType> & assert : mutParam->assertions ) { 1446 // Assertion parameters may not be used in body, 1447 // pass along with unused attribute. 1448 assert.get_and_mutate()->attributes.push_back( 1449 new ast::Attribute( "unused" ) ); 1450 inferredParams.push_back( assert ); 1451 } 1452 mutParam->assertions.clear(); 1417 1453 typeParam = mutParam; 1418 1454 } 1455 // TODO: New version of inner loop. 1419 1456 for ( ast::ptr<ast::DeclWithType> & assert : mutDecl->assertions ) { 1420 1457 // Assertion parameters may not be used in body, … … 1431 1468 spliceBegin( mutDecl->params, layoutParams ); 1432 1469 addAdapters( mutDecl, localTypeVars ); 1433 1434 // Now have to update the type to match the declaration.1435 ast::FunctionType * type = new ast::FunctionType(1436 mutDecl->type->isVarArgs, mutDecl->type->qualifiers );1437 for ( auto type_param : mutDecl->type_params ) {1438 type->forall.emplace_back( new ast::TypeInstType( type_param ) );1439 }1440 for ( auto param : mutDecl->params ) {1441 type->params.emplace_back( param->get_type() );1442 }1443 for ( auto retval : mutDecl->returns ) {1444 type->returns.emplace_back( retval->get_type() );1445 }1446 mutDecl->type = type;1447 1470 1448 1471 return mutDecl; … … 1478 1501 } 1479 1502 } 1503 // TODO: Can this be updated as we go along? 1504 mutDecl->type = makeFunctionType( mutDecl ); 1480 1505 return mutDecl; 1481 1506 } … … 1533 1558 assertf( it != adapters.end(), "Could not correct floating node." ); 1534 1559 return ast::mutate_field( expr, &ast::VariableExpr::var, it->second ); 1560 1535 1561 } 1536 1562 … … 1544 1570 /// * Inserts dynamic calculation of polymorphic type layouts where needed. 1545 1571 struct PolyGenericCalculator final : 1572 public BoxPass, 1546 1573 public ast::WithConstTypeSubstitution, 1547 1574 public ast::WithDeclsToAdd<>, … … 1588 1615 /// C sizeof(). 1589 1616 ast::Expr const * genSizeof( CodeLocation const &, ast::Type const * ); 1617 1590 1618 /// Enters a new scope for type-variables, 1591 1619 /// adding the type variables from the provided type. 1592 1620 void beginTypeScope( ast::Type const * ); 1593 1621 1594 /// The type variables and polymorphic parameters currently in scope.1595 TypeVarMap scopeTypeVars;1596 1622 /// Set of generic type layouts known in the current scope, 1597 1623 /// indexed by sizeofName. … … 1642 1668 ast::TypeDecl const * decl ) { 1643 1669 ast::Type const * base = decl->base; 1644 if ( nullptr == base 1670 if ( nullptr == base) return decl; 1645 1671 1646 1672 // Add size/align variables for opaque type declarations. … … 1667 1693 alignDecl->accept( *visitor ); 1668 1694 1669 // A little trick to replace this with two declarations.1670 // Adding after makes sure that there is no conflict with adding stmts.1695 // Can't use [makeVar], because it inserts into stmtsToAdd and TypeDecls 1696 // can occur at global scope. 1671 1697 declsToAddAfter.push_back( alignDecl ); 1698 // replace with sizeDecl. 1672 1699 return sizeDecl; 1673 1700 } … … 1694 1721 1695 1722 // Change initialization of a polymorphic value object to allocate via a 1696 // variable-length-array (alloca cannot be safely used in loops). 1723 // variable-length-array (alloca was previouly used, but it cannot be 1724 // safely used in loops). 1697 1725 ast::ObjectDecl * newBuf = new ast::ObjectDecl( decl->location, 1698 1726 bufNamer.newName(), … … 2182 2210 /// * Strips fields from generic structure declarations. 2183 2211 struct Eraser final : 2212 public BoxPass, 2184 2213 public ast::WithGuards { 2185 2214 void guardTypeVarMap( ast::Type const * type ) { … … 2196 2225 void previsit( ast::PointerType const * type ); 2197 2226 void previsit( ast::FunctionType const * type ); 2198 public:2199 TypeVarMap scopeTypeVars;2200 2227 }; 2201 2228 -
src/GenPoly/GenPoly.cc
r278e162 r4d2d7e27 273 273 if ( func->returns.empty() ) return nullptr; 274 274 275 TypeVarMap forallTypes ;275 TypeVarMap forallTypes = { ast::TypeData() }; 276 276 makeTypeVarMap( func, forallTypes ); 277 277 return isDynType( func->returns.front(), forallTypes ); … … 801 801 const ast::FunctionType * function = getFunctionType( expr->func->result ); 802 802 assertf( function, "ApplicationExpr has non-function type: %s", toString( expr->func->result ).c_str() ); 803 TypeVarMap exprTyVars ;803 TypeVarMap exprTyVars = { ast::TypeData() }; 804 804 makeTypeVarMap( function, exprTyVars ); 805 805 return needsBoxing( param, arg, exprTyVars, subst ); -
src/GenPoly/GenPoly.h
r278e162 r4d2d7e27 33 33 34 34 typedef ErasableScopedMap< std::string, TypeDecl::Data > TyVarMap; 35 struct TypeVarMap : public ErasableScopedMap<ast::TypeEnvKey, ast::TypeData> { 36 TypeVarMap() : ErasableScopedMap( ast::TypeData() ) {} 37 }; 35 using TypeVarMap = ErasableScopedMap< ast::TypeEnvKey, ast::TypeData >; 38 36 39 37 /// Replaces a TypeInstType by its referrent in the environment, if applicable -
src/GenPoly/SpecializeNew.cpp
r278e162 r4d2d7e27 81 81 } 82 82 83 // The number of elements in a list, if all tuples had been flattened.84 size_t flatT ypeListSize( const std::vector<ast::ptr<ast::Type>> & types) {85 size_t sum = 0;86 for ( const ast::ptr<ast::Type> & type : types ) {87 if ( const ast::TupleType * tuple = type.as<ast::TupleType>()) {88 sum += flatT ypeListSize( tuple->types);89 } else {90 sum += 1;91 }92 }93 return sum;83 // The number of elements in a type if it is a flattened tuple. 84 size_t flatTupleSize( const ast::Type * type ) { 85 if ( auto tuple = dynamic_cast<const ast::TupleType *>( type ) ) { 86 size_t sum = 0; 87 for ( auto t : *tuple ) { 88 sum += flatTupleSize( t ); 89 } 90 return sum; 91 } else { 92 return 1; 93 } 94 94 } 95 95 96 96 // Find the total number of components in a parameter list. 97 97 size_t functionParameterSize( const ast::FunctionType * type ) { 98 return flatTypeListSize( type->params ); 98 size_t sum = 0; 99 for ( auto param : type->params ) { 100 sum += flatTupleSize( param ); 101 } 102 return sum; 99 103 } 100 104 -
tests/collections/.expect/string-istream-manip.txt
r278e162 r4d2d7e27 69 69 13 wwwwwwww 70 70 14 cccc 71 15 q71 15 72 72 1 yyyyyyyyyyyyyyyyyyyy 73 73 2 abcxxx … … 84 84 13 wwwwwwww 85 85 14 cccc 86 15 q86 15 -
tests/collections/string-istream-manip.cfa
r278e162 r4d2d7e27 38 38 void echoTillX(const char * casename) { 39 39 string s; 40 // loop assumes behaviour not tested until main-case #15:41 // on reading nothing, the prior string value is left alone42 40 do { 43 s = "";44 41 forceStringHeapFreeSpaceTo(9); 45 42 sin | s; … … 57 54 string s; 58 55 do { 59 s = "";60 56 sin | plainjane( s ); 61 57 sout | casename | s; … … 72 68 string_res s; 73 69 do { 74 s = "";75 70 sin | plainjane( s ); 76 71 sout | casename | s; … … 87 82 string s; 88 83 do { 89 s = "";90 84 sin | skip("-\n"); 91 85 sin | incl( ".:|# x", s ); … … 103 97 string s; 104 98 do { 105 s = "";106 99 sin | skip("-\n"); 107 100 sin | excl( "-\n", s ); … … 120 113 string s; 121 114 do { 122 s = "";123 115 sin | getline( s ); 124 116 sout | casename | s; … … 135 127 string s; 136 128 do { 137 s = "";138 129 sin | getline( s, '@' ); 139 130 sout | casename | s; -
tests/concurrency/waituntil/channel_close.cfa
r278e162 r4d2d7e27 26 26 for( ;; ) { 27 27 if ( useAnd ) { 28 waituntil( (in << A) ) { __atomic_thread_fence( __ATOMIC_SEQ_CST );assert( A_removes == in ); A_removes++; removes++; }29 and waituntil( (in2 << B) ) { __atomic_thread_fence( __ATOMIC_SEQ_CST );assert( B_removes == in2 ); B_removes++; removes++; }28 waituntil( (in << A) ) { assert( A_removes == in ); A_removes++; removes++; } 29 and waituntil( (in2 << B) ) { assert( B_removes == in2 ); B_removes++; removes++; } 30 30 continue; 31 31 } 32 waituntil( (in << A) ) { __atomic_thread_fence( __ATOMIC_SEQ_CST );assert( A_removes == in ); A_removes++; removes++; }33 or waituntil( (in << B) ) { __atomic_thread_fence( __ATOMIC_SEQ_CST );( B_removes == in ); B_removes++; removes++; }32 waituntil( (in << A) ) { assert( A_removes == in ); A_removes++; removes++; } 33 or waituntil( (in << B) ) { assert( B_removes == in ); B_removes++; removes++; } 34 34 } 35 35 } catchResume ( channel_closed * e ) {} // continue to remove until would block … … 37 37 try { 38 38 for( ;; ) 39 waituntil( (in << A) ) { __atomic_thread_fence( __ATOMIC_SEQ_CST );assert( A_removes == in ); A_removes++; removes++; }39 waituntil( (in << A) ) { assert( A_removes == in ); A_removes++; removes++; } 40 40 } catchResume ( channel_closed * e ) {} // continue to remove until would block 41 41 catch ( channel_closed * e ) {} 42 42 try { 43 43 for( ;; ) 44 waituntil( (in << B) ) { __atomic_thread_fence( __ATOMIC_SEQ_CST );assert( B_removes == in ); B_removes++; removes++; }44 waituntil( (in << B) ) { assert( B_removes == in ); B_removes++; removes++; } 45 45 } catchResume ( channel_closed * e ) {} // continue to remove until would block 46 46 catch ( channel_closed * e ) {} -
tests/genericUnion.cfa
r278e162 r4d2d7e27 10 10 // Created On : Tue Dec 25 14:42:46 2018 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Oct 20 09:13:26 202313 // Update Count : 1512 // Last Modified On : Tue Dec 25 14:46:33 2018 13 // Update Count : 2 14 14 // 15 15 16 #include <fstream.hfa>17 16 #include <limits.hfa> 18 17 19 forall( T)18 forall(T) 20 19 union ByteView { 21 20 T val; … … 24 23 25 24 forall(T) 26 void print( ByteView(T) x) {27 for ( i; sizeof(int) ) {// want to change to sizeof(T)28 sout | nobase( pad0( wd( 2, hex( x.bytes[i] & 0xff ) ) ) ) | nosep;25 void print(ByteView(T) x) { 26 for (int i = 0; i < sizeof(int); i++) { // want to change to sizeof(T) 27 printf("%02x", x.bytes[i] & 0xff); 29 28 } 30 29 } 31 30 32 31 forall(T) 33 void f( ByteView(T) x, T val) {34 print( x);35 sout | " ";32 void f(ByteView(T) x, T val) { 33 print(x); 34 printf(" "); 36 35 x.val = val; 37 print( x);38 sout | nl;36 print(x); 37 printf("\n"); 39 38 } 40 39 41 40 int main() { 42 sout | nlOff;43 41 ByteView(unsigned) u = { 0 }; 44 42 ByteView(int) i = { 0 }; 45 f( u, MAX);46 f( i, -1);43 f(u, MAX); 44 f(i, -1); 47 45 } 48 46 -
tests/io/.expect/manipulatorsInput.arm64.txt
r278e162 r4d2d7e27 34 34 13 wwwwwwww 35 35 14 cccc 36 15 q36 15 37 37 a 38 38 a -
tests/io/.expect/manipulatorsInput.x64.txt
r278e162 r4d2d7e27 34 34 13 wwwwwwww 35 35 14 cccc 36 15 q36 15 37 37 a 38 38 a -
tests/io/.expect/manipulatorsInput.x86.txt
r278e162 r4d2d7e27 34 34 13 wwwwwwww 35 35 14 cccc 36 15 q36 15 37 37 a 38 38 a -
tests/io/.expect/manipulatorsOutput4.txt
r278e162 r4d2d7e27 225 225 -1.55051464826854e+28 -15.5051e27 -15.5051e27 -15.505e27 -15.505e27 -15.50515e27 -15.50515e27 -0015.505e27 -0015.505e27 -15.50515e27 -15.50515e27 -15.505e27 -15.505e27 -15.50515e27 -15.50515e27 -15.505e27 -15.505e27 -15.50515e27 -15.50515e27 226 226 -6.51216152272788e+29 -651.216e27 -651.216e27 -651.22e27 -651.22e27 -651.21615e27 -651.21615e27 -00651.22e27 -00651.22e27 -651.21615e27 -651.21615e27 -651.22e27 -651.22e27 -651.21615e27 -651.21615e27 -651.22e27 -651.22e27 -651.21615e27 -651.21615e27 227 0 1 1 1.0 1228 1 2 2 2.0 2229 2 4 4 4.0 4230 3 8 8 8.0 8231 4 16 16 16.0 16232 5 32 32 32.0 32233 6 64 64 64.0 64234 7 128 128 128.0 128235 8 256 256 256.0 256236 9 512 512 512.0 512237 10 1024 1.024K 1.0K 1K238 11 2048 2.048K 2.0K 2K239 12 4096 4.096K 4.1K 4K240 13 8192 8.192K 8.2K 8K241 14 16384 16.384K 16.4K 16K242 15 32768 32.768K 32.8K 33K243 16 65536 65.536K 65.5K 66K244 17 131072 131.072K 131.1K 131K245 18 262144 262.144K 262.1K 262K246 19 524288 524.288K 524.3K 524K247 20 1048576 1.04858M 1.0M 1M248 21 2097152 2.09715M 2.1M 2M249 22 4194304 4.1943M 4.2M 4M250 23 8388608 8.38861M 8.4M 8M251 24 16777216 16.7772M 16.8M 17M252 25 33554432 33.5544M 33.6M 34M253 26 67108864 67.1089M 67.1M 67M254 27 134217728 134.218M 134.2M 134M255 28 268435456 268.435M 268.4M 268M256 29 536870912 536.871M 536.9M 537M257 30 1073741824 1.07374G 1.1G 1G258 31 2147483648 2.14748G 2.1G 2G -
tests/io/manipulatorsOutput4.cfa
r278e162 r4d2d7e27 7 7 // Created On : Tue Apr 13 17:55:02 2021 8 8 // Last Modified By : Peter A. Buhr 9 // Last Modified On : Tue Oct 17 08:37:42 202310 // Update Count : 59 // Last Modified On : Tue Apr 13 18:00:33 2021 10 // Update Count : 4 11 11 // 12 12 … … 42 42 | left(ws(12,5, eng(w) )) | left(sign(ws(12,5, eng(w) ))) | left(wd(12,5, eng(w) )) | left(sign(wd(12,5, eng(w) ))) | left(pad0(ws(12,5, eng(w) ))) | left(pad0(sign(ws(12,5, eng(w) )))) | left(pad0(wd(12,5, eng(w) ))) | left(pad0(sign(wd(12,5, eng(w) )))); 43 43 } // for 44 45 for ( exp; sizeof(int) * 8 ) {46 size_t pow2 = 1z << exp;47 sout | exp | pow2 | unit(eng(pow2)) | wd(0,1, unit(eng( pow2 ))) | wd(0,0, unit(eng(pow2)));48 } // for49 44 } // main 50 45
Note: See TracChangeset
for help on using the changeset viewer.