# HG changeset patch # User deba # Date 1144093657 0 # Node ID e92071fadd3ffa26896a0483a1b198a450f846be # Parent b71f8ff62046628163ebc8e62c96a0b66c62db2c More mingw compatibility Implementation of the drand48 functions diff -r b71f8ff62046 -r e92071fadd3f lemon/Makefile.am --- a/lemon/Makefile.am Mon Apr 03 16:34:23 2006 +0000 +++ b/lemon/Makefile.am Mon Apr 03 19:47:37 2006 +0000 @@ -9,7 +9,10 @@ lp_base.cc \ lp_skeleton.cc \ base.cc \ - eps.cc + eps.cc \ + bits/mingw32_rand.cc \ + bits/mingw32_time.cc + libemon_la_CXXFLAGS = $(GLPK_CFLAGS) $(CPLEX_CFLAGS) libemon_la_LDFLAGS = $(GLPK_LIBS) $(CPLEX_LIBS) @@ -99,6 +102,8 @@ bits/item_writer.h \ bits/traits.h \ bits/utility.h \ + bits/mingw32_rand.h \ + bits/mingw32_time.h \ concept/bpugraph.h \ concept/graph.h \ concept/graph_component.h \ diff -r b71f8ff62046 -r e92071fadd3f lemon/bits/mingw32_rand.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lemon/bits/mingw32_rand.cc Mon Apr 03 19:47:37 2006 +0000 @@ -0,0 +1,83 @@ +#ifdef WIN32 + +#include + + +static unsigned short _mingw_rand_state[10]; + +void _mingw_rand_next_state(unsigned short xsubi[3]) { + _mingw_rand_state[8] = _mingw_rand_state[9] = 0; + _mingw_rand_state[7] = _mingw_rand_state[6]; + for (int i = 0; i < 3; ++i) { + unsigned long val = 0; + for (int j = 0; i + j < 3; ++j) { + val += (unsigned long)_mingw_rand_state[7 + i + j] + + (unsigned long)xsubi[i] * (unsigned long)_mingw_rand_state[3 + j]; + _mingw_rand_state[7 + i + j] = val; + val >>= 16; + } + } + xsubi[0] = _mingw_rand_state[6]; + xsubi[1] = _mingw_rand_state[7]; + xsubi[2] = _mingw_rand_state[8]; +} + +long int lrand48(void) { + return nrand48(_mingw_rand_state); +} + +long int nrand48(unsigned short xsubi[3]) { + _mingw_rand_next_state(xsubi); + return ((long)(xsubi[2] & ( (1 << 15) - 1) ) << 16) | (long)xsubi[1]; +} + +double drand48(void) { + return erand48(_mingw_rand_state); +} + +double erand48(unsigned short xsubi[3]) { + return (double)nrand48(xsubi) / (1 << 31); +} + + +long int mrand48(void) { + return jrand48(_mingw_rand_state); +} + +long int jrand48(unsigned short xsubi[3]) { + _mingw_rand_next_state(xsubi); + return ((long)xsubi[2] << 16) | (long)xsubi[1]; +} + +void srand48(long int seedval) { + _mingw_rand_state[0] = 0x330E; + _mingw_rand_state[1] = seedval & ( (1 << 16) - 1); + _mingw_rand_state[2] = seedval >> 16; + _mingw_rand_state[3] = 0xE66D; + _mingw_rand_state[4] = 0xDEEC; + _mingw_rand_state[5] = 0x0005; + _mingw_rand_state[6] = 0x000B; +} + +unsigned short *seed48(unsigned short seed16v[3]) { + _mingw_rand_state[7] = _mingw_rand_state[0]; + _mingw_rand_state[8] = _mingw_rand_state[1]; + _mingw_rand_state[9] = _mingw_rand_state[2]; + _mingw_rand_state[0] = seed16v[0]; + _mingw_rand_state[1] = seed16v[1]; + _mingw_rand_state[2] = seed16v[2]; + return _mingw_rand_state + 7; +} + +void lcong48(unsigned short param[7]) { + _mingw_rand_state[0] = param[0]; + _mingw_rand_state[1] = param[1]; + _mingw_rand_state[2] = param[2]; + _mingw_rand_state[3] = param[3]; + _mingw_rand_state[4] = param[4]; + _mingw_rand_state[5] = param[5]; + _mingw_rand_state[6] = param[6]; +} + + +#endif diff -r b71f8ff62046 -r e92071fadd3f lemon/bits/mingw32_rand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lemon/bits/mingw32_rand.h Mon Apr 03 19:47:37 2006 +0000 @@ -0,0 +1,37 @@ +/* -*- C++ -*- + * + * This file is a part of LEMON, a generic C++ optimization library + * + * Copyright (C) 2003-2006 + * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport + * (Egervary Research Group on Combinatorial Optimization, EGRES). + * + * Permission to use, modify and distribute this software is granted + * provided that this copyright notice appears in all copies. For + * precise terms see the accompanying LICENSE file. + * + * This software is provided "AS IS" with no warranty of any kind, + * express or implied, and with no claim as to its suitability for any + * purpose. + * + */ + +#ifndef LEMON_BITS_MINGW32_RAND_H +#define LEMON_BITS_MINGW32_RAND_H + + +#ifdef WIN32 + +double drand48(void); +double erand48(unsigned short xsubi[3]); +long int lrand48(void); +long int nrand48(unsigned short xsubi[3]); +long int mrand48(void); +long int jrand48(unsigned short xsubi[3]); +void srand48(long int seedval); +unsigned short *seed48(unsigned short seed16v[3]); +void lcong48(unsigned short param[7]); + +#endif + +#endif diff -r b71f8ff62046 -r e92071fadd3f lemon/bits/mingw32_time.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lemon/bits/mingw32_time.cc Mon Apr 03 19:47:37 2006 +0000 @@ -0,0 +1,104 @@ +#ifdef WIN32 + +#include + +#include +#include +#include "dos.h" + +static const char days[] = +"Sun Mon Tue Wed Thu Fri Sat "; +static const char months[] = +"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec "; + +void num2str(char *c,int i) { + c[0]=i/10+'0'; + c[1]=i%10+'0'; +} + +char *asctime_r(const struct tm *t, char *buf) { + *(int*)buf=*(int*)(days+(t->tm_wday<<2)); + *(int*)(buf+4)=*(int*)(months+(t->tm_mon<<2)); + num2str(buf+8,t->tm_mday); + if (buf[8]=='0') buf[8]=' '; + buf[10]=' '; + num2str(buf+11,t->tm_hour); + buf[13]=':'; + num2str(buf+14,t->tm_min); + buf[16]=':'; + num2str(buf+17,t->tm_sec); + buf[19]=' '; + num2str(buf+20,(t->tm_year+1900)/100); + num2str(buf+22,(t->tm_year+1900)%100); + buf[24]='\n'; buf[25]='\0'; + return buf; +} + +struct tm * localtime_r (const time_t *t, struct tm *tm) { + struct tm *tmp; + + if ((tmp = localtime(t)) && tm) + *tm = *tmp; + else + return 0; + + return tm; +} + +char *ctime_r(const time_t * tim_p , char * result) { + struct tm tm; + return asctime_r (localtime_r (tim_p, &tm), result); +} + + +int gettimeofday(struct timeval * tp, struct timezone *) { + SYSTEMTIME systime; + + if (tp) { + struct tm tmrec; + time_t theTime = time(NULL); + + + tmrec = *localtime(&theTime); + tp->tv_sec = mktime(&tmrec); + GetLocalTime(&systime); /* system time */ + + tp->tv_usec = systime.wMilliseconds * 1000; + } + return 0; +} + +long filetime_to_clock(FILETIME *ft) +{ + __int64 qw = ft->dwHighDateTime; + qw <<= 32; + qw |= ft->dwLowDateTime; + qw /= 10000; + return (long) qw; + +} + +int times(struct tms *tmbuf) +{ + FILETIME create, exit, kernel, user; + if (GetProcessTimes(GetCurrentProcess(),&create, &exit, &kernel, &user)) { + tmbuf->tms_utime = filetime_to_clock(&user); + tmbuf->tms_stime = filetime_to_clock(&kernel); + tmbuf->tms_cutime = 0; + tmbuf->tms_cstime = 0; + } + else { + tmbuf->tms_utime = clock(); + tmbuf->tms_stime = 0; + tmbuf->tms_cutime = 0; + tmbuf->tms_cstime = 0; + } + return 0; +} + +int sysconf(int) +{ + return 1; +} + +#endif diff -r b71f8ff62046 -r e92071fadd3f lemon/bits/mingw32_time.h --- a/lemon/bits/mingw32_time.h Mon Apr 03 16:34:23 2006 +0000 +++ b/lemon/bits/mingw32_time.h Mon Apr 03 19:47:37 2006 +0000 @@ -22,72 +22,13 @@ #ifdef WIN32 #include -#include +#include #include "dos.h" -static const char days[] = -"Sun Mon Tue Wed Thu Fri Sat "; -static const char months[] = -"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec "; - -inline void num2str(char *c,int i) { - c[0]=i/10+'0'; - c[1]=i%10+'0'; -} - -inline char *asctime_r(const struct tm *t, char *buf) { - /* "Wed Jun 30 21:49:08 1993\n" */ - *(int*)buf=*(int*)(days+(t->tm_wday<<2)); - *(int*)(buf+4)=*(int*)(months+(t->tm_mon<<2)); - num2str(buf+8,t->tm_mday); - if (buf[8]=='0') buf[8]=' '; - buf[10]=' '; - num2str(buf+11,t->tm_hour); - buf[13]=':'; - num2str(buf+14,t->tm_min); - buf[16]=':'; - num2str(buf+17,t->tm_sec); - buf[19]=' '; - num2str(buf+20,(t->tm_year+1900)/100); - num2str(buf+22,(t->tm_year+1900)%100); - buf[24]='\n'; buf[25]='\0'; - return buf; -} - -inline struct tm * localtime_r (const time_t *t, struct tm *tm) { - struct tm *tmp; - - if ((tmp = localtime(t)) && tm) - *tm = *tmp; - else - return 0; - - return tm; -} - -inline char *ctime_r(const time_t * tim_p , char * result) { - struct tm tm; - return asctime_r (localtime_r (tim_p, &tm), result); -} - - -inline int gettimeofday(struct timeval * tp, struct timezone *) { - SYSTEMTIME systime; - - if (tp) { - struct tm tmrec; - time_t theTime = time(NULL); - - - tmrec = *localtime(&theTime); - tp->tv_sec = mktime(&tmrec); - GetLocalTime(&systime); /* system time */ - - tp->tv_usec = systime.wMilliseconds * 1000; - } - return 0; -} - +char *asctime_r(const struct tm *t, char *buf); +struct tm * localtime_r (const time_t *t, struct tm *tm); +char *ctime_r(const time_t * tim_p , char * result); +int gettimeofday(struct timeval * tp, struct timezone *); struct tms { long tms_utime; @@ -96,42 +37,14 @@ long tms_cstime; }; -inline long filetime_to_clock(FILETIME *ft) -{ - __int64 qw = ft->dwHighDateTime; - qw <<= 32; - qw |= ft->dwLowDateTime; - qw /= 10000; /* File time ticks at 0.1uS, clock at 1mS */ - return (long) qw; +long filetime_to_clock(FILETIME *ft); -} - -inline int times(struct tms *tmbuf) -{ - FILETIME create, exit, kernel, user; - if (GetProcessTimes(GetCurrentProcess(),&create, &exit, &kernel, &user)) { - tmbuf->tms_utime = filetime_to_clock(&user); - tmbuf->tms_stime = filetime_to_clock(&kernel); - tmbuf->tms_cutime = 0; - tmbuf->tms_cstime = 0; - } - else { - tmbuf->tms_utime = clock(); - tmbuf->tms_stime = 0; - tmbuf->tms_cutime = 0; - tmbuf->tms_cstime = 0; - } - return 0; -} +int times(struct tms *tmbuf); #define _SC_CLK_TCK 1 -inline int sysconf(int) -{ - return 1; -} +int sysconf(int); #endif - #endif diff -r b71f8ff62046 -r e92071fadd3f lemon/simann.h --- a/lemon/simann.h Mon Apr 03 16:34:23 2006 +0000 +++ b/lemon/simann.h Mon Apr 03 19:47:37 2006 +0000 @@ -32,6 +32,10 @@ #include #include +#ifdef WIN32 +#include +#endif + namespace lemon { /// \addtogroup experimental