tor-browser

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

libc.c (3017B)


      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/. */
      4 
      5 /*
      6 * libc.c
      7 *
      8 * This file contains our wrappers/reimplementations for "standard"
      9 * libc functions.  Things like "memcpy."  We add to this as we need
     10 * it.  Oh, and let's keep it in alphabetical order, should it ever
     11 * get large.  Most string/character stuff should be in utf8.c, not
     12 * here.  This file (and maybe utf8.c) should be the only ones in
     13 * NSS to include files with angle brackets.
     14 */
     15 
     16 #ifndef BASE_H
     17 #include "base.h"
     18 #endif /* BASE_H */
     19 
     20 #include <string.h> /* memcpy, memset */
     21 
     22 /*
     23 * nsslibc_memcpy
     24 * nsslibc_memset
     25 * nsslibc_offsetof
     26 * nsslibc_memequal
     27 */
     28 
     29 /*
     30 * nsslibc_memcpy
     31 *
     32 * Errors:
     33 *  NSS_ERROR_INVALID_POINTER
     34 *
     35 * Return value:
     36 *  NULL on error
     37 *  The destination pointer on success
     38 */
     39 
     40 NSS_IMPLEMENT void *
     41 nsslibc_memcpy(void *dest, const void *source, PRUint32 n)
     42 {
     43 #ifdef NSSDEBUG
     44    if (((void *)NULL == dest) || ((const void *)NULL == source)) {
     45        nss_SetError(NSS_ERROR_INVALID_POINTER);
     46        return (void *)NULL;
     47    }
     48 #endif /* NSSDEBUG */
     49 
     50    return memcpy(dest, source, (size_t)n);
     51 }
     52 
     53 /*
     54 * nsslibc_memset
     55 *
     56 * Errors:
     57 *  NSS_ERROR_INVALID_POINTER
     58 *
     59 * Return value:
     60 *  NULL on error
     61 *  The destination pointer on success
     62 */
     63 
     64 NSS_IMPLEMENT void *
     65 nsslibc_memset(void *dest, PRUint8 byte, PRUint32 n)
     66 {
     67 #ifdef NSSDEBUG
     68    if (((void *)NULL == dest)) {
     69        nss_SetError(NSS_ERROR_INVALID_POINTER);
     70        return (void *)NULL;
     71    }
     72 #endif /* NSSDEBUG */
     73 
     74    return memset(dest, (int)byte, (size_t)n);
     75 }
     76 
     77 /*
     78 * nsslibc_memequal
     79 *
     80 * Errors:
     81 *  NSS_ERROR_INVALID_POINTER
     82 *
     83 * Return value:
     84 *  PR_TRUE if they match
     85 *  PR_FALSE if they don't
     86 *  PR_FALSE upon error
     87 */
     88 
     89 NSS_IMPLEMENT PRBool
     90 nsslibc_memequal(const void *a, const void *b, PRUint32 len,
     91                 PRStatus *statusOpt)
     92 {
     93 #ifdef NSSDEBUG
     94    if ((((void *)NULL == a) || ((void *)NULL == b))) {
     95        nss_SetError(NSS_ERROR_INVALID_POINTER);
     96        if ((PRStatus *)NULL != statusOpt) {
     97            *statusOpt = PR_FAILURE;
     98        }
     99        return PR_FALSE;
    100    }
    101 #endif /* NSSDEBUG */
    102 
    103    if ((PRStatus *)NULL != statusOpt) {
    104        *statusOpt = PR_SUCCESS;
    105    }
    106 
    107    if (0 == memcmp(a, b, len)) {
    108        return PR_TRUE;
    109    } else {
    110        return PR_FALSE;
    111    }
    112 }
    113 
    114 /*
    115 * nsslibc_memcmp
    116 */
    117 
    118 NSS_IMPLEMENT PRInt32
    119 nsslibc_memcmp(const void *a, const void *b, PRUint32 len, PRStatus *statusOpt)
    120 {
    121    int v;
    122 
    123 #ifdef NSSDEBUG
    124    if ((((void *)NULL == a) || ((void *)NULL == b))) {
    125        nss_SetError(NSS_ERROR_INVALID_POINTER);
    126        if ((PRStatus *)NULL != statusOpt) {
    127            *statusOpt = PR_FAILURE;
    128        }
    129        return -2;
    130    }
    131 #endif /* NSSDEBUG */
    132 
    133    if ((PRStatus *)NULL != statusOpt) {
    134        *statusOpt = PR_SUCCESS;
    135    }
    136 
    137    v = memcmp(a, b, len);
    138    return (PRInt32)v;
    139 }
    140 
    141 /*
    142 * offsetof is a preprocessor definition
    143 */