testexecmgmt/ucc/Source/DynamicsConfigurationLibrary/file_utilities.cpp
changeset 0 3da2a79470a7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/testexecmgmt/ucc/Source/DynamicsConfigurationLibrary/file_utilities.cpp	Mon Mar 08 15:04:18 2010 +0800
@@ -0,0 +1,559 @@
+/*
+* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+* System Includes
+*
+*/
+
+
+
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+#ifndef WIN32
+#include <unistd.h>
+#else
+#include <io.h>
+#endif
+#include <assert.h>
+ 
+
+/******************************************************************************************************
+ *
+ * Local Includes
+ *
+ *****************************************************************************************************/
+#include "file_utilities.h"
+
+
+/******************************************************************************************************
+ *
+ * Definitions
+ *
+ *****************************************************************************************************/
+#define TEMPFILE_SUFFIX               "XXXXXX"
+#define MAXLINESIZE                    2048
+#define COPYBUFFER                     2048
+#define TEMPFILENAMESIZE               128
+#define INSERT_TEMPFILE_PREFIX         "insert_tempfile."
+
+#define MIN(a,b)                       (((a)<(b))?a:b)
+
+
+/******************************************************************************************************
+ *
+ * Prototypes
+ *
+ *****************************************************************************************************/
+#ifdef WIN32
+static int mkstemp( char *aString );
+#endif
+
+
+/******************************************************************************************************
+ *
+ * PRIVATE METHOD: OpenTempfile
+ *
+ *****************************************************************************************************/
+FILE *OpenTempfile( char *aFilenamePrefix, char *aFilename, int aLen, char *aMode, int *aSystemError )
+{
+  int err, prefix_len;
+  FILE *fp;
+
+  // check params
+  assert( aFilenamePrefix != NULL );
+  assert( aFilename != NULL );
+  assert( aSystemError != NULL );
+  assert( aLen > (strlen(TEMPFILE_SUFFIX) + 1) );
+  *aSystemError = 0;
+
+  // copy the prefix into the buffer
+  prefix_len = MIN( strlen(aFilenamePrefix), (aLen - strlen(TEMPFILE_SUFFIX) - 1) );
+  memcpy( aFilename, aFilenamePrefix, prefix_len );
+
+  // copy the template into the buffer and NULL terminate
+  memcpy( &(aFilename[prefix_len]), TEMPFILE_SUFFIX, strlen(TEMPFILE_SUFFIX) );
+  aFilename[prefix_len + strlen(TEMPFILE_SUFFIX)] = 0;
+  
+  // get the filename
+  err = mkstemp( aFilename );
+  if( err == -1 ) { 
+    *aSystemError = errno;
+    return NULL;
+  }
+
+  // now open the file
+  fp = fopen( aFilename, aMode );
+  if( fp == NULL ) {
+    *aSystemError = errno;
+  }
+  return fp;
+}
+
+
+/******************************************************************************************************
+ *
+ * PRIVATE METHOD: CopyFileByPtr
+ *
+ *****************************************************************************************************/
+TFUError CopyFileByPtr( FILE *aSource, FILE *aDest, int *aSystemError )
+{
+  char buff[COPYBUFFER];
+  int bytes_read, bytes_written;
+
+  // check params
+  assert( aSource != NULL );
+  assert( aDest != NULL );
+  assert( aSystemError != NULL );
+  *aSystemError = 0;
+
+  // now copy all the bytes
+  while( 1 ) {
+
+    // read from the source
+    bytes_read = fread( buff, 1, COPYBUFFER, aSource );
+    assert( bytes_read >= 0 );
+
+    // check for read errors 
+    if( ferror(aSource) != 0 ) {
+      *aSystemError = errno;
+      return FUE_READ_ERROR;
+    }
+
+    // if some bytes were read then write to the destination
+    bytes_written = fwrite( buff, 1, bytes_read, aDest );
+    assert( bytes_written >= 0 );
+
+    // check for write errors
+    if( bytes_written != bytes_read ) {
+      *aSystemError = errno;
+      return FUE_WRITE_ERROR;
+    }
+
+    // check for eof 
+    if( feof(aSource) != 0 ) {
+      return FUE_NONE;
+    }
+  }
+
+  // done
+  assert( !"INVALID CODE PATH" );
+  return FUE_NONE;
+}
+
+
+/******************************************************************************************************
+ *
+ * PRIVATE METHOD: CopyFileByName
+ *
+ *****************************************************************************************************/
+TFUError CopyFileByName( char *aSource, char *aDest, int *aSystemError )
+{
+  FILE *fpsrc, *fpdst;
+  TFUError err;
+
+  // check params
+  assert( aSource != NULL );
+  assert( aDest != NULL );
+  assert( aSystemError != NULL );
+  *aSystemError = 0;
+
+  // open the source filename
+  fpsrc = fopen( aSource, "r" );
+  if( fpsrc == NULL ) {
+    *aSystemError = errno;
+    return FUE_OPEN_ERROR;
+  }
+
+  // open the dest filename
+  fpdst = fopen( aDest, "w" );
+  if( fpdst == NULL ) {
+    fclose( fpsrc );
+    *aSystemError = errno;
+    return FUE_OPEN_ERROR;
+  }
+  
+  // copy the files
+  err = CopyFileByPtr( fpsrc, fpdst, aSystemError );
+
+  // close the files
+  fflush( fpsrc );
+  fflush( fpdst );
+  fclose( fpsrc );
+  fclose( fpdst );
+
+  // if the copy failed then remove the new file
+  if( err != FUE_NONE ) {
+    unlink( aDest );
+  }
+
+  // done
+  return err;      
+}
+
+
+/******************************************************************************************************
+ *
+ * PRIVATE METHOD: InsertLine
+ *
+ *****************************************************************************************************/
+TFUError InsertLine( char *aFilename, int aLineNumber, char *aLine, int aLineSize, int aReplaceFlag, int *aSystemError )
+{
+  char buff[COPYBUFFER], tempfilename[TEMPFILENAMESIZE];
+  int i, end_of_file, err, insert_line_logic, line_inserted = 0;
+  TFUError rv;
+  FILE *fp_dest, *fp_source;
+
+  // check params
+  assert( aFilename != NULL );
+  assert( (aLine != NULL) || (aLineSize == 0) );
+  assert( aSystemError != NULL );
+  assert( aLineNumber > 0 );
+  *aSystemError = 0;
+
+  // open the file
+  fp_source = fopen( aFilename, "r" );
+  if( fp_source == NULL ) {
+    *aSystemError = errno;
+    return FUE_OPEN_SOURCE_ERROR;
+  }
+
+  // now open the tempfile
+  fp_dest = OpenTempfile( INSERT_TEMPFILE_PREFIX, tempfilename, TEMPFILENAMESIZE, "w", aSystemError );
+  if( fp_dest == NULL ) {
+    fclose( fp_source );
+    return FUE_OPEN_TEMP_ERROR;
+  }
+
+  // now copy all files until we get to the target line - add the new line - then keep going
+  for( i = 1; ; i++ ) {
+    
+    // read the next line from the source file 
+    fgets( buff, COPYBUFFER, fp_source );
+
+    // check for errors
+    if( ferror(fp_source) != 0 ) {
+      *aSystemError = errno;
+      rv = FUE_READ_ERROR;
+      break;
+    }
+
+    // see if we want to insert the newline at this point: we do if the user specified to insert before 
+    // this line OR if we have hit the end of the file. In both cases there must be something to insert.
+    end_of_file = feof( fp_source );
+    insert_line_logic = ((aLineNumber == i) || ((line_inserted == 0)&&(end_of_file != 0)));
+    if( (insert_line_logic != 0) && (aLineSize > 0) ) {
+      fwrite( aLine, 1, aLineSize, fp_dest );
+      if( ferror(fp_dest) != 0 ) {
+	*aSystemError = errno;
+	rv = FUE_WRITE_ERROR;
+	break;
+      }
+      fputc( '\n', fp_dest );
+      line_inserted = 1;
+    }
+    
+    // if we have hit the end of the file then we are done
+    if( end_of_file != 0 ) {
+      rv = FUE_NONE;
+      break;
+    }
+
+    // write the line just read -- unless we just inserted a line and the replace flag is set
+    if( (insert_line_logic == 0) || (aReplaceFlag == 0) ) {
+      fwrite( buff, 1, strlen(buff), fp_dest );
+      if( ferror(fp_dest) != 0 ) {
+		*aSystemError = errno;
+		rv = FUE_WRITE_ERROR;
+		break;
+      }
+    }
+    
+    // go to next line
+  }
+
+  // close both files
+  fflush( fp_source );
+  fflush( fp_dest );
+  fclose( fp_source );
+  fclose( fp_dest );
+
+  // if we were successful then remove the original file and rename the new file to the original 
+  // filename -- otherwise just remove the tempfile
+  if( rv == FUE_NONE ) {
+    unlink( aFilename );
+    err = rename( tempfilename, aFilename );
+    if( err != 0 ) {
+      *aSystemError = errno;
+      rv = FUE_RENAME_ERROR;
+      unlink( tempfilename );
+    }
+  } else {
+    unlink( tempfilename );
+  }
+      
+  // done
+  return rv;
+}
+
+
+/******************************************************************************************************
+ *
+ * PRIVATE METHOD: GetLine
+ *
+ *****************************************************************************************************/
+TFUError GetLine( char *aFilename, int aLineNumber, char *aBuffer, int aBufferSize, int *aSystemError )
+{
+  FILE *fp;
+  char *cline;
+  int i;
+
+  // check params
+  assert( aLineNumber >= 0 );
+  assert( aBuffer != NULL );
+  assert( aSystemError != NULL );
+  *aSystemError = 0;
+
+  // open the file
+  fp = fopen( aFilename, "r" );
+  if( fp == NULL ) {
+    *aSystemError = errno;
+    return FUE_OPEN_ERROR;
+  }
+
+  // read through the file until finding the appropriate line
+  for( i = 0; i < aLineNumber; i++ ) {
+    cline = fgets( aBuffer, aBufferSize, fp );
+    if( cline == NULL )
+      break;
+  }
+
+  // done with the file
+  fflush( fp );
+  fclose( fp );
+
+  // if cline is null then we reached the end-of-file
+  if( cline == NULL ) {
+    return FUE_END_OF_FILE;
+  }
+
+  // otherwise just return -- the line is in the buffer
+  return FUE_NONE;
+}
+
+
+/******************************************************************************************************
+ *
+ * PRIVATE METHOD: FindMatchingLines
+ *
+ *****************************************************************************************************/
+TFUError FindMatchingLines( char *aFilename, char *aToken, int *aLineList, int *aListSize, int *aSystemError )
+{
+  int list_capacity, i, match;
+  char cline[MAXLINESIZE], *cptr, *token_start, *token_end;
+  FILE *fp;
+  TFUError rv;
+
+  // check params
+  assert( aFilename != NULL );
+  assert( aToken != NULL );
+  assert( aLineList != NULL );
+  assert( aListSize != NULL );
+  assert( aSystemError != NULL );
+  list_capacity = *aListSize;
+  *aListSize = 0;
+  *aSystemError = 0;
+
+  // open the file
+  fp = fopen( aFilename, "r" );
+  if( fp == NULL ) {
+    *aSystemError = errno;
+    return FUE_OPEN_ERROR;
+  }
+
+  // now read through the line and look for a line starting with the passed token (after whitespace and '#')
+  for( i = 1; ; i++ ) {
+    
+    // read the next line
+    cptr = fgets( cline, MAXLINESIZE, fp );
+    
+    // check for errors
+    if( ferror(fp) != 0 ) {
+      *aSystemError = errno;
+      rv = FUE_READ_ERROR;
+      break;
+    }
+
+    // check for end of file
+    if( cptr == NULL ) {
+      rv =  FUE_NONE;
+      break;
+    }
+
+    // remove any whitespace (' ' + '\t') and hashes to find the start of the token
+    for( token_start = cline; (*token_start == ' ') || (*token_start == '\t') || (*token_start == '#'); token_start++ )
+      ;
+
+    // now find the end of the token
+    for( token_end = token_start; (*token_end != ' ') && (*token_end != '\t') && (*token_end != '\n') && (*token_end != 0); token_end++ ) 
+      ;
+
+    // null terminate the token - no need to save the old value
+    *token_end = 0;
+
+    // now compare the tokens and add the match
+    match = strcmp( token_start, aToken );
+    if( (match == 0) && ((*aListSize) < list_capacity) ) {
+		aLineList[(*aListSize)++] = i;
+    }
+	
+    // and do it all again
+  }
+
+  // close up the file and return
+  fflush( fp );
+  fclose( fp );
+
+  // done
+  return rv;
+}
+
+
+/******************************************************************************************************
+ *
+ * PRIVATE METHOD: FindMatchingLinesByRawPrefix
+ *
+ *****************************************************************************************************/
+TFUError FindMatchingLinesByRawPrefix( char *aFilename, char *aToken, int *aLineList, int *aListSize, int *aSystemError )
+{
+  int list_capacity, i, match, token_length;
+  char cline[MAXLINESIZE], *cptr;
+  FILE *fp;
+  TFUError rv;
+
+  // check params
+  assert( aFilename != NULL );
+  assert( aToken != NULL );
+  assert( aLineList != NULL );
+  assert( aListSize != NULL );
+  assert( aSystemError != NULL );
+  list_capacity = *aListSize;
+  *aListSize = 0;
+  *aSystemError = 0;
+
+  // get the length of the passed token
+  token_length = strlen( aToken );
+  assert( token_length > 0 );
+
+  // open the file
+  fp = fopen( aFilename, "r" );
+  if( fp == NULL ) {
+    *aSystemError = errno;
+    return FUE_OPEN_ERROR;
+  }
+
+  // now read through the line and look for a line starting with the passed token
+  for( i = 1; ; i++ ) {
+    
+    // read the next line
+    cptr = fgets( cline, MAXLINESIZE, fp );
+    
+    // check for errors
+    if( ferror(fp) != 0 ) {
+      *aSystemError = errno;
+      rv = FUE_READ_ERROR;
+      break;
+    }
+
+    // check for end of file
+    if( cptr == NULL ) {
+      rv =  FUE_NONE;
+      break;
+    }
+
+
+    // now compare the tokens and add the match
+    match = strncmp( cptr, aToken, token_length );
+    if( (match == 0) && ((*aListSize) < list_capacity) ) {
+		aLineList[(*aListSize)++] = i;
+    }
+	
+    // and do it all again
+  }
+
+  // close up the file and return
+  fflush( fp );
+  fclose( fp );
+
+  // done
+  return rv;
+}
+
+
+/******************************************************************************************************
+ *
+ * PRIVATE METHOD: GetFileLineCount
+ *
+ *****************************************************************************************************/
+TFUError GetFileLineCount( char *aFilename, int *aLineCount, int *aSystemError )
+{
+  FILE *fp;
+  char cline[MAXLINESIZE], *cptr;
+
+  // check params
+  assert( aFilename != NULL );
+  assert( aLineCount != NULL );
+  assert( aSystemError != NULL );
+  *aLineCount = *aSystemError = 0;
+
+  // open the file
+  fp = fopen( aFilename, "r" );
+  if( fp == NULL ) {
+    *aSystemError = errno;
+    return FUE_OPEN_ERROR;
+  }
+
+  // read through the file and count the number of lines
+  while( 1 ) {
+    cptr = fgets( cline, MAXLINESIZE, fp );
+    if( cptr == NULL )
+      break;
+    (*aLineCount)++;
+  }
+
+  // done with the file
+  fclose( fp );
+
+  // otherwise just return -- the line is in the buffer
+  return FUE_NONE;
+}
+
+
+/******************************************************************************************************
+ *
+ * PRIVATE METHOD: mkstemp
+ *
+ *****************************************************************************************************/
+#ifdef WIN32
+int mkstemp( char *aString )
+{
+	char *ptr;
+	ptr = _mktemp( aString );
+	if( ptr == NULL ) {
+		return -1;
+	}
+	return 0;
+}
+#endif