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.
		
		
		
		
		
			
		
			
				
					
					
						
							436 lines
						
					
					
						
							10 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							436 lines
						
					
					
						
							10 KiB
						
					
					
				| /**CFile********************************************************************** | |
|  | |
|   FileName     [dddmpUtil.c] | |
|  | |
|   PackageName  [dddmp] | |
|  | |
|   Synopsis     [Util Functions for the dddmp package] | |
|  | |
|   Description  [Functions to manipulate arrays.] | |
|  | |
|   Author       [Gianpiero Cabodi and Stefano Quer] | |
|  | |
|   Copyright    [ | |
|     Copyright (c) 2004 by Politecnico di Torino. | |
|     All Rights Reserved. This software is for educational purposes only. | |
|     Permission is given to academic institutions to use, copy, and modify | |
|     this software and its documentation provided that this introductory | |
|     message is not removed, that this software and its documentation is | |
|     used for the institutions' internal research and educational purposes, | |
|     and that no monies are exchanged. No guarantee is expressed or implied | |
|     by the distribution of this code. | |
|     Send bug-reports and/or questions to: | |
|     {gianpiero.cabodi,stefano.quer}@polito.it. | |
|     ] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| #include "dddmpInt.h" | |
|  | |
| /*---------------------------------------------------------------------------*/ | |
| /* Stucture declarations                                                     */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Type declarations                                                         */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Variable declarations                                                     */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Macro declarations                                                        */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| /**AutomaticStart*************************************************************/ | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Static function prototypes                                                */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| 
 | |
| /**AutomaticEnd***************************************************************/ | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Definition of exported functions                                          */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Definition of internal functions                                          */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [String compare for qsort] | |
|  | |
|   Description [String compare for qsort] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| int | |
| QsortStrcmp( | |
|   const void *ps1   /* IN: pointer to the first string */, | |
|   const void *ps2   /* IN: pointer to the second string */ | |
|   ) | |
| { | |
|   return (strcmp (*((char**)ps1),*((char **)ps2))); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Performs binary search of a name within a sorted array] | |
|  | |
|   Description [Binary search of a name within a sorted array of strings. | |
|     Used when matching names of variables. | |
|     ] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| int | |
| FindVarname ( | |
|   char *name   /* IN: name to look for */, | |
|   char **array /* IN: search array */, | |
|   int n        /* IN: size of the array */ | |
|   ) | |
| { | |
|   int d, m, u, t; | |
| 
 | |
|   d = 0; u = n-1; | |
| 
 | |
|   while (u>=d) { | |
|     m = (u+d)/2; | |
|     t=strcmp(name,array[m]); | |
|     if (t==0) | |
|       return m; | |
|     if (t<0) | |
|       u=m-1; | |
|     else | |
|       d=m+1; | |
|   } | |
| 
 | |
|   return (-1); | |
| } | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Duplicates a string] | |
|  | |
|   Description [Allocates memory and copies source string]  | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| char * | |
| DddmpStrDup ( | |
|   char *str   /* IN: string to be duplicated */ | |
|   ) | |
| { | |
|   char *str2; | |
| 
 | |
|   str2 = DDDMP_ALLOC(char,strlen(str)+1); | |
|   if (str2 != NULL) { | |
|     strcpy (str2,str); | |
|   } | |
| 
 | |
|   return (str2); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Duplicates an array of strings] | |
|  | |
|   Description [Allocates memory and copies source array]  | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| char ** | |
| DddmpStrArrayDup ( | |
|   char **array    /* IN: array of strings to be duplicated */, | |
|   int n           /* IN: size of the array */ | |
|   ) | |
| { | |
|   char **array2; | |
|   int i; | |
| 
 | |
|   array2 = DDDMP_ALLOC(char *, n); | |
|   if (array2 == NULL) { | |
|     (void) fprintf (stderr, "DddmpStrArrayDup: Error allocating memory\n"); | |
|     fflush (stderr); | |
|     return NULL; | |
|   } | |
| 
 | |
|   /* | |
|    * initialize all slots to NULL for fair FREEing in case of failure | |
|    */ | |
| 
 | |
|   for (i=0; i<n; i++) { | |
|     array2[i] = NULL; | |
|   } | |
| 
 | |
|   for (i=0; i<n; i++) {  | |
|     if (array[i] != NULL) { | |
|       if ((array2[i]=DddmpStrDup(array[i]))==NULL) { | |
|         DddmpStrArrayFree (array2, n); | |
|         return (NULL); | |
|       } | |
|     } | |
|   } | |
| 
 | |
|   return (array2); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Inputs an array of strings] | |
|  | |
|   Description [Allocates memory and inputs source array]  | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| char ** | |
| DddmpStrArrayRead ( | |
|   FILE *fp         /* IN: input file */, | |
|   int n            /* IN: size of the array */ | |
|   ) | |
| { | |
|   char buf[DDDMP_MAXSTRLEN]; | |
|   char **array; | |
|   int i; | |
| 
 | |
|   assert(fp!=NULL); | |
| 
 | |
|   array = DDDMP_ALLOC(char *, n); | |
|   if (array == NULL) { | |
|     (void) fprintf (stderr, "DddmpStrArrayRead: Error allocating memory\n"); | |
|     fflush (stderr); | |
|     return NULL; | |
|   } | |
| 
 | |
|   /* | |
|    * initialize all slots to NULL for fair FREEing in case of failure | |
|    */ | |
|   for (i=0; i<n; i++)  | |
|     array[i] = NULL; | |
| 
 | |
|   for (i=0; i < n; i++) {  | |
|     if (fscanf (fp, "%s", buf)==EOF) { | |
|       fprintf (stderr, "DddmpStrArrayRead: Error reading file - EOF found\n"); | |
|       fflush (stderr); | |
|       DddmpStrArrayFree (array, n); | |
|       return (NULL); | |
|     } | |
|     if ((array[i]=DddmpStrDup(buf))==NULL) { | |
|       DddmpStrArrayFree (array, n); | |
|       return (NULL); | |
|     } | |
|   } | |
| 
 | |
|   return (array); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Outputs an array of strings] | |
|  | |
|   Description [Outputs an array of strings to a specified file]  | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| int | |
| DddmpStrArrayWrite ( | |
|   FILE *fp          /* IN: output file */, | |
|   char **array      /* IN: array of strings */, | |
|   int n             /* IN: size of the array */ | |
|   ) | |
| { | |
|   int i; | |
| 
 | |
|   assert(fp!=NULL); | |
| 
 | |
|   for (i=0; i<n; i++) {  | |
|     if (fprintf (fp, " %s", array[i]) == EOF) { | |
|       fprintf (stderr, "DddmpStrArrayWrite: Error writing to file\n"); | |
|       fflush (stderr); | |
|       return (EOF); | |
|     } | |
|   } | |
| 
 | |
|   return (n); | |
| } | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Frees an array of strings] | |
|  | |
|   Description [Frees memory for strings and the array of pointers]  | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| void | |
| DddmpStrArrayFree ( | |
|   char **array      /* IN: array of strings */, | |
|   int n             /* IN: size of the array */ | |
|   ) | |
| { | |
|   int i; | |
| 
 | |
|   if (array == NULL) { | |
|     return; | |
|   } | |
| 
 | |
|   for (i=0; i<n; i++) { | |
|     DDDMP_FREE (array[i]); | |
|   } | |
| 
 | |
|   DDDMP_FREE (array); | |
| 
 | |
|   return; | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Duplicates an array of ints] | |
|  | |
|   Description [Allocates memory and copies source array]  | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| int * | |
| DddmpIntArrayDup ( | |
|   int *array      /* IN: array of ints to be duplicated */, | |
|   int n           /* IN: size of the array */ | |
|   ) | |
| { | |
|   int *array2; | |
|   int i; | |
| 
 | |
|   array2 = DDDMP_ALLOC(int, n); | |
|   if (array2 == NULL) { | |
|     (void) fprintf (stderr, "DddmpIntArrayDup: Error allocating memory\n"); | |
|     fflush (stderr); | |
|     return (NULL); | |
|   } | |
| 
 | |
|   for (i=0; i<n; i++) {  | |
|     array2[i] = array[i]; | |
|   } | |
| 
 | |
|   return (array2); | |
| } | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Inputs an array of ints] | |
|  | |
|   Description [Allocates memory and inputs source array]  | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| int * | |
| DddmpIntArrayRead ( | |
|   FILE *fp          /* IN: input file */, | |
|   int n             /* IN: size of the array */ | |
|   ) | |
| { | |
|   int *array; | |
|   int i; | |
| 
 | |
|   assert(fp!=NULL); | |
| 
 | |
|   array = DDDMP_ALLOC(int, n); | |
|   if (array == NULL) { | |
|     (void) fprintf (stderr, "DddmpIntArrayRead: Error allocating memory\n"); | |
|     fflush (stderr); | |
|     return NULL; | |
|   } | |
| 
 | |
|   for (i=0; i < n; i++) {  | |
|     if (fscanf (fp, "%d", &array[i])==EOF) { | |
|       (void) fprintf (stderr, | |
|         "DddmpIntArrayRead: Error reading file - EOF found\n"); | |
|       fflush (stderr); | |
|       DDDMP_FREE (array); | |
|       return (NULL); | |
|     } | |
|   } | |
| 
 | |
|   return (array); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Outputs an array of ints] | |
|  | |
|   Description [Outputs an array of ints to a specified file] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| int | |
| DddmpIntArrayWrite ( | |
|   FILE *fp          /* IN: output file */, | |
|   int  *array       /* IN: array of ints */, | |
|   int n              /* IN: size of the array */ | |
|   ) | |
| { | |
|   int i; | |
| 
 | |
|   assert(fp!=NULL); | |
| 
 | |
|   for (i=0; i<n; i++) {  | |
|     if (fprintf (fp, " %d", array[i]) == EOF) { | |
|       (void) fprintf (stderr, "DddmpIntArrayWrite: Error writing to file\n"); | |
|       fflush (stderr); | |
|       return EOF; | |
|     } | |
|   } | |
| 
 | |
|   return (n); | |
| } | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Definition of static functions                                            */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 |