From owner-IPv6-jp@jp.freebsd.org  Tue Oct  3 14:06:31 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id OAA40790;
	Tue, 3 Oct 2000 14:06:31 +0900 (JST)
	(envelope-from owner-IPv6-jp@jp.FreeBSD.org)
Received: from gemini.icl.japan-telecom.co.jp (gemini.icl.japan-telecom.co.jp [210.169.130.137])
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) with ESMTP id OAA40785
	for <IPv6-jp@jp.freebsd.org>; Tue, 3 Oct 2000 14:06:29 +0900 (JST)
	(envelope-from tomohide@icl.japan-telecom.co.jp)
Received: from leo.icl.japan-telecom.co.jp (leo.icl.japan-telecom.co.jp [210.169.130.139])
	by gemini.icl.japan-telecom.co.jp (3.7W-gemini) with ESMTP id OAA05347;
	Tue, 3 Oct 2000 14:00:02 +0900 (JST)
Received: from virgo.icl.japan-telecom.co.jp (localhost [127.0.0.1])
	by leo.icl.japan-telecom.co.jp (3.7W-leo) with ESMTP id OAA18629;
	Tue, 3 Oct 2000 14:01:07 +0900 (JST)
Received: from localhost ([172.18.82.240])
	by virgo.icl.japan-telecom.co.jp (3.7W-virgo) with ESMTP id NAA28250;
	Tue, 3 Oct 2000 13:55:46 +0900 (JST)
To: users@jp.ipv6.org
Cc: IPv6-jp@jp.freebsd.org
X-Mailer: Mew version 1.94.1 on Emacs 19.34 / Mule 2.3 (SUETSUMUHANA)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Message-Id: <20001003140724V.tomohide@icl.japan-telecom.co.jp>
Date: Tue, 03 Oct 2000 14:07:24 +0900
From: Tomohde Nagashima <tomohide@icl.japan-telecom.co.jp>
X-Dispatcher: imput version 990905(IM130)
Lines: 393
Reply-To: IPv6-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+000315
X-Sequence: IPv6-jp 909
Subject: [IPv6-jp 909] ADDR ADM..
Errors-To: owner-IPv6-jp@jp.freebsd.org
Sender: owner-IPv6-jp@jp.freebsd.org
X-Originator: tomohide@icl.japan-telecom.co.jp

$BF|K\%F%l%3%`D9Eg$G$9!#(B

$B%"%I%l%94IM}$NOC$G$9!#(B

sTLA$B$,(B2001:278::/35$B$N4D6-2<$G!"(BNLA$B$N(Bbit$B%U%#!<%k%I$,0J2<$N$h$&$KI=8=(B
$B$5$l$F$$$k$H$7$^$9!#(B
<NLA>=<NLA1=1001><Res=000><NLA2=100001>
$B$9$J$o$A!"(B36bit$BL\$+$i(B48bit$BL\$^$G$,(B 1001 000 100001 $B$@$H$9$k$H!"(B
$B$3$N(BNLA2$B$N(BPrefix$B$O(B 2001:278:???::/48$B$J$N$G$7$g$&$+!#(B

$B$H$$$&$3$H$K=P2q$$$^$;$s$G$7$g$&$+!)(B

binary$B$H(B hex$B$N:.9g%"%I%l%9$rI=8=$9$k$Y$/!"(Bbh6$B$H$$$&$b$N$r:n$j$^$7$?!#(B
$B>e$N>l9g!"(B

#bh6 H/0/2001:278::/35 B/35/1001_000_100001/48
2001:0278:1221:0000:0000:0000:0000:0000

$B$H7k2L$,=P$^$9!#%U%)!<%^%C%H$O(B
#bh6 <$B0z?t(B1> <$B0z?t(B2> ...

$B$G(B $B$=$l$>$l$N0z?t$O(B <$B0z?t(B>=MODE/START/ADDR/STOP
$B$H$J$C$F$^$9!#(B
*MODE$B$O(BH(hex)$B$+(BB(binary)$B$G$9!#(B
*START,STOP$B$O(B0$B$+$i(B128$B$^$G$N?tCM$G$9!#(B
*ADDR $B$O(BMODE$B$,(BH $B$+(BB $B$+$K$h$C$F!"I=5-$,0[$J$j$^$9!#(B

 MODE = H $B$N>l9g!#(B
        ADDR $B$ODL>o$N(BIPv6$B%"%I%l%9I=5-$G$9!#(B
        $B$3$N(BSTART+1 $B$+$i(B STOP $B$^$G$N(Bbit$B$r:NMQ$7$^$9!#(B

        ex)
	#bh6 H/0/2001:278::/35
	2001:0278:0000:0000:0000:0000:0000:0000

        #bh6 H/16/ffff:ffff:ffff::/32
        0000:ffff:0000:0000:0000:0000:0000:0000
		->17$B$+$i(B32$B0J30$N(Bbit$B$OL5;k$5$l$?!#(B

 MODE = B $B$N>l9g!#(B
        ADDR$B$O(Bbinary$BI=5-$G$9!#(B
        $B$G$b(Bbit$B$r(B128$B8D=q$/$N$O$a$s$I$/$5$$$N$G(BSTART+1$B$+$i(B
	STOP$B$^$G$N(Bbit$B$r=q$1$P$$$$$G$9!#$G$b(B $B$=$l0J>e$G$b(B
	$B$=$l0J2<$G$b%@%a$G$9!#(B
        $B8+$d$9$/$9$k$?$a$K!"4V$K(B"_"$B$rA^F~$7$F$b$$$$$G$9!#(B
	$B$9$J$o$A!"(BADDR$B$O(BSTOP-START$B8D$N(Bbit $B$H(B _ $B$+$i$J$kNs$G$9!#(B

        ex)
        #bh6 B/0/0000_0001_0010_0011/16
        0123:0000:0000:0000:0000:0000:0000:0000

        #bh6 B/16/0000_0001_0010_0011/32 
        0000:0123:0000:0000:0000:0000:0000:0000 

*$BAm9g5;(B
#bh6 H/0/2001:278::/35 B/35/0101_000_111111/48 H/64/::210:4bff:fe1b:b2/128
2001:0278:0a3f:0000:0210:4bff:fe1b:00b2


$B$3$s$JFH<+%U%)!<%^%C%H3P$($k$h$j!"9M$($?$[$&$,Aa$$$+$J!#!#(B


----------------------bh6.c----------------------------
#include <stdio.h>

int splitbysrsh(char *,char *,char *,char *,char *);
int hextobnry(const char *,char *);
int addrtobnry(const char *,char *);
int shape(int ,char *);
int deluline(char *str);
int  bnrytohex(const char *,char *);
int bnrytoaddr(const char *,char *);
void usage();
void err();

main(int argc, char *argv[]){
 int i,J;
 char str[1024];
 char mode[2];
 char from[4];
 char addr[256];
 char to[4];
 char bnry[128+1];
 char buf[128+1];

 if (argc < 2) usage();

 for(i=0;i<128;i++){
   bnry[i]='0';
 }
 bnry[128]='\0';

 for(J=1;J<argc;J++){
   strcpy(str,argv[J]);
   if( splitbysrsh(str,mode,from,addr,to) ) err();
   if(atoi(from)>atoi(to)) err();
   if(mode[0]=='b' || mode[0]=='B'){
     if( deluline(addr) ) err();
     if( atoi(to)-atoi(from)!=strlen(addr) ) err();
     for(i=atoi(from);i<atoi(to);i++){
       bnry[i]=addr[i-atoi(from)];
     }
   }else if (mode[0]=='h' || mode[0]=='H') {
     if( addrtobnry(addr,buf) ) err();
     for(i=atoi(from);i<atoi(to);i++){
       bnry[i]=buf[i];
     }
   }else {
     err();
   }
 }

 // printf("binary rep: %s\n",bnry);
 bnrytoaddr(bnry,addr);
 printf("%s\n",addr);

 return 0;
}
 

int splitbysrsh(char *str,char *mode0,char *from1,char *addr2,char *to3){
  int i,j=0;
  int flag=0;
  char buf[256];

  for(i=0;i<strlen(str);i++){
    if(str[i]!='/'){
      buf[j]=str[i];
      j++;
    }else {
      buf[j]='\0';
      switch(flag){
      case 0:
	if(strlen(buf)<2)
	  strcpy(mode0,buf);
	else return 1;
      case 1: 
	if(0<=atoi(buf)<=128)
	  strcpy(from1,buf);
	else return 2;
      case 2: 
	if(strlen(buf)<40)
	   strcpy(addr2,buf);
	else return 3;
      }
      flag++;
      j=0;
    }
  }
  buf[j]='\0';
  if(atoi(from1)<=atoi(buf)<=128)
    strcpy(to3,buf);
  else return 4;
  return 0;
}


int hextobnry(const char *hex, char *bnry){
  if(isalpha(hex[0]) && isupper(hex[0]) ) tolower(hex[0]);

  switch (hex[0]) {
  case '0': sprintf(bnry,"0000"); break;
  case '1': sprintf(bnry,"0001"); break;
  case '2': sprintf(bnry,"0010"); break;
  case '3': sprintf(bnry,"0011"); break;
  case '4': sprintf(bnry,"0100"); break;
  case '5': sprintf(bnry,"0101"); break;
  case '6': sprintf(bnry,"0110"); break;
  case '7': sprintf(bnry,"0111"); break;
  case '8': sprintf(bnry,"1000"); break;
  case '9': sprintf(bnry,"1001"); break;
  case 'a': sprintf(bnry,"1010"); break;
  case 'b': sprintf(bnry,"1011"); break;
  case 'c': sprintf(bnry,"1100"); break;
  case 'd': sprintf(bnry,"1101"); break;
  case 'e': sprintf(bnry,"1110"); break;
  case 'f': sprintf(bnry,"1111"); break;
  default : return 0;
  }
  return 1;
}


int addrtobnry(const char *addr, char *bnry){
  int i,j;
  char a[1];
  char b[4];
  char t_addr[1024];
  sprintf(t_addr,"%s",addr);
  if ( shape(1,t_addr) ) return 1;
  for(j=0;j<strlen(t_addr);j++){
    a[0]=t_addr[j];
    hextobnry(a,b);
    for(i=0;i<4;i++){
      bnry[i+j*4]=b[i];
    }
  }
  bnry[j*4]='\0';
  return 0;
}


int shape(int mode,char *str) {
  int i,j,k;
  int flag=0;
  int dbcron=-1;
  int cronum;
  int crons[9];
  char buf[128],buf2[64],buf3[64];
  char addr[16][8];

  snprintf(buf,sizeof(buf),"%s",str);

  j=1;
  for(i=0;i<40-1;i++) {
    if(buf[i]==':'){
      crons[j]=i;
      j++;
    }
    if(buf[i]==':' && buf[i+1]==':') { dbcron = i; flag++; }
    if(buf[i-1]!=':' && buf[i]==':' && buf[i+1]=='\0') return 1;
  }
  cronum = j-1;
  if( cronum<2 || cronum>7 ) return 1;

  if(dbcron>=0){
    if (flag>1) return 4;
    for(i=0;i<dbcron+1;i++) buf2[i]=buf[i];
    buf2[i]='\0';
    for(i=dbcron+1;i<40;i++) buf3[i-dbcron-1]=buf[i];
    buf3[i]='\0';

    switch(cronum) {
    case 2:
      if      (dbcron==0)                       /* ::1234 */
        sprintf(buf,"0:0:0:0:0:0:0%s",buf3);
      else if (dbcron+2==strlen(buf))           /* 3ffe:: */
        sprintf(buf,"%s0:0:0:0:0:0:0",buf2);
      else
        sprintf(buf,"%s0:0:0:0:0:0%s",buf2,buf3); /* 3ffe::1234 */
      break;
    case 3: sprintf(buf,"%s0:0:0:0:0%s",buf2,buf3); break;
    case 4: sprintf(buf,"%s0:0:0:0%s"  ,buf2,buf3); break;
    case 5: sprintf(buf,"%s0:0:0%s"    ,buf2,buf3); break;
    case 6: sprintf(buf,"%s0:0%s"      ,buf2,buf3); break;
    case 7: sprintf(buf,"%s0%s"        ,buf2,buf3); break;
    default: return 2;
    }
  } else if (cronum != 7) {
    return 3;
  }

  crons[0]=-1;
  crons[8]=strlen(buf);

  j=1;
  for(i=0;i<40-1;i++) {
    if(buf[i]==':'){
      crons[j]=i;
      j++;
    }
  }
  for(j=1;j<9;j++){
    switch(crons[j]-crons[j-1]){
    case 2:
        addr[j-1][0]='0';
        addr[j-1][1]='0';
        addr[j-1][2]='0';
        addr[j-1][3]=buf[crons[j-1]+1];
        addr[j-1][4]='\0';
        break;
    case 3:
        addr[j-1][0]='0';
        addr[j-1][1]='0';
        addr[j-1][2]=buf[crons[j-1]+1];
        addr[j-1][3]=buf[crons[j-1]+2];
        addr[j-1][4]='\0';
        break;
    case 4:
        addr[j-1][0]='0';
        addr[j-1][1]=buf[crons[j-1]+1];
        addr[j-1][2]=buf[crons[j-1]+2];
        addr[j-1][3]=buf[crons[j-1]+3];
        addr[j-1][4]='\0';
        break;
    case 5:
        addr[j-1][0]=buf[crons[j-1]+1];
        addr[j-1][1]=buf[crons[j-1]+2];
        addr[j-1][2]=buf[crons[j-1]+3];
        addr[j-1][3]=buf[crons[j-1]+4];
        addr[j-1][4]='\0';
        break;
    }
  }

  if(mode==0)
    sprintf(str,"%s:%s:%s:%s:%s:%s:%s:%s"
         ,addr[0],addr[1],addr[2],addr[3],addr[4],addr[5],addr[6],addr[7]);
  else if (mode==1)
    sprintf(str,"%s%s%s%s%s%s%s%s"
         ,addr[0],addr[1],addr[2],addr[3],addr[4],addr[5],addr[6],addr[7]);
  else
    return 1;

  return 0;
}


int deluline(char *str){
  int i,j=0;
  char buf[256+1];

  for(i=0;i<strlen(str);i++){
    if(str[i]!='_'){
      buf[j]=str[i];
      j++;
    }
  }
  buf[j]='\0';
  for(i=0;i<strlen(buf);i++)
    if(buf[i]!='0' && buf[i]!='1') return 2;
  if(sizeof(buf)<strlen(buf)) return 1;
  strcpy(str,buf);
  return 0;
}


int bnrytohex(const char *bnry, char *hex){
  int i;
  int j[4];
  char buf[2];
  char hexs[16]={ '0','1','2','3','4','5','6','7'
		  ,'8','9','a','b','c','d','e','f'};
  buf[0]=bnry[0],buf[1]='\0',j[0]=atoi(buf);
  buf[0]=bnry[1],j[1]=atoi(buf);
  buf[0]=bnry[2],j[2]=atoi(buf);
  buf[0]=bnry[3],j[3]=atoi(buf);

  i=j[3]+j[2]*2+j[1]*4+j[0]*8;
  buf[0]=hexs[i],buf[1]='\0';
  sprintf(hex,"%s",buf);
  return 0;
}


int bnrytoaddr(const char *bnry,char *addr){
  int i,j,k;
  char a[8][5];
  char b[4];
  char c[1];
  char t_bnry[1024];

  strncpy(t_bnry,bnry,1024);
  if( deluline(t_bnry) ) return 1;

  if(strlen(t_bnry) !=128) return 2;

  for(i=0;i<8;i++){
    for(j=0;j<4;j++){
      for(k=0;k<4;k++)
        b[k]=t_bnry[i*16+j*4+k];
      bnrytohex(b,c);
      a[i][j]=c[0];
    }
    a[i][4]='\0';
  }
  sprintf(addr,"%s:%s:%s:%s:%s:%s:%s:%s",
          a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
  return 0;
}

void usage(){
  printf("usage: bh2addr <format> <format> ...\n"
	 "<format> = B/0-128/binary/0-128 \n"
	 "        or H/0-128/v6addr/0-128 \n");
  exit(1);
}

void err(){
  printf("error\n");
  exit(1);
}

-----------------EOF-----------------------------









