LCOV - code coverage report
Current view: directory - redis/src - endianconv.c (source / functions) Found Hit Coverage
Test: redis.info Lines: 37 0 0.0 %
Date: 2012-04-04 Functions: 6 0 0.0 %
Colors: not hit hit

       1                 : /* endinconv.c -- Endian conversions utilities.
       2                 :  *
       3                 :  * This functions are never called directly, but always using the macros
       4                 :  * defined into endianconv.h, this way we define everything is a non-operation
       5                 :  * if the arch is already little endian.
       6                 :  *
       7                 :  * Redis tries to encode everything as little endian (but a few things that need
       8                 :  * to be backward compatible are still in big endian) because most of the
       9                 :  * production environments are little endian, and we have a lot of conversions
      10                 :  * in a few places because ziplists, intsets, zipmaps, need to be endian-neutral
      11                 :  * even in memory, since they are serialied on RDB files directly with a single
      12                 :  * write(2) without other additional steps.
      13                 :  *
      14                 :  * ----------------------------------------------------------------------------
      15                 :  *
      16                 :  * Copyright (c) 2011-2012, Salvatore Sanfilippo <antirez at gmail dot com>
      17                 :  * All rights reserved.
      18                 :  *
      19                 :  * Redistribution and use in source and binary forms, with or without
      20                 :  * modification, are permitted provided that the following conditions are met:
      21                 :  *
      22                 :  *   * Redistributions of source code must retain the above copyright notice,
      23                 :  *     this list of conditions and the following disclaimer.
      24                 :  *   * Redistributions in binary form must reproduce the above copyright
      25                 :  *     notice, this list of conditions and the following disclaimer in the
      26                 :  *     documentation and/or other materials provided with the distribution.
      27                 :  *   * Neither the name of Redis nor the names of its contributors may be used
      28                 :  *     to endorse or promote products derived from this software without
      29                 :  *     specific prior written permission.
      30                 :  *
      31                 :  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
      32                 :  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      33                 :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      34                 :  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
      35                 :  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
      36                 :  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
      37                 :  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
      38                 :  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
      39                 :  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
      40                 :  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
      41                 :  * POSSIBILITY OF SUCH DAMAGE.
      42                 :  */
      43                 : 
      44                 : 
      45                 : #include <stdint.h>
      46                 : 
      47                 : /* Toggle the 16 bit unsigned integer pointed by *p from little endian to
      48                 :  * big endian */
      49               0 : void memrev16(void *p) {
      50               0 :     unsigned char *x = p, t;
      51                 : 
      52               0 :     t = x[0];
      53               0 :     x[0] = x[1];
      54               0 :     x[1] = t;
      55               0 : }
      56                 : 
      57                 : /* Toggle the 32 bit unsigned integer pointed by *p from little endian to
      58                 :  * big endian */
      59               0 : void memrev32(void *p) {
      60               0 :     unsigned char *x = p, t;
      61                 : 
      62               0 :     t = x[0];
      63               0 :     x[0] = x[3];
      64               0 :     x[3] = t;
      65               0 :     t = x[1];
      66               0 :     x[1] = x[2];
      67               0 :     x[2] = t;
      68               0 : }
      69                 : 
      70                 : /* Toggle the 64 bit unsigned integer pointed by *p from little endian to
      71                 :  * big endian */
      72               0 : void memrev64(void *p) {
      73               0 :     unsigned char *x = p, t;
      74                 : 
      75               0 :     t = x[0];
      76               0 :     x[0] = x[7];
      77               0 :     x[7] = t;
      78               0 :     t = x[1];
      79               0 :     x[1] = x[6];
      80               0 :     x[6] = t;
      81               0 :     t = x[2];
      82               0 :     x[2] = x[5];
      83               0 :     x[5] = t;
      84               0 :     t = x[3];
      85               0 :     x[3] = x[4];
      86               0 :     x[4] = t;
      87               0 : }
      88                 : 
      89               0 : uint16_t intrev16(uint16_t v) {
      90                 :     memrev16(&v);
      91               0 :     return v;
      92                 : }
      93                 : 
      94               0 : uint32_t intrev32(uint32_t v) {
      95                 :     memrev32(&v);
      96               0 :     return v;
      97                 : }
      98                 : 
      99               0 : uint64_t intrev64(uint64_t v) {
     100               0 :     memrev64(&v);
     101               0 :     return v;
     102                 : }
     103                 : 
     104                 : #ifdef TESTMAIN
     105                 : #include <stdio.h>
     106                 : 
     107                 : int main(void) {
     108                 :     char buf[32];
     109                 : 
     110                 :     sprintf(buf,"ciaoroma");
     111                 :     memrev16(buf);
     112                 :     printf("%s\n", buf);
     113                 : 
     114                 :     sprintf(buf,"ciaoroma");
     115                 :     memrev32(buf);
     116                 :     printf("%s\n", buf);
     117                 : 
     118                 :     sprintf(buf,"ciaoroma");
     119                 :     memrev64(buf);
     120                 :     printf("%s\n", buf);
     121                 : 
     122                 :     return 0;
     123                 : }
     124                 : #endif

Generated by: LCOV version 1.7