Date
1 - 1 of 1
[PATCH 49/50] [common] More Win32 Support
Michael Schonberg <mschonberg@...>
From: Mike Schonberg <mschonberg@...>
wUuid.c for uuid support and strpcasecmp and strptime implementations. Signed-off-by: Mike Schonberg <mschonberg@...> --- common/c_cpp/src/c/windows/strpcasecmp.c | 88 +++++++ common/c_cpp/src/c/windows/strptime.c | 376 ++++++++++++++++++++++++++++++ common/c_cpp/src/c/windows/wUuid.c | 69 ++++++ 3 files changed, 533 insertions(+), 0 deletions(-) create mode 100644 common/c_cpp/src/c/windows/strpcasecmp.c create mode 100644 common/c_cpp/src/c/windows/strptime.c create mode 100644 common/c_cpp/src/c/windows/wUuid.c diff --git a/common/c_cpp/src/c/windows/strpcasecmp.c b/common/c_cpp/src/c/windows/strpcasecmp.c new file mode 100644 index 0000000..5483fa8 --- /dev/null +++ b/common/c_cpp/src/c/windows/strpcasecmp.c @@ -0,0 +1,88 @@ +// +// strcasecmp.cc +// +// strcasecmp: replacement of the strcasecmp functions for architectures that do +// not have it. +// +// Part of the ht://Dig package <http://www.htdig.org/> +// Copyright (c) 1999-2004 The ht://Dig Group +// For copyright details, see the file COPYING in your distribution +// or the GNU Library General Public License (LGPL) version 2 or later +// <http://www.gnu.org/copyleft/lgpl.html> +// +// $Id: strpcasecmp.c,v 1.1.2.1 2012/03/15 11:02:57 evinkeating Exp $ +// + +//#ifdef HAVE_CONFIG_H +//#include "htconfig.h" +//#endif /* HAVE_CONFIG_H */ + +//#include "lib.h" +#include <ctype.h> + +//***************************************************************************** +// +int strcasecmp(const char *str1, const char *str2) +{ + if (!str1 && !str2) + return 0; + if (!str1) + return 1; + if (!str2) + return -1; + while (*str1 && + *str2 && + tolower((unsigned char)*str1) == tolower((unsigned char)*str2)) + { + str1++; + str2++; + } + + return tolower((unsigned char)*str1) - tolower((unsigned char)*str2); +} + + +//#define tolower(ch) (isupper(ch) ? (ch) + 'a' - 'A' : (ch)) +//***************************************************************************** +// +int strncasecmp(const char *str1, const char *str2, int n) +{ + if (!str1 && !str2) + return 0; + if (!str1) + return 1; + if (!str2) + return -1; + if (n < 0) + return 0; + while (n && + *str1 && + *str2 && + tolower((unsigned char)*str1) == tolower((unsigned char)*str2)) + { + str1++; + str2++; + n--; + } + + return n == 0 ? 0 : + tolower((unsigned char)*str1) - tolower((unsigned char)*str2); +} + + +//***************************************************************************** +// char *mystrcasestr(const char *s, const char *pattern) +// +const char * +mystrcasestr(const char *s, const char *pattern) +{ + int length = strlen(pattern); + + while (*s) + { + if (strncasecmp(s, pattern, length) == 0) + return s; + s++; + } + return 0; +} \ No newline at end of file diff --git a/common/c_cpp/src/c/windows/strptime.c b/common/c_cpp/src/c/windows/strptime.c new file mode 100644 index 0000000..88035e0 --- /dev/null +++ b/common/c_cpp/src/c/windows/strptime.c @@ -0,0 +1,376 @@ +// Part of the ht://Dig package <http://www.htdig.org/> +// Copyright (c) 1999-2004 The ht://Dig Group +// For copyright details, see the file COPYING in your distribution +// or the GNU Library General Public License (LGPL) version 2 or later +// <http://www.gnu.org/copyleft/lgpl.html> +// + +/* + * Copyright (c) 1994 Powerdog Industries. All rights reserved. + * + * Redistribution and use in source and binary forms, without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgement: + * This product includes software developed by Powerdog Industries. + * 4. The name of Powerdog Industries may not be used to endorse or + * promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY POWERDOG INDUSTRIES ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE POWERDOG INDUSTRIES BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef lint +/* +static char copyright[] = +"@(#) Copyright (c) 1994 Powerdog Industries. All rights reserved."; +static char sccsid[] = "@(#)strptime.c 1.0 (Powerdog) 94/03/27"; +*/ +#endif /* not lint */ + +//#include <lib.h> + +#include <time.h> +#include <ctype.h> +#include <locale.h> +#include <string.h> + +#define asizeof(a) ((int)(sizeof (a) / sizeof ((a)[0]))) + +struct mydtconv { + char *abbrev_month_names[12]; + char *month_names[12]; + char *abbrev_weekday_names[7]; + char *weekday_names[7]; + char *time_format; + char *sdate_format; + char *dtime_format; + char *am_string; + char *pm_string; + char *ldate_format; +}; + +static struct mydtconv En_US = { + { "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }, + { "January", "February", "March", "April", + "May", "June", "July", "August", + "September", "October", "November", "December" }, + { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }, + { "Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday" }, + "%H:%M:%S", + "%m/%d/%y", + "%a %b %e %T %Z %Y", + "AM", + "PM", + "%A, %B, %e, %Y" +}; + +char * +strptime(const char *buf, const char *fmt, struct tm *tm) +{ + char c; + const char *ptr; + int i, len = 0; + + ptr = fmt; + while (*ptr != 0) + { + if (*buf == 0) + break; + + c = *ptr++; + + if (c != '%') + { + if (isspace(c)) + while (*buf != 0 && isspace(*buf)) + buf++; + else if (c != *buf++) + return 0; + continue; + } + + c = *ptr++; + switch (c) + { + case 0: + case '%': + if (*buf++ != '%') + return 0; + break; + + case 'C': + buf = strptime(buf, En_US.ldate_format, tm); + if (buf == 0) + return 0; + break; + + case 'c': + buf = strptime(buf, "%x %X", tm); + if (buf == 0) + return 0; + break; + + case 'D': + buf = strptime(buf, "%m/%d/%y", tm); + if (buf == 0) + return 0; + break; + + case 'R': + buf = strptime(buf, "%H:%M", tm); + if (buf == 0) + return 0; + break; + + case 'r': + buf = strptime(buf, "%I:%M:%S %p", tm); + if (buf == 0) + return 0; + break; + + case 'T': + buf = strptime(buf, "%H:%M:%S", tm); + if (buf == 0) + return 0; + break; + + case 'X': + buf = strptime(buf, En_US.time_format, tm); + if (buf == 0) + return 0; + break; + + case 'x': + buf = strptime(buf, En_US.sdate_format, tm); + if (buf == 0) + return 0; + break; + + case 'j': + if (!isdigit(*buf)) + return 0; + + for (i = 0; *buf != 0 && isdigit(*buf); buf++) + { + i *= 10; + i += *buf - '0'; + } + if (i > 365) + return 0; + + tm->tm_yday = i; + break; + + case 'M': + case 'S': + if (*buf == 0 || isspace(*buf)) + break; + + if (!isdigit(*buf)) + return 0; + + for (i = 0; *buf != 0 && isdigit(*buf); buf++) + { + i *= 10; + i += *buf - '0'; + } + if (i > 59) + return 0; + + if (c == 'M') + tm->tm_min = i; + else + tm->tm_sec = i; + + if (*buf != 0 && isspace(*buf)) + while (*ptr != 0 && !isspace(*ptr)) + ptr++; + break; + + case 'H': + case 'I': + case 'k': + case 'l': + if (!isdigit(*buf)) + return 0; + + for (i = 0; *buf != 0 && isdigit(*buf); buf++) + { + i *= 10; + i += *buf - '0'; + } + if (c == 'H' || c == 'k') { + if (i > 23) + return 0; + } else if (i > 11) + return 0; + + tm->tm_hour = i; + + if (*buf != 0 && isspace(*buf)) + while (*ptr != 0 && !isspace(*ptr)) + ptr++; + break; + + case 'p': + len = strlen(En_US.am_string); + if (strncasecmp(buf, En_US.am_string, len) == 0) + { + if (tm->tm_hour > 12) + return 0; + if (tm->tm_hour == 12) + tm->tm_hour = 0; + buf += len; + break; + } + + len = strlen(En_US.pm_string); + if (strncasecmp(buf, En_US.pm_string, len) == 0) + { + if (tm->tm_hour > 12) + return 0; + if (tm->tm_hour != 12) + tm->tm_hour += 12; + buf += len; + break; + } + + return 0; + + case 'A': + case 'a': + for (i = 0; i < asizeof(En_US.weekday_names); i++) + { + len = strlen(En_US.weekday_names[i]); + if (strncasecmp(buf, + En_US.weekday_names[i], + len) == 0) + break; + + len = strlen(En_US.abbrev_weekday_names[i]); + if (strncasecmp(buf, + En_US.abbrev_weekday_names[i], + len) == 0) + break; + } + if (i == asizeof(En_US.weekday_names)) + return 0; + + tm->tm_wday = i; + buf += len; + break; + + case 'd': + case 'e': + if (!isdigit(*buf)) + return 0; + + for (i = 0; *buf != 0 && isdigit(*buf); buf++) + { + i *= 10; + i += *buf - '0'; + } + if (i > 31) + return 0; + + tm->tm_mday = i; + + if (*buf != 0 && isspace(*buf)) + while (*ptr != 0 && !isspace(*ptr)) + ptr++; + break; + + case 'B': + case 'b': + case 'h': + for (i = 0; i < asizeof(En_US.month_names); i++) + { + len = strlen(En_US.month_names[i]); + if (strncasecmp(buf, + En_US.month_names[i], + len) == 0) + break; + + len = strlen(En_US.abbrev_month_names[i]); + if (strncasecmp(buf, + En_US.abbrev_month_names[i], + len) == 0) + break; + } + if (i == asizeof(En_US.month_names)) + return 0; + + tm->tm_mon = i; + buf += len; + break; + + case 'm': + if (!isdigit(*buf)) + return 0; + + for (i = 0; *buf != 0 && isdigit(*buf); buf++) + { + i *= 10; + i += *buf - '0'; + } + if (i < 1 || i > 12) + return 0; + + tm->tm_mon = i - 1; + + if (*buf != 0 && isspace(*buf)) + while (*ptr != 0 && !isspace(*ptr)) + ptr++; + break; + + case 'Y': + case 'y': + if (*buf == 0 || isspace(*buf)) + break; + + if (!isdigit(*buf)) + return 0; + + for (i = 0; *buf != 0 && isdigit(*buf); buf++) + { + i *= 10; + i += *buf - '0'; + } + if (c == 'y' && i < 69) /* Unix Epoch pivot year */ + i += 100; + if (c == 'Y') + i -= 1900; + if (i < 0) + return 0; + + tm->tm_year = i; + + if (*buf != 0 && isspace(*buf)) + while (*ptr != 0 && !isspace(*ptr)) + ptr++; + break; + } + } + + return (char *) buf; +} \ No newline at end of file diff --git a/common/c_cpp/src/c/windows/wUuid.c b/common/c_cpp/src/c/windows/wUuid.c new file mode 100644 index 0000000..54124ec --- /dev/null +++ b/common/c_cpp/src/c/windows/wUuid.c @@ -0,0 +1,69 @@ +/* $Id: wUuid.c,v 1.1.2.3 2012/04/05 09:33:15 evinkeating Exp $ + * + * OpenMAMA: The open middleware agnostic messaging API + * Copyright (C) 2011 NYSE Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + + +#include <time.h> +#include <stdio.h> +#include <stdlib.h> +#include "wombat/wUuid.h" + +static uint64_t gRoot = 0; +static uint16_t gGotroot = 0; + +#ifndef HOST_NAME_MAX +# define HOST_NAME_MAX 255 +#endif + +void wUuid_generate_time (wUuid myUuid) +{ +} + +void wUuid_unparse (wUuid myUuid, char* out) +{ + if (!gGotroot) + { + char hostname[HOST_NAME_MAX+1]; + if (gethostname (hostname, HOST_NAME_MAX) == 0) + { + struct in_addr addr; + struct hostent* host = gethostbyname (hostname); + if ((host != NULL) && (host->h_addrtype == AF_INET)) + { + /* Found host by name - we just look at the first entry. + * Maybe we should look at all of the entries (these are not + * aliases though). */ + addr = *(struct in_addr*)(host->h_addr_list[0]); + } + else + addr.s_addr=INADDR_NONE; + + gRoot = (((uint64_t)addr.s_addr) << 32) + getpid(); + } + else + { + gRoot = getpid(); + } + gGotroot = 1; + } + + srand (time (NULL)); + snprintf (out, 49, "%d%d", gRoot, rand() % 10000); +} -- 1.7.7.6
|
|