#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++;
	}
	return TRUE;
}
