Pedro, Attached is a proposed implementation for getenv, setenv, unsetenv. I would put this in src/mingw/mingwex/getenv.c . A test program is in the other attachment.
I would propose using this to get libgcov to work on mingw32ce.
Comments, or can I commit and change libgcov to use this ?
Danny
--
Danny Backx ; danny.backx - at - scarlet.be ; http://danny.backx.info
Index: Makefile.in
===================================================================
--- Makefile.in (revision 856)
+++ Makefile.in (working copy)
@@ -85,7 +85,8 @@
WINCE_DISTFILES = \
asctime.c freopen.c gmtime.c localtime.c mktime.c strftime.c time.c \
- tempnam.c unlink.c wcsftime.c fdopen.c read.c write.c open.c lseek.c close.c
+ tempnam.c unlink.c wcsftime.c fdopen.c read.c write.c open.c lseek.c close.c \
+ getenv.c
CC = @CC@
# FIXME: Which is it, CC or CC_FOR_TARGET?
@@ -186,7 +187,7 @@
WINCE_OBJS = \
asctime.o freopen.o gmtime.o localtime.o mktime.o strftime.o time.o \
tempnam.o unlink.o wcsftime.o fdopen.o read.o write.o open.o lseek.o \
- close.o
+ close.o getenv.o
ifneq (,$(findstring wince,$(target_alias)))
LIB_OBJS = $(WINCE_OBJS)
Index: getenv.c
===================================================================
--- getenv.c (revision 0)
+++ getenv.c (revision 0)
@@ -0,0 +1,126 @@
+/*
+ * Functions to mimic getenv/setenv on Windows.
+ * These functions are written by Danny Backx (c) 2006 for the CeGCC project
+ * and are in the public domain.
+ *
+ * We store stuff in HKEY_CURRENT_USER under the key "environment".
+ *
+ * Current limitations :
+ * - Only keys which are simple strings can be read. See the switch statement in getenv.
+ * - As in UNIX implementations, getenv returns a pointer to a static structure,
+ * whose value is only guaranteed until the next call to getenv.
+ * - The buffer size of that structure is predefined to 256 bytes.
+ */
+#include <windows.h>
+#include <winreg.h>
+#include <stdlib.h>
+
+#define BUF_SIZE 256
+
+static char buffer[BUF_SIZE];
+static wchar_t wbuffer[BUF_SIZE];
+static DWORD bufsize;
+
+const static wchar_t *env = L"environment";
+
+char *getenv(const char *name)
+{
+ LONG r;
+ wchar_t *wname;
+ size_t l;
+ DWORD tp;
+ HKEY k;
+
+ r = RegOpenKeyEx(HKEY_CURRENT_USER, env, 0, 0, &k);
+ if (r != ERROR_SUCCESS)
+ return -1;
+
+ l = mbstowcs(NULL, name, 0);
+ wname = (wchar_t *)calloc(l+1, sizeof(wchar_t));
+ (void)mbstowcs(wname, name, l+1);
+ wname[l] = 0;
+
+ bufsize = BUF_SIZE;
+ r = RegQueryValueEx(k, wname, NULL, &tp, (LPBYTE)&wbuffer[0], &bufsize);
+ RegCloseKey(k);
+
+ if (r != ERROR_SUCCESS)
+ return NULL;
+
+ switch (tp) {
+ case REG_SZ:
+ wcstombs(buffer, wbuffer, bufsize);
+ return &buffer[0];
+ case REG_NONE:
+ case REG_BINARY:
+ case REG_DWORD:
+ case REG_DWORD_BIG_ENDIAN:
+ case REG_EXPAND_SZ:
+ case REG_LINK:
+ case REG_MULTI_SZ:
+ case REG_RESOURCE_LIST:
+ default:
+ return NULL;
+ }
+ return NULL;
+}
+
+int setenv(const char *name, const char *value)
+{
+ LONG r;
+ wchar_t *wname, *wvalue;
+ size_t l;
+ HKEY k;
+ DWORD disp;
+
+ /* class ? */
+ r = RegCreateKeyEx(HKEY_CURRENT_USER, env, 0, L"class", 0, 0, NULL, &k, &disp);
+ /* Now disp == REG_CREATED_NEW_KEY or REG_OPENED_EXISTING_KEY */
+
+ if (r != ERROR_SUCCESS)
+ return -1;
+
+ l = mbstowcs(NULL, name, 0);
+ wname = (wchar_t *)calloc(l+1, sizeof(wchar_t));
+ (void)mbstowcs(wname, name, l+1);
+ wname[l] = 0;
+
+ l = mbstowcs(NULL, value, 0);
+ wvalue = (wchar_t *)calloc(l+1, sizeof(wchar_t));
+ l = mbstowcs(wvalue, value, l+1);
+ wvalue[l] = 0;
+
+ r = RegSetValueEx(k, wname, 0, REG_SZ, wvalue, (l+1) * sizeof(wchar_t));
+ RegCloseKey(k);
+ free(wname);
+ free(wvalue);
+ if (r != ERROR_SUCCESS)
+ return -1;
+ return 0;
+}
+
+int unsetenv(const char *name)
+{
+ LONG r;
+ wchar_t *wname;
+ size_t l;
+ DWORD tp;
+ HKEY k;
+
+ r = RegOpenKeyEx(HKEY_CURRENT_USER, env, 0, 0, &k);
+ if (r != ERROR_SUCCESS)
+ return -1;
+
+ l = mbstowcs(NULL, name, 0);
+ wname = (wchar_t *)calloc(l+1, sizeof(wchar_t));
+ (void)mbstowcs(wname, name, l+1);
+ wname[l] = 0;
+
+ r = RegDeleteValue(k, wname);
+ RegCloseKey(k);
+
+ if (r != ERROR_SUCCESS)
+ return -1;
+
+ return 0;
+}
Property changes on: getenv.c
___________________________________________________________________
Name: svn:eol-style
+ native
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
int APIENTRY WinMain(HINSTANCE p1,HINSTANCE p2,LPWSTR p3,int p4)
{
FILE *fp;
int r;
char *s;
char *a = "HOME",
*b = "abc def ghi jkl mno pqr stu vwx yz";
fp = fopen("/storage card/devel/out.txt", "w");
r = setenv(a, b);
fprintf(fp, "setenv(%s,%s) -> %d\n", a, b, r);
s = getenv(a);
fprintf(fp, "getenv(%s) => %s\n", a, s);
unsetenv(a);
s = getenv(a);
fprintf(fp, "getenv(%s) => %s\n", a, s);
fclose(fp);
exit(0);
}
setenv(HOME,abc def ghi jkl mno pqr stu vwx yz) -> 0 getenv(HOME) => abc def ghi jkl mno pqr stu vwx yz getenv(HOME) => (null)
signature.asc
Description: This is a digitally signed message part
------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________ Cegcc-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/cegcc-devel
