/*============================================================================*\
                                RIMSKE --> ARABSKE
\*============================================================================*/


#define  R2A2_ORDER		4		// nejvyse 4 dekadicke rady
#define  R2A2_MAXORD	1000	// 10 ^ R2A2_ORDER



/*
 * SESTAVENI HODNOTY Z POLE CIFER
 */

static int r2a2_value(int const valt[])
{
	int		order,
			value;

	for(order = 1, value = 0;  order <= R2A2_MAXORD;  order *= 10, ++valt)
		value += valt[0] * order;
	return(value);
}



/*
 * VSTUPNI BOD
 */

static void r2a2(char const *valup)
{
#define  THIS_ORD(i)	((i) >> 1)
#define  THIS_WHT(i)	((i) & 001)
#define  THIS_INC(i)	(THIS_WHT(i) << 2 | 001)

    int		pidx,
			less;
	int		addt[R2A2_ORDER],
			subt[R2A2_ORDER];

	for(pidx = 0;  pidx < R2A2_ORDER;  ++pidx)
	{
		addt[pidx] = 0;
		subt[pidx] = 0;
	}
	pidx = sizeof(sromt) / sizeof(*sromt) - 1;
	less = 0;
    do
    {
		int			aidx;
		char const	*fndp;

		if((fndp = strchr(sromt, toupper(*valup))) == NULL)
		{
			fprintf(stderr, "Unknown Digit: %s\n", valup);
			return;
		}
		aidx = fndp - sromt;
		do
		{
#ifdef HAVE_CONDITION
			less  =  aidx < pidx  ?  0  :  less + 1;
#else
			int		smask;

			smask = -(aidx >= pidx);
			less  =  less - smask  &  smask;
#endif
			if(less <= 3)
			{
				if(aidx <= pidx)
					break;
				if(less <= 1)
				{
					pidx = THIS_ORD(pidx);
					subt[pidx] = addt[pidx];
					addt[pidx] = 0;
					break;
				}
			}
			fprintf(stderr, "Unexpected Digit: %s\n", valup);
			return;
		} while(0);
		pidx = aidx;
		if((addt[THIS_ORD(aidx)] += THIS_INC(aidx)) > 9)
		{
			fprintf(stderr, "Too much Digits: %s\n", valup);
			return;
		}
	} while(*++valup != '\0');
	printf("%d\n", r2a2_value(addt) - r2a2_value(subt));

#undef   THIS_ORD
#undef   THIS_WHT
#undef   THIS_INC
}

#undef   R2A2_ORDER
#undef   R2A2_MAXORD
