/* Process handling for Windows
Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2006 Free Software Foundation, Inc.
This file is part of GNU Make.

GNU Make is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 2, or (at your option) any later version.

GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with
GNU Make; see the file COPYING.  If not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.  */

#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include "proc.h"


/*
 * Description:  Convert a NULL string terminated UNIX environment block to
 *		an environment block suitable for a windows32 system call
 *
 * Returns:  TRUE= success, FALSE=fail
 *
 * Notes/Dependencies:  the environment block is sorted in case-insensitive
 *	order, is double-null terminated, and is a char *, not a char **
 */
int _cdecl compare(const void *a1, const void *a2)
{
	return _stricoll(*((char**)a1),*((char**)a2));
}
bool_t
arr2envblk(char **arr, char **envblk_out)
{
	char **tmp;
	int size_needed;
	int arrcnt;
	char *ptr;

	arrcnt = 0;
	while (arr[arrcnt]) {
		arrcnt++;
	}

	tmp = (char**) calloc(arrcnt + 1, sizeof(char *));
	if (!tmp) {
		return FALSE;
	}

	arrcnt = 0;
	size_needed = 0;
	while (arr[arrcnt]) {
		tmp[arrcnt] = arr[arrcnt];
		size_needed += strlen(arr[arrcnt]) + 1;
		arrcnt++;
	}
	size_needed++;

	qsort((void *) tmp, (size_t) arrcnt, sizeof (char*), compare);

	ptr = *envblk_out = calloc(size_needed, 1);
	if (!ptr) {
		free(tmp);
		return FALSE;
	}

	arrcnt = 0;
	while (tmp[arrcnt]) {
		strcpy(ptr, tmp[arrcnt]);
		ptr += strlen(tmp[arrcnt]) + 1;
		arrcnt++;
	}

        free(tmp);
	return TRUE;
}
