Добавил:
Fragga
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:лабораторки по ОС препод Челноков / 1семестр / wi2 / olesha / lab1 / convert
.c#include <stdio.h>
#include "convert.h"
#define MAXBASE 16
static char chr[] = "0123456789abcdef";
static int dgt[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
void error(char *reason){
fprintf(stderr,"error: %s",reason);
exit(1);
}
static int todigit(char s){
int i;
for(i = 0; i < MAXBASE; i++)
if(chr[i] == s) return dgt[i];
error("Invalid digit");
}
static int todigitbs(char s){
int l = 0;
int r = MAXBASE;
int m;
while(l < r){
m = (l + r) / 2;
if(chr[m] < s)
l = m + 1;
else r = m;
}
if(chr[l] == s)
return dgt[l];
else error("Invalid digit");
}
static char tochar(int num){
int i;
for(i = 0; i < MAXBASE; i++)
if(dgt[i] == num) return chr[i];
error("Invalid number");
}
static char tocharbs(int num){
int l = 0;
int r = MAXBASE;
int m;
while(l < r){
m = (l + r) / 2;
if(dgt[m] < num)
l = m + 1;
else r = m;
}
if(dgt[l] == num)
return chr[l];
else error("Invalid number");
}
int xtodec(char *str, int x){
int num = 0;
int i = 0;
while(str[i])
num = num * x + todigitbs(str[i++]);
return num;
}
void dectox(int num, int x, char *str){
static int i = 0;
if(!((num/x) < x))
dectox(num/x,x,str);
else str[i++] = tocharbs(num / x);
str[i++] = tocharbs(num % x);
str[i] = '\0';
}
void convert(char *str, int from, int to){
dectox(xtodec(str,from),to,str);
}