#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef unsigned uint;
int chhex2val(char ch)
{
if (ch >= '0' && ch <= '9')
return ch - '0';
if (ch >= 'A' && ch <= 'F')
return ch - 'A' + 10;
if (ch >= 'a' && ch <= 'f')
return ch - 'a' + 10;
return 0;
}
char val2chhex(int v)
{
if (v >= 0 && v < 16)
return "0123456789ABCDEF"[v];
return '0';
}
// Multiplies a hex string like "17F" by 10 and
// returns a string with the product (e.g. "0EF6").
// The original string isn't modified.
char* mulh10(char* h)
{
size_t i;
uint c = 0;
if (p == NULL)
p[l + 1] = '\0';
for (i = 0; i < l; i++)
{
c += chhex2val(h[l - 1 - i]) * 10;
p[l - i] = val2chhex(c % 16);
c /= 16;
}
p[0] = val2chhex(c);
return p;
}
// Adds (arithmetically) to a hex string like "17F" a hex/dec digit, e.g. '9'.
// Returns the modified original string (e.g. "188").
char* addhd(char* h, char d)
{
size_t i;
uint c = chhex2val(d);
for (i = 0; c && i < l; i++)
{
c += chhex2val(h[l - 1 - i]);
h[l - 1 - i] = val2chhex(c % 16);
c /= 16;
}
return h;
}
int main(void)
{
char num[] = "17F";
printf("\"17F\" (hex) * 10 = \"%s\" (hex)\n", mulh10
(num
)); printf("\"17F\" (hex) + '9' = \"%s\" (hex)\n", addhd
(num
, '9')); printf("\"65535\" (dec) = \"%s\" (hex)\n", addhd(mulh10(addhd(mulh10(addhd(mulh10(addhd(mulh10(addhd(mulh10(
"0"), '6')), '5')), '5')), '3')), '5'));
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKdHlwZWRlZiB1bnNpZ25lZCB1aW50OwoKaW50IGNoaGV4MnZhbChjaGFyIGNoKQp7CiAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpCiAgICByZXR1cm4gY2ggLSAnMCc7CiAgaWYgKGNoID49ICdBJyAmJiBjaCA8PSAnRicpCiAgICByZXR1cm4gY2ggLSAnQScgKyAxMDsKICBpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykKICAgIHJldHVybiBjaCAtICdhJyArIDEwOwogIGFib3J0KCk7CiAgcmV0dXJuIDA7Cn0KCmNoYXIgdmFsMmNoaGV4KGludCB2KQp7CiAgaWYgKHYgPj0gMCAmJiB2IDwgMTYpCiAgICByZXR1cm4gIjAxMjM0NTY3ODlBQkNERUYiW3ZdOwogIGFib3J0KCk7CiAgcmV0dXJuICcwJzsKfQoKLy8gTXVsdGlwbGllcyBhIGhleCBzdHJpbmcgbGlrZSAiMTdGIiBieSAxMCBhbmQKLy8gcmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBwcm9kdWN0IChlLmcuICIwRUY2IikuCi8vIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXNuJ3QgbW9kaWZpZWQuCmNoYXIqIG11bGgxMChjaGFyKiBoKQp7CiAgc2l6ZV90IGwgPSBzdHJsZW4oaCk7CiAgY2hhciogcCA9IG1hbGxvYyhsICsgMSArIDEpOwogIHNpemVfdCBpOwogIHVpbnQgYyA9IDA7CgogIGlmIChwID09IE5VTEwpCiAgICBhYm9ydCgpOwoKICBwW2wgKyAxXSA9ICdcMCc7CiAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykKICB7CiAgICBjICs9IGNoaGV4MnZhbChoW2wgLSAxIC0gaV0pICogMTA7CiAgICBwW2wgLSBpXSA9IHZhbDJjaGhleChjICUgMTYpOwogICAgYyAvPSAxNjsKICB9CiAgcFswXSA9IHZhbDJjaGhleChjKTsKCiAgcmV0dXJuIHA7Cn0KCi8vIEFkZHMgKGFyaXRobWV0aWNhbGx5KSB0byBhIGhleCBzdHJpbmcgbGlrZSAiMTdGIiBhIGhleC9kZWMgZGlnaXQsIGUuZy4gJzknLgovLyBSZXR1cm5zIHRoZSBtb2RpZmllZCBvcmlnaW5hbCBzdHJpbmcgKGUuZy4gIjE4OCIpLgpjaGFyKiBhZGRoZChjaGFyKiBoLCBjaGFyIGQpCnsKICBzaXplX3QgbCA9IHN0cmxlbihoKTsKICBzaXplX3QgaTsKICB1aW50IGMgPSBjaGhleDJ2YWwoZCk7CgogIGZvciAoaSA9IDA7IGMgJiYgaSA8IGw7IGkrKykKICB7CiAgICBjICs9IGNoaGV4MnZhbChoW2wgLSAxIC0gaV0pOwogICAgaFtsIC0gMSAtIGldID0gdmFsMmNoaGV4KGMgJSAxNik7CiAgICBjIC89IDE2OwogIH0KCiAgcmV0dXJuIGg7Cn0KCmludCBtYWluKHZvaWQpCnsKICBjaGFyIG51bVtdID0gIjE3RiI7CiAgcHJpbnRmKCJcIjE3RlwiIChoZXgpICogMTAgPSBcIiVzXCIgKGhleClcbiIsIG11bGgxMChudW0pKTsKICBwcmludGYoIlwiMTdGXCIgKGhleCkgKyAnOScgPSBcIiVzXCIgKGhleClcbiIsIGFkZGhkKG51bSwgJzknKSk7CiAgcHJpbnRmKCJcIjY1NTM1XCIgKGRlYykgPSBcIiVzXCIgKGhleClcbiIsCiAgICAgICAgIGFkZGhkKG11bGgxMChhZGRoZChtdWxoMTAoYWRkaGQobXVsaDEwKGFkZGhkKG11bGgxMChhZGRoZChtdWxoMTAoCiAgICAgICAgICIwIiksICc2JykpLCAnNScpKSwgJzUnKSksICczJykpLCAnNScpKTsKICByZXR1cm4gMDsKfQo=