| "String utilities" |
| |
| CHAR_TO_INT = { |
| "\0": 0, |
| "\1": 1, |
| "\2": 2, |
| "\3": 3, |
| "\4": 4, |
| "\5": 5, |
| "\6": 6, |
| "\7": 7, |
| "\10": 8, |
| "\11": 9, |
| "\12": 10, |
| "\13": 11, |
| "\14": 12, |
| "\15": 13, |
| "\16": 14, |
| "\17": 15, |
| "\20": 16, |
| "\21": 17, |
| "\22": 18, |
| "\23": 19, |
| "\24": 20, |
| "\25": 21, |
| "\26": 22, |
| "\27": 23, |
| "\30": 24, |
| "\31": 25, |
| "\32": 26, |
| "\33": 27, |
| "\34": 28, |
| "\35": 29, |
| "\36": 30, |
| "\37": 31, |
| "\40": 32, |
| "\41": 33, |
| "\42": 34, |
| "\43": 35, |
| "\44": 36, |
| "\45": 37, |
| "\46": 38, |
| "\47": 39, |
| "\50": 40, |
| "\51": 41, |
| "\52": 42, |
| "\53": 43, |
| "\54": 44, |
| "\55": 45, |
| "\56": 46, |
| "\57": 47, |
| "\60": 48, |
| "\61": 49, |
| "\62": 50, |
| "\63": 51, |
| "\64": 52, |
| "\65": 53, |
| "\66": 54, |
| "\67": 55, |
| "\70": 56, |
| "\71": 57, |
| "\72": 58, |
| "\73": 59, |
| "\74": 60, |
| "\75": 61, |
| "\76": 62, |
| "\77": 63, |
| "\100": 64, |
| "\101": 65, |
| "\102": 66, |
| "\103": 67, |
| "\104": 68, |
| "\105": 69, |
| "\106": 70, |
| "\107": 71, |
| "\110": 72, |
| "\111": 73, |
| "\112": 74, |
| "\113": 75, |
| "\114": 76, |
| "\115": 77, |
| "\116": 78, |
| "\117": 79, |
| "\120": 80, |
| "\121": 81, |
| "\122": 82, |
| "\123": 83, |
| "\124": 84, |
| "\125": 85, |
| "\126": 86, |
| "\127": 87, |
| "\130": 88, |
| "\131": 89, |
| "\132": 90, |
| "\133": 91, |
| "\134": 92, |
| "\135": 93, |
| "\136": 94, |
| "\137": 95, |
| "\140": 96, |
| "\141": 97, |
| "\142": 98, |
| "\143": 99, |
| "\144": 100, |
| "\145": 101, |
| "\146": 102, |
| "\147": 103, |
| "\150": 104, |
| "\151": 105, |
| "\152": 106, |
| "\153": 107, |
| "\154": 108, |
| "\155": 109, |
| "\156": 110, |
| "\157": 111, |
| "\160": 112, |
| "\161": 113, |
| "\162": 114, |
| "\163": 115, |
| "\164": 116, |
| "\165": 117, |
| "\166": 118, |
| "\167": 119, |
| "\170": 120, |
| "\171": 121, |
| "\172": 122, |
| "\173": 123, |
| "\174": 124, |
| "\175": 125, |
| "\176": 126, |
| "\177": 127, |
| "\200": 128, |
| "\201": 129, |
| "\202": 130, |
| "\203": 131, |
| "\204": 132, |
| "\205": 133, |
| "\206": 134, |
| "\207": 135, |
| "\210": 136, |
| "\211": 137, |
| "\212": 138, |
| "\213": 139, |
| "\214": 140, |
| "\215": 141, |
| "\216": 142, |
| "\217": 143, |
| "\220": 144, |
| "\221": 145, |
| "\222": 146, |
| "\223": 147, |
| "\224": 148, |
| "\225": 149, |
| "\226": 150, |
| "\227": 151, |
| "\230": 152, |
| "\231": 153, |
| "\232": 154, |
| "\233": 155, |
| "\234": 156, |
| "\235": 157, |
| "\236": 158, |
| "\237": 159, |
| "\240": 160, |
| "\241": 161, |
| "\242": 162, |
| "\243": 163, |
| "\244": 164, |
| "\245": 165, |
| "\246": 166, |
| "\247": 167, |
| "\250": 168, |
| "\251": 169, |
| "\252": 170, |
| "\253": 171, |
| "\254": 172, |
| "\255": 173, |
| "\256": 174, |
| "\257": 175, |
| "\260": 176, |
| "\261": 177, |
| "\262": 178, |
| "\263": 179, |
| "\264": 180, |
| "\265": 181, |
| "\266": 182, |
| "\267": 183, |
| "\270": 184, |
| "\271": 185, |
| "\272": 186, |
| "\273": 187, |
| "\274": 188, |
| "\275": 189, |
| "\276": 190, |
| "\277": 191, |
| "\300": 192, |
| "\301": 193, |
| "\302": 194, |
| "\303": 195, |
| "\304": 196, |
| "\305": 197, |
| "\306": 198, |
| "\307": 199, |
| "\310": 200, |
| "\311": 201, |
| "\312": 202, |
| "\313": 203, |
| "\314": 204, |
| "\315": 205, |
| "\316": 206, |
| "\317": 207, |
| "\320": 208, |
| "\321": 209, |
| "\322": 210, |
| "\323": 211, |
| "\324": 212, |
| "\325": 213, |
| "\326": 214, |
| "\327": 215, |
| "\330": 216, |
| "\331": 217, |
| "\332": 218, |
| "\333": 219, |
| "\334": 220, |
| "\335": 221, |
| "\336": 222, |
| "\337": 223, |
| "\340": 224, |
| "\341": 225, |
| "\342": 226, |
| "\343": 227, |
| "\344": 228, |
| "\345": 229, |
| "\346": 230, |
| "\347": 231, |
| "\350": 232, |
| "\351": 233, |
| "\352": 234, |
| "\353": 235, |
| "\354": 236, |
| "\355": 237, |
| "\356": 238, |
| "\357": 239, |
| "\360": 240, |
| "\361": 241, |
| "\362": 242, |
| "\363": 243, |
| "\364": 244, |
| "\365": 245, |
| "\366": 246, |
| "\367": 247, |
| "\370": 248, |
| "\371": 249, |
| "\372": 250, |
| "\373": 251, |
| "\374": 252, |
| "\375": 253, |
| "\376": 254, |
| "\377": 255, |
| } |
| |
| INT_TO_CHAR = [ |
| "\0", |
| "\1", |
| "\2", |
| "\3", |
| "\4", |
| "\5", |
| "\6", |
| "\7", |
| "\10", |
| "\11", |
| "\12", |
| "\13", |
| "\14", |
| "\15", |
| "\16", |
| "\17", |
| "\20", |
| "\21", |
| "\22", |
| "\23", |
| "\24", |
| "\25", |
| "\26", |
| "\27", |
| "\30", |
| "\31", |
| "\32", |
| "\33", |
| "\34", |
| "\35", |
| "\36", |
| "\37", |
| "\40", |
| "\41", |
| "\42", |
| "\43", |
| "\44", |
| "\45", |
| "\46", |
| "\47", |
| "\50", |
| "\51", |
| "\52", |
| "\53", |
| "\54", |
| "\55", |
| "\56", |
| "\57", |
| "\60", |
| "\61", |
| "\62", |
| "\63", |
| "\64", |
| "\65", |
| "\66", |
| "\67", |
| "\70", |
| "\71", |
| "\72", |
| "\73", |
| "\74", |
| "\75", |
| "\76", |
| "\77", |
| "\100", |
| "\101", |
| "\102", |
| "\103", |
| "\104", |
| "\105", |
| "\106", |
| "\107", |
| "\110", |
| "\111", |
| "\112", |
| "\113", |
| "\114", |
| "\115", |
| "\116", |
| "\117", |
| "\120", |
| "\121", |
| "\122", |
| "\123", |
| "\124", |
| "\125", |
| "\126", |
| "\127", |
| "\130", |
| "\131", |
| "\132", |
| "\133", |
| "\134", |
| "\135", |
| "\136", |
| "\137", |
| "\140", |
| "\141", |
| "\142", |
| "\143", |
| "\144", |
| "\145", |
| "\146", |
| "\147", |
| "\150", |
| "\151", |
| "\152", |
| "\153", |
| "\154", |
| "\155", |
| "\156", |
| "\157", |
| "\160", |
| "\161", |
| "\162", |
| "\163", |
| "\164", |
| "\165", |
| "\166", |
| "\167", |
| "\170", |
| "\171", |
| "\172", |
| "\173", |
| "\174", |
| "\175", |
| "\176", |
| "\177", |
| "\200", |
| "\201", |
| "\202", |
| "\203", |
| "\204", |
| "\205", |
| "\206", |
| "\207", |
| "\210", |
| "\211", |
| "\212", |
| "\213", |
| "\214", |
| "\215", |
| "\216", |
| "\217", |
| "\220", |
| "\221", |
| "\222", |
| "\223", |
| "\224", |
| "\225", |
| "\226", |
| "\227", |
| "\230", |
| "\231", |
| "\232", |
| "\233", |
| "\234", |
| "\235", |
| "\236", |
| "\237", |
| "\240", |
| "\241", |
| "\242", |
| "\243", |
| "\244", |
| "\245", |
| "\246", |
| "\247", |
| "\250", |
| "\251", |
| "\252", |
| "\253", |
| "\254", |
| "\255", |
| "\256", |
| "\257", |
| "\260", |
| "\261", |
| "\262", |
| "\263", |
| "\264", |
| "\265", |
| "\266", |
| "\267", |
| "\270", |
| "\271", |
| "\272", |
| "\273", |
| "\274", |
| "\275", |
| "\276", |
| "\277", |
| "\300", |
| "\301", |
| "\302", |
| "\303", |
| "\304", |
| "\305", |
| "\306", |
| "\307", |
| "\310", |
| "\311", |
| "\312", |
| "\313", |
| "\314", |
| "\315", |
| "\316", |
| "\317", |
| "\320", |
| "\321", |
| "\322", |
| "\323", |
| "\324", |
| "\325", |
| "\326", |
| "\327", |
| "\330", |
| "\331", |
| "\332", |
| "\333", |
| "\334", |
| "\335", |
| "\336", |
| "\337", |
| "\340", |
| "\341", |
| "\342", |
| "\343", |
| "\344", |
| "\345", |
| "\346", |
| "\347", |
| "\350", |
| "\351", |
| "\352", |
| "\353", |
| "\354", |
| "\355", |
| "\356", |
| "\357", |
| "\360", |
| "\361", |
| "\362", |
| "\363", |
| "\364", |
| "\365", |
| "\366", |
| "\367", |
| "\370", |
| "\371", |
| "\372", |
| "\373", |
| "\374", |
| "\375", |
| "\376", |
| "\377", |
| ] |
| |
| def ord(c): |
| """returns the codepoint of a character |
| |
| ord(c) returns the integer value of the sole Unicode code point |
| encoded by the string `c`. |
| |
| If `c` does not encode exactly one Unicode code point, `ord` fails. |
| Each invalid code within the string is treated as if it encodes the |
| Unicode replacement character, U+FFFD. |
| |
| Args: |
| c: character whose codepoint to be returned. |
| |
| Returns: |
| codepoint of `c` argument. |
| """ |
| if len(c) != 1: |
| fail("expected a string with a single character") |
| return CHAR_TO_INT.get(c) |
| |
| def chr(i): |
| """returns a string encoding a codepoint |
| |
| chr returns a string that encodes the single Unicode code |
| point whose value is specified by the integer `i` |
| |
| Args: |
| i: position of the character |
| |
| Returns: |
| unicode string of the position |
| """ |
| if i < 0 or i > 255: |
| fail("expected a int between 0 and 255 (inclusive)") |
| return INT_TO_CHAR[i] |
| |
| def _to_char(n): |
| alpha = "0123456789abcdef" |
| return alpha[n] |
| |
| def hex(number): |
| """Format integer to hexdecimal representation |
| |
| Args: |
| number: number to format |
| |
| Returns: |
| hexdecimal representation of the number argument |
| """ |
| |
| hex_string = "" |
| is_signed = number < 0 |
| r = number * -1 if is_signed else number |
| for _ in range(1000000): |
| if r > 0: |
| rem = r % 16 |
| hex_string = _to_char(rem) + hex_string |
| r //= 16 |
| else: |
| break |
| |
| if not hex_string: |
| hex_string = "0" |
| |
| return "{}0x{}".format("-" if is_signed else "", hex_string) |