LCOV - code coverage report
Current view: directory - nsprpub/pr/src/misc - praton.c (source / functions) Found Hit Coverage
Test: app.info Lines: 53 37 69.8 %
Date: 2012-06-02 Functions: 4 3 75.0 %

       1                 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
       2                 : /*******************************************************************************
       3                 :  * The following function pr_inet_aton is based on the BSD function inet_aton
       4                 :  * with some modifications. The license and copyright notices applying to this
       5                 :  * function appear below. Modifications are also according to the license below.
       6                 :  ******************************************************************************/
       7                 : 
       8                 : #include "prnetdb.h"
       9                 : 
      10                 : /*
      11                 :  * Copyright (c) 1983, 1990, 1993
      12                 :  *    The Regents of the University of California.  All rights reserved.
      13                 :  * 
      14                 :  * Redistribution and use in source and binary forms, with or without
      15                 :  * modification, are permitted provided that the following conditions
      16                 :  * are met:
      17                 :  * 1. Redistributions of source code must retain the above copyright
      18                 :  *    notice, this list of conditions and the following disclaimer.
      19                 :  * 2. Redistributions in binary form must reproduce the above copyright
      20                 :  *    notice, this list of conditions and the following disclaimer in the
      21                 :  *    documentation and/or other materials provided with the distribution.
      22                 :  * 4. Neither the name of the University nor the names of its contributors
      23                 :  *    may be used to endorse or promote products derived from this software
      24                 :  *    without specific prior written permission.
      25                 :  * 
      26                 :  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
      27                 :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      28                 :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      29                 :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
      30                 :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      31                 :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      32                 :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      33                 :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      34                 :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      35                 :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      36                 :  * SUCH DAMAGE.
      37                 :  */
      38                 : 
      39                 : /*
      40                 :  * Portions Copyright (c) 1993 by Digital Equipment Corporation.
      41                 :  * 
      42                 :  * Permission to use, copy, modify, and distribute this software for any
      43                 :  * purpose with or without fee is hereby granted, provided that the above
      44                 :  * copyright notice and this permission notice appear in all copies, and that
      45                 :  * the name of Digital Equipment Corporation not be used in advertising or
      46                 :  * publicity pertaining to distribution of the document or software without
      47                 :  * specific, written prior permission.
      48                 :  * 
      49                 :  * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
      50                 :  * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
      51                 :  * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
      52                 :  * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
      53                 :  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
      54                 :  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
      55                 :  * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
      56                 :  * SOFTWARE.
      57                 :  */
      58                 : 
      59                 : /*
      60                 :  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
      61                 :  * Portions Copyright (c) 1996-1999 by Internet Software Consortium.
      62                 :  *
      63                 :  * Permission to use, copy, modify, and distribute this software for any
      64                 :  * purpose with or without fee is hereby granted, provided that the above
      65                 :  * copyright notice and this permission notice appear in all copies.
      66                 :  *
      67                 :  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
      68                 :  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
      69                 :  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
      70                 :  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
      71                 :  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
      72                 :  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
      73                 :  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
      74                 :  */
      75                 : 
      76                 : #define XX 127
      77                 : static const unsigned char index_hex[256] = {
      78                 :     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
      79                 :     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
      80                 :     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
      81                 :      0, 1, 2, 3,  4, 5, 6, 7,  8, 9,XX,XX, XX,XX,XX,XX,
      82                 :     XX,10,11,12, 13,14,15,XX, XX,XX,XX,XX, XX,XX,XX,XX,
      83                 :     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
      84                 :     XX,10,11,12, 13,14,15,XX, XX,XX,XX,XX, XX,XX,XX,XX,
      85                 :     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
      86                 :     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
      87                 :     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
      88                 :     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
      89                 :     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
      90                 :     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
      91                 :     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
      92                 :     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
      93                 :     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
      94                 : };
      95                 : 
      96          122984 : static PRBool _isdigit(char c) { return c >= '0' && c <= '9'; }
      97               0 : static PRBool _isxdigit(char c) { return index_hex[(unsigned char) c] != XX; }
      98               1 : static PRBool _isspace(char c) { return c == ' ' || (c >= '\t' && c <= '\r'); }
      99                 : #undef XX
     100                 : 
     101                 : int
     102           33596 : pr_inet_aton(const char *cp, PRUint32 *addr)
     103                 : {
     104                 :     PRUint32 val;
     105                 :     int base, n;
     106                 :     char c;
     107                 :     PRUint8 parts[4];
     108           33596 :     PRUint8 *pp = parts;
     109                 :     int digit;
     110                 : 
     111           33596 :     c = *cp;
     112                 :     for (;;) {
     113                 :         /*
     114                 :          * Collect number up to ``.''.
     115                 :          * Values are specified as for C:
     116                 :          * 0x=hex, 0=octal, isdigit=decimal.
     117                 :          */
     118           36349 :         if (!_isdigit(c))
     119           16726 :             return (0);
     120           19623 :         val = 0; base = 10; digit = 0;
     121           19623 :         if (c == '0') {
     122             803 :             c = *++cp;
     123             803 :             if (c == 'x' || c == 'X')
     124               0 :                 base = 16, c = *++cp;
     125                 :             else {
     126             803 :                 base = 8;
     127             803 :                 digit = 1;
     128                 :             }
     129                 :         }
     130                 :         for (;;) {
     131           86635 :             if (_isdigit(c)) {
     132           67012 :                 if (base == 8 && (c == '8' || c == '9'))
     133               0 :                     return (0);
     134           67012 :                 val = (val * base) + (c - '0');
     135           67012 :                 c = *++cp;
     136           67012 :                 digit = 1;
     137           19623 :             } else if (base == 16 && _isxdigit(c)) {
     138               0 :                 val = (val << 4) + index_hex[(unsigned char) c];
     139               0 :                 c = *++cp;
     140               0 :                 digit = 1;
     141                 :             } else
     142                 :                 break;
     143           67012 :         }
     144           19623 :         if (c == '.') {
     145                 :             /*
     146                 :              * Internet format:
     147                 :              *    a.b.c.d
     148                 :              *    a.b.c    (with c treated as 16 bits)
     149                 :              *    a.b    (with b treated as 24 bits)
     150                 :              */
     151           19219 :             if (pp >= parts + 3 || val > 0xffU)
     152           16466 :                 return (0);
     153            2753 :             *pp++ = val;
     154            2753 :             c = *++cp;
     155                 :         } else
     156                 :             break;
     157            2753 :     }
     158                 :     /*
     159                 :      * Check for trailing characters.
     160                 :      */
     161             404 :     if (c != '\0' && !_isspace(c))
     162               1 :         return (0);
     163                 :     /*
     164                 :      * Did we get a valid digit?
     165                 :      */
     166             403 :     if (!digit)
     167               0 :         return (0);
     168                 :     /*
     169                 :      * Concoct the address according to
     170                 :      * the number of parts specified.
     171                 :      */
     172             403 :     n = pp - parts + 1;
     173             403 :     switch (n) {
     174                 :     case 1:                /*%< a -- 32 bits */
     175               1 :         break;
     176                 : 
     177                 :     case 2:                /*%< a.b -- 8.24 bits */
     178               0 :         if (val > 0xffffffU)
     179               0 :             return (0);
     180               0 :         val |= parts[0] << 24;
     181               0 :         break;
     182                 : 
     183                 :     case 3:                /*%< a.b.c -- 8.8.16 bits */
     184               0 :         if (val > 0xffffU)
     185               0 :             return (0);
     186               0 :         val |= (parts[0] << 24) | (parts[1] << 16);
     187               0 :         break;
     188                 : 
     189                 :     case 4:                /*%< a.b.c.d -- 8.8.8.8 bits */
     190             402 :         if (val > 0xffU)
     191               0 :             return (0);
     192             402 :         val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
     193             402 :         break;
     194                 :     }
     195             403 :     *addr = PR_htonl(val);
     196             403 :     return (1);
     197                 : }
     198                 : 

Generated by: LCOV version 1.7