Changes in / [3da470c:224e52f]
- Location:
- src
- Files:
-
- 15 edited
-
Parser/ExpressionNode.cc (modified) (3 diffs)
-
Parser/ParseNode.h (modified) (2 diffs)
-
Parser/parser.yy (modified) (2 diffs)
-
SymTab/AddVisit.h (modified) (3 diffs)
-
SymTab/Validate.cc (modified) (13 diffs)
-
SynTree/Expression.cc (modified) (3 diffs)
-
SynTree/Expression.h (modified) (2 diffs)
-
SynTree/Mutator.cc (modified) (2 diffs)
-
SynTree/Mutator.h (modified) (2 diffs)
-
SynTree/SynTree.h (modified) (2 diffs)
-
SynTree/Visitor.cc (modified) (2 diffs)
-
SynTree/Visitor.h (modified) (2 diffs)
-
examples/rational.c (modified) (1 diff)
-
libcfa/rational (modified) (3 diffs)
-
libcfa/rational.c (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/ExpressionNode.cc
r3da470c r224e52f 10 10 // Created On : Sat May 16 13:17:07 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Apr 8 15:43:05201613 // Update Count : 2 9612 // Last Modified On : Sun Mar 13 12:34:38 2016 13 // Update Count : 272 14 14 // 15 15 … … 22 22 23 23 #include "ParseNode.h" 24 #include "TypeData.h"25 24 #include "SynTree/Constant.h" 26 25 #include "SynTree/Expression.h" 27 #include "SynTree/Declaration.h"28 26 #include "Common/UnimplementedError.h" 29 27 #include "parseutility.h" … … 874 872 } 875 873 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 type911 if ( DeclarationWithType * newDeclWithType = dynamic_cast< DeclarationWithType * >( newDecl ) ) { // non-sue compound-literal type912 return new CompoundLiteralExpr( newDeclWithType->get_type(), kids->build() );913 // these types do not have associated type information914 } 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 } // if923 }924 925 926 874 ExpressionNode *flattenCommas( ExpressionNode *list ) { 927 875 if ( CompositeExprNode *composite = dynamic_cast< CompositeExprNode * >( list ) ) { -
src/Parser/ParseNode.h
r3da470c r224e52f 10 10 // Created On : Sat May 16 13:28:16 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Apr 8 16:27:20201613 // Update Count : 20512 // Last Modified On : Wed Mar 2 17:26:35 2016 13 // Update Count : 190 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 563 540 template< typename SynTreeType, typename NodeType > 564 541 void buildList( const NodeType *firstNode, std::list< SynTreeType *> &outputList ) { -
src/Parser/parser.yy
r3da470c r224e52f 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Apr 8 16:21:55201613 // Update Count : 1 50812 // Last Modified On : Thu Mar 24 16:16:16 2016 13 // Update Count : 1498 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 { $$ = new CompoundLiteralNode( $2, new InitializerNode( $5, true ) ); }374 { $$ = 0; } 375 375 | postfix_expression '{' argument_expression_list '}' // CFA 376 376 { -
src/SymTab/AddVisit.h
r3da470c r224e52f 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 16:14:32 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : T hu Apr 7 14:42:21 201613 // Update Count : 511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Jul 14 12:26:17 2015 13 // Update Count : 4 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 > 29 39 inline void addVisit(CompoundStmt *compoundStmt, Visitor &visitor) { 30 40 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 ); 31 62 } 32 63 … … 43 74 } 44 75 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 // } 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 } 50 87 } // namespace SymTab 51 88 -
src/SymTab/Validate.cc
r3da470c r224e52f 10 10 // Created On : Sun May 17 21:50:04 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Apr 7 16:45:30201613 // Update Count : 2 4312 // Last Modified On : Wed Mar 2 17:31:39 2016 13 // Update Count : 226 14 14 // 15 15 … … 40 40 #include <list> 41 41 #include <iterator> 42 #include "Common/utility.h"43 #include "Common/UniqueName.h"44 42 #include "Validate.h" 45 43 #include "SynTree/Visitor.h" 46 44 #include "SynTree/Mutator.h" 47 45 #include "SynTree/Type.h" 48 #include "SynTree/Expression.h"49 46 #include "SynTree/Statement.h" 50 47 #include "SynTree/TypeSubstitution.h" … … 52 49 #include "FixFunction.h" 53 50 // #include "ImplementationType.h" 54 #include "GenPoly/DeclMutator.h" 51 #include "Common/utility.h" 52 #include "Common/UniqueName.h" 55 53 #include "AddVisit.h" 56 54 #include "MakeLibCfa.h" … … 72 70 73 71 virtual void visit( CompoundStmt *compoundStmt ); 72 virtual void visit( IfStmt *ifStmt ); 73 virtual void visit( WhileStmt *whileStmt ); 74 virtual void visit( ForStmt *forStmt ); 74 75 virtual void visit( SwitchStmt *switchStmt ); 75 76 virtual void visit( ChooseStmt *chooseStmt ); 76 // virtual void visit( CaseStmt *caseStmt ); 77 virtual void visit( CaseStmt *caseStmt ); 78 virtual void visit( CatchStmt *catchStmt ); 77 79 private: 78 80 HoistStruct(); … … 142 144 143 145 virtual void visit( CompoundStmt *compoundStmt ); 146 virtual void visit( IfStmt *ifStmt ); 147 virtual void visit( WhileStmt *whileStmt ); 148 virtual void visit( ForStmt *forStmt ); 144 149 virtual void visit( SwitchStmt *switchStmt ); 145 150 virtual void visit( ChooseStmt *chooseStmt ); 146 // virtual void visit( CaseStmt *caseStmt ); 151 virtual void visit( CaseStmt *caseStmt ); 152 virtual void visit( CatchStmt *catchStmt ); 147 153 148 154 AutogenerateRoutines() : functionNesting( 0 ) {} … … 160 166 /// and return something if the return type is non-void. 161 167 static void checkFunctionReturns( std::list< Declaration * > & translationUnit ); 168 162 169 private: 163 170 virtual void visit( FunctionDecl * functionDecl ); … … 195 202 }; 196 203 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 210 208 EliminateTypedef::eliminateTypedef( translationUnit ); 211 209 HoistStruct::hoistStruct( translationUnit ); … … 213 211 acceptAll( translationUnit, pass2 ); 214 212 ReturnChecker::checkFunctionReturns( translationUnit ); 215 mutateAll( translationUnit, compoundliteral );216 213 AutogenerateRoutines::autogenerateRoutines( translationUnit ); 217 214 acceptAll( translationUnit, pass3 ); … … 295 292 } 296 293 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 297 306 void HoistStruct::visit( SwitchStmt *switchStmt ) { 298 307 addVisit( switchStmt, *this ); … … 303 312 } 304 313 305 // void HoistStruct::visit( CaseStmt *caseStmt ) { 306 // addVisit( caseStmt, *this ); 307 // } 314 void HoistStruct::visit( CaseStmt *caseStmt ) { 315 addVisit( caseStmt, *this ); 316 } 317 318 void HoistStruct::visit( CatchStmt *cathStmt ) { 319 addVisit( cathStmt, *this ); 320 } 308 321 309 322 void Pass1::visit( EnumDecl *enumDecl ) { … … 861 874 } 862 875 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 863 888 void AutogenerateRoutines::visit( SwitchStmt *switchStmt ) { 864 889 visitStatement( switchStmt ); … … 869 894 } 870 895 871 // void AutogenerateRoutines::visit( CaseStmt *caseStmt ) { 872 // visitStatement( caseStmt ); 873 // } 896 void AutogenerateRoutines::visit( CaseStmt *caseStmt ) { 897 visitStatement( caseStmt ); 898 } 899 900 void AutogenerateRoutines::visit( CatchStmt *cathStmt ) { 901 visitStatement( cathStmt ); 902 } 874 903 875 904 void ReturnChecker::checkFunctionReturns( std::list< Declaration * > & translationUnit ) { … … 1051 1080 } 1052 1081 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 block1071 return new VariableExpr( newtempvar );1072 }1073 1082 } // namespace SymTab 1074 1083 -
src/SynTree/Expression.cc
r3da470c r224e52f 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Apr 8 17:16:23 201613 // Update Count : 4011 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Dec 09 14:10:29 2015 13 // Update Count : 34 14 14 // 15 15 … … 22 22 23 23 #include "Type.h" 24 #include "Initializer.h"25 24 #include "Expression.h" 26 25 #include "Declaration.h" … … 465 464 466 465 467 CompoundLiteralExpr::CompoundLiteralExpr( Type * type, Initializer * initializer ) : type( type ), initializer( initializer ) {468 add_result( type->clone() );469 }470 471 CompoundLiteralExpr::CompoundLiteralExpr( const CompoundLiteralExpr &other ) : Expression( other ), type( maybeClone( other.type ) ), initializer( maybeClone( other.initializer ) ) {}472 473 CompoundLiteralExpr::~CompoundLiteralExpr() {474 delete initializer;475 delete type;476 }477 478 void CompoundLiteralExpr::print( std::ostream &os, int indent ) const {479 os << "Compound Literal Expression: " << std::endl;480 if ( type ) type->print( os, indent + 2 );481 if ( initializer ) initializer->print( os, indent + 2 );482 }483 484 466 485 467 std::ostream & operator<<( std::ostream & out, Expression * expr ) { -
src/SynTree/Expression.h
r3da470c r224e52f 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Apr 8 17:18:06 201613 // Update Count : 2111 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Dec 09 14:10:21 2015 13 // Update Count : 19 14 14 // 15 15 … … 577 577 }; 578 578 579 /// CompoundLiteralExpr represents a C99 'compound literal'580 class CompoundLiteralExpr : public Expression {581 public:582 CompoundLiteralExpr( Type * type, Initializer * initializer );583 CompoundLiteralExpr( const CompoundLiteralExpr &other );584 ~CompoundLiteralExpr();585 586 Type * get_type() const { return type; }587 void set_type( Type * t ) { type = t; }588 589 Initializer * get_initializer() const { return initializer; }590 void set_initializer( Initializer * i ) { initializer = i; }591 592 virtual CompoundLiteralExpr *clone() const { return new CompoundLiteralExpr( *this ); }593 virtual void accept( Visitor &v ) { v.visit( this ); }594 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }595 virtual void print( std::ostream &os, int indent = 0 ) const;596 private:597 Type * type;598 Initializer * initializer;599 };600 601 579 std::ostream & operator<<( std::ostream & out, Expression * expr ); 602 580 -
src/SynTree/Mutator.cc
r3da470c r224e52f 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Apr 1 18:05:16201613 // Update Count : 1 612 // Last Modified On : Wed Mar 2 17:28:20 2016 13 // Update Count : 12 14 14 // 15 15 … … 342 342 } 343 343 344 Expression *Mutator::mutate( CompoundLiteralExpr *compLitExpr ) {345 mutateAll( compLitExpr->get_results(), *this );346 compLitExpr->set_type( maybeMutate( compLitExpr->get_type(), *this ) );347 compLitExpr->set_initializer( maybeMutate( compLitExpr->get_initializer(), *this ) );348 return compLitExpr;349 }350 351 344 Type *Mutator::mutate( VoidType *voidType ) { 352 345 mutateAll( voidType->get_forall(), *this ); -
src/SynTree/Mutator.h
r3da470c r224e52f 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Apr 1 17:26:56201613 // Update Count : 1012 // Last Modified On : Wed Mar 2 17:33:11 2016 13 // Update Count : 9 14 14 // 15 15 #include <cassert> … … 77 77 virtual Expression* mutate( AsmExpr *asmExpr ); 78 78 virtual Expression* mutate( UntypedValofExpr *valofExpr ); 79 virtual Expression* mutate( CompoundLiteralExpr *compLitExpr );80 79 81 80 virtual Type* mutate( VoidType *basicType ); -
src/SynTree/SynTree.h
r3da470c r224e52f 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Apr 1 16:47:44201613 // Update Count : 512 // Last Modified On : Wed Mar 2 17:29:00 2016 13 // Update Count : 4 14 14 // 15 15 … … 82 82 class AsmExpr; 83 83 class UntypedValofExpr; 84 class CompoundLiteralExpr;85 84 86 85 class Type; -
src/SynTree/Visitor.cc
r3da470c r224e52f 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Apr 1 18:05:13 201613 // Update Count : 1 812 // Last Modified On : Wed Mar 2 17:29:23 2016 13 // Update Count : 16 14 14 // 15 15 … … 289 289 } 290 290 291 void Visitor::visit( CompoundLiteralExpr *compLitExpr ) {292 acceptAll( compLitExpr->get_results(), *this );293 maybeAccept( compLitExpr->get_type(), *this );294 maybeAccept( compLitExpr->get_initializer(), *this );295 }296 297 291 void Visitor::visit( VoidType *voidType ) { 298 292 acceptAll( voidType->get_forall(), *this ); -
src/SynTree/Visitor.h
r3da470c r224e52f 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Apr 1 17:26:55 201613 // Update Count : 712 // Last Modified On : Wed Mar 2 17:33:35 2016 13 // Update Count : 6 14 14 // 15 15 … … 77 77 virtual void visit( AsmExpr *asmExpr ); 78 78 virtual void visit( UntypedValofExpr *valofExpr ); 79 virtual void visit( CompoundLiteralExpr *compLitExpr );80 79 81 80 virtual void visit( VoidType *basicType ); -
src/examples/rational.c
r3da470c r224e52f 6 6 // file "LICENCE" distributed with Cforall. 7 7 // 8 // rational.c -- test rational number package8 // rational.c -- 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 : Fri Apr 8 11:27:48201614 // Update Count : 2 113 // Last Modified On : Thu Apr 7 17:25:44 2016 14 // Update Count : 20 15 15 // 16 16 -
src/libcfa/rational
r3da470c r224e52f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 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. 7 // rational -- 10 8 // 11 9 // Author : Peter A. Buhr 12 10 // Created On : Wed Apr 6 17:56:25 2016 13 11 // Last Modified By : Peter A. Buhr 14 // Last Modified On : Fri Apr 8 11:38:27201615 // Update Count : 1512 // Last Modified On : Thu Apr 7 17:23:36 2016 13 // Update Count : 9 16 14 // 17 15 18 16 #include "iostream" 19 17 20 // implementation21 18 struct Rational { 22 19 long int numerator, denominator; // invariant: denominator > 0 23 20 }; // Rational 24 21 25 // constants26 22 extern struct Rational 0; 27 23 extern struct Rational 1; 28 24 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 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 35 30 long int numerator( Rational r ); 36 31 long int numerator( Rational r, long int n ); 37 long int denominator( Rational r );38 32 long int denominator( Rational r, long int d ); 39 40 // comparison41 33 int ?==?( Rational l, Rational r ); 42 34 int ?!=?( Rational l, Rational r ); … … 45 37 int ?>?( Rational l, Rational r ); 46 38 int ?>=?( Rational l, Rational r ); 47 48 // arithmetic49 39 Rational -?( Rational r ); 50 40 Rational ?+?( Rational l, Rational r ); … … 52 42 Rational ?*?( Rational l, Rational r ); 53 43 Rational ?/?( Rational l, Rational r ); 54 55 // conversion56 44 double widen( Rational r ); 57 45 Rational narrow( double f, long int md ); 58 59 // I/O60 46 forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, Rational * ); 61 47 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, Rational ); -
src/libcfa/rational.c
r3da470c r224e52f 11 11 // Created On : Wed Apr 6 17:54:28 2016 12 12 // Last Modified By : Peter A. Buhr 13 // Last Modified On : Fri Apr 8 15:39:17201614 // Update Count : 1 713 // Last Modified On : Thu Apr 7 17:28:03 2016 14 // Update Count : 12 15 15 // 16 16 … … 23 23 } // extern 24 24 25 26 // constants27 28 25 struct Rational 0 = {0, 1}; 29 26 struct Rational 1 = {1, 1}; 30 27 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 ) { 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 ) { 36 32 for ( ;; ) { // Euclid's algorithm 37 33 long int r = a % b; … … 43 39 } // gcd 44 40 45 staticlong int simplify( long int *n, long int *d ) {41 long int simplify( long int *n, long int *d ) { 46 42 if ( *d == 0 ) { 47 43 serr | "Invalid rational number construction: denominator cannot be equal to 0." | endl; … … 52 48 } // Rationalnumber::simplify 53 49 54 55 // constructors 56 57 Rational rational() { 58 return (Rational){ 0, 1 }; 59 // Rational t = { 0, 1 }; 60 // return t; 50 Rational rational() { // constructor 51 // r = (Rational){ 0, 1 }; 52 Rational t = { 0, 1 }; 53 return t; 61 54 } // rational 62 55 63 Rational rational( long int n ) { 64 return(Rational){ n, 1 };65 //Rational t = { n, 1 };66 //return t;56 Rational rational( long int n ) { // constructor 57 // r = (Rational){ n, 1 }; 58 Rational t = { n, 1 }; 59 return t; 67 60 } // rational 68 61 69 Rational rational( long int n, long int d ) { 62 Rational rational( long int n, long int d ) { // constructor 70 63 long int t = simplify( &n, &d ); // simplify 71 64 // r = (Rational){ n / t, d / t }; … … 73 66 return t; 74 67 } // rational 75 76 77 // getter/setter for numerator/denominator78 68 79 69 long int numerator( Rational r ) { … … 89 79 } // numerator 90 80 91 long int denominator( Rational r ) {92 return r.denominator;93 } // denominator94 95 81 long int denominator( Rational r, long int d ) { 96 82 long int prev = r.denominator; … … 101 87 } // denominator 102 88 103 104 // comparison105 106 89 int ?==?( Rational l, Rational r ) { 107 90 return l.numerator * r.denominator == l.denominator * r.numerator; … … 127 110 return ! ( l < r ); 128 111 } // ?>=? 129 130 131 // arithmetic132 112 133 113 Rational -?( Rational r ) { … … 169 149 return t; 170 150 } // ?/? 171 172 173 // conversion174 151 175 152 double widen( Rational r ) { … … 211 188 } // narrow 212 189 213 214 // I/O215 216 190 forall( dtype istype | istream( istype ) ) 217 191 istype * ?|?( istype *is, Rational *r ) {
Note:
See TracChangeset
for help on using the changeset viewer.