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.
		
		
		
		
		
			
		
			
				
					
					
						
							343 lines
						
					
					
						
							9.4 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							343 lines
						
					
					
						
							9.4 KiB
						
					
					
				| /**CFile********************************************************************** | |
|  | |
|   FileName    [dddmpBinary.c] | |
|  | |
|   PackageName [dddmp] | |
|  | |
|   Synopsis    [Input and output BDD codes and integers from/to file] | |
|  | |
|   Description [Input and output BDD codes and integers from/to file | |
|     in binary mode. | |
|     DD node codes are written as one byte. | |
|     Integers of any length are written as sequences of "linked" bytes. | |
|     For each byte 7 bits are used for data and one (MSBit) as link with | |
|     a further byte (MSB = 1 means one more byte). | |
|     Low level read/write of bytes filter <CR>, <LF> and <ctrl-Z> | |
|     with escape sequences. | |
|     ] | |
|  | |
|   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                                                */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| static int WriteByteBinary(FILE *fp, unsigned char c); | |
| static int ReadByteBinary(FILE *fp, unsigned char *cp); | |
| 
 | |
| /**AutomaticEnd***************************************************************/ | |
| 
 | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Definition of exported functions                                          */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Definition of internal functions                                          */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Writes 1 byte node code] | |
|  | |
|   Description [outputs a 1 byte node code using the following format: | |
|      <pre> | |
|      Unused      : 1 bit; | |
|      V           : 2 bits;     (variable code) | |
|      T           : 2 bits;     (Then code) | |
|      Ecompl      : 1 bit;      (Else complemented) | |
|      E           : 2 bits;     (Else code) | |
|     </pre> | |
|     Ecompl is set with complemented edges. | |
|     ] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [DddmpReadCode()] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| int | |
| DddmpWriteCode ( | |
|   FILE *fp                   /* IN: file where to write the code */, | |
|   struct binary_dd_code code /* IN: the code to be written */ | |
|   ) | |
| { | |
|   unsigned char c; | |
|   int retValue; | |
| 
 | |
|   c = (code.Unused<<7)|(code.V<<5)|(code.T<<3)| | |
| 		(code.Ecompl<<2)|(code.E); | |
| 
 | |
|   retValue = WriteByteBinary (fp, c); | |
| 
 | |
|   return (retValue); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Reads a 1 byte node code] | |
|  | |
|   Description [Reads a 1 byte node code. See DddmpWriteCode() | |
|     for code description.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [DddmpWriteCode()] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| int  | |
| DddmpReadCode ( | |
|   FILE *fp                     /*  IN: file where to read the code */, | |
|   struct binary_dd_code *pcode /* OUT: the read code */ | |
|   ) | |
| { | |
|   unsigned char c; | |
| 
 | |
|   if (ReadByteBinary (fp, &c) == EOF) { | |
|     return (0); | |
|   } | |
| 
 | |
|   pcode->Unused =  c>>7; | |
|   pcode->V      = (c>>5) & 3; | |
|   pcode->T      = (c>>3) & 3; | |
|   pcode->Ecompl = (c>>2) & 1; | |
|   pcode->E      =  c     & 3; | |
| 
 | |
|   return (1); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Writes a "packed integer"] | |
|  | |
|   Description [Writes an integer as a sequence of bytes (MSByte first). | |
|     For each byte 7 bits are used for data and one (LSBit) as link  | |
|     with a further byte (LSB = 1 means one more byte). | |
|     ] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [DddmpReadInt()] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| int  | |
| DddmpWriteInt ( | |
|   FILE *fp   /* IN: file where to write the integer */, | |
|   int id     /* IN: integer to be written */ | |
|   ) | |
| { | |
|   char cvet[4]; | |
|   int i; | |
| 
 | |
|   for (i=0; i<4; i++) { | |
|     cvet[i] = (char)((id & 0x0000007f) << 1); | |
|     id >>= 7; | |
|   } | |
| 
 | |
|   for (i=3; (i>0) && (cvet[i] == 0); i--); | |
| 
 | |
|   for (; i>0; i--) { | |
|     cvet[i] |= (char)1; | |
|     if (WriteByteBinary (fp, cvet[i]) == EOF) | |
|       return (0); | |
|   } | |
| 
 | |
|   if (WriteByteBinary (fp, cvet[0]) == EOF) { | |
|     return (0); | |
|   } | |
| 
 | |
|   return (1); | |
| } | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Reads a "packed integer"] | |
|  | |
|   Description [Reads an integer coded on a sequence of bytes. See | |
|     DddmpWriteInt() for format.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [DddmpWriteInt()] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| int | |
| DddmpReadInt ( | |
|   FILE *fp   /*  IN: file where to read the integer */, | |
|   int *pid   /* OUT: the read integer */ | |
|   ) | |
| { | |
|   unsigned char c; | |
|   int i; | |
|   unsigned int id; | |
| 
 | |
|   id = 0; | |
|   for (i=0; i<4; i++) { | |
|     if (ReadByteBinary (fp, &c) == EOF) | |
|       return (0); | |
|     id = (id<<7) | (c>>1); | |
|     if ((c & 1) == 0) | |
|       break; | |
|   } | |
| 
 | |
|  /* Check for correct format: last char should  | |
|     be found before i = 4 */ | |
|   assert(i<4); | |
| 
 | |
|   *pid = id; | |
| 
 | |
|   return (i+1); | |
| } | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Definition of static functions                                            */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Writes a byte to file filtering <CR>, <LF> and <ctrl-Z>] | |
|  | |
|   Description [outputs a byte to file fp. Uses 0x00 as escape character | |
|     to filter <CR>, <LF> and <ctrl-Z>. | |
|     This is done for compatibility between unix and dos/windows systems. | |
|     ] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [ReadByteBinary()] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| WriteByteBinary ( | |
|   FILE *fp         /* IN: file where to write the byte */, | |
|   unsigned char c  /* IN: the byte to be written */ | |
|   ) | |
| { | |
|   unsigned char BinaryEscape; | |
|   | |
|   switch (c) { | |
| 
 | |
|     case 0x00: /* Escape */ | |
|       BinaryEscape = 0x00; | |
|       if (fwrite (&BinaryEscape, sizeof(char), 1, fp) != sizeof(char)) | |
|         return (0); | |
|       c = 0x00; | |
|       break; | |
|     case 0x0a: /* <LF> */ | |
|       BinaryEscape = 0x00; | |
|       if (fwrite (&BinaryEscape, sizeof(char), 1, fp) != sizeof(char)) | |
|         return (0); | |
|       c = 0x01; | |
|       break; | |
|     case 0x0d: /* <CR> */ | |
|       BinaryEscape = 0x00; | |
|       if (fwrite (&BinaryEscape, sizeof(char), 1, fp) != sizeof(char)) | |
|         return (0); | |
|       c = 0x02; | |
|       break; | |
|     case 0x1a: /* <ctrl-Z> */ | |
|       BinaryEscape = 0x00; | |
|       if (fwrite (&BinaryEscape, sizeof(char), 1, fp) != sizeof(char)) | |
|         return (0); | |
|       c = 0x03; | |
|       break; | |
|   } | |
|   if (fwrite (&c, sizeof(char), 1, fp) != sizeof(char)) | |
|     return (0); | |
| 
 | |
|   return (1); | |
| } | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Reads a byte from file with escaped <CR>, <LF> and <ctrl-Z>] | |
|  | |
|   Description [inputs a byte to file fp. 0x00 has been used as escape character | |
|     to filter <CR>, <LF> and <ctrl-Z>. This is done for | |
|     compatibility between unix and dos/windows systems. | |
|     ] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [WriteByteBinary()] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| static int | |
| ReadByteBinary ( | |
|   FILE *fp           /*  IN: file where to read the byte */, | |
|   unsigned char *cp  /* OUT: the read byte */ | |
|   ) | |
| { | |
|   | |
|   if (fread (cp, sizeof(char), 1, fp) != sizeof(char)) { | |
|     return (0); | |
|   } | |
| 
 | |
|   if (*cp == 0x00) { /* Escape */ | |
|     if (fread (cp, sizeof(char), 1, fp) != sizeof(char)) { | |
|       return (0); | |
|     } | |
| 
 | |
|     switch (*cp) { | |
| 
 | |
|       case 0x00: /* Escape */ | |
|         break; | |
|       case 0x01: /* <LF> */ | |
|         *cp = 0x0a; | |
|         break; | |
|       case 0x02: /* <CR> */ | |
|         *cp = 0x0d; | |
|         break; | |
|       case 0x03: /* <ctrl-Z> */ | |
|         *cp = 0x1a; | |
|         break; | |
|     } | |
|   } | |
| 
 | |
|   return (1); | |
| } | |
| 
 | |
| 
 |