1 /* Process handling for Windows 2 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 3 2006 Free Software Foundation, Inc. 4 This file is part of GNU Make. 5 6 GNU Make is free software; you can redistribute it and/or modify it under the 7 terms of the GNU General Public License as published by the Free Software 8 Foundation; either version 2, or (at your option) any later version. 9 10 GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY 11 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR 12 A PARTICULAR PURPOSE. See the GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License along with 15 GNU Make; see the file COPYING. If not, write to the Free Software 16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ 17 18 #include <stddef.h> 19 #include <stdlib.h> 20 #include <string.h> 21 #include <windows.h> 22 #include "proc.h" 23 24 25 /* 26 * Description: Convert a NULL string terminated UNIX environment block to 27 * an environment block suitable for a windows32 system call 28 * 29 * Returns: TRUE= success, FALSE=fail 30 * 31 * Notes/Dependencies: the environment block is sorted in case-insensitive 32 * order, is double-null terminated, and is a char *, not a char ** 33 */ 34 int _cdecl compare(const void *a1, const void *a2) 35 { 36 return _stricoll(*((char**)a1),*((char**)a2)); 37 } 38 bool_t 39 arr2envblk(char **arr, char **envblk_out) 40 { 41 char **tmp; 42 int size_needed; 43 int arrcnt; 44 char *ptr; 45 46 arrcnt = 0; 47 while (arr[arrcnt]) { 48 arrcnt++; 49 } 50 51 tmp = (char**) calloc(arrcnt + 1, sizeof(char *)); 52 if (!tmp) { 53 return FALSE; 54 } 55 56 arrcnt = 0; 57 size_needed = 0; 58 while (arr[arrcnt]) { 59 tmp[arrcnt] = arr[arrcnt]; 60 size_needed += strlen(arr[arrcnt]) + 1; 61 arrcnt++; 62 } 63 size_needed++; 64 65 qsort((void *) tmp, (size_t) arrcnt, sizeof (char*), compare); 66 67 ptr = *envblk_out = calloc(size_needed, 1); 68 if (!ptr) { 69 free(tmp); 70 return FALSE; 71 } 72 73 arrcnt = 0; 74 while (tmp[arrcnt]) { 75 strcpy(ptr, tmp[arrcnt]); 76 ptr += strlen(tmp[arrcnt]) + 1; 77 arrcnt++; 78 } 79 80 free(tmp); 81 return TRUE; 82 } 83