home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / C / NUMBIT.ZIP / NUMBIT.C next >
Encoding:
C/C++ Source or Header  |  1986-09-10  |  5.7 KB  |  191 lines

  1. #include <stdio.h>
  2. #define  MSOFT
  3.  
  4. /*
  5.  *  numbit.c
  6.  *  For those times when you need to know the values of a number in another
  7.  *  base.  As we all need Decimal, Octal, Hex and Binary forms from time to
  8.  *  time.
  9.  *  This will accept an entry in the following formats:
  10.  *     Decimal   255
  11.  *     Octal    0377
  12.  *     Hex      0xff
  13.  *
  14.  *  The output will be given in all formats.  Numbers larger than 0xffff
  15.  *  will be handled as 32 bit long integers.  Negative numbers will cause
  16.  *  the upper bit to be set and thus will be erroneous.
  17.  */
  18.  
  19. #ifndef MSOFT
  20. long    stoi();                                  /* declare conversion */
  21. #else
  22. #include <stdlib.h>                              /* get library declaration */
  23. #endif
  24.  
  25. main()
  26. {
  27. char    *endptr, buf[80];
  28. union  {
  29.       long value;
  30.       struct  {
  31.         unsigned int lw_bit0:1;
  32.         unsigned int lw_bit1:1;
  33.         unsigned int lw_bit2:1;
  34.         unsigned int lw_bit3:1;
  35.         unsigned int lw_bit4:1;
  36.         unsigned int lw_bit5:1;
  37.         unsigned int lw_bit6:1;
  38.         unsigned int lw_bit7:1;
  39.         unsigned int lw_bit8:1;
  40.         unsigned int lw_bit9:1;
  41.         unsigned int lw_bit10:1;
  42.         unsigned int lw_bit11:1;
  43.         unsigned int lw_bit12:1;
  44.         unsigned int lw_bit13:1;
  45.         unsigned int lw_bit14:1;
  46.         unsigned int lw_bit15:1;
  47.  
  48.         unsigned int hw_bit0:1;
  49.         unsigned int hw_bit1:1;
  50.         unsigned int hw_bit2:1;
  51.         unsigned int hw_bit3:1;
  52.         unsigned int hw_bit4:1;
  53.         unsigned int hw_bit5:1;
  54.         unsigned int hw_bit6:1;
  55.         unsigned int hw_bit7:1;
  56.         unsigned int hw_bit8:1;
  57.         unsigned int hw_bit9:1;
  58.         unsigned int hw_bit10:1;
  59.         unsigned int hw_bit11:1;
  60.         unsigned int hw_bit12:1;
  61.         unsigned int hw_bit13:1;
  62.         unsigned int hw_bit14:1;
  63.         unsigned int hw_bit15:1;
  64.       } bits;
  65.     } num;
  66.  
  67.    do {
  68.       printf("enter number to try   ");
  69.  
  70.       gets(buf);
  71.  
  72. #ifndef MSOFT
  73.       num.value = stoi(buf);
  74. #else
  75.       num.value = strtol(buf, &endptr, 0);
  76. #endif
  77.  
  78.       printf("Decimal = %lu  Hex = %lx  Octal = %lo\n",
  79.                num.value,
  80.                num.value,
  81.                num.value   );
  82.  
  83.       if( num.value > 0xffff )
  84.       {
  85.          printf("%d%d%d%d%d%d%d%d %d%d%d%d%d%d%d%d ",
  86.                 num.bits.hw_bit15,
  87.                 num.bits.hw_bit14,
  88.                 num.bits.hw_bit13,
  89.                 num.bits.hw_bit12,
  90.                 num.bits.hw_bit11,
  91.                 num.bits.hw_bit10,
  92.                 num.bits.hw_bit9,
  93.                 num.bits.hw_bit8,
  94.                 num.bits.hw_bit7,
  95.                 num.bits.hw_bit6,
  96.                 num.bits.hw_bit5,
  97.                 num.bits.hw_bit4,
  98.                 num.bits.hw_bit3,
  99.                 num.bits.hw_bit2,
  100.                 num.bits.hw_bit1,
  101.                 num.bits.hw_bit0);
  102.       }
  103.  
  104.       printf("%d%d%d%d%d%d%d%d %d%d%d%d%d%d%d%d\n",
  105.              num.bits.lw_bit15,
  106.              num.bits.lw_bit14,
  107.              num.bits.lw_bit13,
  108.              num.bits.lw_bit12,
  109.              num.bits.lw_bit11,
  110.              num.bits.lw_bit10,
  111.              num.bits.lw_bit9,
  112.              num.bits.lw_bit8,
  113.              num.bits.lw_bit7,
  114.              num.bits.lw_bit6,
  115.              num.bits.lw_bit5,
  116.              num.bits.lw_bit4,
  117.              num.bits.lw_bit3,
  118.              num.bits.lw_bit2,
  119.              num.bits.lw_bit1,
  120.              num.bits.lw_bit0);
  121.    } while (num.value != 0);
  122.  
  123. }
  124. /*=============================================================*/
  125. #ifndef MSOFT                                    /* cant use the library */
  126.                                                  /* function strtol      */
  127. #define  islower(c)     ( 'a' <= (c) && (c) <= 'z' )
  128. #define  toupper(c)     ( islower(c) ? (c) - ('a' - 'A') : (c) )
  129.  
  130. /* stoi.c       more powerful version of atoi.
  131.  *
  132.  *      copyright 1985 by Allen Holub.
  133.  *      modified 5/86 by Jerry Pendergraft
  134.  *          to return a long value, and work on a char pointer rather
  135.  *          than a pointer to char pointer.
  136.  */
  137.  
  138. long    stoi(str)
  139. char    *str;
  140. {
  141. long    num = 0;
  142. int     sign = 1;
  143.  
  144.         while(*str == ' ' || *str == '\t' || *str == '\n' )
  145.                 str++;
  146.  
  147.         if( *str == '-' )
  148.            {
  149.            sign = -1;
  150.            str++;
  151.            }
  152.  
  153.         if( *str == '0' )                        /* Octal or Hex form        */
  154.            {
  155.                 ++str;
  156.                 if( *str == 'x' || *str == 'X' ) /* Hex form                 */
  157.                    {
  158.                         str++;
  159.                         while( ('0' <= *str && *str <= '9') ||
  160.                                ('a' <= *str && *str <= 'f') ||
  161.                                ('A' <= *str && *str <= 'F')  )
  162.                            {
  163.                            num *= 16;
  164.                            num += ( '0' <= *str && *str <= '9' ) ?
  165.                                     *str - '0'                   :
  166.                                     toupper( *str ) - 'A' + 10   ;
  167.                            str++;
  168.                            }
  169.                    }
  170.                 else
  171.                    {
  172.                         while( '0' <= *str && *str <= '7' )
  173.                            {
  174.                            num *= 8;
  175.                            num += *str++ - '0';
  176.                            }
  177.                    }
  178.            }
  179.         else                                     /* Decimal entry */
  180.            {
  181.                 while( '0' <= *str && *str <= '9' )
  182.                    {
  183.                    num *= 10;
  184.                    num += *str++ - '0';
  185.                    }
  186.            }
  187.  
  188. return( num * sign );
  189. }
  190. #endif
  191.