home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / lib / libc / net / iso_addr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-20  |  3.7 KB  |  120 lines

  1. /*
  2.  * Copyright (c) 1989 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. #if defined(LIBC_SCCS) && !defined(lint)
  35. static char sccsid[] = "@(#)iso_addr.c    5.4 (Berkeley) 2/24/91";
  36. #endif /* LIBC_SCCS and not lint */
  37.  
  38. #include <sys/types.h>
  39. #include <netiso/iso.h>
  40. #include <string.h>
  41.  
  42. /* States*/
  43. #define VIRGIN    0
  44. #define GOTONE    1
  45. #define GOTTWO    2
  46. /* Inputs */
  47. #define    DIGIT    (4*0)
  48. #define    END    (4*1)
  49. #define DELIM    (4*2)
  50.  
  51. struct iso_addr *
  52. iso_addr(addr)
  53.     register const char *addr;
  54. {
  55.     static struct iso_addr out_addr;
  56.     register char *cp = out_addr.isoa_genaddr;
  57.     char *cplim = cp + sizeof(out_addr.isoa_genaddr);
  58.     register int byte = 0, state = VIRGIN, new;
  59.  
  60.     bzero((char *)&out_addr, sizeof(out_addr));
  61.     do {
  62.         if ((*addr >= '0') && (*addr <= '9')) {
  63.             new = *addr - '0';
  64.         } else if ((*addr >= 'a') && (*addr <= 'f')) {
  65.             new = *addr - 'a' + 10;
  66.         } else if ((*addr >= 'A') && (*addr <= 'F')) {
  67.             new = *addr - 'A' + 10;
  68.         } else if (*addr == 0) 
  69.             state |= END;
  70.         else
  71.             state |= DELIM;
  72.         addr++;
  73.         switch (state /* | INPUT */) {
  74.         case GOTTWO | DIGIT:
  75.             *cp++ = byte; /*FALLTHROUGH*/
  76.         case VIRGIN | DIGIT:
  77.             state = GOTONE; byte = new; continue;
  78.         case GOTONE | DIGIT:
  79.             state = GOTTWO; byte = new + (byte << 4); continue;
  80.         default: /* | DELIM */
  81.             state = VIRGIN; *cp++ = byte; byte = 0; continue;
  82.         case GOTONE | END:
  83.         case GOTTWO | END:
  84.             *cp++ = byte; /* FALLTHROUGH */
  85.         case VIRGIN | END:
  86.             break;
  87.         }
  88.         break;
  89.     } while (cp < cplim); 
  90.     out_addr.isoa_len = cp - out_addr.isoa_genaddr;
  91.     return (&out_addr);
  92. }
  93. static char hexlist[] = "0123456789abcdef";
  94.  
  95. char *
  96. iso_ntoa(isoa)
  97.     const struct iso_addr *isoa;
  98. {
  99.     static char obuf[64];
  100.     register char *out = obuf; 
  101.     register int i;
  102.     register u_char *in = (u_char *)isoa->isoa_genaddr;
  103.     u_char *inlim = in + isoa->isoa_len;
  104.  
  105.     out[1] = 0;
  106.     while (in < inlim) {
  107.         i = *in++;
  108.         *out++ = '.';
  109.         if (i > 0xf) {
  110.             out[1] = hexlist[i & 0xf];
  111.             i >>= 4;
  112.             out[0] = hexlist[i];
  113.             out += 2;
  114.         } else
  115.             *out++ = hexlist[i];
  116.     }
  117.     *out = 0;
  118.     return(obuf + 1);
  119. }
  120.