/*
* WRITTEN BY A.O.
* DO NOT STEAL MY ART.
*/
#define CASE_SINGLE(value,offset) if(code==value) return code+offset;
#define CASE_RANGE(left,right,offset) if(code>=left && code<=right) return code+offset;
#define CASE_RANGE_EVEN(left,right,offset) if(code%2==0 && code>=left && code<=right) return code+offset;
#define CASE_RANGE_ODD(left,right,offset) if(code%2==1 && code>=left && code<=right) return code+offset;
unsigned int ucs_toupper(unsigned int code){
switch(code
>>8){
case 0x00:
CASE_RANGE (0x0061,0x007a,-32)
CASE_SINGLE (0x00b5,743)
CASE_RANGE (0x00e0,0x00f6,-32)
CASE_RANGE (0x00f8,0x00fe,-32)
CASE_SINGLE (0x00ff,121)
break;
case 0x01:
CASE_RANGE_ODD (0x0101,0x012f,-1)
CASE_SINGLE (0x0131,-232)
CASE_RANGE_ODD (0x0133,0x0137,-1)
CASE_RANGE_EVEN(0x013a,0x0148,-1)
CASE_RANGE_ODD (0x014b,0x0177,-1)
CASE_RANGE_EVEN(0x017a,0x017e,-1)
CASE_SINGLE (0x017f,-300)
CASE_SINGLE (0x0180,195)
CASE_RANGE_ODD (0x0183,0x0185,-1)
CASE_SINGLE (0x0188,-1)
CASE_SINGLE (0x018c,-1)
CASE_SINGLE (0x0192,-1)
CASE_SINGLE (0x0195,97)
CASE_SINGLE (0x0199,-1)
CASE_SINGLE (0x019a,163)
CASE_SINGLE (0x019e,130)
CASE_RANGE_ODD (0x01a1,0x01a5,-1)
CASE_SINGLE (0x01a8,-1)
CASE_SINGLE (0x01ad,-1)
CASE_SINGLE (0x01b0,-1)
CASE_RANGE_EVEN(0x01b4,0x01b6,-1)
CASE_SINGLE (0x01b9,-1)
CASE_SINGLE (0x01bd,-1)
CASE_SINGLE (0x01bf,56)
CASE_SINGLE (0x01c5,-1)
CASE_SINGLE (0x01c6,-2)
CASE_SINGLE (0x01c8,-1)
CASE_SINGLE (0x01c9,-2)
CASE_SINGLE (0x01cb,-1)
CASE_SINGLE (0x01cc,-2)
CASE_RANGE_EVEN(0x01ce,0x01dc,-1)
CASE_SINGLE (0x01dd,-79)
CASE_RANGE_ODD (0x01df,0x01ef,-1)
CASE_SINGLE (0x01f2,-1)
CASE_SINGLE (0x01f3,-2)
CASE_SINGLE (0x01f5,-1)
CASE_RANGE_ODD (0x01f9,0x021f,-1)
break;
case 0x02:
CASE_RANGE_ODD (0x01f9,0x021f,-1)
CASE_RANGE_ODD (0x0223,0x0233,-1)
CASE_SINGLE (0x023c,-1)
CASE_SINGLE (0x0242,-1)
CASE_RANGE_ODD (0x0247,0x024f,-1)
CASE_SINGLE (0x0250,10783)
CASE_SINGLE (0x0251,10780)
CASE_SINGLE (0x0253,-210)
CASE_SINGLE (0x0254,-206)
CASE_RANGE (0x0256,0x0257,-205)
CASE_SINGLE (0x0259,-202)
CASE_SINGLE (0x025b,-203)
CASE_SINGLE (0x0260,-205)
CASE_SINGLE (0x0263,-207)
CASE_SINGLE (0x0268,-209)
CASE_SINGLE (0x0269,-211)
CASE_SINGLE (0x026b,10743)
CASE_SINGLE (0x026f,-211)
CASE_SINGLE (0x0271,10749)
CASE_SINGLE (0x0272,-213)
CASE_SINGLE (0x0275,-214)
CASE_SINGLE (0x027d,10727)
CASE_SINGLE (0x0280,-218)
CASE_SINGLE (0x0283,-218)
CASE_SINGLE (0x0288,-218)
CASE_SINGLE (0x0289,-69)
CASE_RANGE (0x028a,0x028b,-217)
CASE_SINGLE (0x028c,-71)
CASE_SINGLE (0x0292,-219)
break;
case 0x03:
CASE_SINGLE (0x0345,84)
CASE_RANGE_ODD (0x0371,0x0373,-1)
CASE_SINGLE (0x0377,-1)
CASE_RANGE (0x037b,0x037d,130)
CASE_SINGLE (0x03ac,-38)
CASE_RANGE (0x03ad,0x03af,-37)
CASE_RANGE (0x03b1,0x03c1,-32)
CASE_SINGLE (0x03c2,-31)
CASE_RANGE (0x03c3,0x03cb,-32)
CASE_SINGLE (0x03cc,-64)
CASE_RANGE (0x03cd,0x03ce,-63)
CASE_SINGLE (0x03d0,-62)
CASE_SINGLE (0x03d1,-57)
CASE_SINGLE (0x03d5,-47)
CASE_SINGLE (0x03d6,-54)
CASE_SINGLE (0x03d7,-8)
CASE_RANGE_ODD (0x03d9,0x03ef,-1)
CASE_SINGLE (0x03f0,-86)
CASE_SINGLE (0x03f1,-80)
CASE_SINGLE (0x03f2,7)
CASE_SINGLE (0x03f5,-96)
CASE_SINGLE (0x03f8,-1)
CASE_SINGLE (0x03fb,-1)
break;
case 0x04:
CASE_RANGE (0x0430,0x044f,-32)
CASE_RANGE (0x0450,0x045f,-80)
CASE_RANGE_ODD (0x0461,0x0481,-1)
CASE_RANGE_ODD (0x048b,0x04bf,-1)
CASE_RANGE_EVEN(0x04c2,0x04ce,-1)
CASE_SINGLE (0x04cf,-15)
CASE_RANGE_ODD (0x04d1,0x0523,-1)
break;
case 0x05:
CASE_RANGE_ODD (0x04d1,0x0523,-1)
CASE_RANGE (0x0561,0x0586,-48)
break;
case 0x1d:
CASE_SINGLE (0x1d79,35332)
CASE_SINGLE (0x1d7d,3814)
break;
case 0x1e:
CASE_RANGE_ODD (0x1e01,0x1e95,-1)
CASE_SINGLE (0x1e9b,-59)
CASE_RANGE_ODD (0x1ea1,0x1eff,-1)
break;
case 0x1f:
CASE_RANGE (0x1f00,0x1f07,8)
CASE_RANGE (0x1f10,0x1f15,8)
CASE_RANGE (0x1f20,0x1f27,8)
CASE_RANGE (0x1f30,0x1f37,8)
CASE_RANGE (0x1f40,0x1f45,8)
CASE_RANGE_ODD (0x1f51,0x1f57,8)
CASE_RANGE (0x1f60,0x1f67,8)
CASE_RANGE (0x1f70,0x1f71,74)
CASE_RANGE (0x1f72,0x1f75,86)
CASE_RANGE (0x1f76,0x1f77,100)
CASE_RANGE (0x1f78,0x1f79,128)
CASE_RANGE (0x1f7a,0x1f7b,112)
CASE_RANGE (0x1f7c,0x1f7d,126)
CASE_RANGE (0x1f80,0x1f87,8)
CASE_RANGE (0x1f90,0x1f97,8)
CASE_RANGE (0x1fa0,0x1fa7,8)
CASE_RANGE (0x1fb0,0x1fb1,8)
CASE_SINGLE (0x1fb3,9)
CASE_SINGLE (0x1fbe,-7205)
CASE_SINGLE (0x1fc3,9)
CASE_RANGE (0x1fd0,0x1fd1,8)
CASE_RANGE (0x1fe0,0x1fe1,8)
CASE_SINGLE (0x1fe5,7)
CASE_SINGLE (0x1ff3,9)
break;
case 0x21:
CASE_SINGLE (0x214e,-28)
CASE_RANGE (0x2170,0x217f,-16)
CASE_SINGLE (0x2184,-1)
break;
case 0x24:
CASE_RANGE (0x24d0,0x24e9,-26)
break;
case 0x2c:
CASE_RANGE (0x2c30,0x2c5e,-48)
CASE_SINGLE (0x2c61,-1)
CASE_SINGLE (0x2c65,-10795)
CASE_SINGLE (0x2c66,-10792)
CASE_RANGE_EVEN(0x2c68,0x2c6c,-1)
CASE_SINGLE (0x2c73,-1)
CASE_SINGLE (0x2c76,-1)
CASE_RANGE_ODD (0x2c81,0x2ce3,-1)
break;
case 0x2d:
CASE_RANGE (0x2d00,0x2d25,-7264)
break;
case 0xa6:
CASE_RANGE_ODD (0xa641,0xa65f,-1)
CASE_RANGE_ODD (0xa663,0xa66d,-1)
CASE_RANGE_ODD (0xa681,0xa697,-1)
break;
case 0xa7:
CASE_RANGE_ODD (0xa723,0xa72f,-1)
CASE_RANGE_ODD (0xa733,0xa76f,-1)
CASE_RANGE_EVEN(0xa77a,0xa77c,-1)
CASE_RANGE_ODD (0xa77f,0xa787,-1)
CASE_SINGLE (0xa78c,-1)
break;
case 0xff:
CASE_RANGE (0xff41,0xff5a,-32)
break;
case 0x104:
CASE_RANGE (0x10428,0x1044f,-40)
break;
}
return code;
}