You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							270 lines
						
					
					
						
							8.2 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							270 lines
						
					
					
						
							8.2 KiB
						
					
					
				| /**CFile*********************************************************************** | |
|   | |
|    FileName    [testmtr.c] | |
|  | |
|    PackageName [mtr] | |
|  | |
|    Synopsis    [Test program for the mtr package.] | |
|  | |
|    Description [] | |
|  | |
|    SeeAlso     [] | |
|  | |
|    Author      [Fabio Somenzi] | |
|     | |
|   Copyright   [Copyright (c) 1995-2012, Regents of the University of Colorado | |
|  | |
|   All rights reserved. | |
|  | |
|   Redistribution and use in source and binary forms, with or without | |
|   modification, are permitted provided that the following conditions | |
|   are met: | |
|  | |
|   Redistributions of source code must retain the above copyright | |
|   notice, this list of conditions and the following disclaimer. | |
|  | |
|   Redistributions in binary form must reproduce the above copyright | |
|   notice, this list of conditions and the following disclaimer in the | |
|   documentation and/or other materials provided with the distribution. | |
|  | |
|   Neither the name of the University of Colorado nor the names of its | |
|   contributors may be used to endorse or promote products derived from | |
|   this software without specific prior written permission. | |
|  | |
|   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
|   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
|   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | |
|   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | |
|   COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | |
|   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | |
|   BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
|   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
|   CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
|   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | |
|   ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
|   POSSIBILITY OF SUCH DAMAGE.] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| #include "util.h" | |
| #include "mtr.h" | |
|  | |
| /*---------------------------------------------------------------------------*/ | |
| /* Variable declarations                                                     */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| #ifndef lint | |
| static char rcsid[] MTR_UNUSED = "$Id: testmtr.c,v 1.5 2012/02/05 06:10:35 fabio Exp $"; | |
| #endif | |
|  | |
| /*---------------------------------------------------------------------------*/ | |
| /* Constant declarations                                                     */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| #define TESTMTR_VERSION\ | |
|     "TestMtr Version #0.6, Release date 2/6/12" | |
|  | |
| /**AutomaticStart*************************************************************/ | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Static function prototypes                                                */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| static void usage (char *prog); | |
| static FILE * open_file (const char *filename, const char *mode); | |
| 
 | |
| /**AutomaticEnd***************************************************************/ | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Definition of exported functions                                          */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Main program for testmtr.] | |
|  | |
|   Description [Main program for testmtr.  Performs initialization. | |
|   Reads command line options and network(s).  Builds some simple trees | |
|   and prints them out.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [] | |
|  | |
| ******************************************************************************/ | |
| int | |
| main( | |
|   int  argc, | |
|   char ** argv) | |
| { | |
|     MtrNode *root, | |
| 	    *node; | |
|     int	    i, | |
| 	    c, | |
| 	    pr = 0; | |
|     FILE    *fp; | |
|     const char *file = NULL; | |
|      | |
|     (void) printf("# %s\n", TESTMTR_VERSION); | |
|     /* Echo command line and arguments. */ | |
|     (void) printf("#"); | |
|     for(i = 0; i < argc; i++) { | |
| 	(void) printf(" %s", argv[i]); | |
|     } | |
|     (void) printf("\n"); | |
|     (void) fflush(stdout); | |
| 
 | |
|     while ((c = getopt(argc, argv, "Mhp:")) != EOF) { | |
| 	switch(c) { | |
| 	case 'M': | |
| #ifdef MNEMOSYNE | |
| 	    (void) mnem_setrecording(0); | |
| #endif | |
| 	    break; | |
| 	case 'p': | |
| 	    pr = atoi(optarg); | |
| 	    break; | |
| 	case 'h': | |
| 	default: | |
| 	    usage(argv[0]); | |
| 	    break; | |
| 	} | |
|     } | |
| 
 | |
|     if (argc - optind == 0) { | |
| 	file = "-"; | |
|     } else if (argc - optind == 1) { | |
| 	file = argv[optind]; | |
|     } else { | |
| 	usage(argv[0]); | |
|     } | |
| 
 | |
|     /* Create and print a simple tree. */ | |
|     root = Mtr_InitTree(); | |
|     root->flags = 0; | |
|     node = Mtr_CreateFirstChild(root); | |
|     node->flags = 1; | |
|     node = Mtr_CreateLastChild(root); | |
|     node->flags = 2; | |
|     node = Mtr_CreateFirstChild(root); | |
|     node->flags = 3; | |
|     node = Mtr_AllocNode(); | |
|     node->flags = 4; | |
|     Mtr_MakeNextSibling(root->child,node); | |
|     Mtr_PrintTree(root); | |
|     Mtr_FreeTree(root); | |
|     (void) printf("#------------------------\n"); | |
| 
 | |
|     /* Create an initial tree in which all variables belong to one group. */ | |
|     root = Mtr_InitGroupTree(0,12); | |
|     Mtr_PrintTree(root); (void) printf("#  "); | |
|     Mtr_PrintGroups(root,pr == 0); (void) printf("\n"); | |
|     node = Mtr_MakeGroup(root,0,6,MTR_DEFAULT); | |
|     node = Mtr_MakeGroup(root,6,6,MTR_DEFAULT); | |
|     Mtr_PrintTree(root); (void) printf("#  "); | |
|     Mtr_PrintGroups(root,pr == 0); (void) printf("\n"); | |
|     for (i = 0; i < 6; i+=2) { | |
| 	node = Mtr_MakeGroup(root,(unsigned) i,(unsigned) 2,MTR_DEFAULT); | |
|     } | |
|     node = Mtr_MakeGroup(root,0,12,MTR_FIXED); | |
|     Mtr_PrintTree(root); (void) printf("#  "); | |
|     Mtr_PrintGroups(root,pr == 0); (void) printf("\n"); | |
|     /* Print a partial tree. */ | |
|     (void) printf("#  "); | |
|     Mtr_PrintGroups(root->child,pr == 0); (void) printf("\n"); | |
|     node = Mtr_FindGroup(root,0,6); | |
|     node = Mtr_DissolveGroup(node); | |
|     Mtr_PrintTree(root); (void) printf("#  "); | |
|     Mtr_PrintGroups(root,pr == 0); (void) printf("\n"); | |
|     node = Mtr_FindGroup(root,4,2); | |
|     if (!Mtr_SwapGroups(node,node->younger)) { | |
| 	(void) printf("error in Mtr_SwapGroups\n"); | |
| 	exit(3); | |
|     } | |
|     Mtr_PrintTree(root); (void) printf("#  "); | |
|     Mtr_PrintGroups(root,pr == 0); | |
|     Mtr_FreeTree(root); | |
|     (void) printf("#------------------------\n"); | |
| 
 | |
|     /* Create a group tree with fixed subgroups. */ | |
|     root = Mtr_InitGroupTree(0,4); | |
|     Mtr_PrintTree(root); (void) printf("#  "); | |
|     Mtr_PrintGroups(root,pr == 0); (void) printf("\n"); | |
|     node = Mtr_MakeGroup(root,0,2,MTR_FIXED); | |
|     node = Mtr_MakeGroup(root,2,2,MTR_FIXED); | |
|     Mtr_PrintTree(root); (void) printf("#  "); | |
|     Mtr_PrintGroups(root,pr == 0); (void) printf("\n"); | |
|     Mtr_FreeTree(root); | |
|     (void) printf("#------------------------\n"); | |
| 
 | |
|     /* Open input file. */ | |
|     fp = open_file(file, "r"); | |
|     root = Mtr_ReadGroups(fp,12); | |
|     Mtr_PrintTree(root); (void) printf("#  "); | |
|     Mtr_PrintGroups(root,pr == 0); (void) printf("\n"); | |
| 
 | |
|     Mtr_FreeTree(root); | |
| 
 | |
| #ifdef MNEMOSYNE | |
|     mnem_writestats(); | |
| #endif | |
|  | |
|     exit(0); | |
|     /* NOTREACHED */ | |
| 
 | |
| } /* end of main */ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Prints usage message and exits.] | |
|  | |
|   Description [] | |
|  | |
|   SideEffects [none] | |
|  | |
|   SeeAlso     [] | |
|  | |
| ******************************************************************************/ | |
| static void | |
| usage( | |
|   char * prog) | |
| { | |
|     (void) fprintf(stderr, "usage: %s [options] [file]\n", prog); | |
|     (void) fprintf(stderr, "   -M\t\tturns off memory allocation recording\n"); | |
|     (void) fprintf(stderr, "   -h\t\tprints this message\n"); | |
|     (void) fprintf(stderr, "   -p n\t\tcontrols verbosity\n"); | |
|     exit(2); | |
| 
 | |
| } /* end of usage */ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Opens a file.] | |
|  | |
|   Description [Opens a file, or fails with an error message and exits. | |
|   Allows '-' as a synonym for standard input.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [] | |
|  | |
| ******************************************************************************/ | |
| static FILE * | |
| open_file( | |
|   const char * filename, | |
|   const char * mode) | |
| { | |
|     FILE *fp; | |
| 
 | |
|     if (strcmp(filename, "-") == 0) { | |
|         return mode[0] == 'r' ? stdin : stdout; | |
|     } else if ((fp = fopen(filename, mode)) == NULL) { | |
|         perror(filename); | |
|         exit(1); | |
|     } | |
|     return(fp); | |
| 
 | |
| } /* end of open_file */ | |
| 
 |