#include "libft.h" /** * Parses a string of superscript digits (e.g., "²³⁴") into a long long. * Returns the integer value, or LLONG_MAX/LLONG_MIN on overflow. */ long long ft_atoll_superscript(const char *str) { long long nbr = 0; int i = 0; int negatif = 1; int superscript_size; // Skip leading whitespace while (ft_isspace(str[i])) i++; // Handle optional sign if (str[i] == '-') negatif = -1; if (str[i] == '+' || str[i] == '-') i++; // Parse superscript digits while (1) { if (!ft_isdigit_superscript(&str[i], &superscript_size)) break; // Not a superscript digit // Extract the digit value (0-9) from the superscript character int digit; if (superscript_size == 2) { // ¹ (U+00B9), ² (U+00B2), or ³ (U+00B3) if ((uint8_t)str[i + 1] == 0xB9) digit = 1; else if ((uint8_t)str[i + 1] == 0xB2) digit = 2; else if ((uint8_t)str[i + 1] == 0xB3) digit = 3; else break; // Invalid, should not happen } else if (superscript_size == 3) { // ⁰ (U+2070) to ⁹ (U+2079) digit = (uint8_t)str[i + 2] - 0xB0; // 0xB0 → 0, 0xB1 → 1, ..., 0xB9 → 9 } else { break; // Invalid, should not happen } // Check for overflow if (nbr > LLONG_MAX / 10 || (nbr == LLONG_MAX / 10 && digit > LLONG_MAX % 10)) { return (negatif > 0) ? LLONG_MAX : LLONG_MIN; } nbr = nbr * 10 + digit; i += superscript_size; // Skip the entire UTF-8 character } return (nbr * negatif); }