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