#include #include #include #define null NULL /* (c)1999 A.Matsuda arabic.c */ struct{ int c; int v; }tbl[] = { { 'm', 1000 }, { 'd', 500 }, { 'c', 100 }, { 'l', 50 }, { 'x', 10 }, { 'v', 5 }, { 'i', 1 }, { -1 , -1 }, }; int chkv( int c ) { int i; for( i = 0 ; ; i++ ){ if( tbl[i].c == -1 ){ break; } if( toupper(tbl[i].c) == toupper(c) ){ return 1; } } return 0; } int getv( int c ) { int i; for( i = 0 ; ; i++ ){ if( tbl[i].c == -1 ){ break; } if( toupper(c) == toupper(tbl[i].c) ){ return tbl[i].v; } } return -1; } int arabic( char* buf , int* val ) { int prev = 0; int current = 0; int i; int cnt = 0; if( buf == null || val == null ){ return 1; } *val = 0; for( i = 0 ; i < strlen( buf ) ; i ++ ){ if( chkv(buf[i]) ){ current = getv( buf[i] ); if( prev == current){ cnt++; } else{ if( prev < current && cnt >= 1 ){ /* 2回以上引かれる数より小さな数が続いた後に減算を行う事はない */ return -2; } cnt = 0; } if( current > prev && prev != 0 ){ if( prev*5 != current && prev*10 != current ){ return -2; } if( prev == 5 || prev == 50 || prev == 500 ){ return -2; } *val -= prev*2; *val += current; prev = current - prev; } else{ /* 一度減算をおこなったら、currentよりも小さな値であるべき */ if( prev != 0 && (( (prev%9) == 0 ) && (prev/9) <= current) ) { return -2; } if( prev != 0 && ( prev == 4 || prev == 40 || prev == 400 ) && ( ( prev / 4 ) <= current ) ){ return -2; } if( ( prev == 5 || prev == 50 || prev == 500 ) && (cnt >= 1 ) ){ return -2; } *val += current; prev = current; } } else{ return -3; } } return 0; }