gecko-dev/xpcom/glue/nsCRTGlue.cpp
Carsten "Tomcat" Book bab9dbe9c4 Backed out 19 changesets (bug 1149397, bug 1065657, bug 1024774) for fixing Linux PGO xpcshell bustage on a CLOSED TREE
Backed out changeset 53058615e7a3 (bug 1024774)
Backed out changeset 68fe0894bb09 (bug 1065657)
Backed out changeset 1b9620d674df (bug 1024774)
Backed out changeset a31c514b59da (bug 1024774)
Backed out changeset 0fcf8757f6c2 (bug 1024774)
Backed out changeset 9a3c71b925d4 (bug 1024774)
Backed out changeset 783acc92af04 (bug 1024774)
Backed out changeset ad71c9a3446b (bug 1024774)
Backed out changeset 4f37e72e70f6 (bug 1024774)
Backed out changeset ec869578cc0a (bug 1024774)
Backed out changeset 3c1d306c8a3d (bug 1024774)
Backed out changeset b3a90f30892d (bug 1024774)
Backed out changeset cf7bbb3774c0 (bug 1024774)
Backed out changeset 2522eb4d3cf2 (bug 1024774)
Backed out changeset 89a502d88f9c (bug 1024774)
Backed out changeset 61046ad3161f (bug 1024774)
Backed out changeset 36706aaa2f06 (bug 1024774)
Backed out changeset ba8e68e05149 (bug 1149397)
Backed out changeset 532169437c2f (bug 1065657)

--HG--
rename : toolkit/components/protobuf/src/google/protobuf/extension_set.cc => toolkit/components/protobuf/google/protobuf/extension_set.cc
rename : toolkit/components/protobuf/src/google/protobuf/extension_set.h => toolkit/components/protobuf/google/protobuf/extension_set.h
rename : toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_pnacl.h => toolkit/components/protobuf/google/protobuf/generated_message_util.cc
rename : toolkit/components/protobuf/src/google/protobuf/stubs/stringprintf.h => toolkit/components/protobuf/google/protobuf/generated_message_util.h
rename : toolkit/components/protobuf/src/google/protobuf/io/coded_stream.cc => toolkit/components/protobuf/google/protobuf/io/coded_stream.cc
rename : toolkit/components/protobuf/src/google/protobuf/io/coded_stream.h => toolkit/components/protobuf/google/protobuf/io/coded_stream.h
rename : toolkit/components/protobuf/src/google/protobuf/io/coded_stream_inl.h => toolkit/components/protobuf/google/protobuf/io/coded_stream_inl.h
rename : toolkit/components/protobuf/src/google/protobuf/io/package_info.h => toolkit/components/protobuf/google/protobuf/io/package_info.h
rename : toolkit/components/protobuf/src/google/protobuf/service.cc => toolkit/components/protobuf/google/protobuf/io/zero_copy_stream.cc
rename : toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream.h => toolkit/components/protobuf/google/protobuf/io/zero_copy_stream.h
rename : toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h => toolkit/components/protobuf/google/protobuf/io/zero_copy_stream_impl.h
rename : toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc => toolkit/components/protobuf/google/protobuf/io/zero_copy_stream_impl_lite.cc
rename : toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h => toolkit/components/protobuf/google/protobuf/io/zero_copy_stream_impl_lite.h
rename : toolkit/components/protobuf/src/google/protobuf/message_lite.cc => toolkit/components/protobuf/google/protobuf/message_lite.cc
rename : toolkit/components/protobuf/src/google/protobuf/message_lite.h => toolkit/components/protobuf/google/protobuf/message_lite.h
rename : toolkit/components/protobuf/src/google/protobuf/package_info.h => toolkit/components/protobuf/google/protobuf/package_info.h
rename : toolkit/components/protobuf/src/google/protobuf/repeated_field.cc => toolkit/components/protobuf/google/protobuf/repeated_field.cc
rename : toolkit/components/protobuf/src/google/protobuf/repeated_field.h => toolkit/components/protobuf/google/protobuf/repeated_field.h
rename : toolkit/components/protobuf/src/google/protobuf/stubs/common.cc => toolkit/components/protobuf/google/protobuf/stubs/common.cc
rename : toolkit/components/protobuf/src/google/protobuf/stubs/common.h => toolkit/components/protobuf/google/protobuf/stubs/common.h
rename : toolkit/components/protobuf/src/google/protobuf/stubs/hash.h => toolkit/components/protobuf/google/protobuf/stubs/hash.h
rename : toolkit/components/protobuf/src/google/protobuf/stubs/once.cc => toolkit/components/protobuf/google/protobuf/stubs/once.cc
rename : toolkit/components/protobuf/src/google/protobuf/stubs/once.h => toolkit/components/protobuf/google/protobuf/stubs/once.h
rename : toolkit/components/protobuf/src/google/protobuf/stubs/stl_util.h => toolkit/components/protobuf/google/protobuf/stubs/stl_util-inl.h
rename : toolkit/components/protobuf/src/google/protobuf/wire_format_lite.cc => toolkit/components/protobuf/google/protobuf/wire_format_lite.cc
rename : toolkit/components/protobuf/src/google/protobuf/wire_format_lite.h => toolkit/components/protobuf/google/protobuf/wire_format_lite.h
rename : toolkit/components/protobuf/src/google/protobuf/wire_format_lite_inl.h => toolkit/components/protobuf/google/protobuf/wire_format_lite_inl.h
2015-04-23 08:37:24 +02:00

419 lines
9.1 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsCRTGlue.h"
#include "nsXPCOM.h"
#include "nsDebug.h"
#include "prtime.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#ifdef XP_WIN
#include <io.h>
#include <windows.h>
#include "mozilla/UniquePtr.h"
#endif
#ifdef ANDROID
#include <android/log.h>
#include <unistd.h>
#endif
using namespace mozilla;
const char*
NS_strspnp(const char* aDelims, const char* aStr)
{
const char* d;
do {
for (d = aDelims; *d != '\0'; ++d) {
if (*aStr == *d) {
++aStr;
break;
}
}
} while (*d);
return aStr;
}
char*
NS_strtok(const char* aDelims, char** aStr)
{
if (!*aStr) {
return nullptr;
}
char* ret = (char*)NS_strspnp(aDelims, *aStr);
if (!*ret) {
*aStr = ret;
return nullptr;
}
char* i = ret;
do {
for (const char* d = aDelims; *d != '\0'; ++d) {
if (*i == *d) {
*i = '\0';
*aStr = ++i;
return ret;
}
}
++i;
} while (*i);
*aStr = nullptr;
return ret;
}
uint32_t
NS_strlen(const char16_t* aString)
{
const char16_t* end;
for (end = aString; *end; ++end) {
// empty loop
}
return end - aString;
}
int
NS_strcmp(const char16_t* aStrA, const char16_t* aStrB)
{
while (*aStrB) {
int r = *aStrA - *aStrB;
if (r) {
return r;
}
++aStrA;
++aStrB;
}
return *aStrA != '\0';
}
char16_t*
NS_strdup(const char16_t* aString)
{
uint32_t len = NS_strlen(aString);
return NS_strndup(aString, len);
}
char16_t*
NS_strndup(const char16_t* aString, uint32_t aLen)
{
char16_t* newBuf = (char16_t*)NS_Alloc((aLen + 1) * sizeof(char16_t));
if (newBuf) {
memcpy(newBuf, aString, aLen * sizeof(char16_t));
newBuf[aLen] = '\0';
}
return newBuf;
}
char*
NS_strdup(const char* aString)
{
uint32_t len = strlen(aString);
char* str = (char*)NS_Alloc(len + 1);
if (str) {
memcpy(str, aString, len);
str[len] = '\0';
}
return str;
}
// This table maps uppercase characters to lower case characters;
// characters that are neither upper nor lower case are unaffected.
const unsigned char nsLowerUpperUtils::kUpper2Lower[256] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64,
// upper band mapped to lower [A-Z] => [a-z]
97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
112,113,114,115,116,117,118,119,120,121,122,
91, 92, 93, 94, 95,
96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
};
const unsigned char nsLowerUpperUtils::kLower2Upper[256] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
96,
// lower band mapped to upper [a-z] => [A-Z]
65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
123,124,125,126,127,
128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
};
bool
NS_IsUpper(char aChar)
{
return aChar != (char)nsLowerUpperUtils::kUpper2Lower[(unsigned char)aChar];
}
bool
NS_IsLower(char aChar)
{
return aChar != (char)nsLowerUpperUtils::kLower2Upper[(unsigned char)aChar];
}
bool
NS_IsAscii(char16_t aChar)
{
return (0x0080 > aChar);
}
bool
NS_IsAscii(const char16_t* aString)
{
while (*aString) {
if (0x0080 <= *aString) {
return false;
}
aString++;
}
return true;
}
bool
NS_IsAscii(const char* aString)
{
while (*aString) {
if (0x80 & *aString) {
return false;
}
aString++;
}
return true;
}
bool
NS_IsAscii(const char* aString, uint32_t aLength)
{
const char* end = aString + aLength;
while (aString < end) {
if (0x80 & *aString) {
return false;
}
++aString;
}
return true;
}
bool
NS_IsAsciiAlpha(char16_t aChar)
{
return (aChar >= 'A' && aChar <= 'Z') ||
(aChar >= 'a' && aChar <= 'z');
}
bool
NS_IsAsciiWhitespace(char16_t aChar)
{
return aChar == ' ' ||
aChar == '\r' ||
aChar == '\n' ||
aChar == '\t';
}
bool
NS_IsAsciiDigit(char16_t aChar)
{
return aChar >= '0' && aChar <= '9';
}
#ifndef XPCOM_GLUE_AVOID_NSPR
#define TABLE_SIZE 36
static const char table[] = {
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3',
'4', '5', '6', '7', '8', '9'
};
void
NS_MakeRandomString(char* aBuf, int32_t aBufLen)
{
// turn PR_Now() into milliseconds since epoch
// and salt rand with that.
static unsigned int seed = 0;
if (seed == 0) {
double fpTime = double(PR_Now());
seed = (unsigned int)(fpTime * 1e-6 + 0.5); // use 1e-6, granularity of PR_Now() on the mac is seconds
srand(seed);
}
int32_t i;
for (i = 0; i < aBufLen; ++i) {
*aBuf++ = table[rand() % TABLE_SIZE];
}
*aBuf = 0;
}
#endif
static StderrCallback sStderrCallback = nullptr;
void
set_stderr_callback(StderrCallback aCallback)
{
sStderrCallback = aCallback;
}
#if defined(ANDROID) && !defined(RELEASE_BUILD)
static FILE* sStderrCopy = nullptr;
void
stderr_to_file(const char* aFmt, va_list aArgs)
{
vfprintf(sStderrCopy, aFmt, aArgs);
}
void
copy_stderr_to_file(const char* aFile)
{
if (sStderrCopy) {
return;
}
char* buf = (char*)malloc(strlen(aFile) + 16);
sprintf(buf, "%s.%u", aFile, (uint32_t)getpid());
sStderrCopy = fopen(buf, "w");
free(buf);
set_stderr_callback(stderr_to_file);
}
#endif
#ifdef HAVE_VA_COPY
#define VARARGS_ASSIGN(foo, bar) VA_COPY(foo,bar)
#elif defined(HAVE_VA_LIST_AS_ARRAY)
#define VARARGS_ASSIGN(foo, bar) foo[0] = bar[0]
#else
#define VARARGS_ASSIGN(foo, bar) (foo) = (bar)
#endif
#if defined(XP_WIN)
void
vprintf_stderr(const char* aFmt, va_list aArgs)
{
if (sStderrCallback) {
va_list argsCpy;
VARARGS_ASSIGN(argsCpy, aArgs);
sStderrCallback(aFmt, aArgs);
va_end(argsCpy);
}
if (IsDebuggerPresent()) {
int lengthNeeded = _vscprintf(aFmt, aArgs);
if (lengthNeeded) {
lengthNeeded++;
auto buf = MakeUnique<char[]>(lengthNeeded);
if (buf) {
va_list argsCpy;
VARARGS_ASSIGN(argsCpy, aArgs);
vsnprintf(buf.get(), lengthNeeded, aFmt, argsCpy);
buf[lengthNeeded - 1] = '\0';
va_end(argsCpy);
OutputDebugStringA(buf.get());
}
}
}
FILE* fp = _fdopen(_dup(2), "a");
if (!fp) {
return;
}
vfprintf(fp, aFmt, aArgs);
fclose(fp);
}
#elif defined(ANDROID)
void
vprintf_stderr(const char* aFmt, va_list aArgs)
{
if (sStderrCallback) {
va_list argsCpy;
VARARGS_ASSIGN(argsCpy, aArgs);
sStderrCallback(aFmt, aArgs);
va_end(argsCpy);
}
__android_log_vprint(ANDROID_LOG_INFO, "Gecko", aFmt, aArgs);
}
#else
void
vprintf_stderr(const char* aFmt, va_list aArgs)
{
if (sStderrCallback) {
va_list argsCpy;
VARARGS_ASSIGN(argsCpy, aArgs);
sStderrCallback(aFmt, aArgs);
va_end(argsCpy);
}
vfprintf(stderr, aFmt, aArgs);
}
#endif
void
printf_stderr(const char* aFmt, ...)
{
va_list args;
va_start(args, aFmt);
vprintf_stderr(aFmt, args);
va_end(args);
}
void
fprintf_stderr(FILE* aFile, const char* aFmt, ...)
{
va_list args;
va_start(args, aFmt);
if (aFile == stderr) {
vprintf_stderr(aFmt, args);
} else {
vfprintf(aFile, aFmt, args);
}
va_end(args);
}