Index: Objects/unicodectype.c =================================================================== --- Objects/unicodectype.c (revision 73674) +++ Objects/unicodectype.c (working copy) @@ -131,522 +131,6 @@ return 1; } -/* Returns the numeric value as double for Unicode characters having - this property, -1.0 otherwise. */ - -/* TODO: replace with unicodetype_db.h table */ - -double _PyUnicode_ToNumeric(Py_UNICODE ch) -{ - switch (ch) { - case 0x0F33: - return (double) -1 / 2; - case 0x17F0: - case 0x3007: -#ifdef Py_UNICODE_WIDE - case 0x1018A: -#endif - return (double) 0; - case 0x09F4: - case 0x17F1: - case 0x215F: - case 0x2160: - case 0x2170: - case 0x3021: - case 0x3192: - case 0x3220: - case 0x3280: -#ifdef Py_UNICODE_WIDE - case 0x10107: - case 0x10142: - case 0x10158: - case 0x10159: - case 0x1015A: - case 0x10320: - case 0x103D1: -#endif - return (double) 1; - case 0x00BD: - case 0x0F2A: - case 0x2CFD: -#ifdef Py_UNICODE_WIDE - case 0x10141: - case 0x10175: - case 0x10176: -#endif - return (double) 1 / 2; - case 0x2153: - return (double) 1 / 3; - case 0x00BC: -#ifdef Py_UNICODE_WIDE - case 0x10140: -#endif - return (double) 1 / 4; - case 0x2155: - return (double) 1 / 5; - case 0x2159: - return (double) 1 / 6; - case 0x215B: - return (double) 1 / 8; - case 0x0BF0: - case 0x1372: - case 0x2169: - case 0x2179: - case 0x2469: - case 0x247D: - case 0x2491: - case 0x24FE: - case 0x277F: - case 0x2789: - case 0x2793: - case 0x3038: - case 0x3229: - case 0x3289: -#ifdef Py_UNICODE_WIDE - case 0x10110: - case 0x10149: - case 0x10150: - case 0x10157: - case 0x10160: - case 0x10161: - case 0x10162: - case 0x10163: - case 0x10164: - case 0x10322: - case 0x103D3: - case 0x10A44: -#endif - return (double) 10; - case 0x0BF1: - case 0x137B: - case 0x216D: - case 0x217D: -#ifdef Py_UNICODE_WIDE - case 0x10119: - case 0x1014B: - case 0x10152: - case 0x1016A: - case 0x103D5: - case 0x10A46: -#endif - return (double) 100; - case 0x0BF2: - case 0x216F: - case 0x217F: - case 0x2180: -#ifdef Py_UNICODE_WIDE - case 0x10122: - case 0x1014D: - case 0x10154: - case 0x10171: - case 0x10A47: -#endif - return (double) 1000; - case 0x137C: - case 0x2182: -#ifdef Py_UNICODE_WIDE - case 0x1012B: - case 0x10155: -#endif - return (double) 10000; - case 0x216A: - case 0x217A: - case 0x246A: - case 0x247E: - case 0x2492: - case 0x24EB: - return (double) 11; - case 0x0F2F: - return (double) 11 / 2; - case 0x216B: - case 0x217B: - case 0x246B: - case 0x247F: - case 0x2493: - case 0x24EC: - return (double) 12; - case 0x246C: - case 0x2480: - case 0x2494: - case 0x24ED: - return (double) 13; - case 0x0F30: - return (double) 13 / 2; - case 0x246D: - case 0x2481: - case 0x2495: - case 0x24EE: - return (double) 14; - case 0x246E: - case 0x2482: - case 0x2496: - case 0x24EF: - return (double) 15; - case 0x0F31: - return (double) 15 / 2; - case 0x09F9: - case 0x246F: - case 0x2483: - case 0x2497: - case 0x24F0: - return (double) 16; - case 0x16EE: - case 0x2470: - case 0x2484: - case 0x2498: - case 0x24F1: - return (double) 17; - case 0x0F32: - return (double) 17 / 2; - case 0x16EF: - case 0x2471: - case 0x2485: - case 0x2499: - case 0x24F2: - return (double) 18; - case 0x16F0: - case 0x2472: - case 0x2486: - case 0x249A: - case 0x24F3: - return (double) 19; - case 0x09F5: - case 0x17F2: - case 0x2161: - case 0x2171: - case 0x3022: - case 0x3193: - case 0x3221: - case 0x3281: -#ifdef Py_UNICODE_WIDE - case 0x10108: - case 0x1015B: - case 0x1015C: - case 0x1015D: - case 0x1015E: - case 0x103D2: -#endif - return (double) 2; - case 0x2154: -#ifdef Py_UNICODE_WIDE - case 0x10177: -#endif - return (double) 2 / 3; - case 0x2156: - return (double) 2 / 5; - case 0x1373: - case 0x2473: - case 0x2487: - case 0x249B: - case 0x24F4: - case 0x3039: -#ifdef Py_UNICODE_WIDE - case 0x10111: - case 0x103D4: - case 0x10A45: -#endif - return (double) 20; -#ifdef Py_UNICODE_WIDE - case 0x1011A: - return (double) 200; - case 0x10123: - return (double) 2000; - case 0x1012C: - return (double) 20000; -#endif - case 0x3251: - return (double) 21; - case 0x3252: - return (double) 22; - case 0x3253: - return (double) 23; - case 0x3254: - return (double) 24; - case 0x3255: - return (double) 25; - case 0x3256: - return (double) 26; - case 0x3257: - return (double) 27; - case 0x3258: - return (double) 28; - case 0x3259: - return (double) 29; - case 0x09F6: - case 0x17F3: - case 0x2162: - case 0x2172: - case 0x3023: - case 0x3194: - case 0x3222: - case 0x3282: -#ifdef Py_UNICODE_WIDE - case 0x10109: -#endif - return (double) 3; - case 0x0F2B: - return (double) 3 / 2; - case 0x00BE: -#ifdef Py_UNICODE_WIDE - case 0x10178: -#endif - return (double) 3 / 4; - case 0x2157: - return (double) 3 / 5; - case 0x215C: - return (double) 3 / 8; - case 0x1374: - case 0x303A: - case 0x325A: -#ifdef Py_UNICODE_WIDE - case 0x10112: - case 0x10165: -#endif - return (double) 30; -#ifdef Py_UNICODE_WIDE - case 0x1011B: - case 0x1016B: - return (double) 300; - case 0x10124: - return (double) 3000; - case 0x1012D: - return (double) 30000; -#endif - case 0x325B: - return (double) 31; - case 0x325C: - return (double) 32; - case 0x325D: - return (double) 33; - case 0x325E: - return (double) 34; - case 0x325F: - return (double) 35; - case 0x32B1: - return (double) 36; - case 0x32B2: - return (double) 37; - case 0x32B3: - return (double) 38; - case 0x32B4: - return (double) 39; - case 0x09F7: - case 0x17F4: - case 0x2163: - case 0x2173: - case 0x3024: - case 0x3195: - case 0x3223: - case 0x3283: -#ifdef Py_UNICODE_WIDE - case 0x1010A: -#endif - return (double) 4; - case 0x2158: - return (double) 4 / 5; - case 0x1375: - case 0x32B5: -#ifdef Py_UNICODE_WIDE - case 0x10113: -#endif - return (double) 40; -#ifdef Py_UNICODE_WIDE - case 0x1011C: - return (double) 400; - case 0x10125: - return (double) 4000; - case 0x1012E: - return (double) 40000; -#endif - case 0x32B6: - return (double) 41; - case 0x32B7: - return (double) 42; - case 0x32B8: - return (double) 43; - case 0x32B9: - return (double) 44; - case 0x32BA: - return (double) 45; - case 0x32BB: - return (double) 46; - case 0x32BC: - return (double) 47; - case 0x32BD: - return (double) 48; - case 0x32BE: - return (double) 49; - case 0x17F5: - case 0x2164: - case 0x2174: - case 0x3025: - case 0x3224: - case 0x3284: -#ifdef Py_UNICODE_WIDE - case 0x1010B: - case 0x10143: - case 0x10148: - case 0x1014F: - case 0x1015F: - case 0x10173: - case 0x10321: -#endif - return (double) 5; - case 0x0F2C: - return (double) 5 / 2; - case 0x215A: - return (double) 5 / 6; - case 0x215D: - return (double) 5 / 8; - case 0x1376: - case 0x216C: - case 0x217C: - case 0x32BF: -#ifdef Py_UNICODE_WIDE - case 0x10114: - case 0x10144: - case 0x1014A: - case 0x10151: - case 0x10166: - case 0x10167: - case 0x10168: - case 0x10169: - case 0x10174: - case 0x10323: -#endif - return (double) 50; - case 0x216E: - case 0x217E: -#ifdef Py_UNICODE_WIDE - case 0x1011D: - case 0x10145: - case 0x1014C: - case 0x10153: - case 0x1016C: - case 0x1016D: - case 0x1016E: - case 0x1016F: - case 0x10170: -#endif - return (double) 500; - case 0x2181: -#ifdef Py_UNICODE_WIDE - case 0x10126: - case 0x10146: - case 0x1014E: - case 0x10172: -#endif - return (double) 5000; -#ifdef Py_UNICODE_WIDE - case 0x1012F: - case 0x10147: - case 0x10156: - return (double) 50000; -#endif - case 0x17F6: - case 0x2165: - case 0x2175: - case 0x3026: - case 0x3225: - case 0x3285: -#ifdef Py_UNICODE_WIDE - case 0x1010C: -#endif - return (double) 6; - case 0x1377: -#ifdef Py_UNICODE_WIDE - case 0x10115: -#endif - return (double) 60; -#ifdef Py_UNICODE_WIDE - case 0x1011E: - return (double) 600; - case 0x10127: - return (double) 6000; - case 0x10130: - return (double) 60000; -#endif - case 0x17F7: - case 0x2166: - case 0x2176: - case 0x3027: - case 0x3226: - case 0x3286: -#ifdef Py_UNICODE_WIDE - case 0x1010D: -#endif - return (double) 7; - case 0x0F2D: - return (double) 7 / 2; - case 0x215E: - return (double) 7 / 8; - case 0x1378: -#ifdef Py_UNICODE_WIDE - case 0x10116: -#endif - return (double) 70; -#ifdef Py_UNICODE_WIDE - case 0x1011F: - return (double) 700; - case 0x10128: - return (double) 7000; - case 0x10131: - return (double) 70000; -#endif - case 0x17F8: - case 0x2167: - case 0x2177: - case 0x3028: - case 0x3227: - case 0x3287: -#ifdef Py_UNICODE_WIDE - case 0x1010E: -#endif - return (double) 8; - case 0x1379: -#ifdef Py_UNICODE_WIDE - case 0x10117: -#endif - return (double) 80; -#ifdef Py_UNICODE_WIDE - case 0x10120: - return (double) 800; - case 0x10129: - return (double) 8000; - case 0x10132: - return (double) 80000; -#endif - case 0x17F9: - case 0x2168: - case 0x2178: - case 0x3029: - case 0x3228: - case 0x3288: -#ifdef Py_UNICODE_WIDE - case 0x1010F: -#endif - return (double) 9; - case 0x0F2E: - return (double) 9 / 2; - case 0x137A: -#ifdef Py_UNICODE_WIDE - case 0x10118: -#endif - return (double) 90; -#ifdef Py_UNICODE_WIDE - case 0x10121: - case 0x1034A: - return (double) 900; - case 0x1012A: - return (double) 9000; - case 0x10133: - return (double) 90000; -#endif - default: - return (double) _PyUnicode_ToDigit(ch); - } -} - int _PyUnicode_IsNumeric(Py_UNICODE ch) { return _PyUnicode_ToNumeric(ch) != -1.0; Index: Objects/unicodetype_db.h =================================================================== --- Objects/unicodetype_db.h (revision 73674) +++ Objects/unicodetype_db.h (working copy) @@ -1422,3 +1422,667 @@ 1, 0, 0, }; +/* Returns the numeric value as double for Unicode characters + having this property, -1.0 otherwise. */ +double _PyUnicode_ToNumeric(Py_UNICODE ch) +{ + switch (ch) { + case 0x0F33: + return (double) -1 / 2; + case 0x0C78: + case 0x17F0: + case 0x3007: + case 0xF9B2: +#ifdef Py_UNICODE_WIDE + case 0x1018A: +#endif + return (double) 0; + case 0x09F4: + case 0x0C79: + case 0x0C7C: + case 0x17F1: + case 0x215F: + case 0x2160: + case 0x2170: + case 0x3021: + case 0x3192: + case 0x3220: + case 0x3280: +#ifdef Py_UNICODE_WIDE + case 0x10107: + case 0x10142: + case 0x10158: + case 0x10159: + case 0x1015A: + case 0x10320: + case 0x103D1: + case 0x10916: + case 0x12415: + case 0x1241E: + case 0x1242C: + case 0x12434: + case 0x1244F: + case 0x12458: + case 0x1D360: +#endif + return (double) 1; + case 0x00BD: + case 0x0D74: + case 0x0F2A: + case 0x2CFD: +#ifdef Py_UNICODE_WIDE + case 0x10141: + case 0x10175: + case 0x10176: +#endif + return (double) 1 / 2; + case 0x2153: +#ifdef Py_UNICODE_WIDE + case 0x1245A: + case 0x1245D: +#endif + return (double) 1 / 3; + case 0x00BC: + case 0x0D73: +#ifdef Py_UNICODE_WIDE + case 0x10140: + case 0x12460: + case 0x12462: +#endif + return (double) 1 / 4; + case 0x2155: + return (double) 1 / 5; + case 0x2159: +#ifdef Py_UNICODE_WIDE + case 0x12461: +#endif + return (double) 1 / 6; + case 0x215B: +#ifdef Py_UNICODE_WIDE + case 0x1245F: +#endif + return (double) 1 / 8; + case 0x0BF0: + case 0x0D70: + case 0x1372: + case 0x2169: + case 0x2179: + case 0x2469: + case 0x247D: + case 0x2491: + case 0x24FE: + case 0x277F: + case 0x2789: + case 0x2793: + case 0x3038: + case 0x3229: + case 0x3289: + case 0xF973: + case 0xF9FD: +#ifdef Py_UNICODE_WIDE + case 0x10110: + case 0x10149: + case 0x10150: + case 0x10157: + case 0x10160: + case 0x10161: + case 0x10162: + case 0x10163: + case 0x10164: + case 0x10322: + case 0x103D3: + case 0x10917: + case 0x10A44: + case 0x1D369: +#endif + return (double) 10; + case 0x0BF1: + case 0x0D71: + case 0x137B: + case 0x216D: + case 0x217D: +#ifdef Py_UNICODE_WIDE + case 0x10119: + case 0x1014B: + case 0x10152: + case 0x1016A: + case 0x103D5: + case 0x10919: + case 0x10A46: +#endif + return (double) 100; + case 0x0BF2: + case 0x0D72: + case 0x216F: + case 0x217F: + case 0x2180: +#ifdef Py_UNICODE_WIDE + case 0x10122: + case 0x1014D: + case 0x10154: + case 0x10171: + case 0x10A47: +#endif + return (double) 1000; + case 0x137C: + case 0x2182: +#ifdef Py_UNICODE_WIDE + case 0x1012B: + case 0x10155: +#endif + return (double) 10000; + case 0x2188: + return (double) 100000; + case 0x216A: + case 0x217A: + case 0x246A: + case 0x247E: + case 0x2492: + case 0x24EB: + return (double) 11; + case 0x0F2F: + return (double) 11 / 2; + case 0x216B: + case 0x217B: + case 0x246B: + case 0x247F: + case 0x2493: + case 0x24EC: + return (double) 12; + case 0x246C: + case 0x2480: + case 0x2494: + case 0x24ED: + return (double) 13; + case 0x0F30: + return (double) 13 / 2; + case 0x246D: + case 0x2481: + case 0x2495: + case 0x24EE: + return (double) 14; + case 0x246E: + case 0x2482: + case 0x2496: + case 0x24EF: + return (double) 15; + case 0x0F31: + return (double) 15 / 2; + case 0x09F9: + case 0x246F: + case 0x2483: + case 0x2497: + case 0x24F0: + return (double) 16; + case 0x16EE: + case 0x2470: + case 0x2484: + case 0x2498: + case 0x24F1: + return (double) 17; + case 0x0F32: + return (double) 17 / 2; + case 0x16EF: + case 0x2471: + case 0x2485: + case 0x2499: + case 0x24F2: + return (double) 18; + case 0x16F0: + case 0x2472: + case 0x2486: + case 0x249A: + case 0x24F3: + return (double) 19; + case 0x09F5: + case 0x0C7A: + case 0x0C7D: + case 0x17F2: + case 0x2161: + case 0x2171: + case 0x3022: + case 0x3193: + case 0x3221: + case 0x3281: + case 0xF978: +#ifdef Py_UNICODE_WIDE + case 0x10108: + case 0x1015B: + case 0x1015C: + case 0x1015D: + case 0x1015E: + case 0x103D2: + case 0x12400: + case 0x12416: + case 0x1241F: + case 0x12423: + case 0x1242D: + case 0x12435: + case 0x1244A: + case 0x12450: + case 0x12459: + case 0x1D361: +#endif + return (double) 2; + case 0x2154: +#ifdef Py_UNICODE_WIDE + case 0x10177: + case 0x1245B: + case 0x1245E: +#endif + return (double) 2 / 3; + case 0x2156: + return (double) 2 / 5; + case 0x1373: + case 0x2473: + case 0x2487: + case 0x249B: + case 0x24F4: + case 0x3039: +#ifdef Py_UNICODE_WIDE + case 0x10111: + case 0x103D4: + case 0x10918: + case 0x10A45: + case 0x1D36A: +#endif + return (double) 20; +#ifdef Py_UNICODE_WIDE + case 0x1011A: + return (double) 200; + case 0x10123: + return (double) 2000; + case 0x1012C: + return (double) 20000; +#endif + case 0x3251: + return (double) 21; + case 0x3252: + return (double) 22; + case 0x3253: + return (double) 23; + case 0x3254: + return (double) 24; + case 0x3255: + return (double) 25; + case 0x3256: + return (double) 26; + case 0x3257: + return (double) 27; + case 0x3258: + return (double) 28; + case 0x3259: + return (double) 29; + case 0x09F6: + case 0x0C7B: + case 0x0C7E: + case 0x17F3: + case 0x2162: + case 0x2172: + case 0x3023: + case 0x3194: + case 0x3222: + case 0x3282: + case 0xF96B: +#ifdef Py_UNICODE_WIDE + case 0x10109: + case 0x12401: + case 0x12408: + case 0x12417: + case 0x12420: + case 0x12424: + case 0x12425: + case 0x1242E: + case 0x1242F: + case 0x12436: + case 0x12437: + case 0x1243A: + case 0x1243B: + case 0x1244B: + case 0x12451: + case 0x1D362: +#endif + return (double) 3; + case 0x0F2B: + return (double) 3 / 2; + case 0x00BE: + case 0x0D75: +#ifdef Py_UNICODE_WIDE + case 0x10178: +#endif + return (double) 3 / 4; + case 0x2157: + return (double) 3 / 5; + case 0x215C: + return (double) 3 / 8; + case 0x1374: + case 0x303A: + case 0x325A: +#ifdef Py_UNICODE_WIDE + case 0x10112: + case 0x10165: + case 0x1D36B: +#endif + return (double) 30; +#ifdef Py_UNICODE_WIDE + case 0x1011B: + case 0x1016B: + return (double) 300; + case 0x10124: + return (double) 3000; + case 0x1012D: + return (double) 30000; +#endif + case 0x325B: + return (double) 31; + case 0x325C: + return (double) 32; + case 0x325D: + return (double) 33; + case 0x325E: + return (double) 34; + case 0x325F: + return (double) 35; + case 0x32B1: + return (double) 36; + case 0x32B2: + return (double) 37; + case 0x32B3: + return (double) 38; + case 0x32B4: + return (double) 39; + case 0x09F7: + case 0x17F4: + case 0x2163: + case 0x2173: + case 0x3024: + case 0x3195: + case 0x3223: + case 0x3283: +#ifdef Py_UNICODE_WIDE + case 0x1010A: + case 0x12402: + case 0x12409: + case 0x1240F: + case 0x12418: + case 0x12421: + case 0x12426: + case 0x12430: + case 0x12438: + case 0x1243C: + case 0x1243D: + case 0x1243E: + case 0x1243F: + case 0x1244C: + case 0x12452: + case 0x12453: + case 0x1D363: +#endif + return (double) 4; + case 0x2158: + return (double) 4 / 5; + case 0x1375: + case 0x32B5: +#ifdef Py_UNICODE_WIDE + case 0x10113: + case 0x1D36C: +#endif + return (double) 40; +#ifdef Py_UNICODE_WIDE + case 0x1011C: + return (double) 400; + case 0x10125: + return (double) 4000; + case 0x1012E: + return (double) 40000; +#endif + case 0x32B6: + return (double) 41; + case 0x32B7: + return (double) 42; + case 0x32B8: + return (double) 43; + case 0x32B9: + return (double) 44; + case 0x32BA: + return (double) 45; + case 0x32BB: + return (double) 46; + case 0x32BC: + return (double) 47; + case 0x32BD: + return (double) 48; + case 0x32BE: + return (double) 49; + case 0x17F5: + case 0x2164: + case 0x2174: + case 0x3025: + case 0x3224: + case 0x3284: +#ifdef Py_UNICODE_WIDE + case 0x1010B: + case 0x10143: + case 0x10148: + case 0x1014F: + case 0x1015F: + case 0x10173: + case 0x10321: + case 0x12403: + case 0x1240A: + case 0x12410: + case 0x12419: + case 0x12422: + case 0x12427: + case 0x12431: + case 0x12439: + case 0x1244D: + case 0x12454: + case 0x12455: + case 0x1D364: +#endif + return (double) 5; + case 0x0F2C: + return (double) 5 / 2; + case 0x215A: +#ifdef Py_UNICODE_WIDE + case 0x1245C: +#endif + return (double) 5 / 6; + case 0x215D: + return (double) 5 / 8; + case 0x1376: + case 0x216C: + case 0x217C: + case 0x2186: + case 0x32BF: +#ifdef Py_UNICODE_WIDE + case 0x10114: + case 0x10144: + case 0x1014A: + case 0x10151: + case 0x10166: + case 0x10167: + case 0x10168: + case 0x10169: + case 0x10174: + case 0x10323: + case 0x1D36D: +#endif + return (double) 50; + case 0x216E: + case 0x217E: +#ifdef Py_UNICODE_WIDE + case 0x1011D: + case 0x10145: + case 0x1014C: + case 0x10153: + case 0x1016C: + case 0x1016D: + case 0x1016E: + case 0x1016F: + case 0x10170: +#endif + return (double) 500; + case 0x2181: +#ifdef Py_UNICODE_WIDE + case 0x10126: + case 0x10146: + case 0x1014E: + case 0x10172: +#endif + return (double) 5000; + case 0x2187: +#ifdef Py_UNICODE_WIDE + case 0x1012F: + case 0x10147: + case 0x10156: +#endif + return (double) 50000; + case 0x17F6: + case 0x2165: + case 0x2175: + case 0x2185: + case 0x3026: + case 0x3225: + case 0x3285: + case 0xF9D1: + case 0xF9D3: +#ifdef Py_UNICODE_WIDE + case 0x1010C: + case 0x12404: + case 0x1240B: + case 0x12411: + case 0x1241A: + case 0x12428: + case 0x12440: + case 0x1244E: + case 0x1D365: +#endif + return (double) 6; + case 0x1377: +#ifdef Py_UNICODE_WIDE + case 0x10115: + case 0x1D36E: +#endif + return (double) 60; +#ifdef Py_UNICODE_WIDE + case 0x1011E: + return (double) 600; + case 0x10127: + return (double) 6000; + case 0x10130: + return (double) 60000; +#endif + case 0x17F7: + case 0x2166: + case 0x2176: + case 0x3027: + case 0x3226: + case 0x3286: +#ifdef Py_UNICODE_WIDE + case 0x1010D: + case 0x12405: + case 0x1240C: + case 0x12412: + case 0x1241B: + case 0x12429: + case 0x12441: + case 0x12442: + case 0x12443: + case 0x1D366: +#endif + return (double) 7; + case 0x0F2D: + return (double) 7 / 2; + case 0x215E: + return (double) 7 / 8; + case 0x1378: +#ifdef Py_UNICODE_WIDE + case 0x10116: + case 0x1D36F: +#endif + return (double) 70; +#ifdef Py_UNICODE_WIDE + case 0x1011F: + return (double) 700; + case 0x10128: + return (double) 7000; + case 0x10131: + return (double) 70000; +#endif + case 0x17F8: + case 0x2167: + case 0x2177: + case 0x3028: + case 0x3227: + case 0x3287: +#ifdef Py_UNICODE_WIDE + case 0x1010E: + case 0x12406: + case 0x1240D: + case 0x12413: + case 0x1241C: + case 0x1242A: + case 0x12444: + case 0x12445: + case 0x1D367: +#endif + return (double) 8; + case 0x1379: +#ifdef Py_UNICODE_WIDE + case 0x10117: + case 0x1D370: +#endif + return (double) 80; +#ifdef Py_UNICODE_WIDE + case 0x10120: + return (double) 800; + case 0x10129: + return (double) 8000; + case 0x10132: + return (double) 80000; +#endif + case 0x17F9: + case 0x2168: + case 0x2178: + case 0x3029: + case 0x3228: + case 0x3288: +#ifdef Py_UNICODE_WIDE + case 0x1010F: + case 0x12407: + case 0x1240E: + case 0x12414: + case 0x1241D: + case 0x1242B: + case 0x12446: + case 0x12447: + case 0x12448: + case 0x12449: + case 0x1D368: + case 0x2F890: +#endif + return (double) 9; + case 0x0F2E: + return (double) 9 / 2; + case 0x137A: +#ifdef Py_UNICODE_WIDE + case 0x10118: + case 0x10341: + case 0x1D371: +#endif + return (double) 90; +#ifdef Py_UNICODE_WIDE + case 0x10121: + case 0x1034A: + return (double) 900; + case 0x1012A: + return (double) 9000; + case 0x10133: + return (double) 90000; +#endif + default: + return (double) _PyUnicode_ToDigit(ch); + } +} Index: Tools/unicode/makeunicodedata.py =================================================================== --- Tools/unicode/makeunicodedata.py (revision 73674) +++ Tools/unicode/makeunicodedata.py (working copy) @@ -352,6 +352,7 @@ table = [dummy] cache = {0: dummy} index = [0] * len(unicode.chars) + numbers = {} for char in unicode.chars: record = unicode.table[char] @@ -421,6 +422,11 @@ table.append(item) index[char] = i + # some code points are numbers but not digits, + # record them for the PyUnicode_ToNumeric function. + if record[8] and not record[7]: # numeric and not digit + numbers.setdefault(record[8], []).append(char) + print len(table), "unique character type entries" print "--- Writing", FILE, "..." @@ -443,6 +449,42 @@ Array("index1", index1).dump(fp, trace) Array("index2", index2).dump(fp, trace) + # Generate numeric conversion function + print >> fp, "/* Returns the numeric value as double for Unicode characters" + print >> fp, " having this property, -1.0 otherwise. */" + print >> fp, "double _PyUnicode_ToNumeric(Py_UNICODE ch)" + print >> fp, "{" + print >> fp, " switch (ch) {" + + widechar = False + sortednumbers = sorted(numbers.items()) + for i, (value, chars) in enumerate(sortednumbers): + for char in chars: + if char > 0xFFFF and not widechar: + print >> fp, "#ifdef Py_UNICODE_WIDE" + widechar = True + print >> fp, " case 0x%04X:" % (char,) + + # close the #ifdef before the return if we have a char in the BMP + if widechar and chars[0] <= 0xFFFF: + print >> fp, "#endif" + widechar = False + + # the return statement + value = value.replace("/", " / ") + print >> fp, " return (double) %s;" % (value,) + + # close the #ifdef after the return, if the next item has a char in the BMP + if widechar: + if i+1 >= len(sortednumbers) or sortednumbers[i+1][1][0] <= 0xFFFF: + print >> fp, "#endif" + widechar = False + + print >> fp, " default:" + print >> fp, " return (double) _PyUnicode_ToDigit(ch);" + print >> fp, " }" + print >> fp, "}" + fp.close() # --------------------------------------------------------------------