xpcom/glue/nsCRTGlue.cpp

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 #include "nsCRTGlue.h"
     6 #include "nsXPCOM.h"
     7 #include "nsDebug.h"
     8 #include "prtime.h"
    10 #include <stdlib.h>
    11 #include <string.h>
    12 #include <stdio.h>
    13 #include <stdarg.h>
    15 #ifdef XP_WIN
    16 #include <io.h>
    17 #include <windows.h>
    18 #endif
    20 #ifdef ANDROID
    21 #include <android/log.h>
    22 #endif
    24 const char*
    25 NS_strspnp(const char *delims, const char *str)
    26 {
    27   const char *d;
    28   do {
    29     for (d = delims; *d != '\0'; ++d) {
    30       if (*str == *d) {
    31         ++str;
    32         break;
    33       }
    34     }
    35   } while (*d);
    37   return str;
    38 }
    40 char*
    41 NS_strtok(const char *delims, char **str)
    42 {
    43   if (!*str)
    44     return nullptr;
    46   char *ret = (char*) NS_strspnp(delims, *str);
    48   if (!*ret) {
    49     *str = ret;
    50     return nullptr;
    51   }
    53   char *i = ret;
    54   do {
    55     for (const char *d = delims; *d != '\0'; ++d) {
    56       if (*i == *d) {
    57         *i = '\0';
    58         *str = ++i;
    59         return ret;
    60       }
    61     }
    62     ++i;
    63   } while (*i);
    65   *str = nullptr;
    66   return ret;
    67 }
    69 uint32_t
    70 NS_strlen(const char16_t *aString)
    71 {
    72   const char16_t *end;
    74   for (end = aString; *end; ++end) {
    75     // empty loop
    76   }
    78   return end - aString;
    79 }
    81 int
    82 NS_strcmp(const char16_t *a, const char16_t *b)
    83 {
    84   while (*b) {
    85     int r = *a - *b;
    86     if (r)
    87       return r;
    89     ++a;
    90     ++b;
    91   }
    93   return *a != '\0';
    94 }
    96 char16_t*
    97 NS_strdup(const char16_t *aString)
    98 {
    99   uint32_t len = NS_strlen(aString);
   100   return NS_strndup(aString, len);
   101 }
   103 char16_t*
   104 NS_strndup(const char16_t *aString, uint32_t aLen)
   105 {
   106   char16_t *newBuf = (char16_t*) NS_Alloc((aLen + 1) * sizeof(char16_t));
   107   if (newBuf) {
   108     memcpy(newBuf, aString, aLen * sizeof(char16_t));
   109     newBuf[aLen] = '\0';
   110   }
   111   return newBuf;
   112 }
   114 char*
   115 NS_strdup(const char *aString)
   116 {
   117   uint32_t len = strlen(aString);
   118   char *str = (char*) NS_Alloc(len + 1);
   119   if (str) {
   120     memcpy(str, aString, len);
   121     str[len] = '\0';
   122   }
   123   return str;
   124 }
   126 // This table maps uppercase characters to lower case characters;
   127 // characters that are neither upper nor lower case are unaffected.
   128 const unsigned char nsLowerUpperUtils::kUpper2Lower[256] = {
   129     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
   130    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
   131    32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
   132    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
   133    64,
   135     // upper band mapped to lower [A-Z] => [a-z]
   136        97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
   137   112,113,114,115,116,117,118,119,120,121,122,
   139                                                91, 92, 93, 94, 95,
   140    96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
   141   112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
   142   128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
   143   144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
   144   160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
   145   176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
   146   192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
   147   208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
   148   224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
   149   240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
   150 };
   152 const unsigned char nsLowerUpperUtils::kLower2Upper[256] = {
   153     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
   154    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
   155    32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
   156    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
   157    64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
   158    80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
   159    96,
   161     // lower band mapped to upper [a-z] => [A-Z]
   162        65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
   163    80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
   165                                               123,124,125,126,127,
   166   128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
   167   144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
   168   160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
   169   176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
   170   192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
   171   208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
   172   224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
   173   240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
   174 };
   176 bool NS_IsUpper(char aChar)
   177 {
   178   return aChar != (char)nsLowerUpperUtils::kUpper2Lower[(unsigned char)aChar];
   179 }
   181 bool NS_IsLower(char aChar)
   182 {
   183   return aChar != (char)nsLowerUpperUtils::kLower2Upper[(unsigned char)aChar];
   184 }
   186 bool NS_IsAscii(char16_t aChar)
   187 {
   188   return (0x0080 > aChar);
   189 }
   191 bool NS_IsAscii(const char16_t *aString)
   192 {
   193   while(*aString) {
   194     if( 0x0080 <= *aString)
   195       return false;
   196     aString++;
   197   }
   198   return true;
   199 }
   201 bool NS_IsAscii(const char *aString)
   202 {
   203   while(*aString) {
   204     if( 0x80 & *aString)
   205       return false;
   206     aString++;
   207   }
   208   return true;
   209 }
   211 bool NS_IsAscii(const char* aString, uint32_t aLength)
   212 {
   213   const char* end = aString + aLength;
   214   while (aString < end) {
   215     if (0x80 & *aString)
   216       return false;
   217     ++aString;
   218   }
   219   return true;
   220 }
   222 bool NS_IsAsciiAlpha(char16_t aChar)
   223 {
   224   return ((aChar >= 'A') && (aChar <= 'Z')) ||
   225          ((aChar >= 'a') && (aChar <= 'z'));
   226 }
   228 bool NS_IsAsciiWhitespace(char16_t aChar)
   229 {
   230   return aChar == ' ' ||
   231          aChar == '\r' ||
   232          aChar == '\n' ||
   233          aChar == '\t';
   234 }
   236 bool NS_IsAsciiDigit(char16_t aChar)
   237 {
   238   return aChar >= '0' && aChar <= '9';
   239 }
   242 #ifndef XPCOM_GLUE_AVOID_NSPR
   243 #define TABLE_SIZE 36
   244 static const char table[] = {
   245   'a','b','c','d','e','f','g','h','i','j',
   246   'k','l','m','n','o','p','q','r','s','t',
   247   'u','v','w','x','y','z','0','1','2','3',
   248   '4','5','6','7','8','9'
   249 };
   251 void NS_MakeRandomString(char *aBuf, int32_t aBufLen)
   252 {
   253   // turn PR_Now() into milliseconds since epoch
   254   // and salt rand with that.
   255   static unsigned int seed = 0;
   256   if (seed == 0) {
   257     double fpTime = double(PR_Now());
   258     seed = (unsigned int)(fpTime * 1e-6 + 0.5); // use 1e-6, granularity of PR_Now() on the mac is seconds
   259     srand(seed);
   260   }
   262   int32_t i;
   263   for (i=0;i<aBufLen;i++) {
   264     *aBuf++ = table[rand()%TABLE_SIZE];
   265   }
   266   *aBuf = 0;
   267 }
   269 #endif
   270 #if defined(XP_WIN)
   272 #define va_copy(dest, src) (dest = src)
   274 void
   275 vprintf_stderr(const char *fmt, va_list args)
   276 {
   277   if (IsDebuggerPresent()) {
   278     char buf[2048];
   279     va_list argsCpy;
   280     va_copy(argsCpy, args);
   281     vsnprintf(buf, sizeof(buf), fmt, argsCpy);
   282     buf[sizeof(buf) - 1] = '\0';
   283     va_end(argsCpy);
   284     OutputDebugStringA(buf);
   285   }
   287   FILE *fp = _fdopen(_dup(2), "a");
   288   if (!fp)
   289       return;
   291   vfprintf(fp, fmt, args);
   293   fclose(fp);
   294 }
   296 #undef va_copy
   298 #elif defined(ANDROID)
   299 void
   300 vprintf_stderr(const char *fmt, va_list args)
   301 {
   302   __android_log_vprint(ANDROID_LOG_INFO, "Gecko", fmt, args);
   303 }
   304 #else
   305 void
   306 vprintf_stderr(const char *fmt, va_list args)
   307 {
   308   vfprintf(stderr, fmt, args);
   309 }
   310 #endif
   312 void
   313 printf_stderr(const char *fmt, ...)
   314 {
   315   va_list args;
   316   va_start(args, fmt);
   317   vprintf_stderr(fmt, args);
   318   va_end(args);
   319 }
   321 void
   322 fprintf_stderr(FILE* aFile, const char *fmt, ...)
   323 {
   324   va_list args;
   325   va_start(args, fmt);
   326   if (aFile == stderr) {
   327     vprintf_stderr(fmt, args);
   328   } else {
   329     vfprintf(aFile, fmt, args);
   330   }
   331   va_end(args);
   332 }

mercurial