Changes in libcfa/src/iostream.cfa [63e129c:4aae2bd]
- File:
-
- 1 edited
-
libcfa/src/iostream.cfa (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/iostream.cfa
r63e129c r4aae2bd 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Jan 28 11:58:54202413 // Update Count : 1 91712 // Last Modified On : Wed Jan 3 10:53:13 2024 13 // Update Count : 1898 14 14 // 15 15 … … 944 944 istype & nl( istype & is ) { 945 945 fmt( is, "%*[^\n]" ); // ignore characters to newline 946 if ( ! eof( is ) ) fmt( is, "%*c" );// read newline946 if ( ! eof( is ) && getANL$( is ) ) fmt( is, "%*c" ); // read newline 947 947 return is; 948 948 } // nl … … 984 984 } 985 985 986 istype & ?|?( istype & is, _Istream_Cquoted f ) with( f.cstr ) { 986 istype & ?|?( istype & is, _Istream_Cquoted f ) with( f ) { 987 char fmtstr[32]; // storage scanset and format codes 988 fmtstr[0] = '%'; 989 990 int pos = 1; 987 991 int args; 988 fini: { 992 bool check = true; 993 994 if ( cstr.flags.ignore ) { check = false; fmtstr[1] = '*'; pos += 1; } 995 int rwd = cstr.wd; 996 if ( cstr.wd != -1 ) { // => just ignore versus ignore with width 997 // wd is buffer bytes available (for input chars + null terminator) 998 // rwd is count of input chars 999 // no maximum width necessary because text ignored => width is read width 1000 if ( cstr.flags.rwd ) check = false; 1001 else rwd = cstr.wd - 1; 1002 pos += sprintf( &fmtstr[pos], "%d", rwd ); 1003 } // if 1004 1005 int len = 0; // may not be set in fmt 1006 char enddelim; 1007 if ( ! cstr.flags.inex ) { // => quoted getline 989 1008 args = fmt( is, "%*[ \f\n\r\t\v]" ); // remove leading whitespace 990 if ( eof( is ) ) break fini; 991 char rfmt[4] = { delimiters[0], '%', 'n', '\0' }; 992 int len = 0; // may not be set in fmt 1009 if ( eof( is ) ) goto Eof; 1010 char rfmt[4] = { cstr.delimiters[0], '%', 'n', '\0' }; 993 1011 args = fmt( is, rfmt, &len ); // remove leading quote 994 if ( len == 0 || eof( is ) ) break fini; 995 996 // Change the remainder of the read into a getline by reseting the closing delimiter. 997 if ( delimiters[1] != '\0' ) { 998 delimiters[0] = delimiters[1]; 999 delimiters[1] = '\0'; 1012 if ( len == 0 || eof( is ) ) goto Eof; 1013 } // if 1014 enddelim = cstr.delimiters[1] == '\0' ? cstr.delimiters[0] : cstr.delimiters[1]; 1015 sprintf( &fmtstr[pos], "[^%c]%%n", enddelim ); 1016 if ( cstr.flags.ignore ) args = fmt( is, fmtstr, &len ); // no string argument for '*' 1017 else args = fmt( is, fmtstr, cstr.s, &len ); 1018 if ( check && len == rwd && ! eof( is ) ) { // might not fit 1019 char peek; 1020 fmt( is, "%c", &peek ); // check for delimiter 1021 if ( ! eof( is ) ) { 1022 if ( peek != enddelim ) { 1023 ungetc( is, peek ); 1024 throwResume ExceptionInst( cstring_length ); 1025 } // if 1000 1026 } // if 1001 flags.delimiter = true; 1002 return is | *(_Istream_Cstr *)&f; 1003 } // fini 1004 // read failed => no pattern match => set string to null 1005 if ( ! flags.ignore && s != 0p && args == 0 ) s[0] = '\0'; 1027 } else fmt( is, "%*c" ); // remove delimiter 1028 Eof: ; 1029 if ( rwd > 0 && args == 0 ) cstr.s[0] = '\0'; // read failed => no pattern match => set string to null 1006 1030 if ( args == 1 && eof( is ) ) { // data but scan ended at EOF 1007 1031 clear( is ); // => reset EOF => detect again on next read … … 1010 1034 } 1011 1035 1012 istype & ?|?( istype & is, _Istream_Cstr f ) with( f .cstr) {1036 istype & ?|?( istype & is, _Istream_Cstr f ) with( f ) { 1013 1037 const char * scanset; 1014 1038 size_t nscanset = 0; 1015 1039 if ( flags.delimiter ) scanset = delimiters; // getline ? 1016 else scanset = f. cstr.scanset;1040 else scanset = f.scanset; 1017 1041 if ( scanset ) nscanset = strlen( scanset ); 1018 1042 1019 1043 char fmtstr[nscanset + 32]; // storage for scanset and format codes 1020 1044 fmtstr[0] = '%'; 1045 1021 1046 int pos = 1; 1022 1047 int args; 1023 1048 bool check = true; 1024 1049 1025 if ( f lags.ignore ) { check = false; fmtstr[1] = '*'; pos += 1; }1026 int rwd = wd;1027 if ( wd != -1 ) { // => just ignore versus ignore with width1050 if ( f.flags.ignore ) { check = false; fmtstr[1] = '*'; pos += 1; } 1051 int rwd = f.wd; 1052 if ( f.wd != -1 ) { // => just ignore versus ignore with width 1028 1053 // wd is buffer bytes available (for input chars + null terminator) 1029 1054 // rwd is count of input chars 1030 1055 // no maximum width necessary because text ignored => width is read width 1031 if ( flags.rwd ) check = false; 1032 else rwd = wd - 1; 1033 assert( rwd > 0 ); 1056 if ( f.flags.rwd ) check = false; 1057 else rwd = f.wd - 1; 1034 1058 pos += sprintf( &fmtstr[pos], "%d", rwd ); 1035 1059 } // if 1036 1060 1037 1061 if ( ! scanset ) { // %s, %*s, %ws, %*ws 1038 // fprintf( stderr, "cstr %s\n", s );1062 // fprintf( stderr, "cstr %s\n", f.s ); 1039 1063 strcpy( &fmtstr[pos], "s%n" ); 1040 1064 int len = 0; // may not be set in fmt 1041 if ( f lags.ignore ) args = fmt( is, fmtstr, &len ); // no string argument for '*'1042 else args = fmt( is, fmtstr, s, &len );1043 // fprintf( stderr, "cstr %s %d %d %d %s\n", fmtstr, args, len, wd,s );1065 if ( f.flags.ignore ) args = fmt( is, fmtstr, &len ); // no string argument for '*' 1066 else args = fmt( is, fmtstr, f.s, &len ); 1067 // fprintf( stderr, "cstr %s %d %d %d %s\n", fmtstr, args, len, f.wd, f.s ); 1044 1068 if ( check && len >= rwd && ! eof( is ) ) { // might not fit 1045 1069 char peek; … … 1052 1076 } // if 1053 1077 // FIX ME: CFA strings need to be modified to NOT change the argument for this case, then this can be removed. 1054 if ( ! flags.ignore && args == 0 ) s[0]= '\0';// read failed => no pattern match => set string to null1078 if ( rwd > 0 && args == 0 ) f.s[0]= '\0'; // read failed => no pattern match => set string to null 1055 1079 } else { 1056 if ( f lags.delimiter ) { // getline1080 if ( f.flags.delimiter ) { // getline 1057 1081 int len = 0; // may not be set in fmt 1058 if ( delimiters[2] != '\0' ) { // read single character ? 1059 sprintf( &fmtstr[pos], "c%%n" ); 1060 } else { 1061 sprintf( &fmtstr[pos], "[^%c]%%n", delimiters[0] ); 1062 } // if 1063 if ( flags.ignore ) args = fmt( is, fmtstr, &len ); // no string argument for '*' 1064 else args = fmt( is, fmtstr, s, &len ); 1082 sprintf( &fmtstr[pos], "[^%c]%%n", f.delimiters[0] ); 1083 if ( f.flags.ignore ) args = fmt( is, fmtstr, &len ); // no string argument for '*' 1084 else args = fmt( is, fmtstr, f.s, &len ); 1065 1085 if ( check && len == rwd && ! eof( is ) ) { // might not fit 1066 char peek;1067 fmt( is, "%c", &peek ); // check fordelimiter1086 fmtstr[0] = f.delimiters[0]; fmtstr[1] = '%'; fmtstr[2] = 'n'; fmtstr[3] = '\0'; 1087 fmt( is, fmtstr, &len ); // remove delimiter 1068 1088 if ( ! eof( is ) ) { 1069 if ( peek != delimiters[0] ) { 1070 ungetc( is, peek ); 1089 // if ( peek != f.delimiter[0] ) { 1090 if ( len != 1 ) { 1091 // ungetc( is, peek ); 1071 1092 throwResume ExceptionInst( cstring_length ); 1072 1093 } // if … … 1076 1097 // incl %[xxx], %*[xxx], %w[xxx], %*w[xxx] 1077 1098 // excl %[^xxx], %*[^xxx], %w[^xxx], %*w[^xxx] 1078 sprintf( &fmtstr[pos], "[%s%s]%%n", f lags.inex ? "^" : "", scanset );1079 // fprintf( stderr, "incl/excl %s %d\n", fmtstr, wd );1099 sprintf( &fmtstr[pos], "[%s%s]%%n", f.flags.inex ? "^" : "", scanset ); 1100 // fprintf( stderr, "incl/excl %s %d\n", fmtstr, f.wd ); 1080 1101 int len = 0; // may not be set in fmt 1081 if ( f lags.ignore ) args = fmt( is, fmtstr, &len ); // no string argument for '*'1082 else args = fmt( is, fmtstr, s, &len );1083 // fprintf( stderr, "incl/excl %s \"%s\" %d %d %d %d %d %c\n", fmtstr, s, args, wd, len, eof( is ), check, s[wd] );1102 if ( f.flags.ignore ) args = fmt( is, fmtstr, &len ); // no string argument for '*' 1103 else args = fmt( is, fmtstr, f.s, &len ); 1104 // 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] ); 1084 1105 if ( check && len == rwd && ! eof( is ) ) { // might not fit 1085 1106 // fprintf( stderr, "overflow\n" ); … … 1089 1110 if ( ! eof( is ) ) { 1090 1111 ungetc( is, peek ); 1091 if ( f lags.inex ^ strchr(scanset, peek ) != 0p ) throwResume ExceptionInst( cstring_length );1112 if ( f.flags.inex ^ strchr( f.scanset, peek ) != 0p ) throwResume ExceptionInst( cstring_length ); 1092 1113 } // if 1093 1114 } // if 1094 1115 } // if 1095 if ( ! flags.ignore && args == 0 ) s[0]= '\0';// read failed => no pattern match => set string to null1116 if ( rwd > 0 && args == 0 ) f.s[0]= '\0'; // read failed => no pattern match => set string to null 1096 1117 } // if 1097 1118 if ( args == 1 && eof( is ) ) { // data but scan ended at EOF … … 1099 1120 clear( is ); // => reset EOF => detect again on next read 1100 1121 } // if 1122 return is; 1123 } // ?|? 1124 1125 istype & ?|?( istype & is, _Istream_Char f ) { 1126 fmt( is, "%*c" ); // argument variable unused 1101 1127 return is; 1102 1128 } // ?|? … … 1119 1145 } // distribution 1120 1146 1121 INPUT_FMT_IMPL( char, "c" )1122 1147 INPUT_FMT_IMPL( signed char, "hhi" ) 1123 1148 INPUT_FMT_IMPL( unsigned char, "hhi" )
Note:
See TracChangeset
for help on using the changeset viewer.