Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: N C I P A D D R . C P P
//
// Contents: WCHAR support for Winsock inet_ functions.
//
// Notes:
//
// Author: shaunco 24 Mar 1997
//
//----------------------------------------------------------------------------
#include <pch.h>
#pragma hdrstop
#include "ncipaddr.h"
VOID IpHostAddrToPsz( IN DWORD dwAddr, OUT PWSTR pszBuffer) { BYTE* pb = (BYTE*)&dwAddr; static const WCHAR c_szIpAddr [] = L"%d.%d.%d.%d"; wsprintfW (pszBuffer, c_szIpAddr, pb[3], pb[2], pb[1], pb[0]); }
DWORD IpPszToHostAddr( IN PCWSTR cp) { DWORD val, base, n; WCHAR c; DWORD parts[4], *pp = parts;
again: // Collect number up to ``.''.
// Values are specified as for C:
// 0x=hex, 0=octal, other=decimal.
//
val = 0; base = 10; if (*cp == L'0') { base = 8, cp++; } if (*cp == L'x' || *cp == L'X') { base = 16, cp++; } while (c = *cp) { if ((c >= L'0') && (c <= L'9')) { val = (val * base) + (c - L'0'); cp++; continue; } if ((base == 16) && ( ((c >= L'0') && (c <= L'9')) || ((c >= L'A') && (c <= L'F')) || ((c >= L'a') && (c <= L'f')) )) { val = (val << 4) + (c + 10 - ( ((c >= L'a') && (c <= L'f')) ? L'a' : L'A' ) ); cp++; continue; } break; } if (*cp == L'.') { // Internet format:
// a.b.c.d
// a.b.c (with c treated as 16-bits)
// a.b (with b treated as 24 bits)
//
if (pp >= parts + 3) { return (DWORD) -1; } *pp++ = val, cp++; goto again; }
// Check for trailing characters.
//
if (*cp && (*cp != L' ')) { return 0xffffffff; }
*pp++ = val;
// Concoct the address according to
// the number of parts specified.
//
n = (DWORD)(pp - parts); switch (n) { case 1: // a -- 32 bits
val = parts[0]; break;
case 2: // a.b -- 8.24 bits
val = (parts[0] << 24) | (parts[1] & 0xffffff); break;
case 3: // a.b.c -- 8.8.16 bits
val = (parts[0] << 24) | ((parts[1] & 0xff) << 16) | (parts[2] & 0xffff); break;
case 4: // a.b.c.d -- 8.8.8.8 bits
val = (parts[0] << 24) | ((parts[1] & 0xff) << 16) | ((parts[2] & 0xff) << 8) | (parts[3] & 0xff); break;
default: return 0xffffffff; }
return val; }
|