home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 29 Fixes_o / 29-Fixes_o.zip / netbios1.zip / MAPNAME.C < prev    next >
C/C++ Source or Header  |  1991-02-26  |  5KB  |  203 lines

  1. /*
  2.  * Mapname.c : display mapping between NetBIOS names and RFC-encoding
  3.  *
  4.  * 12/10/90 hj  initial version
  5.  *
  6.  */
  7. #include <stdio.h>
  8. #include <ctype.h>
  9.  
  10. #define NAMELEN 16
  11.  
  12. #define FIRST_ENC(c)  ((((c) >> 4) & 0xf) + 'A')
  13. #define SECOND_ENC(c) (((c) & 0xf) + 'A')
  14. #define DECODE(cp)    ((*(cp) - 'A') << 4 | (*((cp) + 1) - 'A'))
  15.  
  16. #define byte    unsigned char
  17.  
  18. static char copyright[] =
  19.    "\r\nCopyright (c) 1990 by Syntax, Inc\r\nAll rights reserved\r\n";
  20.  
  21. static char inbuf[256];
  22.  
  23.  
  24. static int
  25. unhex(x)
  26. char x;
  27. {
  28.   if ((x >= 'a') && (x <= 'f')) return x - 'a' + 10;
  29.   if ((x >= 'A') && (x <= 'F')) return x - 'A' + 10;
  30.   if ((x >= '0') && (x <= '9')) return x - '0';
  31.   return -1;
  32. }
  33.  
  34. static
  35. getoct(s)
  36. char *s;
  37. {
  38. int n;
  39.  
  40.   if ((*s < '0') || (*s > '3')) return -1;
  41.   n = 64 * (*s++ - '0');
  42.   if ((*s < '0') || (*s > '7')) return -1;
  43.   n += 8 * (*s++ - '0');
  44.   if ((*s < '0') || (*s > '7')) return -1;
  45.   n += *s++ - '0';
  46.   return n;
  47. }
  48.  
  49. char *
  50. nbname(s)
  51. register char *s;
  52. {
  53. static byte buf[17];
  54. int i = 0,n;
  55.  
  56.   memset(buf,0,16);
  57.   while (*s && i < 16) {
  58.     if (*s == '\\') {
  59.       switch(*++s) {
  60.         case '\\' : buf[i++] = '\\'; ++s; break;
  61.         case 'a'  : buf[i++] = '\a'; ++s; break;
  62.         case 'b'  : buf[i++] = '\b'; ++s; break;
  63.         case 'n'  : buf[i++] = '\n'; ++s; break;
  64.         case 'r'  : buf[i++] = '\r'; ++s; break;
  65.         case 't'  : buf[i++] = '\t'; ++s; break;
  66.         case 'x'  :
  67.           if (!isxdigit(s[1]) || !isxdigit(s[2])) buf[i++] = '\\';
  68.           else {
  69.             s++;
  70.             buf[i++] = unhex(s[0]) * 16 + unhex(s[1]);
  71.             s += 2;
  72.           }
  73.           break;
  74.         case '0': case '1': case '2': case '3':
  75.           if ((n = getoct(s)) < 0) buf[i++] = '\\';
  76.           else {
  77.             buf[i++] = n;
  78.             s += 3;
  79.           }
  80.           break;
  81.         default: buf[i++] = *s++; break;
  82.       }
  83.     }
  84.     else buf[i++] = *s++;
  85.   }
  86.   buf[16] = 0;
  87.   return buf;
  88. }
  89.  
  90. static
  91. n_encode(crypt,clear)
  92. byte *crypt,*clear;
  93. {
  94. int i;
  95.  
  96.   for (i = 0; i < NAMELEN; i++) {
  97.     *crypt++ = FIRST_ENC(clear[i]);
  98.     *crypt++ = SECOND_ENC(clear[i]);
  99.   }
  100.  
  101.   *crypt = '\0';
  102. }
  103.  
  104. static
  105. n_decode(clear,crypt)
  106. byte *clear,*crypt;
  107. {
  108. int i;
  109.  
  110.   for (i = 0; i < NAMELEN; i++) {
  111.     *clear++ = DECODE(crypt);
  112.     crypt += 2;
  113.   }
  114.   *clear = '\0';
  115. }
  116.  
  117. static char *
  118. asc(s,l)
  119. byte *s;
  120. int l;
  121. {
  122. static byte buf[64],*bp;
  123.  
  124.   bp = buf;
  125.   while (l--) { *(bp++) = isprint(*s) ? *s : '.'; s++; }
  126.   *bp = 0;
  127.   return buf;
  128. }
  129.  
  130. static char *
  131. hexnm(nbn)
  132. byte *nbn;
  133. {
  134. int i;
  135. static char hex[64];
  136. register char *h;
  137.  
  138.   for (h=hex,i=0; i<16; i++) { sprintf(h,"%02.2x ",*(nbn++)); h += strlen(h); }
  139.   *(h-1) = 0;
  140.   return hex;
  141. }
  142.  
  143. static
  144. show(rfc,clear)
  145. char *rfc,*clear;
  146. {
  147.   printf("NetBIOS    : [%s] %s\n",asc(clear,16),hexnm(clear));
  148.   printf("RFC encoded: %s\n",rfc);
  149. }
  150.  
  151. main()
  152. {
  153. char rfcname[68],clearnm[68],*ascii,x[68];
  154. int i;
  155.  
  156.   printf("Name types:\n\n"
  157.          "R == RFC encoded (converted to NetBIOS)\n"
  158.          "N == NetBIOS     (converted to RFC encoded)\n\n"
  159.          "RFC encoded names consist of letters A through P only.\n"
  160.          "NetBIOS names consist of any ASCII characters.\n\n"
  161.          "Enter non-printable ASCII characters using the \"C\" \"\\xxx\" conventions.\n\n");
  162.  
  163.   for (;;) {
  164.     printf("\nName type? R(FC) or N(etBIOS) : ");
  165.     if (!gets(x)) break;
  166.     memset(rfcname,0,68);
  167.     memset(clearnm,0,68);
  168.     memset(inbuf,0,256);
  169.     switch(x[0]) {
  170.       case 'r' : case 'R' :
  171.         printf("RFC encoded: ");
  172.         if (!gets(inbuf)) break;
  173.         strncpy(rfcname,inbuf,33);
  174.         rfcname[32] = 0;
  175.         for (i=0; i<strlen(rfcname); i++)
  176.           rfcname[i] = toupper(rfcname[i]);
  177.         if ((i=strspn(rfcname,"ABCDEFGHIJKLMNOP")) < strlen(rfcname)) {
  178.           printf("The '%c' in %s is illegal; legal characters are A - P\n",
  179.             rfcname[i],rfcname);
  180.           break;
  181.         }
  182.         memset(rfcname+strlen(rfcname),'A',32-strlen(rfcname));
  183.         n_decode(clearnm,rfcname);
  184.         n_encode(rfcname,clearnm);
  185.         show(rfcname,clearnm);
  186.         break;
  187.  
  188.       case 'n' : case 'N' :
  189.         printf("NetBIOS    : ");
  190.         if (!gets(inbuf)) break;
  191.         strncpy(clearnm,inbuf,68);
  192.         clearnm[64] = 0;
  193.         n_encode(rfcname,ascii=nbname(clearnm));
  194.         n_decode(ascii,rfcname);
  195.         show(rfcname,ascii);
  196.         break;
  197.  
  198.       default :
  199.         break;
  200.     }
  201.   }
  202. }
  203.