ldmc/code-size-benchmark/posint-dec-to-hex-optimal.c

52 lines
1,016 B
C

#include <stdio.h>
#include <stdint.h>
__attribute__((noinline))
int morph_posint_radix( char * in, char * out ) {
uint64_t value = 0;
while( *in ) {
if( *in >= '0' && *in <= '9' ) {
value *= 10;
value += *in - '0';
}
else
return -1;
in++;
}
uint64_t v = value;
while( v ) {
out ++;
v /= 16;
}
*out-- = '\0';
while( value ) {
unsigned digit = value % 16;
if( digit < 10 ) {
*out-- = digit + '0';
} else if( digit < 16 ) {
*out-- = digit + 'a' - 10;
} else {
return -1;
}
value /= 16;
}
return 0;
}
int main() {
char bufA[1024];
char bufB[1024];
char * in = bufA;
char * out = bufB;
scanf("%s", in);
morph_posint_radix( in, out );
printf("%s\n", out);
return 0;
}