* Converts a substring given by 'str' and 'len' into * a date time unit enum value. The 'metastr' parameter * is used for error messages, and may be NULL. * * Returns NPY_DATETIMEUNIT on success, NPY_FR_ERROR on failure. */
| 1714 | * Returns NPY_DATETIMEUNIT on success, NPY_FR_ERROR on failure. |
| 1715 | */ |
| 1716 | NPY_NO_EXPORT NPY_DATETIMEUNIT |
| 1717 | parse_datetime_unit_from_string(char const *str, Py_ssize_t len, char const *metastr) |
| 1718 | { |
| 1719 | /* Use switch statements so the compiler can make it fast */ |
| 1720 | if (len == 1) { |
| 1721 | switch (str[0]) { |
| 1722 | case 'Y': |
| 1723 | return NPY_FR_Y; |
| 1724 | case 'M': |
| 1725 | return NPY_FR_M; |
| 1726 | case 'W': |
| 1727 | return NPY_FR_W; |
| 1728 | case 'D': |
| 1729 | return NPY_FR_D; |
| 1730 | case 'h': |
| 1731 | return NPY_FR_h; |
| 1732 | case 'm': |
| 1733 | return NPY_FR_m; |
| 1734 | case 's': |
| 1735 | return NPY_FR_s; |
| 1736 | } |
| 1737 | } |
| 1738 | /* All the two-letter units are variants of seconds */ |
| 1739 | else if (len == 2 && str[1] == 's') { |
| 1740 | switch (str[0]) { |
| 1741 | case 'm': |
| 1742 | return NPY_FR_ms; |
| 1743 | case 'u': |
| 1744 | return NPY_FR_us; |
| 1745 | case 'n': |
| 1746 | return NPY_FR_ns; |
| 1747 | case 'p': |
| 1748 | return NPY_FR_ps; |
| 1749 | case 'f': |
| 1750 | return NPY_FR_fs; |
| 1751 | case 'a': |
| 1752 | return NPY_FR_as; |
| 1753 | } |
| 1754 | } |
| 1755 | else if (len == 3 && !strncmp(str, "\xce\xbcs", 3)) { |
| 1756 | /* greek small letter mu, utf8-encoded */ |
| 1757 | return NPY_FR_us; |
| 1758 | } |
| 1759 | else if (len == 7 && !strncmp(str, "generic", 7)) { |
| 1760 | return NPY_FR_GENERIC; |
| 1761 | } |
| 1762 | |
| 1763 | /* If nothing matched, it's an error */ |
| 1764 | if (metastr == NULL) { |
| 1765 | PyErr_Format(PyExc_TypeError, |
| 1766 | "Invalid datetime unit \"%s\" in metadata", |
| 1767 | str); |
| 1768 | } |
| 1769 | else { |
| 1770 | PyErr_Format(PyExc_TypeError, |
| 1771 | "Invalid datetime unit in metadata string \"%s\"", |
| 1772 | metastr); |
| 1773 | } |
no outgoing calls
no test coverage detected