bnghtz

convert_num_system.c

Feb 5th, 2014
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.77 KB | None | 0 0
  1. /******************************************************************************
  2. * convert between numeric systems                                     BnGhTz  *
  3. *                                                                             *
  4. * Usage: convert_num_system number from [to]                                  *
  5. *  number: number to convert                                                  *
  6. *  from:   base radix (int 2 - 36)                                            *
  7. *  to:     target radix (int 2 - 36); The default is 10.                      *
  8. *                                                                             *
  9. * Examples:                                                                   *
  10. *                                                                             *
  11. * ./convert_num_system foo 25                                                 *
  12. * 9999                                                                        *
  13. *                                                                             *
  14. * ./convert_num_system 301 36 7                                               *
  15. * 14224                                                                       *
  16. *                                                                             *
  17. ******************************************************************************/
  18.  
  19. /*  gcc -lm  this.c -o convert_num_system  */
  20.  
  21. /*
  22.     The unsigned long long integer cannot handle bigger number as
  23.     36:zzzzzzzzzzq which is DEC: 131 621 703 842 267 126.
  24. */
  25.  
  26.  
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29. #include <math.h>
  30. #include <string.h>
  31.  
  32. #define MaxLen 255
  33. #define MaxRadix 36
  34. #define MinRadix 2
  35. #define BaseRadix 10
  36.  
  37. #define TYPE unsigned long long int
  38.  
  39. void usage(char * name)
  40. {
  41.   fprintf(stderr, "Usage: %s number from [to]\n\n");
  42.   fprintf(stderr, "  number: number to convert\n");
  43.   fprintf(stderr, "  from:   base radix (int: %d - %d)\n", MinRadix, MaxRadix);
  44.   fprintf(stderr, "  to:     target radix (int: %d - %d);", MinRadix, MaxRadix);
  45.   fprintf(stderr, " The default is %d.\n\n", BaseRadix);
  46.  
  47.   exit(-2);
  48. }
  49.  
  50. TYPE powInt(TYPE x, int y)
  51. {
  52.   return (TYPE) pow((float)x,(float)y);
  53. }
  54.  
  55. // gets the length of coverted number
  56. int toLen(TYPE x, int to)
  57. {
  58.   return (int)(log(x) / log(to)) + 1;
  59. }
  60.  
  61. // char -> numeric value; example F->15; A->10->A; 9->9
  62. int chr_to_dec(char c)
  63. {
  64.    int ret;
  65.  
  66.    if (c >= 'A' && c <= 'Z')
  67.      ret = c - 'A' + 10;
  68.    else if (c >= 'a' && c <= 'z')
  69.      ret = c - 'a' + 10;
  70.    else if (c >= '0' && c <= '9')
  71.      ret = c - '0';
  72.  
  73.    return ret;
  74. }
  75.  
  76. // value --> char; example 15->F; 10->A; 9->9
  77. char dec_to_chr(int x)
  78. {
  79.   char ret;
  80.  
  81.   if (x > 9)
  82.     ret = x - 10 + 'A';
  83.   else
  84.     ret = x + '0';
  85.  
  86.   return ret;
  87. }
  88.  
  89. // serch for minimal radix in a number (maximal value + 1)
  90. int serchMinRadix(char *num)
  91. {
  92.   int i, val, ret;
  93.   ret = 0;
  94.  
  95.   for (i = 0; i < strlen(num); i++)
  96.   {
  97.     val = chr_to_dec(num[i]) + 1;
  98.     if (val > ret)
  99.       ret = val;
  100.   }
  101.  
  102.   return ret;
  103. }
  104.  
  105. // numeric system converter
  106. char * scale_to_any(char * num, int from, int to)
  107. {
  108.   TYPE dec, temp;
  109.   int i, len, to_len, min_radix;
  110.   char *ret = NULL;
  111.  
  112.   // checking
  113.   min_radix = serchMinRadix(num);
  114.  
  115.   if (min_radix > from)
  116.   {
  117.     fprintf(stderr, "Invalid radix '%d'. Minimal radix is '%d'\n",\
  118.         from, min_radix);
  119.     exit(-1);
  120.   }
  121.  
  122.   // convert to dec  (right to left)
  123.   dec = 0;
  124.   len = strlen(num);
  125.  
  126.   for (i = 0; i < len; i++)
  127.   {
  128.     dec += chr_to_dec(num[len - i - 1]) * powInt(from,i);
  129.   }
  130.  
  131.   // convert to oth
  132.   to_len = toLen(dec,to);
  133.   ret = (char *) malloc(sizeof(char) * (to_len + 1));
  134.   bzero(ret, (sizeof(char) * to_len));
  135.   i = 0;
  136.  
  137.   while (dec > 0)
  138.   {
  139.     temp = (int) (dec % (TYPE)to);
  140.     dec = (dec - (TYPE)temp) / (TYPE)to;
  141.     ret[to_len - 1 - i] = dec_to_chr(temp);
  142.     i++;
  143.   }
  144.  
  145.   return ret;
  146. }
  147.  
  148. void checkRadix(int x, char * item)
  149. {
  150.   if (x < MinRadix)
  151.   {
  152.     fprintf(stderr, "ERROR in '%s' minimal radix is %d\n", item, MinRadix);
  153.     exit(-1);
  154.   }
  155.   else if (x > MaxRadix)
  156.   {
  157.     fprintf(stderr, "ERROR in '%s' maximal radix is %d\n", item, MaxRadix);
  158.     exit(-1);
  159.   }
  160. }
  161.  
  162. int main(int argc, char * argv[])
  163. {
  164.   int i, from = 0, to = BaseRadix;
  165.   char *num = NULL;
  166.   char *ret = NULL;
  167.   int size = sizeof(char) * MaxLen;
  168.   num = (char *) malloc(size);
  169.   ret = (char *) malloc(size);
  170.   bzero(num, size);
  171.   bzero(ret, size);
  172.  
  173.   // INPUT
  174.   if (argc < 3)
  175.     usage(argv[0]);
  176.  
  177.   if (argc > 1)
  178.     sprintf(num, "%s", argv[1]);
  179.   if (argc > 2)
  180.     from = atoi(argv[2]);
  181.   if (argc > 3)
  182.     to = atoi(argv[3]);
  183.  
  184.   checkRadix(from, "from");
  185.   checkRadix(to, "to");
  186.  
  187.   // convert
  188.   ret = scale_to_any(num, from, to);
  189.   printf("%2d: %s = %2d: %s\n", from, num, to, ret);
  190.  
  191.   return 0;
  192. }
Advertisement
Add Comment
Please, Sign In to add comment