
#include "installOS.h"
#include "installConfig.h"

#ifdef _WIN32

#include <stdio.h>


#else /* Unix like platforms */

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

#endif

int readConfigFile(_TCHAR* config_file, _TCHAR* arg0, int *argc, _TCHAR ***argv) 
{
	_TCHAR buffer[1024];
	_TCHAR argument[1024];
	FILE *file = NULL;
	int maxArgs = 128;
	int index;
	
	if (config_file == NULL || argc == NULL || argv == NULL) return -1;

	/* Open the config file as a text file 
	 */	
	file = _tfopen(config_file, _T_INSTALL("rt"));	
	if (file == NULL) return -3;

	*argv = (_TCHAR **)malloc(1 + maxArgs * sizeof(_TCHAR*));
	
	/* Make it look like a regular list of arguments that starts with the executable location and name */
	(*argv)[0] = _tcsdup(arg0);
	index = 1;
	
	/* Parse every line */	
	while (_fgetts(buffer, 1024, file) != NULL)
	{
		/* Extract the string prior to the first newline character.
		 * We don't have to worry about \r\n combinations since the file
		 * is opened in translated mode.
		 */
		if (_stscanf(buffer, _T_INSTALL("%[^\n]"), argument) == 1)
		{
			(*argv)[index] = _tcsdup(argument);
			index++;
			
			/* Grow the array of TCHAR*. Ensure one more entry is
			 * available for the final NULL entry
			 */
			if (index == maxArgs - 1)
			{
				maxArgs += 128;
				*argv = (_TCHAR **)realloc(*argv, maxArgs * sizeof(_TCHAR*));
			}
		}
	}
	(*argv)[index] = NULL;
	*argc = index;
	
	fclose(file);
	free(config_file);
	return 0;
}

void freeConfig(_TCHAR **argv) 
{
	int index = 0;
	if (argv == NULL) return;
	while (argv[index] != NULL)
	{
		free(argv[index]);
		index++;
	}
	free(argv);
}
