tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

strcase.c (5481B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
      2 /* This Source Code Form is subject to the terms of the Mozilla Public
      3 * License, v. 2.0. If a copy of the MPL was not distributed with this
      4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      5 
      6 #include "plstr.h"
      7 #include <string.h>
      8 
      9 static const unsigned char uc[] = {
     10    '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007', '\010',
     11    '\011', '\012', '\013', '\014', '\015', '\016', '\017', '\020', '\021',
     12    '\022', '\023', '\024', '\025', '\026', '\027', '\030', '\031', '\032',
     13    '\033', '\034', '\035', '\036', '\037', ' ',    '!',    '"',    '#',
     14    '$',    '%',    '&',    '\'',   '(',    ')',    '*',    '+',    ',',
     15    '-',    '.',    '/',    '0',    '1',    '2',    '3',    '4',    '5',
     16    '6',    '7',    '8',    '9',    ':',    ';',    '<',    '=',    '>',
     17    '?',    '@',    'A',    'B',    'C',    'D',    'E',    'F',    'G',
     18    'H',    'I',    'J',    'K',    'L',    'M',    'N',    'O',    'P',
     19    'Q',    'R',    'S',    'T',    'U',    'V',    'W',    'X',    'Y',
     20    'Z',    '[',    '\\',   ']',    '^',    '_',    '`',    'A',    'B',
     21    'C',    'D',    'E',    'F',    'G',    'H',    'I',    'J',    'K',
     22    'L',    'M',    'N',    'O',    'P',    'Q',    'R',    'S',    'T',
     23    'U',    'V',    'W',    'X',    'Y',    'Z',    '{',    '|',    '}',
     24    '~',    '\177', 0200,   0201,   0202,   0203,   0204,   0205,   0206,
     25    0207,   0210,   0211,   0212,   0213,   0214,   0215,   0216,   0217,
     26    0220,   0221,   0222,   0223,   0224,   0225,   0226,   0227,   0230,
     27    0231,   0232,   0233,   0234,   0235,   0236,   0237,   0240,   0241,
     28    0242,   0243,   0244,   0245,   0246,   0247,   0250,   0251,   0252,
     29    0253,   0254,   0255,   0256,   0257,   0260,   0261,   0262,   0263,
     30    0264,   0265,   0266,   0267,   0270,   0271,   0272,   0273,   0274,
     31    0275,   0276,   0277,   0300,   0301,   0302,   0303,   0304,   0305,
     32    0306,   0307,   0310,   0311,   0312,   0313,   0314,   0315,   0316,
     33    0317,   0320,   0321,   0322,   0323,   0324,   0325,   0326,   0327,
     34    0330,   0331,   0332,   0333,   0334,   0335,   0336,   0337,   0340,
     35    0341,   0342,   0343,   0344,   0345,   0346,   0347,   0350,   0351,
     36    0352,   0353,   0354,   0355,   0356,   0357,   0360,   0361,   0362,
     37    0363,   0364,   0365,   0366,   0367,   0370,   0371,   0372,   0373,
     38    0374,   0375,   0376,   0377};
     39 
     40 PR_IMPLEMENT(PRIntn)
     41 PL_strcasecmp(const char* a, const char* b) {
     42  const unsigned char* ua = (const unsigned char*)a;
     43  const unsigned char* ub = (const unsigned char*)b;
     44 
     45  if ((const char*)0 == a) {
     46    return ((const char*)0 == b) ? 0 : -1;
     47  }
     48  if ((const char*)0 == b) {
     49    return 1;
     50  }
     51 
     52  while ((uc[*ua] == uc[*ub]) && ('\0' != *a)) {
     53    a++;
     54    ua++;
     55    ub++;
     56  }
     57 
     58  return (PRIntn)(uc[*ua] - uc[*ub]);
     59 }
     60 
     61 PR_IMPLEMENT(PRIntn)
     62 PL_strncasecmp(const char* a, const char* b, PRUint32 max) {
     63  const unsigned char* ua = (const unsigned char*)a;
     64  const unsigned char* ub = (const unsigned char*)b;
     65 
     66  if ((const char*)0 == a) {
     67    return ((const char*)0 == b) ? 0 : -1;
     68  }
     69  if ((const char*)0 == b) {
     70    return 1;
     71  }
     72 
     73  while (max && (uc[*ua] == uc[*ub]) && ('\0' != *a)) {
     74    a++;
     75    ua++;
     76    ub++;
     77    max--;
     78  }
     79 
     80  if (0 == max) {
     81    return (PRIntn)0;
     82  }
     83 
     84  return (PRIntn)(uc[*ua] - uc[*ub]);
     85 }
     86 
     87 PR_IMPLEMENT(char*)
     88 PL_strcasestr(const char* big, const char* little) {
     89  PRUint32 ll;
     90 
     91  if (((const char*)0 == big) || ((const char*)0 == little)) {
     92    return (char*)0;
     93  }
     94  if (((char)0 == *big) || ((char)0 == *little)) {
     95    return (char*)0;
     96  }
     97 
     98  ll = strlen(little);
     99 
    100  for (; *big; big++) /* obvious improvement available here */
    101    if (0 == PL_strncasecmp(big, little, ll)) {
    102      return (char*)big;
    103    }
    104 
    105  return (char*)0;
    106 }
    107 
    108 PR_IMPLEMENT(char*)
    109 PL_strcaserstr(const char* big, const char* little) {
    110  const char* p;
    111  PRUint32 bl, ll;
    112 
    113  if (((const char*)0 == big) || ((const char*)0 == little)) {
    114    return (char*)0;
    115  }
    116  if (((char)0 == *big) || ((char)0 == *little)) {
    117    return (char*)0;
    118  }
    119 
    120  bl = strlen(big);
    121  ll = strlen(little);
    122  if (bl < ll) {
    123    return (char*)0;
    124  }
    125  p = &big[bl - ll];
    126 
    127  for (; p >= big; p--) /* obvious improvement available here */
    128    if (0 == PL_strncasecmp(p, little, ll)) {
    129      return (char*)p;
    130    }
    131 
    132  return (char*)0;
    133 }
    134 
    135 PR_IMPLEMENT(char*)
    136 PL_strncasestr(const char* big, const char* little, PRUint32 max) {
    137  PRUint32 ll;
    138 
    139  if (((const char*)0 == big) || ((const char*)0 == little)) {
    140    return (char*)0;
    141  }
    142  if (((char)0 == *big) || ((char)0 == *little)) {
    143    return (char*)0;
    144  }
    145 
    146  ll = strlen(little);
    147  if (ll > max) {
    148    return (char*)0;
    149  }
    150  max -= ll;
    151  max++;
    152 
    153  for (; max && *big; big++, max--) /* obvious improvement available here */
    154    if (0 == PL_strncasecmp(big, little, ll)) {
    155      return (char*)big;
    156    }
    157 
    158  return (char*)0;
    159 }
    160 
    161 PR_IMPLEMENT(char*)
    162 PL_strncaserstr(const char* big, const char* little, PRUint32 max) {
    163  const char* p;
    164  PRUint32 ll;
    165 
    166  if (((const char*)0 == big) || ((const char*)0 == little)) {
    167    return (char*)0;
    168  }
    169  if (((char)0 == *big) || ((char)0 == *little)) {
    170    return (char*)0;
    171  }
    172 
    173  ll = strlen(little);
    174 
    175  for (p = big; max && *p; p++, max--);
    176 
    177  p -= ll;
    178  if (p < big) {
    179    return (char*)0;
    180  }
    181 
    182  for (; p >= big; p--) /* obvious improvement available here */
    183    if (0 == PL_strncasecmp(p, little, ll)) {
    184      return (char*)p;
    185    }
    186 
    187  return (char*)0;
    188 }