Changes in / [6ce67ce:6ed1d4b]


Ignore:
Location:
src
Files:
2 deleted
24 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Box.cc

    r6ce67ce r6ed1d4b  
    7373                        /// Makes a new temporary array holding the offsets of the fields of `type`, and returns a new variable expression referencing it
    7474                        Expression *makeOffsetArray( StructInstType *type );
    75                         /// Pass the extra type parameters from polymorphic generic arguments or return types into a function application
    76                         void passArgTypeVars( ApplicationExpr *appExpr, Type *parmType, Type *argBaseType, std::list< Expression *>::iterator &arg, const TyVarMap &exprTyVars, std::set< std::string > &seenTypes );
    7775                        /// passes extra type parameters into a polymorphic function application
    78                         void passTypeVars( ApplicationExpr *appExpr, ReferenceToType *polyRetType, std::list< Expression *>::iterator &arg, const TyVarMap &exprTyVars );
     76                        void passTypeVars( ApplicationExpr *appExpr, std::list< Expression *>::iterator &arg, const TyVarMap &exprTyVars );
    7977                        /// wraps a function application with a new temporary for the out-parameter return value
    8078                        Expression *addRetParam( ApplicationExpr *appExpr, FunctionType *function, Type *retType, std::list< Expression *>::iterator &arg );
     
    400398                }
    401399
    402                 void Pass1::passArgTypeVars( ApplicationExpr *appExpr, Type *parmType, Type *argBaseType, std::list< Expression *>::iterator &arg, const TyVarMap &exprTyVars, std::set< std::string > &seenTypes ) {
    403                         Type *polyBase = hasPolyBase( parmType, exprTyVars );
    404                         if ( polyBase && ! dynamic_cast< TypeInstType* >( polyBase ) ) {
    405                                 std::string sizeName = sizeofName( polyBase );
    406                                 if ( seenTypes.count( sizeName ) ) return;
    407 
    408                                 arg = appExpr->get_args().insert( arg, new SizeofExpr( argBaseType->clone() ) );
    409                                 arg++;
    410                                 arg = appExpr->get_args().insert( arg, new AlignofExpr( argBaseType->clone() ) );
    411                                 arg++;
    412                                 if ( dynamic_cast< StructInstType* >( polyBase ) ) {
    413                                         if ( StructInstType *argBaseStructType = dynamic_cast< StructInstType* >( argBaseType ) ) {
    414                                                 arg = appExpr->get_args().insert( arg, makeOffsetArray( argBaseStructType ) );
    415                                                 arg++;
    416                                         } else {
    417                                                 throw SemanticError( "Cannot pass non-struct type for generic struct" );
    418                                         }
    419                                 }
    420 
    421                                 seenTypes.insert( sizeName );
    422                         }
    423                 }
    424 
    425                 void Pass1::passTypeVars( ApplicationExpr *appExpr, ReferenceToType *polyRetType, std::list< Expression *>::iterator &arg, const TyVarMap &exprTyVars ) {
     400                void Pass1::passTypeVars( ApplicationExpr *appExpr, std::list< Expression *>::iterator &arg, const TyVarMap &exprTyVars ) {
    426401                        // pass size/align for type variables
    427402                        for ( TyVarMap::const_iterator tyParm = exprTyVars.begin(); tyParm != exprTyVars.end(); ++tyParm ) {
     
    449424                        std::list< Expression* >::const_iterator fnArg = arg;
    450425                        std::set< std::string > seenTypes; //< names for generic types we've seen
    451 
    452                         // a polymorphic return type may need to be added to the argument list
    453                         if ( polyRetType ) {
    454                                 Type *concRetType = replaceWithConcrete( appExpr, polyRetType );
    455                                 passArgTypeVars( appExpr, polyRetType, concRetType, arg, exprTyVars, seenTypes );
    456                         }
    457                        
    458                         // add type information args for presently unseen types in parameter list
    459426                        for ( ; fnParm != funcType->get_parameters().end() && fnArg != appExpr->get_args().end(); ++fnParm, ++fnArg ) {
    460                                 VariableExpr *fnArgBase = getBaseVar( *fnArg );
    461                                 if ( ! fnArgBase || fnArgBase->get_results().empty() ) continue;
    462                                 passArgTypeVars( appExpr, (*fnParm)->get_type(), fnArgBase->get_results().front(), arg, exprTyVars, seenTypes );
     427                                Type *polyBase = hasPolyBase( (*fnParm)->get_type(), exprTyVars );
     428                                if ( polyBase && ! dynamic_cast< TypeInstType* >( polyBase ) ) {
     429                                        std::string sizeName = sizeofName( polyBase );
     430                                        if ( seenTypes.count( sizeName ) ) continue;
     431
     432                                        VariableExpr *fnArgBase = getBaseVar( *fnArg );
     433                                        assert( fnArgBase && ! fnArgBase->get_results().empty() );
     434                                        Type *argBaseType = fnArgBase->get_results().front();
     435                                        arg = appExpr->get_args().insert( arg, new SizeofExpr( argBaseType->clone() ) );
     436                                        arg++;
     437                                        arg = appExpr->get_args().insert( arg, new AlignofExpr( argBaseType->clone() ) );
     438                                        arg++;
     439                                        if ( dynamic_cast< StructInstType* >( polyBase ) ) {
     440                                                if ( StructInstType *argBaseStructType = dynamic_cast< StructInstType* >( argBaseType ) ) {
     441                                                        arg = appExpr->get_args().insert( arg, makeOffsetArray( argBaseStructType ) );
     442                                                        arg++;
     443                                                } else {
     444                                                        throw SemanticError( "Cannot pass non-struct type for generic struct" );
     445                                                }
     446                                        }
     447
     448                                        seenTypes.insert( sizeName );
     449                                }
    463450                        }
    464451                }
     
    483470                        ObjectDecl *newObj = makeTemporary( retType->clone() );
    484471                        Expression *paramExpr = new VariableExpr( newObj );
    485 
    486                         // If the type of the temporary is not polymorphic, box temporary by taking its address;
    487                         // otherwise the temporary is already boxed and can be used directly.
     472                        // If the type of the temporary is not polymorphic, box temporary by taking its address; otherwise the
     473                        // temporary is already boxed and can be used directly.
    488474                        if ( ! isPolyType( newObj->get_type(), scopeTyVars, env ) ) {
    489475                                paramExpr = new AddressExpr( paramExpr );
     
    534520                        assert( env );
    535521                        Type *concrete = replaceWithConcrete( appExpr, polyType );
    536                         // add out-parameter for return value   
    537522                        return addRetParam( appExpr, function, concrete, arg );
    538523                }
     
    557542                        assert( ! arg->get_results().empty() );
    558543                        if ( isPolyType( param, exprTyVars ) ) {
    559                                 if ( isPolyType( arg->get_results().front() ) ) {
    560                                         // if the argument's type is polymorphic, we don't need to box again!
     544                                if ( dynamic_cast< TypeInstType *>( arg->get_results().front() ) ) {
     545                                        // if the argument's type is a type parameter, we don't need to box again!
    561546                                        return;
    562547                                } else if ( arg->get_results().front()->get_isLvalue() ) {
     
    637622                        assert( arg );
    638623                        if ( isPolyType( realParam->get_type(), tyVars ) ) {
    639                                 if ( ! isPolyType( arg->get_type() ) ) {
     624                                if ( dynamic_cast<TypeInstType *>(arg->get_type()) == NULL ) {
    640625                                        UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) );
    641626                                        deref->get_args().push_back( new CastExpr( new VariableExpr( param ), new PointerType( Type::Qualifiers(), arg->get_type()->clone() ) ) );
     
    932917                        std::list< Expression *>::iterator paramBegin = appExpr->get_args().begin();
    933918
    934                         TyVarMap exprTyVars;
    935                         makeTyVarMap( function, exprTyVars );
    936                         ReferenceToType *polyRetType = 0;
    937 
    938                         if ( polyRetType = isPolyRet( function ) ) {
    939                                 ret = addPolyRetParam( appExpr, function, polyRetType, arg );
     919                        if ( ReferenceToType *polyType = isPolyRet( function ) ) {
     920                                ret = addPolyRetParam( appExpr, function, polyType, arg );
    940921                        } else if ( needsAdapter( function, scopeTyVars ) ) {
    941922                                // std::cerr << "needs adapter: ";
     
    949930                        arg = appExpr->get_args().begin();
    950931
    951                         passTypeVars( appExpr, polyRetType, arg, exprTyVars );
     932                        TyVarMap exprTyVars;
     933                        makeTyVarMap( function, exprTyVars );
     934
     935                        passTypeVars( appExpr, arg, exprTyVars );
    952936                        addInferredParams( appExpr, function, arg, exprTyVars );
    953937
     
    1008992                }
    1009993
    1010                 /// Wraps a function declaration in a new pointer-to-function variable expression
    1011                 VariableExpr *wrapFunctionDecl( DeclarationWithType *functionDecl ) {
    1012                         // line below cloned from FixFunction.cc
    1013                         ObjectDecl *functionObj = new ObjectDecl( functionDecl->get_name(), functionDecl->get_storageClass(), functionDecl->get_linkage(), 0,
    1014                                                                   new PointerType( Type::Qualifiers(), functionDecl->get_type()->clone() ), 0 );
    1015                         functionObj->set_mangleName( functionDecl->get_mangleName() );
    1016                         return new VariableExpr( functionObj );
    1017                 }
    1018                
    1019994                Statement * Pass1::mutate( ReturnStmt *returnStmt ) {
    1020995                        if ( retval && returnStmt->get_expr() ) {
     
    10321007
    10331008                                // find assignment operator for (polymorphic) return type
    1034                                 ApplicationExpr *assignExpr = 0;
     1009                                DeclarationWithType *assignDecl = 0;
    10351010                                if ( TypeInstType *typeInst = dynamic_cast< TypeInstType *>( retval->get_type() ) ) {
    1036                                         // find assignment operator for type variable
    10371011                                        std::map< std::string, DeclarationWithType *>::const_iterator assignIter = assignOps.find( typeInst->get_name() );
    10381012                                        if ( assignIter == assignOps.end() ) {
    10391013                                                throw SemanticError( "Attempt to return dtype or ftype object in ", returnStmt->get_expr() );
    10401014                                        } // if
    1041                                         assignExpr = new ApplicationExpr( new VariableExpr( assignIter->second ) );
     1015                                        assignDecl = assignIter->second;
    10421016                                } else if ( ReferenceToType *refType = dynamic_cast< ReferenceToType *>( retval->get_type() ) ) {
    1043                                         // find assignment operator for generic type
    10441017                                        ScopedMap< std::string, DeclarationWithType *>::const_iterator assignIter = scopedAssignOps.find( refType->get_name() );
    10451018                                        if ( assignIter == scopedAssignOps.end() ) {
    10461019                                                throw SemanticError( "Attempt to return dtype or ftype generic object in ", returnStmt->get_expr() );
    10471020                                        }
    1048 
    1049                                         // wrap it up in an application expression
    10501021                                        DeclarationWithType *functionDecl = assignIter->second;
    1051                                         assignExpr = new ApplicationExpr( wrapFunctionDecl( functionDecl ) );
    1052                                         assignExpr->set_env( env->clone() );
    1053 
    1054                                         // find each of its needed secondary assignment operators
    1055                                         std::list< Expression* > &tyParams = refType->get_parameters();
    1056                                         std::list< TypeDecl* > &forallParams = functionDecl->get_type()->get_forall();
    1057                                         std::list< Expression* >::const_iterator tyIt = tyParams.begin();
    1058                                         std::list< TypeDecl* >::const_iterator forallIt = forallParams.begin();
    1059                                         for ( ; tyIt != tyParams.end() && forallIt != forallParams.end(); ++tyIt, ++forallIt ) {
    1060                                                 if ( (*forallIt)->get_kind() != TypeDecl::Any ) continue; // skip types with no assign op (ftype/dtype)
    1061 
    1062                                                 std::list< DeclarationWithType* > &asserts = (*forallIt)->get_assertions();
    1063                                                 assert( ! asserts.empty() && "Type param needs assignment operator assertion" );
    1064                                                 DeclarationWithType *actualDecl = asserts.front();
    1065                                                 ReferenceToType *actualType = isAssignment( actualDecl );
    1066                                                 assert( actualType && "First assertion of type with assertions should be assignment operator" );
    1067                                                 TypeExpr *formalTypeExpr = dynamic_cast< TypeExpr* >( *tyIt );
    1068                                                 assert( formalTypeExpr && "type parameters must be type expressions" );
    1069                                                 Type *formalType = formalTypeExpr->get_type();
    1070                                                 assignExpr->get_env()->add( actualType->get_name(), formalType );
    1071                                                
    1072                                                 DeclarationWithType *assertAssign = 0;
    1073                                                 if ( TypeInstType *formalTypeInstType = dynamic_cast< TypeInstType* >( formalType ) ) {
    1074                                                         std::map< std::string, DeclarationWithType *>::const_iterator assertAssignIt = assignOps.find( formalTypeInstType->get_name() );
    1075                                                         if ( assertAssignIt == assignOps.end() ) {
    1076                                                                 throw SemanticError( "No assignment operation found for ", formalTypeInstType );
    1077                                                         }
    1078                                                         assertAssign = assertAssignIt->second;
    1079                                                         //assignExpr->get_env()->add( formalTypeInstType->get_name(), actualType );
    1080                                                 } else if ( ReferenceToType *formalReferenceType = dynamic_cast< ReferenceToType* >( formalType ) )  {
    1081                                                         ScopedMap< std::string, DeclarationWithType *>::const_iterator assertAssignIt = scopedAssignOps.find( formalReferenceType->get_name() );
    1082                                                         if ( assertAssignIt == scopedAssignOps.end() ) {
    1083                                                                 throw SemanticError( "No assignment operation found for ", formalReferenceType );
    1084                                                         }
    1085                                                         assertAssign = assertAssignIt->second;
    1086                                                 } else assert( false && "returning polymorphic types with non struct/polymorphic parameters not yet supported" );
    1087                                                
    1088 
    1089                                                 assignExpr->get_inferParams()[ actualDecl->get_uniqueId() ]
    1090                                                         = ParamEntry( assertAssign->get_uniqueId(), assertAssign->get_type()->clone(), actualDecl->get_type()->clone(), wrapFunctionDecl( assertAssign ) );
    1091                                         }
     1022                                        // line below cloned from FixFunction.cc
     1023                                        assignDecl = new ObjectDecl( functionDecl->get_name(), functionDecl->get_storageClass(), functionDecl->get_linkage(), 0,
     1024                                                                     new PointerType( Type::Qualifiers(), functionDecl->get_type()->clone() ), 0 );
     1025                                        assignDecl->set_mangleName( functionDecl->get_mangleName() );
    10921026                                }
    1093                                 assert( assignExpr );
     1027                                assert( assignDecl );
    10941028
    10951029                                // replace return statement with appropriate assignment to out parameter
     1030                                ApplicationExpr *assignExpr = new ApplicationExpr( new VariableExpr( assignDecl ) );
    10961031                                Expression *retParm = new NameExpr( retval->get_name() );
    10971032                                retParm->get_results().push_back( new PointerType( Type::Qualifiers(), retval->get_type()->clone() ) );
     
    12451180                        }
    12461181
    1247                         // add size/align for generic parameter types to parameter list
     1182                        // add size/align for generic types to parameter list
    12481183                        std::set< std::string > seenTypes; // sizeofName for generic types we've seen
    12491184                        for ( std::list< DeclarationWithType* >::const_iterator fnParm = last; fnParm != funcType->get_parameters().end(); ++fnParm ) {
     
    13601295
    13611296                                if ( DeclarationWithType *declWithType = dynamic_cast< DeclarationWithType* >( *decl ) ) {
    1362                                         if ( memberDecl->get_mangleName().empty() || declWithType->get_mangleName().empty()
    1363                                              || memberDecl->get_mangleName() == declWithType->get_mangleName() ) return i;
     1297                                        if ( memberDecl->get_mangleName() == declWithType->get_mangleName() ) return i;
    13641298                                        else continue;
    13651299                                } else return i;
     
    14071341                        if ( ! objectType ) return memberExpr;
    14081342
    1409                         Expression *newMemberExpr = 0;
    14101343                        if ( StructInstType *structType = dynamic_cast< StructInstType* >( objectType ) ) {
    14111344                                // look up offset index
     
    14171350                                fieldLoc->get_args().push_back( makeDerefdVar( varExpr->clone(), varDepth ) );
    14181351                                fieldLoc->get_args().push_back( makeOffsetIndex( objectType, i ) );
    1419                                 newMemberExpr = fieldLoc;
    1420                         } else if ( dynamic_cast< UnionInstType* >( objectType ) ) {
     1352
     1353                                delete memberExpr;
     1354                                return fieldLoc;
     1355                        } else if ( UnionInstType *unionType = dynamic_cast< UnionInstType* >( objectType ) ) {
    14211356                                // union members are all at offset zero, so build appropriately-dereferenced variable
    1422                                 newMemberExpr = makeDerefdVar( varExpr->clone(), varDepth );
     1357                                Expression *derefdVar = makeDerefdVar( varExpr->clone(), varDepth );
     1358                                delete memberExpr;
     1359                                return derefdVar;
    14231360                        } else return memberExpr;
    1424                         assert( newMemberExpr );
    1425 
    1426                         // wrap pointer members in appropriate cast
    1427                         if ( dynamic_cast< PointerType* >( memberExpr->get_member()->get_type() ) ) {
    1428                                 CastExpr *ptrCastExpr = new CastExpr( newMemberExpr, new PointerType( Type::Qualifiers(), new PointerType( Type::Qualifiers(), new VoidType( Type::Qualifiers() ) ) ) );
    1429                                 UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) );
    1430                                 derefExpr->get_args().push_back( ptrCastExpr );
    1431                                 newMemberExpr = derefExpr;
    1432                         }
    1433 
    1434                         delete memberExpr;
    1435                         return newMemberExpr;
    14361361                }
    14371362
     
    14541379                                delete offsetofExpr;
    14551380                                return offsetInd;
    1456                         } else if ( dynamic_cast< UnionInstType* >( ty ) ) {
     1381                        } else if ( UnionInstType *unionType = dynamic_cast< UnionInstType* >( ty ) ) {
    14571382                                // all union members are at offset zero
    14581383                                delete offsetofExpr;
  • src/ResolvExpr/CastCost.cc

    r6ce67ce r6ed1d4b  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 06:57:43 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb  2 15:34:36 2016
    13 // Update Count     : 7
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Mon Oct 05 14:48:45 2015
     13// Update Count     : 5
    1414//
    1515
     
    6969                PointerType *destAsPointer = dynamic_cast< PointerType* >( dest );
    7070                if ( destAsPointer && basicType->isInteger() ) {
    71                         //cost = Cost( 1, 0, 0 );
    72                         cost = Cost::infinity;
     71                        cost = Cost( 1, 0, 0 );
    7372                } else {
    7473                        ConversionCost::visit( basicType );
     
    8887                                        cost = Cost( 0, 0, 1 );
    8988                                } else if ( castResult < 0 ) {
    90                                         cost = Cost::infinity;
    91                                         //cost = Cost( 1, 0, 0 );
     89                                        cost = Cost( 1, 0, 0 );
    9290                                } // if
    9391                        } // if
    9492                } else if ( BasicType *destAsBasic = dynamic_cast< BasicType* >( dest ) ) {
    9593                        if ( destAsBasic->isInteger() ) {
    96                                 //cost = Cost( 1, 0, 0 );
    97                                 cost = Cost::infinity;
     94                                cost = Cost( 1, 0, 0 );
    9895                        } // if
    9996                }
  • src/ResolvExpr/Resolver.cc

    r6ce67ce r6ed1d4b  
    1010// Created On       : Sun May 17 12:17:01 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb  9 21:57:52 2016
    13 // Update Count     : 179
     12// Last Modified On : Fri Jul 24 17:33:54 2015
     13// Update Count     : 178
    1414//
    1515
     
    322322                                                                                                BasicType::SignedInt);
    323323                                } else {
    324                                         DeclarationWithType * decl = lookupId( n );
     324                                        DeclarationWithType * decl = lookupId(n);
    325325                                        initContext = decl->get_type();
    326326                                }
     
    344344                                        if ( PointerType * pt = dynamic_cast< PointerType *>( newExpr->get_results().front() ) ) {
    345345                                                if ( isCharType( pt->get_base() ) ) {
    346                                                         // strip cast if we're initializing a char[] with a char *, e.g.  char x[] = "hello";
     346                                                        // strip cast if we're initializing a char[] with a char *, e.g.
     347                                                        // char x[] = "hello";
    347348                                                        CastExpr *ce = dynamic_cast< CastExpr * >( newExpr );
    348349                                                        singleInit->set_value( ce->get_arg() );
  • src/SymTab/Validate.cc

    r6ce67ce r6ed1d4b  
    382382                // it's not a semantic error if the struct is not found, just an implicit forward declaration
    383383                if ( st ) {
    384                         //assert( ! structInst->get_baseStruct() || structInst->get_baseStruct()->get_members().empty() || ! st->get_members().empty() );
     384                        assert( ! structInst->get_baseStruct() || structInst->get_baseStruct()->get_members().empty() || ! st->get_members().empty() );
    385385                        structInst->set_baseStruct( st );
    386386                } // if
     
    659659        }
    660660
    661         /// Creates a new type decl that's the same as src, but renamed and with only the ?=? assertion (for complete types only)
    662         TypeDecl *cloneAndRename( TypeDecl *src, const std::string &name ) {
    663                 TypeDecl *dst = new TypeDecl( name, src->get_storageClass(), 0, src->get_kind() );
    664 
    665                 if ( src->get_kind() == TypeDecl::Any ) {
    666                         // just include assignment operator assertion
    667                         TypeInstType *assignParamType = new TypeInstType( Type::Qualifiers(), name, dst );
    668                         FunctionType *assignFunctionType = new FunctionType( Type::Qualifiers(), false );
    669                         assignFunctionType->get_returnVals().push_back(
    670                                 new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, assignParamType->clone(), 0 ) );
    671                         assignFunctionType->get_parameters().push_back(
    672                                 new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), assignParamType->clone() ), 0 ) );
    673                         assignFunctionType->get_parameters().push_back(
    674                                 new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, assignParamType, 0 ) );
    675                         FunctionDecl *assignAssert = new FunctionDecl( "?=?", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, assignFunctionType, 0, false, false );
    676                         dst->get_assertions().push_back( assignAssert );
    677                 }
    678 
    679                 return dst;
    680         }
    681 
    682661        Declaration *makeStructAssignment( StructDecl *aggregateDecl, StructInstType *refType, unsigned int functionNesting ) {
    683662                FunctionType *assignType = new FunctionType( Type::Qualifiers(), false );
     
    687666                std::list< TypeDecl* >& genericParams = aggregateDecl->get_parameters();
    688667                std::list< Expression* > structParams;  // List of matching parameters to put on types
    689                 TypeSubstitution genericSubs; // Substitutions to make to member types of struct
    690668                for ( std::list< TypeDecl* >::const_iterator param = genericParams.begin(); param != genericParams.end(); ++param ) {
    691669                        isGeneric = true;
    692                         TypeDecl *typeParam = cloneAndRename( *param, "_autoassign_" + aggregateDecl->get_name() + "_" + (*param)->get_name() );
     670                        TypeDecl *typeParam = (*param)->clone();
    693671                        assignType->get_forall().push_back( typeParam );
    694                         TypeInstType *newParamType = new TypeInstType( Type::Qualifiers(), typeParam->get_name(), typeParam );
    695                         genericSubs.add( (*param)->get_name(), newParamType );
    696                         structParams.push_back( new TypeExpr( newParamType ) );
     672                        structParams.push_back( new TypeExpr( new TypeInstType( Type::Qualifiers(), typeParam->get_name(), typeParam ) ) );
    697673                }
    698674
     
    725701                                }
    726702
    727                                 if ( isGeneric ) {
    728                                         // rewrite member type in terms of the type variables on this operator
    729                                         DeclarationWithType *fixedMember = dwt->clone();
    730                                         genericSubs.apply( fixedMember );
    731 
    732                                         // assign to both destination and return value
    733                                         if ( ArrayType *array = dynamic_cast< ArrayType * >( fixedMember->get_type() ) ) {
    734                                                 makeArrayAssignment( srcParam, dstParam, fixedMember, array, back_inserter( assignDecl->get_statements()->get_kids() ) );
    735                                                 makeArrayAssignment( srcParam, returnVal, fixedMember, array, back_inserter( assignDecl->get_statements()->get_kids() ) );
    736                                         } else {
    737                                                 makeScalarAssignment( srcParam, dstParam, fixedMember, back_inserter( assignDecl->get_statements()->get_kids() ) );
    738                                                 makeScalarAssignment( srcParam, returnVal, fixedMember, back_inserter( assignDecl->get_statements()->get_kids() ) );
    739                                         } // if
     703                                if ( ArrayType *array = dynamic_cast< ArrayType * >( dwt->get_type() ) ) {
     704                                        makeArrayAssignment( srcParam, dstParam, dwt, array, back_inserter( assignDecl->get_statements()->get_kids() ) );
     705                                        if ( isGeneric ) makeArrayAssignment( srcParam, returnVal, dwt, array, back_inserter( assignDecl->get_statements()->get_kids() ) );
    740706                                } else {
    741                                         // assign to destination
    742                                         if ( ArrayType *array = dynamic_cast< ArrayType * >( dwt->get_type() ) ) {
    743                                                 makeArrayAssignment( srcParam, dstParam, dwt, array, back_inserter( assignDecl->get_statements()->get_kids() ) );
    744                                         } else {
    745                                                 makeScalarAssignment( srcParam, dstParam, dwt, back_inserter( assignDecl->get_statements()->get_kids() ) );
    746                                         } // if
     707                                        makeScalarAssignment( srcParam, dstParam, dwt, back_inserter( assignDecl->get_statements()->get_kids() ) );
     708                                        if ( isGeneric ) makeScalarAssignment( srcParam, returnVal, dwt, back_inserter( assignDecl->get_statements()->get_kids() ) );
    747709                                } // if
    748710                        } // if
     
    762724                for ( std::list< TypeDecl* >::const_iterator param = genericParams.begin(); param != genericParams.end(); ++param ) {
    763725                        isGeneric = true;
    764                         TypeDecl *typeParam = cloneAndRename( *param, "_autoassign_" + aggregateDecl->get_name() + "_" + (*param)->get_name() );
     726                        TypeDecl *typeParam = (*param)->clone();
    765727                        assignType->get_forall().push_back( typeParam );
    766728                        unionParams.push_back( new TypeExpr( new TypeInstType( Type::Qualifiers(), typeParam->get_name(), typeParam ) ) );
  • src/Tests/Makefile

    r6ce67ce r6ed1d4b  
    88OUTPUTS = ${addprefix ${OUTPUTDIR}/,${EXAMPLES:.c=.txt}}
    99
    10 #.SILENT :
     10.SILENT :
    1111
    1212all :
     
    1919
    2020${OUTPUTDIR}/%.txt : %.c ${CFA} Makefile
    21         -${CFA} -n ${CFAOPT} $< > $@ 2>&1
     21        -${CFA} -n ${CFAOPT} < $< > $@ 2>&1
    2222
    2323${OUTPUTDIR}/report : ${OUTPUTS} ${EXPECTDIR}
  • src/examples/abs.c

    r6ce67ce r6ed1d4b  
    1010// Created On       : Thu Jan 28 18:26:16 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb 17 09:32:04 2016
    13 // Update Count     : 44
     12// Last Modified On : Wed Feb  3 11:14:58 2016
     13// Update Count     : 43
    1414//
    1515
     
    1818
    1919int main( void ) {
     20        ofstream *sout = ofstream_stdout();
     21
    2022        char ch = -65;
    2123        sout | "char\t\t\t"                                     | ch     | "\tabs " | abs( ch ) | endl;
  • src/examples/alloc.c

    r6ce67ce r6ed1d4b  
    1111// Created On       : Wed Feb  3 07:56:22 2016
    1212// Last Modified By : Peter A. Buhr
    13 // Last Modified On : Wed Feb 17 11:43:23 2016
    14 // Update Count     : 40
     13// Last Modified On : Wed Feb  3 16:32:04 2016
     14// Update Count     : 38
    1515//
    1616
     
    2727
    2828int main( void ) {
     29    ofstream * sout = ofstream_stdout();
     30
    2931    size_t size = 10;
    3032    int * p;
     
    98100    free( x );
    99101#endif
     102    free( sout );
    100103}
    101104
  • src/examples/fstream_test.c

    r6ce67ce r6ed1d4b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb 17 11:45:43 2016
    13 // Update Count     : 43
     12// Last Modified On : Tue Jan 26 17:11:33 2016
     13// Update Count     : 42
    1414//
    1515
     
    1717
    1818int main( void ) {
     19        ofstream *sout = ofstream_stdout();
     20        ifstream *sin = ifstream_stdin();
    1921        int nombre;
    2022        sout | "Entrez un nombre, s'il vous plaît:\n";
  • src/examples/hello.c

    r6ce67ce r6ed1d4b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb 17 12:11:45 2016
    13 // Update Count     : 8
     12// Last Modified On : Tue Jan 26 17:11:49 2016
     13// Update Count     : 7
    1414//
    1515
     
    1717
    1818int main() {
     19        ofstream *sout = ofstream_stdout();
     20        ifstream *sin = ifstream_stdin();
    1921        sout | "Bonjour au monde!\n";
    2022}
  • src/examples/identity.c

    r6ce67ce r6ed1d4b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb 17 12:17:32 2016
    13 // Update Count     : 10
     12// Last Modified On : Tue Jan 26 17:11:58 2016
     13// Update Count     : 8
    1414//
    1515
     
    2222
    2323int main() {
     24        ofstream *sout = ofstream_stdout();
    2425        sout | "char\t\t\t"                                     | identity( 'z' ) | endl;
    2526        sout | "signed int\t\t"                         | identity( 4 ) | endl;
     
    2930        sout | "signed long long int\t"         | identity( 4ll ) | endl;
    3031        sout | "unsigned long long int\t"       | identity( 4ull ) | endl;
    31         sout | "float\t\t\t"                            | identity( 4.1f ) | endl;
    32         sout | "double\t\t\t"                           | identity( 4.1 ) | endl;
    33         sout | "long double\t\t"                        | identity( 4.1l ) | endl;
     32        sout | "float\t\t\t"                            | identity( 4.0f ) | endl;
     33        sout | "double\t\t\t"                           | identity( 4.0 ) | endl;
     34        sout | "long double\t\t"                        | identity( 4.0l ) | endl;
    3435}
    3536
  • src/examples/minmax.c

    r6ce67ce r6ed1d4b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb 17 12:17:53 2016
    13 // Update Count     : 47
     12// Last Modified On : Wed Feb  3 11:14:49 2016
     13// Update Count     : 46
    1414//
    1515
     
    1818
    1919int main( void ) {
     20        ofstream *sout = ofstream_stdout();
    2021        // char does not have less or greater than.
    2122        int ?<?( char op1, char op2 ) { return (int)op1 < (int)op2; }
  • src/examples/quad.c

    r6ce67ce r6ed1d4b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb 17 12:19:24 2016
    13 // Update Count     : 6
     12// Last Modified On : Tue Jan 26 17:13:48 2016
     13// Update Count     : 5
    1414//
    1515
     
    2727
    2828int main() {
     29        ofstream *sout = ofstream_stdout();
    2930        int N = 2;
    3031        sout | "result of quad of " | N | " is " | quad( N ) | endl;
  • src/examples/quoted_keyword.c

    r6ce67ce r6ed1d4b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb 17 12:19:45 2016
    13 // Update Count     : 9
     12// Last Modified On : Tue Jan 26 17:13:58 2016
     13// Update Count     : 8
    1414//
    1515
     
    2828
    2929int main() {
     30        ofstream *sout = ofstream_stdout();
    3031        sout | `catch` + st.`type` + st.`struct` + `throw` | endl;
    3132}
  • src/examples/random.c

    r6ce67ce r6ed1d4b  
    77
    88int main() {
     9        ofstream *sout = ofstream_stdout();
     10
    911        randseed( getpid() );                                                           // set random seed
    1012
  • src/examples/square.c

    r6ce67ce r6ed1d4b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb 17 12:21:58 2016
    13 // Update Count     : 26
     12// Last Modified On : Tue Jan 26 17:14:16 2016
     13// Update Count     : 25
    1414//
    1515
     
    2323int main() {
    2424#if 0
     25        ofstream *sout = ofstream_stdout();
    2526        sout | "result of squaring 9 is " | endl;
    2627
  • src/examples/sum.c

    r6ce67ce r6ed1d4b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb 16 23:49:31 2016
    13 // Update Count     : 189
     12// Last Modified On : Fri Feb  5 16:47:44 2016
     13// Update Count     : 139
    1414//
    1515
     
    3333
    3434// Required to satisfy sumable as char does not have addition.
    35 const char 0;
    36 char ?+?( char t1, char t2 ) { return (int)t1 + t2; }   // cast forces integer addition, otherwise recursion
    37 char ?+=?( char *t1, char t2 ) { *t1 = *t1 + t2; return *t1; }
    38 char ++?( char *t ) { *t += 1; return *t; }
    39 char ?++( char *t ) { char temp = *t; *t += 1; return temp; }
     35// const char 0;
     36// char ?+?( char op1, char op2 ) { return (int)op1 + op2; } // cast forces integer addition or recursion
     37// char ++?( char *op ) { *op += 1; return *op; }
     38// char ?++( char *op ) { char temp = *op; *op += 1; return temp; }
    4039
    4140int main( void ) {
    4241        const int low = 5, High = 15, size = High - low;
     42        ofstream *sout = ofstream_stdout();
     43#if 0
    4344
    44         char s = 0, a[size], v = low;
     45        char s = 0, a[size];
     46        char v = low;
    4547        for ( int i = 0; i < size; i += 1, v += 1 ) {
    4648                s += v;
    4749                a[i] = v;
    48         } // for
     50        }
    4951        sout | "sum from " | low | " to " | High | " is "
    5052                 | (int)sum( size, a ) | ", check " | (int)s | endl;
    5153
    52         int s = 0, a[size], v = low;
     54        int s = 0, a[size];
     55        int v = low;
    5356        for ( int i = 0; i < size; i += 1, v += 1 ) {
    5457                s += (int)v;
    5558                a[i] = (int)v;
    56         } // for
     59        }
    5760        sout | "sum from " | low | " to " | High | " is "
    5861                 | sum( size, (int *)a ) | ", check " | (int)s | endl;
    5962
    60         float s = 0.0, a[size], v = low / 10.0;
     63        float s = 0.0, a[size];
     64        float v = low / 10.0;
    6165        for ( int i = 0; i < size; i += 1, v += 0.1f ) {
    6266                s += (float)v;
    6367                a[i] = (float)v;
    64         } // for
     68        }
    6569        sout | "sum from " | low / 10.0 | " to " | High / 10.0 | " is "
    6670                 | sum( size, (float *)a ) | ", check " | (float)s | endl;
     71#endif
     72        double s = 0, a[size];
     73        double v = low / 10.0;
    6774
    68         double s = 0, a[size], v = low / 10.0;
    6975        for ( int i = 0; i < size; i += 1, v += 0.1 ) {
    7076                s += (double)v;
    7177                a[i] = (double)v;
    72         } // for
     78        }
    7379        sout | "sum from " | low / 10.0 | " to " | High / 10.0 | " is "
    7480                 | sum( size, (double *)a ) | ", check " | (double)s | endl;
    7581
    76         struct S { int i, j; } 0 = { 0, 0 }, 1 = { 1, 1 };
    77         S ?+?( S t1, S t2 ) { S s = { t1.i + t2.i, t1.j + t2.j }; return s; }
    78         S ?+=?( S *t1, S t2 ) { *t1 = *t1 + t2; return *t1; }
    79         S ++?( S *t ) { *t += 1; return *t; }
    80         S ?++( S *t ) { S temp = *t; *t += 1; return temp; }
    81         ofstream * ?|?( ofstream * os, S v ) { return os | v.i | ' ' | v.j; }
    82 
    83         S s = 0, a[size], v = { low, low };
    84         for ( int i = 0; i < size; i += 1, v += (S)1 ) {
    85                 s += (S)v;
    86                 a[i] = (S)v;
    87         } // for
    88         sout | "sum from " | low | " to " | High | " is "
    89                  | sum( size, (S *)a ) | ", check " | (S)s | endl;
     82        // struct S { int i, j; } sarr[size];
     83        // struct S 0 = { 0, 0 };
     84        // struct S 1 = { 1, 1 };
     85        // S ?+?( S t1, S t2 ) { S s = { t1.i + t1.j, t2.i + t2.j }; return s; }
     86        // S ?+=?( S *t1, S t2 ) { *t1 = *t1 + t2; return *t1; }
     87        // S ++?( S *t ) { *t += 1; return *t; }
     88        // S ?++( S *t ) { S temp = *t; *t += 1; return temp; }
     89        // sum( size, sarr );
    9090} // main
    9191
  • src/examples/swap.c

    r6ce67ce r6ed1d4b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb 17 12:22:12 2016
    13 // Update Count     : 64
     12// Last Modified On : Wed Feb  3 11:14:04 2016
     13// Update Count     : 63
    1414//
    1515
     
    1818
    1919int main( void ) {
     20        ofstream *sout = ofstream_stdout();
     21
    2022        char c1 = 'a', c2 = 'b';
    2123        sout | "char\t\t\t" | c1 | ' ' | c2 | "\t\t\tswap ";
  • src/examples/twice.c

    r6ce67ce r6ed1d4b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb 17 12:23:25 2016
    13 // Update Count     : 13
     12// Last Modified On : Tue Jan 26 17:14:44 2016
     13// Update Count     : 12
    1414//
    1515
     
    2727        char ?++( char *op ) { char temp = *op; *op += 1; return temp; }
    2828
     29        ofstream *sout = ofstream_stdout();
    2930        sout | twice( 'a' ) | ' ' | twice( 1 ) | ' ' | twice( 3.2 ) | endl;
    3031}
  • src/examples/vector_test.c

    r6ce67ce r6ed1d4b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb 17 12:23:55 2016
    13 // Update Count     : 18
     12// Last Modified On : Tue Jan 26 17:14:52 2016
     13// Update Count     : 17
    1414//
    1515
     
    2020
    2121int main( void ) {
     22        ofstream *sout = ofstream_stdout();
     23        ifstream *sin = ifstream_stdin();
    2224        vector_int vec = vector_int_allocate();
    2325
  • src/libcfa/fstream

    r6ce67ce r6ed1d4b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb 17 14:02:01 2016
    13 // Update Count     : 22
     12// Last Modified On : Wed Jan 27 23:47:41 2016
     13// Update Count     : 3
    1414//
    1515
     
    1919#include "iostream"
    2020
     21typedef struct ofstream ofstream;
     22
    2123// implement context ostream
    22 struct ofstream;
     24ofstream *write( ofstream *, const char *, streamsize_type );
     25int fail( ofstream * );
    2326
    24 int fail( ofstream * os );
    25 int flush( ofstream * os );
    26 void open( ofstream ** os, const char * name, const char * mode );
    27 void close( ofstream * os );
    28 ofstream * write( ofstream * os, const char * data, streamsize_type size );
     27ofstream *ofstream_stdout();
     28ofstream *ofstream_stderr();
     29ofstream *ofstream_fromfile( const char *name );
     30void ofstream_close( ofstream *os );
    2931
    30 extern ofstream * sout, * serr;
     32typedef struct ifstream ifstream;
    3133
    3234// implement context istream
    33 struct ifstream;
     35ifstream *read( ifstream *, char *, streamsize_type );
     36ifstream *unread( ifstream *, char );
     37int fail( ifstream * );
     38int eof( ifstream * );
    3439
    35 int fail( ifstream * is );
    36 int eof( ifstream * is );
    37 void open( ifstream ** is, const char * name, const char * mode );
    38 void close( ifstream * is );
    39 ifstream * get( ifstream * is, int * data );
    40 ifstream * read( ifstream * is, char * data, streamsize_type size );
    41 ifstream * ungetc( ifstream * is, char c );
    42 
    43 extern ifstream *sin;
     40ifstream *ifstream_stdin();
     41ifstream *ifstream_fromfile( const char *name );
    4442
    4543#endif // __FSTREAM_H__
  • src/libcfa/fstream.c

    r6ce67ce r6ed1d4b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb 17 14:03:05 2016
    13 // Update Count     : 76
     12// Last Modified On : Tue Jan 26 17:12:59 2016
     13// Update Count     : 6
    1414//
    1515
     
    2323struct ofstream {
    2424        FILE *file;
     25        int fail;
    2526};
    2627
    27 #define IO_MSG "I/O error "
    28 
    29 int fail( ofstream * os ) {
    30         return ferror( os->file );
    31 } // fail
    32 
    33 int flush( ofstream * os ) {
    34         return fflush( os->file );
    35 } // flush
    36 
    37 void open( ofstream ** os, const char * name, const char * mode ) {
    38         FILE *t = fopen( name, mode );
    39         if ( t == 0 ) {                                                                         // do not change unless successful
    40                 perror( IO_MSG "open output" );
    41                 exit( EXIT_FAILURE );
    42         } // if
    43         (*os)->file = t;
    44 } // open
    45 
    46 void close( ofstream * os ) {
    47         if ( os->file == stdout || os->file == stderr ) return;
    48 
    49         if ( fclose( os->file ) == EOF ) {
    50                 perror( IO_MSG "close output" );
    51         } // if
    52 } // close
    53 
    54 ofstream * write( ofstream * os, const char * data, streamsize_type size ) {
    55         if ( fail( os ) ) {
    56                 fprintf( stderr, "attempt write I/O on failed stream\n" );
    57                 exit( EXIT_FAILURE );
    58         } // if
    59 
    60         if ( fwrite( data, 1, size, os->file ) != size ) {
    61                 perror( IO_MSG "write" );
    62                 exit( EXIT_FAILURE );
     28ofstream *write( ofstream *os, const char *data, streamsize_type size ) {
     29        if ( ! os->fail ) {
     30                fwrite( data, size, 1, os->file );
     31                os->fail = ferror( os->file );
    6332        } // if
    6433        return os;
    6534} // write
    6635
    67 static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_) };
    68 ofstream *sout = &soutFile;
    69 static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_) };
    70 ofstream *serr = &serrFile;
     36int fail( ofstream *os ) {
     37        return os->fail;
     38} // fail
    7139
    72 //---------------------------------------
     40static ofstream *make_ofstream() {
     41        ofstream *new_stream = malloc( sizeof( ofstream ) );
     42        new_stream->fail = 0;
     43        return new_stream;
     44} // make_ofstream
     45
     46ofstream *ofstream_stdout() {
     47        ofstream *stdout_stream = make_ofstream();
     48        stdout_stream->file = stdout;
     49        return stdout_stream;
     50} // ofstream_stdout
     51
     52ofstream *ofstream_stderr() {
     53        ofstream *stderr_stream = make_ofstream();
     54        stderr_stream->file = stderr;
     55        return stderr_stream;
     56} // ofstream_stderr
     57
     58ofstream *ofstream_fromfile( const char *name ) {
     59        ofstream *file_stream = make_ofstream();
     60        file_stream->file = fopen( name, "w" );
     61        file_stream->fail = file_stream->file == 0;
     62        return file_stream;
     63}
     64
     65void ofstream_close( ofstream *os ) {
     66        if ( os->file != stdout && os->file != stderr ) {
     67                os->fail = fclose( os->file );
     68        }
     69        free( os );
     70}
    7371
    7472struct ifstream {
    7573        FILE *file;
     74        int fail;
     75        int eof;
    7676};
    7777
    78 int fail( ifstream * is ) {
    79         return ferror( is->file );
    80 } // fail
     78ifstream *read( ifstream *is, char *data, streamsize_type size ) {
     79        if ( ! is->fail && ! is->eof ) {
     80                fread( data, size, 1, is->file );
     81                is->fail = ferror( is->file );
     82                is->eof = feof( is->file );
     83        }
     84        return is;
     85}
     86 
     87ifstream *unread( ifstream *is, char c ) {
     88        if ( ! is->fail ) {
     89                if ( ! EOF == ungetc( c, is->file ) ) {
     90                        is->fail = 1;
     91                }
     92        }
     93        return is;
     94}
    8195
    82 int eof( ifstream * is ) {
    83         return feof( is->file );
    84 } // eof
     96int fail( ifstream *is ) {
     97        return is->fail;
     98}
    8599
    86 ifstream * get( ifstream * is, int * data ) {
    87         if ( fscanf( is->file, "%d", data ) == EOF ) {
    88                 if ( ferror( is->file ) ) {
    89                         fprintf( stderr, "invalid int read\n" );
    90                         exit( EXIT_FAILURE );
    91                 } // if
    92         } // if
    93         return is;
    94 } // read
     100int eof( ifstream *is ) {
     101        return is->eof;
     102}
    95103
    96 ifstream * read( ifstream * is, char * data, streamsize_type size ) {
    97         if ( fail( is ) ) {
    98                 fprintf( stderr, "attempt read I/O on failed stream\n" );
    99                 exit( EXIT_FAILURE );
    100         } // if
     104static ifstream *make_ifstream() {
     105        ifstream *new_stream = malloc( sizeof( ifstream ) );
     106        new_stream->fail = 0;
     107        new_stream->eof = 0;
     108        return new_stream;
     109}
    101110
    102         if ( fread( data, size, 1, is->file ) == 0 ) {
    103                 perror( IO_MSG "read" );
    104                 exit( EXIT_FAILURE );
    105         } // if
    106         return is;
    107 } // read
    108  
    109 ifstream *ungetc( ifstream * is, char c ) {
    110         if ( fail( is ) ) {
    111                 fprintf( stderr, "attempt ungetc I/O on failed stream\n" );
    112                 exit( EXIT_FAILURE );
    113         } // if
     111ifstream *ifstream_stdin() {
     112        ifstream *stdin_stream = make_ifstream();
     113        stdin_stream->file = stdin;
     114        return stdin_stream;
     115}
    114116
    115         if ( ungetc( c, is->file ) == EOF ) {
    116                 perror( IO_MSG "ungetc" );
    117                 exit( EXIT_FAILURE );
    118         } // if
    119         return is;
    120 } // ungetc
    121 
    122 void open( ifstream ** is, const char * name, const char * mode ) {
    123         FILE *t = fopen( name, mode );
    124         if ( t == 0 ) {                                                                         // do not change unless successful
    125                 perror( IO_MSG "open input" );
    126                 exit( EXIT_FAILURE );
    127         } // if
    128         (*is)->file = t;
    129 } // open
    130 
    131 void close( ifstream * is ) {
    132         if ( is->file == stdin ) return;
    133 
    134         if ( fclose( is->file ) == EOF ) {
    135                 perror( IO_MSG "close input" );
    136         } // if
    137 } // close
    138 
    139 static ifstream sinFile = { (FILE *)(&_IO_2_1_stdin_) };
    140 ifstream *sin = &sinFile;
     117ifstream *ifstream_fromfile( const char *name ) {
     118        ifstream *file_stream = make_ifstream();
     119        file_stream->file = fopen( name, "r" );
     120        file_stream->fail = file_stream->file == 0;
     121        return file_stream;
     122}
    141123
    142124// Local Variables: //
  • src/libcfa/iostream

    r6ce67ce r6ed1d4b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb 17 14:04:24 2016
    13 // Update Count     : 32
     12// Last Modified On : Fri Jan 29 15:50:36 2016
     13// Update Count     : 29
    1414//
    1515
     
    2222
    2323context ostream( dtype ostype ) {
     24        ostype *write( ostype *, const char *, streamsize_type );
    2425        int fail( ostype * );
    25         int flush( ostype * );
    26         ostype * write( ostype *, const char *, streamsize_type );
    2726};
     27
    2828context writeable( type T ) {
    2929        forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, T );
     
    5252
    5353// writes the range [begin, end) to the given stream
    54 forall( type elt_type | writeable( elt_type ), type iterator_type | iterator( iterator_type, elt_type ), dtype os_type | ostream( os_type ) )
     54forall( type elt_type | writeable( elt_type ),
     55                type iterator_type | iterator( iterator_type, elt_type ),
     56                dtype os_type | ostream( os_type ) )
    5557void write( iterator_type begin, iterator_type end, os_type *os );
    5658
    57 forall( type elt_type | writeable( elt_type ), type iterator_type | iterator( iterator_type, elt_type ), dtype os_type | ostream( os_type ) )
     59forall( type elt_type | writeable( elt_type ),
     60                type iterator_type | iterator( iterator_type, elt_type ),
     61                dtype os_type | ostream( os_type ) )
    5862void write_reverse( iterator_type begin, iterator_type end, os_type *os );
    5963
    60 //---------------------------------------
     64//******************************************************************************
    6165
    6266context istream( dtype istype ) {
     67        istype *read( istype *, char *, streamsize_type );
     68        istype *unread( istype *, char );
    6369        int fail( istype * );
    6470        int eof( istype * );
    65         istype * get( istype *, int * );
    66         istype * read( istype *, char *, streamsize_type );
    67         istype * ungetc( istype *, char );
    6871};
    6972
  • src/libcfa/iostream.c

    r6ce67ce r6ed1d4b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb 17 14:19:56 2016
    13 // Update Count     : 76
     12// Last Modified On : Mon Feb  1 14:20:30 2016
     13// Update Count     : 60
    1414//
    1515
     
    1919#include <stdio.h>
    2020#include <string.h>                                                                             // strlen
    21 #include <float.h>                                                                              // DBL_DIG, LDBL_DIG
    2221#include <complex.h>                                                                    // creal, cimag
    2322}
     
    7372ostype * ?|?( ostype *os, double d ) {
    7473        char buffer[32];
    75         return write( os, buffer, sprintf( buffer, "%.*lg", DBL_DIG, d ) );
     74        return write( os, buffer, sprintf( buffer, "%g", d ) );
    7675} // ?|?
    7776
     
    7978ostype * ?|?( ostype *os, long double d ) {
    8079        char buffer[32];
    81         return write( os, buffer, sprintf( buffer, "%.*Lg", LDBL_DIG, d ) );
     80        return write( os, buffer, sprintf( buffer, "%Lg", d ) );
    8281} // ?|?
    8382
     
    111110forall( dtype ostype, dtype retostype | ostream( ostype ) | ostream( retostype ) )
    112111retostype * ?|?( ostype *os, retostype * (*manip)(ostype*) ) {
    113   return manip( os );
     112  return manip(os);
    114113}
    115114
    116115forall( dtype ostype | ostream( ostype ) )
    117116ostype * endl( ostype * os ) {
    118         os | "\n";
    119         flush( os );
    120         return os;
     117  os | "\n";
     118  // flush
     119  return os;
    121120} // endl
    122121
    123 //---------------------------------------
    124 
    125 forall( type elt_type | writeable( elt_type ), type iterator_type | iterator( iterator_type, elt_type ),
     122forall( type elt_type | writeable( elt_type ),
     123                type iterator_type | iterator( iterator_type, elt_type ),
    126124                dtype os_type | ostream( os_type ) )
    127125void write( iterator_type begin, iterator_type end, os_type *os ) {
    128         void print( elt_type i ) { os | i | ' '; }
     126        void print( elt_type i ) {
     127                os | i | ' ';
     128        }
    129129        for_each( begin, end, print );
    130130} // ?|?
    131131
    132 forall( type elt_type | writeable( elt_type ), type iterator_type | iterator( iterator_type, elt_type ),
     132forall( type elt_type | writeable( elt_type ),
     133                type iterator_type | iterator( iterator_type, elt_type ),
    133134                dtype os_type | ostream( os_type ) )
    134135void write_reverse( iterator_type begin, iterator_type end, os_type *os ) {
     
    137138} // ?|?
    138139
    139 //---------------------------------------
    140140
    141141forall( dtype istype | istream( istype ) )
     
    146146forall( dtype istype | istream( istype ) )
    147147istype * ?|?( istype *is, int *ip ) {
    148         return get( is, ip );
     148        char cur;
     149 
     150        // skip some whitespace
     151        do {
     152                is | &cur;
     153                if ( fail( is ) || eof( is ) ) return is;
     154        } while ( !( cur >= '0' && cur <= '9' ) );
     155 
     156        // accumulate digits
     157        *ip = 0;
     158        while ( cur >= '0' && cur <= '9' ) {
     159                *ip = *ip * 10 + ( cur - '0' );
     160                is | &cur;
     161                if ( fail( is ) || eof( is ) ) return is;
     162        }
     163 
     164        unread( is, cur );
     165        return is;
    149166} // ?|?
    150167
  • src/libcfa/stdlib.c

    r6ce67ce r6ed1d4b  
    1010// Created On       : Thu Jan 28 17:10:29 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb 10 15:45:56 2016
    13 // Update Count     : 140
     12// Last Modified On : Fri Feb  5 15:41:24 2016
     13// Update Count     : 128
    1414//
    1515
     
    2323#include <string.h>                                                                             // memset
    2424#include <malloc.h>                                                                             // malloc_usable_size
     25#include <stdio.h>
    2526#include <math.h>                                                                               // fabsf, fabs, fabsl
    2627#include <complex.h>                                                                    // _Complex_I, cabsf, cabs, cabsl
     
    105106long int ato( const char * ptr ) {
    106107        long int li;
    107         if ( sscanf( ptr, "%ld", &li ) == EOF ) {}                      // check return code
     108        if ( sscanf( ptr, "%ld", &li ) == EOF ) {};                     // check return code
    108109        return li;
    109110}
    110111unsigned long int ato( const char * ptr ) {
    111112        unsigned long int uli;
    112         if ( sscanf( ptr, "%lu", &uli ) == EOF ) {}                     // check return code
     113        if ( sscanf( ptr, "%lu", &uli ) == EOF ) {};            // check return code
    113114        return uli;
    114115}
    115116long long int ato( const char * ptr ) {
    116117        long long int lli;
    117         if ( sscanf( ptr, "%lld", &lli ) == EOF ) {}            // check return code
     118        if ( sscanf( ptr, "%lld", &lli ) == EOF ) {};           // check return code
    118119        return lli;
    119120}
    120121unsigned long long int ato( const char * ptr ) {
    121122        unsigned long long int ulli;
    122         if ( sscanf( ptr, "%llu", &ulli ) == EOF ) {}           // check return code
     123        if ( sscanf( ptr, "%llu", &ulli ) == EOF ) {};          // check return code
    123124        return ulli;
    124125}
    125126float ato( const char * ptr ) {
    126127        float f;
    127         if ( sscanf( ptr, "%f", &f ) == EOF ) {}                        // check return code
     128        if ( sscanf( ptr, "%f", &f ) == EOF ) {};                       // check return code
    128129        return f;
    129130}
    130131double ato( const char * ptr ) {
    131132        double d;
    132         if ( sscanf( ptr, "%lf", &d ) == EOF ) {}                       // check return code
     133        if ( sscanf( ptr, "%lf", &d ) == EOF ) {};                      // check return code
    133134        return d;
    134135}
    135136long double ato( const char * ptr ) {
    136137        long double ld;
    137         if ( sscanf( ptr, "%Lf", &ld ) == EOF ) {}                      // check return code
     138        printf( "FRED " );
     139        if ( sscanf( ptr, "%.32Lf", &ld ) == EOF ) {};          // check return code
    138140        return ld;
    139141}
    140142float _Complex ato( const char * ptr ) {
    141143        float re, im;
    142         if ( sscanf( ptr, "%g%gi", &re, &im ) == EOF ) {}       // check return code
     144        if ( sscanf( ptr, "%g%g", &re, &im ) == EOF ) {};       // check return code
    143145        return re + im * _Complex_I;
    144146}
    145147double _Complex ato( const char * ptr ) {
    146148        double re, im;
    147         if ( sscanf( ptr, "%lf%lfi", &re, &im ) == EOF ) {} // check return code
     149        if ( sscanf( ptr, "%.16lg%.16lg", &re, &im ) == EOF ) {}; // check return code
    148150        return re + im * _Complex_I;
    149151}
    150152long double _Complex ato( const char * ptr ) {
    151153        long double re, im;
    152         if ( sscanf( ptr, "%Lf%Lfi", &re, &im ) == EOF ) {}     // check return code
     154        if ( sscanf( ptr, "%.32Lg%.32Lg", &re, &im ) == EOF ) {}; // check return code
    153155        return re + im * _Complex_I;
    154156}       
Note: See TracChangeset for help on using the changeset viewer.