Changeset e7a8f65 for libcfa/src


Ignore:
Timestamp:
Aug 9, 2023, 5:34:21 PM (10 months ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
master
Children:
74c6748
Parents:
3318dff
Message:

force all input of C strings to specify a maximum length for the string target

Location:
libcfa/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/iostream.cfa

    r3318dff re7a8f65  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Aug  7 08:59:29 2023
    13 // Update Count     : 1407
     12// Last Modified On : Wed Aug  9 10:10:56 2023
     13// Update Count     : 1432
    1414//
    1515
     
    271271        OSTYPE_VOID_IMPL( const char * )
    272272
    273 //      ostype & ?|?( ostype & os, const char16_t * s ) {
     273//      ostype & ?|?( ostype & os, const char16_t s[] ) {
    274274//              if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) );
    275275//              fmt( os, "%ls", s );
     
    278278
    279279// #if ! ( __ARM_ARCH_ISA_ARM == 1 && __ARM_32BIT_STATE == 1 ) // char32_t == wchar_t => ambiguous
    280 //      ostype & ?|?( ostype & os, const char32_t * s ) {
     280//      ostype & ?|?( ostype & os, const char32_t s[] ) {
    281281//              if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) );
    282282//              fmt( os, "%ls", s );
     
    285285// #endif // ! ( __ARM_ARCH_ISA_ARM == 1 && __ARM_32BIT_STATE == 1 )
    286286
    287 //      ostype & ?|?( ostype & os, const wchar_t * s ) {
     287//      ostype & ?|?( ostype & os, const wchar_t s[] ) {
    288288//              if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) );
    289289//              fmt( os, "%ls", s );
     
    917917        // } // ?|?
    918918
    919         istype & ?|?( istype & is, char s[] ) {
    920                 fmt( is, "%s", s );
    921                 return is;
    922         } // ?|?
    923         ISTYPE_VOID_IMPL( char * )
     919        // istype & ?|?( istype & is, char s[] ) {
     920        //      fmt( is, "%s", s );
     921        //      return is;
     922        // } // ?|?
     923        // ISTYPE_VOID_IMPL( char * )
    924924
    925925        // manipulators
     
    934934        istype & nl( istype & is ) {
    935935                fmt( is, "%*[^\n]" );                                                   // ignore characters to newline
     936                if ( ! eof( is ) && getANL$( is ) ) fmt( is, "%*c" ); // read newline
    936937                return is;
    937938        } // nl
     
    952953forall( istype & | basic_istream( istype ) ) {
    953954        istype & ?|?( istype & is, _Istream_Cstr f ) {
    954                 // skip xxx
     955                // skip
    955956                if ( ! f.s ) {
    956957                        // printf( "skip %s %d\n", f.scanset, f.wd );
    957                         if ( f.wd == -1 ) fmt( is, f.scanset, "" );             // no input arguments
     958                        if ( f.wd == -1 ) fmt( is, f.scanset, "" );     // no input arguments
    958959                        else for ( f.wd ) fmt( is, "%*c" );
    959960                        return is;
    960961                } // if
     962
     963                // getline
     964                if ( f.flags.delimit ) {
     965                        char fmtstr[] = "%[^ ]s";                                       // delimit inserted into space
     966                        fmtstr[3] = f.delimit;
     967                        fmt( is, fmtstr, f.s );                                         // read upto delimiter
     968                        fmt( is, "%*c" );                                                       // ignore delimiter
     969                        return is;
     970                } // if
     971
     972                // incl/excl
    961973                size_t len = 0;
    962974                if ( f.scanset ) len = strlen( f.scanset );
     
    977989                fmtstr[start] = '['; start += 1;
    978990                if ( f.flags.inex ) { fmtstr[start] = '^'; start += 1; }
    979                 strcpy( &fmtstr[start], f.scanset );                            // copy includes '\0'
     991                strcpy( &fmtstr[start], f.scanset );                    // copy includes '\0'
    980992                len += start;
    981993                fmtstr[len] = ']'; fmtstr[len + 1] = '\0';
     
    987999
    9881000        istype & ?|?( istype & is, _Istream_Char f ) {
    989                 fmt( is, "%*c" );                                                                       // argument variable unused
     1001                fmt( is, "%*c" );                                                               // argument variable unused
    9901002                return is;
    9911003        } // ?|?
  • libcfa/src/iostream.hfa

    r3318dff re7a8f65  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jul 19 14:25:52 2023
    13 // Update Count     : 463
     12// Last Modified On : Wed Aug  9 16:47:05 2023
     13// Update Count     : 500
    1414//
    1515
     
    130130        ostype & ?|?( ostype &, const char [] );
    131131        OSTYPE_VOID( const char [] );
    132         // ostype & ?|?( ostype &, const char16_t * );
     132        // ostype & ?|?( ostype &, const char16_t [] );
    133133        #if ! ( __ARM_ARCH_ISA_ARM == 1 && __ARM_32BIT_STATE == 1 ) // char32_t == wchar_t => ambiguous
    134         // ostype & ?|?( ostype &, const char32_t * );
     134        // ostype & ?|?( ostype &, const char32_t [] );
    135135        #endif // ! ( __ARM_ARCH_ISA_ARM == 1 && __ARM_32BIT_STATE == 1 )
    136         // ostype & ?|?( ostype &, const wchar_t * );
     136        // ostype & ?|?( ostype &, const wchar_t [] );
    137137        ostype & ?|?( ostype &, const void * );
    138138        OSTYPE_VOID( const void * );
     
    390390
    391391//      istype & ?|?( istype &, const char [] );
    392         istype & ?|?( istype &, char [] );
    393         ISTYPE_VOID( char * );
     392//      istype & ?|?( istype &, char [] );
     393//      ISTYPE_VOID( char [] );
    394394
    395395        // manipulators
     
    405405struct _Istream_Cstr {
    406406        char * s;
    407         const char * scanset;
     407        union {
     408                const char * scanset;
     409                char delimit;
     410        };
    408411        int wd;                                                                                         // width
    409412        union {
     
    412415                        unsigned char ignore:1;                                         // do not change input argument
    413416                        unsigned char inex:1;                                           // include/exclude characters in scanset
     417                        unsigned char delimit:1;                                        // delimit character
    414418                } flags;
    415419        };
     
    417421
    418422static inline {
    419         _Istream_Cstr skip( const char scanset[] ) { return (_Istream_Cstr){ 0p, scanset, -1, { .all : 0 } }; }
    420         _Istream_Cstr skip( unsigned int n ) { return (_Istream_Cstr){ 0p, 0p, n, { .all : 0 } }; }
    421         _Istream_Cstr incl( const char scanset[], char * s ) { return (_Istream_Cstr){ s, scanset, -1, { .flags.inex : false } }; }
     423        _Istream_Cstr skip( const char scanset[] ) { return (_Istream_Cstr){ 0p, {scanset}, -1, {.all : 0} }; }
     424        _Istream_Cstr skip( unsigned int wd ) { return (_Istream_Cstr){ 0p, {0p}, wd, {.all : 0} }; }
     425        _Istream_Cstr & getline( _Istream_Cstr & fmt ) { fmt.delimit = '\n'; fmt.flags.delimit = true; return fmt; }
     426        _Istream_Cstr & getline( const char delimit, _Istream_Cstr & fmt ) { fmt.delimit = delimit; fmt.flags.delimit = true; return fmt; }
     427//      _Istream_Cstr incl( const char scanset[], char s[] ) { return (_Istream_Cstr){ s, {scanset}, -1, { .flags.inex : false } }; }
     428//      _Istream_Cstr incl( const char scanset[], unsigned int wd, char s[] ) { return (_Istream_Cstr){ s, {scanset}, wd, {.flags.inex : false} }; }
    422429        _Istream_Cstr & incl( const char scanset[], _Istream_Cstr & fmt ) { fmt.scanset = scanset; fmt.flags.inex = false; return fmt; }
    423         _Istream_Cstr excl( const char scanset[], char * s ) { return (_Istream_Cstr){ s, scanset, -1, { .flags.inex : true } }; }
     430//      _Istream_Cstr excl( const char scanset[], char s[] ) { return (_Istream_Cstr){ s, {scanset}, -1, { .flags.inex : true } }; }
     431//      _Istream_Cstr excl( const char scanset[], unsigned int wd, char s[] ) { return (_Istream_Cstr){ s, {scanset}, wd, {.flags.inex : true} }; }
    424432        _Istream_Cstr & excl( const char scanset[], _Istream_Cstr & fmt ) { fmt.scanset = scanset; fmt.flags.inex = true; return fmt; }
    425         _Istream_Cstr ignore( char s[] ) { return (_Istream_Cstr)@{ s, 0p, -1, { .flags.ignore : true } }; }
     433        _Istream_Cstr ignore( char s[] ) { return (_Istream_Cstr)@{ s, {0p}, -1, {.flags.ignore : true} }; }
    426434        _Istream_Cstr & ignore( _Istream_Cstr & fmt ) { fmt.flags.ignore = true; return fmt; }
    427         _Istream_Cstr wdi( unsigned int w, char s[] ) { return (_Istream_Cstr)@{ s, 0p, w, { .all : 0 } }; }
    428         _Istream_Cstr & wdi( unsigned int w, _Istream_Cstr & fmt ) { fmt.wd = w; return fmt; }
     435        _Istream_Cstr wdi( unsigned int wd, char s[] ) { return (_Istream_Cstr)@{ s, {0p}, wd, {.all : 0} }; }
     436//      _Istream_Cstr & wdi( unsigned int wd, _Istream_Cstr & fmt ) { fmt.wd = wd; return fmt; }
    429437} // distribution
    430438forall( istype & | basic_istream( istype ) ) {
     
    457465        _Istream_Manip(T) ignore( const T & val ) { return (_Istream_Manip(T))@{ (T &)val, -1, true }; } \
    458466        _Istream_Manip(T) & ignore( _Istream_Manip(T) & fmt ) { fmt.ignore = true; return fmt; } \
    459         _Istream_Manip(T) wdi( unsigned int w, T & val ) { return (_Istream_Manip(T))@{ val, w, false }; } \
    460         _Istream_Manip(T) & wdi( unsigned int w, _Istream_Manip(T) & fmt ) { fmt.wd = w; return fmt; } \
     467        _Istream_Manip(T) wdi( unsigned int wd, T & val ) { return (_Istream_Manip(T))@{ val, wd, false }; } \
     468        _Istream_Manip(T) & wdi( unsigned int wd, _Istream_Manip(T) & fmt ) { fmt.wd = wd; return fmt; } \
    461469} /* distribution */ \
    462470forall( istype & | basic_istream( istype ) ) { \
Note: See TracChangeset for help on using the changeset viewer.