You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
2.6 KiB
118 lines
2.6 KiB
//===-- Windows.cpp -------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// This file provides Windows support functions
|
|
|
|
#include "lldb/Host/PosixApi.h"
|
|
#include "lldb/Host/windows/windows.h"
|
|
|
|
#include "llvm/Support/ConvertUTF.h"
|
|
|
|
#include <assert.h>
|
|
#include <cerrno>
|
|
#include <ctype.h>
|
|
#include <io.h>
|
|
#include <stdarg.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
int vasprintf(char **ret, const char *fmt, va_list ap) {
|
|
char *buf;
|
|
int len;
|
|
size_t buflen;
|
|
va_list ap2;
|
|
|
|
va_copy(ap2, ap);
|
|
len = vsnprintf(NULL, 0, fmt, ap2);
|
|
|
|
if (len >= 0 &&
|
|
(buf = (char *)malloc((buflen = (size_t)(len + 1)))) != NULL) {
|
|
len = vsnprintf(buf, buflen, fmt, ap);
|
|
*ret = buf;
|
|
} else {
|
|
*ret = NULL;
|
|
len = -1;
|
|
}
|
|
|
|
va_end(ap2);
|
|
return len;
|
|
}
|
|
|
|
char *strcasestr(const char *s, const char *find) {
|
|
char c, sc;
|
|
size_t len;
|
|
|
|
if ((c = *find++) != 0) {
|
|
c = tolower((unsigned char)c);
|
|
len = strlen(find);
|
|
do {
|
|
do {
|
|
if ((sc = *s++) == 0)
|
|
return 0;
|
|
} while ((char)tolower((unsigned char)sc) != c);
|
|
} while (strncasecmp(s, find, len) != 0);
|
|
s--;
|
|
}
|
|
return const_cast<char *>(s);
|
|
}
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
char *basename(char *path) {
|
|
char *l1 = strrchr(path, '\\');
|
|
char *l2 = strrchr(path, '/');
|
|
if (l2 > l1)
|
|
l1 = l2;
|
|
if (!l1)
|
|
return path; // no base name
|
|
return &l1[1];
|
|
}
|
|
|
|
char *dirname(char *path) {
|
|
char *l1 = strrchr(path, '\\');
|
|
char *l2 = strrchr(path, '/');
|
|
if (l2 > l1)
|
|
l1 = l2;
|
|
if (!l1)
|
|
return NULL; // no dir name
|
|
*l1 = 0;
|
|
return path;
|
|
}
|
|
|
|
int strcasecmp(const char *s1, const char *s2) { return stricmp(s1, s2); }
|
|
|
|
int strncasecmp(const char *s1, const char *s2, size_t n) {
|
|
return strnicmp(s1, s2, n);
|
|
}
|
|
|
|
#if _MSC_VER < 1900
|
|
namespace lldb_private {
|
|
int vsnprintf(char *buffer, size_t count, const char *format, va_list argptr) {
|
|
int old_errno = errno;
|
|
int r = ::vsnprintf(buffer, count, format, argptr);
|
|
int new_errno = errno;
|
|
buffer[count - 1] = '\0';
|
|
if (r == -1 || r == count) {
|
|
FILE *nul = fopen("nul", "w");
|
|
int bytes_written = ::vfprintf(nul, format, argptr);
|
|
fclose(nul);
|
|
if (bytes_written < count)
|
|
errno = new_errno;
|
|
else {
|
|
errno = old_errno;
|
|
r = bytes_written;
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
} // namespace lldb_private
|
|
#endif
|
|
|
|
#endif // _MSC_VER
|