Changeset 630a82a
- Timestamp:
- Apr 8, 2016, 5:22:29 PM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, string, with_gc
- Children:
- 3da470c
- Parents:
- 3d9b5da
- Location:
- src
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/ExpressionNode.cc
r3d9b5da r630a82a 10 10 // Created On : Sat May 16 13:17:07 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Mar 13 12:34:38201613 // Update Count : 2 7212 // Last Modified On : Fri Apr 8 15:43:05 2016 13 // Update Count : 296 14 14 // 15 15 … … 22 22 23 23 #include "ParseNode.h" 24 #include "TypeData.h" 24 25 #include "SynTree/Constant.h" 25 26 #include "SynTree/Expression.h" 27 #include "SynTree/Declaration.h" 26 28 #include "Common/UnimplementedError.h" 27 29 #include "parseutility.h" … … 872 874 } 873 875 876 877 CompoundLiteralNode::CompoundLiteralNode( DeclarationNode *type, InitializerNode *kids ) : type( type ), kids( kids ) {} 878 CompoundLiteralNode::CompoundLiteralNode( const CompoundLiteralNode &other ) : ExpressionNode( other ), type( other.type ), kids( other.kids ) {} 879 880 CompoundLiteralNode::~CompoundLiteralNode() { 881 delete kids; 882 delete type; 883 } 884 885 CompoundLiteralNode *CompoundLiteralNode::clone() const { 886 return new CompoundLiteralNode( *this ); 887 } 888 889 void CompoundLiteralNode::print( std::ostream &os, int indent ) const { 890 os << string( indent,' ' ) << "CompoundLiteralNode:" << endl; 891 892 os << string( indent + 2, ' ' ) << "type:" << endl; 893 if ( type != 0 ) 894 type->print( os, indent + 4 ); 895 896 os << string( indent + 2, ' ' ) << "initialization:" << endl; 897 if ( kids != 0 ) 898 kids->printList( os, indent + 4 ); 899 } 900 901 void CompoundLiteralNode::printOneLine( std::ostream &os, int indent ) const { 902 os << "( "; 903 if ( type ) type->print( os ); 904 os << ", "; 905 if ( kids ) kids->printOneLine( os ); 906 os << ") "; 907 } 908 909 Expression *CompoundLiteralNode::build() const { 910 Declaration * newDecl = type->build(); // compound literal type 911 if ( DeclarationWithType * newDeclWithType = dynamic_cast< DeclarationWithType * >( newDecl ) ) { // non-sue compound-literal type 912 return new CompoundLiteralExpr( newDeclWithType->get_type(), kids->build() ); 913 // these types do not have associated type information 914 } else if ( StructDecl * newDeclStructDecl = dynamic_cast< StructDecl * >( newDecl ) ) { 915 return new CompoundLiteralExpr( new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ), kids->build() ); 916 } else if ( UnionDecl * newDeclUnionDecl = dynamic_cast< UnionDecl * >( newDecl ) ) { 917 return new CompoundLiteralExpr( new UnionInstType( Type::Qualifiers(), newDeclUnionDecl->get_name() ), kids->build() ); 918 } else if ( EnumDecl * newDeclEnumDecl = dynamic_cast< EnumDecl * >( newDecl ) ) { 919 return new CompoundLiteralExpr( new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() ), kids->build() ); 920 } else { 921 assert( false ); 922 } // if 923 } 924 925 874 926 ExpressionNode *flattenCommas( ExpressionNode *list ) { 875 927 if ( CompositeExprNode *composite = dynamic_cast< CompositeExprNode * >( list ) ) { -
src/Parser/ParseNode.h
r3d9b5da r630a82a 10 10 // Created On : Sat May 16 13:28:16 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 17:26:35201613 // Update Count : 19012 // Last Modified On : Fri Apr 8 16:27:20 2016 13 // Update Count : 205 14 14 // 15 15 … … 538 538 }; 539 539 540 class CompoundLiteralNode : public ExpressionNode { 541 public: 542 CompoundLiteralNode( DeclarationNode *type, InitializerNode *kids ); 543 CompoundLiteralNode( const CompoundLiteralNode &type ); 544 ~CompoundLiteralNode(); 545 546 virtual CompoundLiteralNode *clone() const; 547 548 DeclarationNode *get_type() const { return type; } 549 CompoundLiteralNode *set_type( DeclarationNode *t ) { type = t; return this; } 550 551 InitializerNode *get_initializer() const { return kids; } 552 CompoundLiteralNode *set_initializer( InitializerNode *k ) { kids = k; return this; } 553 554 void print( std::ostream &, int indent = 0 ) const; 555 void printOneLine( std::ostream &, int indent = 0 ) const; 556 557 virtual Expression *build() const; 558 private: 559 DeclarationNode *type; 560 InitializerNode *kids; 561 }; 562 540 563 template< typename SynTreeType, typename NodeType > 541 564 void buildList( const NodeType *firstNode, std::list< SynTreeType *> &outputList ) { -
src/Parser/parser.yy
r3d9b5da r630a82a 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 24 16:16:16201613 // Update Count : 1 49812 // Last Modified On : Fri Apr 8 16:21:55 2016 13 // Update Count : 1508 14 14 // 15 15 … … 372 372 { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::DecrPost ), $1 ); } 373 373 | '(' type_name_no_function ')' '{' initializer_list comma_opt '}' // C99 374 { $$ = 0; }374 { $$ = new CompoundLiteralNode( $2, new InitializerNode( $5, true ) ); } 375 375 | postfix_expression '{' argument_expression_list '}' // CFA 376 376 { -
src/SymTab/AddVisit.h
r3d9b5da r630a82a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 16:14:32 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : T ue Jul 14 12:26:17 201513 // Update Count : 411 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Apr 7 14:42:21 2016 13 // Update Count : 5 14 14 // 15 15 … … 27 27 28 28 template< typename Visitor > 29 inline void addVisitStatement( Statement *stmt, Visitor &visitor ) {30 maybeAccept( stmt, visitor );31 /// if ( ! declsToAdd.empty() ) {32 /// CompoundStmt *compound = new CompoundStmt( noLabels );33 /// compound->get_kids().push_back( stmt );34 /// addDecls( declsToAdd, compound->get_kids(), compound->get_kids().end() );35 /// }36 }37 38 template< typename Visitor >39 29 inline void addVisit(CompoundStmt *compoundStmt, Visitor &visitor) { 40 30 addVisitStatementList( compoundStmt->get_kids(), visitor ); 41 }42 43 template< typename Visitor >44 inline void addVisit(IfStmt *ifStmt, Visitor &visitor) {45 addVisitStatement( ifStmt->get_thenPart(), visitor );46 addVisitStatement( ifStmt->get_elsePart(), visitor );47 maybeAccept( ifStmt->get_condition(), visitor );48 }49 50 template< typename Visitor >51 inline void addVisit(WhileStmt *whileStmt, Visitor &visitor) {52 addVisitStatement( whileStmt->get_body(), visitor );53 maybeAccept( whileStmt->get_condition(), visitor );54 }55 56 template< typename Visitor >57 inline void addVisit(ForStmt *forStmt, Visitor &visitor) {58 addVisitStatement( forStmt->get_body(), visitor );59 acceptAll( forStmt->get_initialization(), visitor );60 maybeAccept( forStmt->get_condition(), visitor );61 maybeAccept( forStmt->get_increment(), visitor );62 31 } 63 32 … … 74 43 } 75 44 76 template< typename Visitor > 77 inline void addVisit(CaseStmt *caseStmt, Visitor &visitor) { 78 addVisitStatementList( caseStmt->get_statements(), visitor ); 79 maybeAccept( caseStmt->get_condition(), visitor ); 80 } 81 82 template< typename Visitor > 83 inline void addVisit(CatchStmt *cathStmt, Visitor &visitor) { 84 addVisitStatement( cathStmt->get_body(), visitor ); 85 maybeAccept( cathStmt->get_decl(), visitor ); 86 } 45 // template< typename Visitor > 46 // inline void addVisit(CaseStmt *caseStmt, Visitor &visitor) { 47 // addVisitStatementList( caseStmt->get_statements(), visitor ); 48 // maybeAccept( caseStmt->get_condition(), visitor ); 49 // } 87 50 } // namespace SymTab 88 51 -
src/SymTab/Validate.cc
r3d9b5da r630a82a 10 10 // Created On : Sun May 17 21:50:04 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 17:31:39201613 // Update Count : 2 2612 // Last Modified On : Thu Apr 7 16:45:30 2016 13 // Update Count : 243 14 14 // 15 15 … … 40 40 #include <list> 41 41 #include <iterator> 42 #include "Common/utility.h" 43 #include "Common/UniqueName.h" 42 44 #include "Validate.h" 43 45 #include "SynTree/Visitor.h" 44 46 #include "SynTree/Mutator.h" 45 47 #include "SynTree/Type.h" 48 #include "SynTree/Expression.h" 46 49 #include "SynTree/Statement.h" 47 50 #include "SynTree/TypeSubstitution.h" … … 49 52 #include "FixFunction.h" 50 53 // #include "ImplementationType.h" 51 #include "Common/utility.h" 52 #include "Common/UniqueName.h" 54 #include "GenPoly/DeclMutator.h" 53 55 #include "AddVisit.h" 54 56 #include "MakeLibCfa.h" … … 70 72 71 73 virtual void visit( CompoundStmt *compoundStmt ); 72 virtual void visit( IfStmt *ifStmt );73 virtual void visit( WhileStmt *whileStmt );74 virtual void visit( ForStmt *forStmt );75 74 virtual void visit( SwitchStmt *switchStmt ); 76 75 virtual void visit( ChooseStmt *chooseStmt ); 77 virtual void visit( CaseStmt *caseStmt ); 78 virtual void visit( CatchStmt *catchStmt ); 76 // virtual void visit( CaseStmt *caseStmt ); 79 77 private: 80 78 HoistStruct(); … … 144 142 145 143 virtual void visit( CompoundStmt *compoundStmt ); 146 virtual void visit( IfStmt *ifStmt );147 virtual void visit( WhileStmt *whileStmt );148 virtual void visit( ForStmt *forStmt );149 144 virtual void visit( SwitchStmt *switchStmt ); 150 145 virtual void visit( ChooseStmt *chooseStmt ); 151 virtual void visit( CaseStmt *caseStmt ); 152 virtual void visit( CatchStmt *catchStmt ); 146 // virtual void visit( CaseStmt *caseStmt ); 153 147 154 148 AutogenerateRoutines() : functionNesting( 0 ) {} … … 166 160 /// and return something if the return type is non-void. 167 161 static void checkFunctionReturns( std::list< Declaration * > & translationUnit ); 168 169 162 private: 170 163 virtual void visit( FunctionDecl * functionDecl ); … … 202 195 }; 203 196 197 class CompoundLiteral : public GenPoly::DeclMutator { 198 DeclarationNode::StorageClass storageclass = DeclarationNode::NoStorageClass; 199 200 virtual DeclarationWithType * mutate( ObjectDecl *objectDecl ); 201 virtual Expression *mutate( CompoundLiteralExpr *compLitExpr ); 202 }; 203 204 204 void validate( std::list< Declaration * > &translationUnit, bool doDebug ) { 205 205 Pass1 pass1; 206 206 Pass2 pass2( doDebug, 0 ); 207 207 Pass3 pass3( 0 ); 208 CompoundLiteral compoundliteral; 209 208 210 EliminateTypedef::eliminateTypedef( translationUnit ); 209 211 HoistStruct::hoistStruct( translationUnit ); … … 211 213 acceptAll( translationUnit, pass2 ); 212 214 ReturnChecker::checkFunctionReturns( translationUnit ); 215 mutateAll( translationUnit, compoundliteral ); 213 216 AutogenerateRoutines::autogenerateRoutines( translationUnit ); 214 217 acceptAll( translationUnit, pass3 ); … … 292 295 } 293 296 294 void HoistStruct::visit( IfStmt *ifStmt ) {295 addVisit( ifStmt, *this );296 }297 298 void HoistStruct::visit( WhileStmt *whileStmt ) {299 addVisit( whileStmt, *this );300 }301 302 void HoistStruct::visit( ForStmt *forStmt ) {303 addVisit( forStmt, *this );304 }305 306 297 void HoistStruct::visit( SwitchStmt *switchStmt ) { 307 298 addVisit( switchStmt, *this ); … … 312 303 } 313 304 314 void HoistStruct::visit( CaseStmt *caseStmt ) { 315 addVisit( caseStmt, *this ); 316 } 317 318 void HoistStruct::visit( CatchStmt *cathStmt ) { 319 addVisit( cathStmt, *this ); 320 } 305 // void HoistStruct::visit( CaseStmt *caseStmt ) { 306 // addVisit( caseStmt, *this ); 307 // } 321 308 322 309 void Pass1::visit( EnumDecl *enumDecl ) { … … 874 861 } 875 862 876 void AutogenerateRoutines::visit( IfStmt *ifStmt ) {877 visitStatement( ifStmt );878 }879 880 void AutogenerateRoutines::visit( WhileStmt *whileStmt ) {881 visitStatement( whileStmt );882 }883 884 void AutogenerateRoutines::visit( ForStmt *forStmt ) {885 visitStatement( forStmt );886 }887 888 863 void AutogenerateRoutines::visit( SwitchStmt *switchStmt ) { 889 864 visitStatement( switchStmt ); … … 894 869 } 895 870 896 void AutogenerateRoutines::visit( CaseStmt *caseStmt ) { 897 visitStatement( caseStmt ); 898 } 899 900 void AutogenerateRoutines::visit( CatchStmt *cathStmt ) { 901 visitStatement( cathStmt ); 902 } 871 // void AutogenerateRoutines::visit( CaseStmt *caseStmt ) { 872 // visitStatement( caseStmt ); 873 // } 903 874 904 875 void ReturnChecker::checkFunctionReturns( std::list< Declaration * > & translationUnit ) { … … 1080 1051 } 1081 1052 1053 DeclarationWithType * CompoundLiteral::mutate( ObjectDecl *objectDecl ) { 1054 storageclass = objectDecl->get_storageClass(); 1055 DeclarationWithType * temp = Mutator::mutate( objectDecl ); 1056 storageclass = DeclarationNode::NoStorageClass; 1057 return temp; 1058 } 1059 1060 Expression *CompoundLiteral::mutate( CompoundLiteralExpr *compLitExpr ) { 1061 // transform [storage_class] ... (struct S){ 3, ... }; 1062 // into [storage_class] struct S temp = { 3, ... }; 1063 static UniqueName indexName( "_compLit" ); 1064 1065 ObjectDecl *tempvar = new ObjectDecl( indexName.newName(), storageclass, LinkageSpec::C, 0, compLitExpr->get_type(), compLitExpr->get_initializer() ); 1066 compLitExpr->set_type( 0 ); 1067 compLitExpr->set_initializer( 0 ); 1068 delete compLitExpr; 1069 DeclarationWithType * newtempvar = mutate( tempvar ); 1070 addDeclaration( newtempvar ); // add modified temporary to current block 1071 return new VariableExpr( newtempvar ); 1072 } 1082 1073 } // namespace SymTab 1083 1074 -
src/SynTree/Expression.cc
r3d9b5da r630a82a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Wed Dec 09 14:10:29 201513 // Update Count : 3411 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Apr 8 17:16:23 2016 13 // Update Count : 40 14 14 // 15 15 … … 22 22 23 23 #include "Type.h" 24 #include "Initializer.h" 24 25 #include "Expression.h" 25 26 #include "Declaration.h" … … 443 444 444 445 446 CompoundLiteralExpr::CompoundLiteralExpr( Type * type, Initializer * initializer ) : type( type ), initializer( initializer ) { 447 add_result( type->clone() ); 448 } 449 450 CompoundLiteralExpr::CompoundLiteralExpr( const CompoundLiteralExpr &other ) : Expression( other ), type( maybeClone( other.type ) ), initializer( maybeClone( other.initializer ) ) {} 451 452 CompoundLiteralExpr::~CompoundLiteralExpr() { 453 delete initializer; 454 delete type; 455 } 456 457 void CompoundLiteralExpr::print( std::ostream &os, int indent ) const { 458 os << "Compound Literal Expression: " << std::endl; 459 if ( type ) type->print( os, indent + 2 ); 460 if ( initializer ) initializer->print( os, indent + 2 ); 461 } 462 445 463 446 464 std::ostream & operator<<( std::ostream & out, Expression * expr ) { -
src/SynTree/Expression.h
r3d9b5da r630a82a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Wed Dec 09 14:10:21 201513 // Update Count : 1911 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Apr 8 17:18:06 2016 13 // Update Count : 21 14 14 // 15 15 … … 557 557 }; 558 558 559 /// CompoundLiteralExpr represents a C99 'compound literal' 560 class CompoundLiteralExpr : public Expression { 561 public: 562 CompoundLiteralExpr( Type * type, Initializer * initializer ); 563 CompoundLiteralExpr( const CompoundLiteralExpr &other ); 564 ~CompoundLiteralExpr(); 565 566 Type * get_type() const { return type; } 567 void set_type( Type * t ) { type = t; } 568 569 Initializer * get_initializer() const { return initializer; } 570 void set_initializer( Initializer * i ) { initializer = i; } 571 572 virtual CompoundLiteralExpr *clone() const { return new CompoundLiteralExpr( *this ); } 573 virtual void accept( Visitor &v ) { v.visit( this ); } 574 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); } 575 virtual void print( std::ostream &os, int indent = 0 ) const; 576 private: 577 Type * type; 578 Initializer * initializer; 579 }; 580 559 581 std::ostream & operator<<( std::ostream & out, Expression * expr ); 560 582 -
src/SynTree/Mutator.cc
r3d9b5da r630a82a 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 17:28:20201613 // Update Count : 1 212 // Last Modified On : Fri Apr 1 18:05:16 2016 13 // Update Count : 16 14 14 // 15 15 … … 336 336 } 337 337 338 Expression *Mutator::mutate( CompoundLiteralExpr *compLitExpr ) { 339 mutateAll( compLitExpr->get_results(), *this ); 340 compLitExpr->set_type( maybeMutate( compLitExpr->get_type(), *this ) ); 341 compLitExpr->set_initializer( maybeMutate( compLitExpr->get_initializer(), *this ) ); 342 return compLitExpr; 343 } 344 338 345 Type *Mutator::mutate( VoidType *voidType ) { 339 346 mutateAll( voidType->get_forall(), *this ); -
src/SynTree/Mutator.h
r3d9b5da r630a82a 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 17:33:11201613 // Update Count : 912 // Last Modified On : Fri Apr 1 17:26:56 2016 13 // Update Count : 10 14 14 // 15 15 #include <cassert> … … 76 76 virtual Expression* mutate( AsmExpr *asmExpr ); 77 77 virtual Expression* mutate( UntypedValofExpr *valofExpr ); 78 virtual Expression* mutate( CompoundLiteralExpr *compLitExpr ); 78 79 79 80 virtual Type* mutate( VoidType *basicType ); -
src/SynTree/SynTree.h
r3d9b5da r630a82a 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 17:29:00201613 // Update Count : 412 // Last Modified On : Fri Apr 1 16:47:44 2016 13 // Update Count : 5 14 14 // 15 15 … … 81 81 class AsmExpr; 82 82 class UntypedValofExpr; 83 class CompoundLiteralExpr; 83 84 84 85 class Type; -
src/SynTree/Visitor.cc
r3d9b5da r630a82a 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 17:29:23 201613 // Update Count : 1 612 // Last Modified On : Fri Apr 1 18:05:13 2016 13 // Update Count : 18 14 14 // 15 15 … … 284 284 } 285 285 286 void Visitor::visit( CompoundLiteralExpr *compLitExpr ) { 287 acceptAll( compLitExpr->get_results(), *this ); 288 maybeAccept( compLitExpr->get_type(), *this ); 289 maybeAccept( compLitExpr->get_initializer(), *this ); 290 } 291 286 292 void Visitor::visit( VoidType *voidType ) { 287 293 acceptAll( voidType->get_forall(), *this ); -
src/SynTree/Visitor.h
r3d9b5da r630a82a 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 17:33:35 201613 // Update Count : 612 // Last Modified On : Fri Apr 1 17:26:55 2016 13 // Update Count : 7 14 14 // 15 15 … … 76 76 virtual void visit( AsmExpr *asmExpr ); 77 77 virtual void visit( UntypedValofExpr *valofExpr ); 78 virtual void visit( CompoundLiteralExpr *compLitExpr ); 78 79 79 80 virtual void visit( VoidType *basicType ); -
src/examples/rational.c
r3d9b5da r630a82a 6 6 // file "LICENCE" distributed with Cforall. 7 7 // 8 // rational.c -- 8 // rational.c -- test rational number package 9 9 // 10 10 // Author : Peter A. Buhr 11 11 // Created On : Mon Mar 28 08:43:12 2016 12 12 // Last Modified By : Peter A. Buhr 13 // Last Modified On : Thu Apr 7 17:25:44201614 // Update Count : 2 013 // Last Modified On : Fri Apr 8 11:27:48 2016 14 // Update Count : 21 15 15 // 16 16 -
src/libcfa/rational
r3d9b5da r630a82a 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // rational -- 7 // rational -- Rational numbers are numbers written as a ratio, i.e., as a fraction, where the numerator (top number) 8 // and the denominator (bottom number) are whole numbers. When creating and computing with rational numbers, results 9 // are constantly reduced to keep the numerator and denominator as small as possible. 8 10 // 9 11 // Author : Peter A. Buhr 10 12 // Created On : Wed Apr 6 17:56:25 2016 11 13 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Apr 7 17:23:36201613 // Update Count : 914 // Last Modified On : Fri Apr 8 11:38:27 2016 15 // Update Count : 15 14 16 // 15 17 16 18 #include "iostream" 17 19 20 // implementation 18 21 struct Rational { 19 22 long int numerator, denominator; // invariant: denominator > 0 20 23 }; // Rational 21 24 25 // constants 22 26 extern struct Rational 0; 23 27 extern struct Rational 1; 24 28 25 long int gcd( long int a, long int b ); 26 long int simplify( long int *n, long int *d ); 27 Rational rational(); // constructor 28 Rational rational( long int n ); // constructor 29 Rational rational( long int n, long int d ); // constructor 29 // constructors 30 Rational rational(); 31 Rational rational( long int n ); 32 Rational rational( long int n, long int d ); 33 34 // getter/setter for numerator/denominator 30 35 long int numerator( Rational r ); 31 36 long int numerator( Rational r, long int n ); 37 long int denominator( Rational r ); 32 38 long int denominator( Rational r, long int d ); 39 40 // comparison 33 41 int ?==?( Rational l, Rational r ); 34 42 int ?!=?( Rational l, Rational r ); … … 37 45 int ?>?( Rational l, Rational r ); 38 46 int ?>=?( Rational l, Rational r ); 47 48 // arithmetic 39 49 Rational -?( Rational r ); 40 50 Rational ?+?( Rational l, Rational r ); … … 42 52 Rational ?*?( Rational l, Rational r ); 43 53 Rational ?/?( Rational l, Rational r ); 54 55 // conversion 44 56 double widen( Rational r ); 45 57 Rational narrow( double f, long int md ); 58 59 // I/O 46 60 forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, Rational * ); 47 61 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, Rational ); -
src/libcfa/rational.c
r3d9b5da r630a82a 11 11 // Created On : Wed Apr 6 17:54:28 2016 12 12 // Last Modified By : Peter A. Buhr 13 // Last Modified On : Thu Apr 7 17:28:03201614 // Update Count : 1 213 // Last Modified On : Fri Apr 8 15:39:17 2016 14 // Update Count : 17 15 15 // 16 16 … … 23 23 } // extern 24 24 25 26 // constants 27 25 28 struct Rational 0 = {0, 1}; 26 29 struct Rational 1 = {1, 1}; 27 30 28 // Calculate the greatest common denominator of two numbers, the first of which may be negative. It is used to reduce 29 // rationals. 30 31 long int gcd( long int a, long int b ) { 31 32 // helper 33 34 // Calculate greatest common denominator of two numbers, the first of which may be negative. Used to reduce rationals. 35 static long int gcd( long int a, long int b ) { 32 36 for ( ;; ) { // Euclid's algorithm 33 37 long int r = a % b; … … 39 43 } // gcd 40 44 41 long int simplify( long int *n, long int *d ) {45 static long int simplify( long int *n, long int *d ) { 42 46 if ( *d == 0 ) { 43 47 serr | "Invalid rational number construction: denominator cannot be equal to 0." | endl; … … 48 52 } // Rationalnumber::simplify 49 53 50 Rational rational() { // constructor 51 // r = (Rational){ 0, 1 }; 52 Rational t = { 0, 1 }; 53 return t; 54 55 // constructors 56 57 Rational rational() { 58 return (Rational){ 0, 1 }; 59 // Rational t = { 0, 1 }; 60 // return t; 54 61 } // rational 55 62 56 Rational rational( long int n ) { // constructor57 // r =(Rational){ n, 1 };58 Rational t = { n, 1 };59 return t;63 Rational rational( long int n ) { 64 return (Rational){ n, 1 }; 65 // Rational t = { n, 1 }; 66 // return t; 60 67 } // rational 61 68 62 Rational rational( long int n, long int d ) { // constructor69 Rational rational( long int n, long int d ) { 63 70 long int t = simplify( &n, &d ); // simplify 64 71 // r = (Rational){ n / t, d / t }; … … 66 73 return t; 67 74 } // rational 75 76 77 // getter/setter for numerator/denominator 68 78 69 79 long int numerator( Rational r ) { … … 79 89 } // numerator 80 90 91 long int denominator( Rational r ) { 92 return r.denominator; 93 } // denominator 94 81 95 long int denominator( Rational r, long int d ) { 82 96 long int prev = r.denominator; … … 87 101 } // denominator 88 102 103 104 // comparison 105 89 106 int ?==?( Rational l, Rational r ) { 90 107 return l.numerator * r.denominator == l.denominator * r.numerator; … … 110 127 return ! ( l < r ); 111 128 } // ?>=? 129 130 131 // arithmetic 112 132 113 133 Rational -?( Rational r ) { … … 149 169 return t; 150 170 } // ?/? 171 172 173 // conversion 151 174 152 175 double widen( Rational r ) { … … 188 211 } // narrow 189 212 213 214 // I/O 215 190 216 forall( dtype istype | istream( istype ) ) 191 217 istype * ?|?( istype *is, Rational *r ) {
Note: See TracChangeset
for help on using the changeset viewer.