#include <stdio.h>
#define IN_NUTRAL 0
#define IN_0 1
#define IN_X 2
#define IN_NUMBER 3
#define IN_X_ERROR (unsigned long)-1
#define IN_N_ERROR (unsigned long)-2
void HexTo12(char *num)
{
unsigned long i = 0, j = IN_NUTRAL;
printf("%s: ", num);
if(!*num)
{
puts("エラー: 文字列が空です。");
return;
}
while(*num)
{
switch(*num)
{
case '0':
i = i * 16;
if(j == IN_NUTRAL)
j = IN_0;
break;
case '1': j = IN_NUMBER; i = i * 16 + 1; break;
case '2': j = IN_NUMBER; i = i * 16 + 2; break;
case '3': j = IN_NUMBER; i = i * 16 + 3; break;
case '4': j = IN_NUMBER; i = i * 16 + 4; break;
case '5': j = IN_NUMBER; i = i * 16 + 5; break;
case '6': j = IN_NUMBER; i = i * 16 + 6; break;
case '7': j = IN_NUMBER; i = i * 16 + 7; break;
case '8': j = IN_NUMBER; i = i * 16 + 8; break;
case '9': j = IN_NUMBER; i = i * 16 + 9; break;
case 'A': case 'a': j = IN_NUMBER; i = i * 16 + 10; break;
case 'B': case 'b': j = IN_NUMBER; i = i * 16 + 11; break;
case 'C': case 'c': j = IN_NUMBER; i = i * 16 + 12; break;
case 'D': case 'd': j = IN_NUMBER; i = i * 16 + 13; break;
case 'E': case 'e': j = IN_NUMBER; i = i * 16 + 14; break;
case 'F': case 'f': j = IN_NUMBER; i = i * 16 + 15; break;
case 'X': case 'x':
if(j != IN_0)
{
puts("エラー: xの位置が不正です。");
return;
}
j = IN_X;
break;
default:
puts("エラー: 16進数表記になっていません。");
return;
}
++num;
}
if(i < 0 || i > 1000000)
{
puts("エラー: 0以上100万以下の整数ではありません。");
return;
}
j += (i / (1 * 12 * 12 * 12 * 12 * 12)) % 12 << 20;
j += (i / (1 * 12 * 12 * 12 * 12)) % 12 << 16;
j += (i / (1 * 12 * 12 * 12)) % 12 << 12;
j += (i / (1 * 12 * 12)) %12 << 8;
j += (i / (1 * 12)) % 12 << 4;
j += (i / (1)) % 12;
printf("%lX\n", j);
}
int main(int argc, char *argv[])
{
int i;
if(argc < 2)
{
puts("エラー: 引数が指定されていません。");
return -1;
}
for(i = 1; i < argc; ++i)
{
printf("%d: ", i);
HexTo12(argv[i]);
}
getchar();
return 0;
}