Changes in libcfa/src/iostream.cfa [f842032:0d49efb]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/iostream.cfa
rf842032 r0d49efb 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 19:29:54202313 // Update Count : 1 80013 // Last Modified On : Sun Oct 8 12:10:21 2023 14 // Update Count : 1564 14 15 // 15 16 … … 47 48 return os; 48 49 } // ?|? 49 OS YPE_VOID_IMPL( bool )50 OSTYPE_VOID_IMPL( bool ) 50 51 51 52 ostype & ?|?( ostype & os, char c ) { … … 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
Note: See TracChangeset
for help on using the changeset viewer.