/*
 * Program pro testovani funkce pro prevod cisla o zakladu 2 - 36 na retezec
 *
 * Tomas Kavalek - tom.kavalek@atlas.cz
 */

#define ASSERTDEBUG 0

#include <stdio.h>

#if ASSERTDEBUG
#  include <assert.h>
#endif

// Prototyp funkce
int ul2str(unsigned long value, unsigned int base, char *string, int size);

// Funkce prevadi cislo value o zakladu base na retezec o velikosti size
int ul2str(unsigned long value, unsigned int base, char *string, int size) {
#if ASSERTDEBUG
  // Kontrola zakladu pomoci ladiciho makra
  assert(base > 1 && base < 37);
#else
  // Kontrola zakladu pomoci podminky
  if(base < 2 || base > 36) return 0;
#endif
  // Definice promennych
  unsigned int rest = 0;                     // Zbytek pro ulozeni do pole
  unsigned int i = 0, j = 0;                 // Pomocne iteratory
  unsigned int myarray[size];                // Pomocne pole pro ukladani
  
  // Cyklus samotneho vypoctu
  do {
    rest = value % base;                     // Zbytek po deleni
    value /= base;                           // Cislo pro dalsi iteraci
    myarray[i++] = rest;                     // Ulozeni zbytku do pole
  } while(value > 0);                        // Cyklus dokud je co pocitat
  
  // Ulozeni vysledku do retezce (pole) predaneho odkazem a jeho otoceni
  // s naslednym prevod cislic na pismena, pokud je potreba
  while(i-- != 0) {
    if(myarray[i] < 10) string[j++] = myarray[i] + '0';
    else string[j++] = myarray[i] - 10 + 'A';
  }
  
  // Nutne ukonceni retezce
  string[j] = '\0';
  
  return 1;
}

// Hlavni funkce
int main(int argc, char **argv) {
  // Potrebujeme minimalne dva parametry
  if(argc > 2) {
    char string[80];                         // Pole pro ulozeni retezce
    // Prevadime
    if((ul2str(atol(argv[1]), atoi(argv[2]), string, 80))) printf("%s\n", string);
    else {
      printf("%s: nepodarilo se prevest %ld na retezec\n", argv[0], atol(argv[1]));
      exit(1);
    }
  } else printf("%s: pouziti %s <value> <base>\n", argv[0], argv[0]);
  return 0;
}