Andreas Fritiofson <andreas.fritiofson@gmail.com> UTF8 fixes
[fw/openocd] / src / helper / replacements.c
index b6ddfd7c562082c9db9cd3a98b23e3ba1ace9bef..77e4ee7a35a25e6acdcde7cba2b990f1fc0b150e 100644 (file)
@@ -2,7 +2,7 @@
  *   Copyright (C) 2006 by Dominic Rath                                    *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
- *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
+ *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
  *   oyvind.harboe@zylin.com                                               *
  *                                                                         *
  *   Copyright (C) 2008 by Spencer Oliver                                  *
  *   Free Software Foundation, Inc.,                                       *
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
 /* DANGER!!!! These must be defined *BEFORE* replacements.h and the malloc() macro!!!! */
 
 #include <stdlib.h>
 #include <string.h>
-#ifdef HAVE_STRINGS_H
-#include <strings.h>
-#endif
-/* 
+/*
  * clear_malloc
  *
  * will alloc memory and clear it
@@ -42,7 +35,7 @@
 void *clear_malloc(size_t size)
 {
        void *t = malloc(size);
-       if (t!=NULL)
+       if (t != NULL)
        {
                memset(t, 0x00, size);
        }
@@ -52,7 +45,7 @@ void *clear_malloc(size_t size)
 void *fill_malloc(size_t size)
 {
        void *t = malloc(size);
-       if (t!=NULL)
+       if (t != NULL)
        {
                /* We want to initialize memory to some known bad state.  */
                /* 0 and 0xff yields 0 and -1 as integers, which often          */
@@ -64,9 +57,17 @@ void *fill_malloc(size_t size)
        return t;
 }
 
-#include "replacements.h"
+#define IN_REPLACEMENTS_C
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
 
-#include <stdio.h>
+#ifdef _WIN32
+#include <io.h>
+#endif
 
 /* replacements for gettimeofday */
 #ifndef HAVE_GETTIMEOFDAY
@@ -137,3 +138,153 @@ char* strndup(const char *s, size_t n)
        return (char *) memcpy (new, s, len);
 }
 #endif
+
+#ifdef _WIN32
+int win_select(int max_fd, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *tv)
+{
+       DWORD ms_total, limit;
+       HANDLE handles[MAXIMUM_WAIT_OBJECTS];
+       int handle_slot_to_fd[MAXIMUM_WAIT_OBJECTS];
+       int n_handles = 0, i;
+       fd_set sock_read, sock_write, sock_except;
+       fd_set aread, awrite, aexcept;
+       int sock_max_fd = -1;
+       struct timeval tvslice;
+       int retcode;
+
+#define SAFE_FD_ISSET(fd, set) (set != NULL && FD_ISSET(fd, set))
+
+       /* calculate how long we need to wait in milliseconds */
+       if (tv == NULL) {
+               ms_total = INFINITE;
+       } else {
+               ms_total = tv->tv_sec * 1000;
+               ms_total += tv->tv_usec / 1000;
+       }
+
+       FD_ZERO(&sock_read);
+       FD_ZERO(&sock_write);
+       FD_ZERO(&sock_except);
+
+       /* build an array of handles for non-sockets */
+       for (i = 0; i < max_fd; i++) {
+               if (SAFE_FD_ISSET(i, rfds) || SAFE_FD_ISSET(i, wfds) || SAFE_FD_ISSET(i, efds)) {
+                       long handle = _get_osfhandle(i);
+                       handles[n_handles] = (HANDLE)handle;
+                       if (handles[n_handles] == INVALID_HANDLE_VALUE) {
+                               /* socket */
+                               if (SAFE_FD_ISSET(i, rfds)) {
+                                       FD_SET(i, &sock_read);
+                               }
+                               if (SAFE_FD_ISSET(i, wfds)) {
+                                       FD_SET(i, &sock_write);
+                               }
+                               if (SAFE_FD_ISSET(i, efds)) {
+                                       FD_SET(i, &sock_except);
+                               }
+                               if (i > sock_max_fd) {
+                                       sock_max_fd = i;
+                               }
+                       } else {
+                               handle_slot_to_fd[n_handles] = i;
+                               n_handles++;
+                       }
+               }
+       }
+
+       if (n_handles == 0) {
+               /* plain sockets only - let winsock handle the whole thing */
+               return select(max_fd, rfds, wfds, efds, tv);
+       }
+
+       /* mixture of handles and sockets; lets multiplex between
+        * winsock and waiting on the handles */
+
+       FD_ZERO(&aread);
+       FD_ZERO(&awrite);
+       FD_ZERO(&aexcept);
+
+       limit = GetTickCount() + ms_total;
+       do {
+               retcode = 0;
+
+               if (sock_max_fd >= 0) {
+                       /* overwrite the zero'd sets here; the select call
+                        * will clear those that are not active */
+                       aread = sock_read;
+                       awrite = sock_write;
+                       aexcept = sock_except;
+
+                       tvslice.tv_sec = 0;
+                       tvslice.tv_usec = 100000;
+
+                       retcode = select(sock_max_fd + 1, &aread, &awrite, &aexcept, &tvslice);
+               }
+               if (n_handles > 0) {
+                       /* check handles */
+                       DWORD wret;
+
+                       wret = MsgWaitForMultipleObjects(n_handles, handles, FALSE, retcode > 0 ? 0 : 100, QS_ALLEVENTS);
+
+                       if (wret == WAIT_TIMEOUT) {
+                               /* set retcode to 0; this is the default.
+                                * select() may have set it to something else,
+                                * in which case we leave it alone, so this branch
+                                * does nothing */
+                               ;
+                       } else if (wret == WAIT_FAILED) {
+                               if (retcode == 0) {
+                                       retcode = -1;
+                               }
+                       } else {
+                               if (retcode < 0) {
+                                       retcode = 0;
+                               }
+                               for (i = 0; i < n_handles; i++) {
+                                       if (WAIT_OBJECT_0 == WaitForSingleObject(handles[i], 0)) {
+                                               if (SAFE_FD_ISSET(handle_slot_to_fd[i], rfds)) {
+                                                       DWORD dwBytes;
+                                                       long handle = _get_osfhandle(handle_slot_to_fd[i]);
+
+                                                       if (PeekNamedPipe((HANDLE)handle, NULL, 0, NULL, &dwBytes, NULL))
+                                                       {
+                                                               /* check to see if gdb pipe has data available */
+                                                               if (dwBytes)
+                                                               {
+                                                                       FD_SET(handle_slot_to_fd[i], &aread);
+                                                                       retcode++;
+                                                               }
+                                                       }
+                                                       else
+                                                       {
+                                                               FD_SET(handle_slot_to_fd[i], &aread);
+                                                               retcode++;
+                                                       }
+                                               }
+                                               if (SAFE_FD_ISSET(handle_slot_to_fd[i], wfds)) {
+                                                       FD_SET(handle_slot_to_fd[i], &awrite);
+                                                       retcode++;
+                                               }
+                                               if (SAFE_FD_ISSET(handle_slot_to_fd[i], efds)) {
+                                                       FD_SET(handle_slot_to_fd[i], &aexcept);
+                                                       retcode++;
+                                               }
+                                       }
+                               }
+                       }
+               }
+       } while (retcode == 0 && (ms_total == INFINITE || GetTickCount() < limit));
+
+       if (rfds) {
+               *rfds = aread;
+       }
+       if (wfds) {
+               *wfds = awrite;
+       }
+       if (efds) {
+               *efds = aexcept;
+       }
+
+       return retcode;
+}
+#endif