|  | ================ | 
|  | String Functions | 
|  | ================ | 
|  |  | 
|  | .. include:: check.rst | 
|  |  | 
|  | --------------- | 
|  | Source location | 
|  | --------------- | 
|  |  | 
|  | -   The main source for string functions is located at: | 
|  | ``libc/src/string``. | 
|  |  | 
|  | -   The source for string conversion functions is located at: | 
|  | ``libc/src/stdlib`` and | 
|  | ``libc/src/__support``. | 
|  |  | 
|  | -   The tests are located at: | 
|  | ``libc/test/src/string``, | 
|  | ``libc/test/src/stdlib``, and | 
|  | ``libc/test/src/__support`` | 
|  | respectively. | 
|  |  | 
|  | --------------------- | 
|  | Implementation Status | 
|  | --------------------- | 
|  |  | 
|  | Primary memory functions | 
|  | ======================== | 
|  |  | 
|  | .. TODO(gchatelet): add details about the memory functions. | 
|  |  | 
|  |  | 
|  | =============  ========= | 
|  | Function Name  Available | 
|  | =============  ========= | 
|  | bzero          |check| | 
|  | bcmp           |check| | 
|  | bcopy          |check| | 
|  | memcpy         |check| | 
|  | memset         |check| | 
|  | memcmp         |check| | 
|  | memmove        |check| | 
|  | =============  ========= | 
|  |  | 
|  |  | 
|  | Other Raw Memory Functions | 
|  | ========================== | 
|  |  | 
|  | =============  ========= | 
|  | Function Name  Available | 
|  | =============  ========= | 
|  | memchr         |check| | 
|  | memrchr        |check| | 
|  | memccpy        |check| | 
|  | mempcpy        |check| | 
|  | =============  ========= | 
|  |  | 
|  | String Memory Functions | 
|  | ======================= | 
|  |  | 
|  | =============  ========= | 
|  | Function Name  Available | 
|  | =============  ========= | 
|  | stpcpy         |check| | 
|  | stpncpy        |check| | 
|  | strcpy         |check| | 
|  | strncpy        |check| | 
|  | strcat         |check| | 
|  | strncat        |check| | 
|  | strdup         |check| | 
|  | strndup        |check| | 
|  | =============  ========= | 
|  |  | 
|  | String Examination Functions | 
|  | ============================ | 
|  |  | 
|  | =============  ========= | 
|  | Function Name  Available | 
|  | =============  ========= | 
|  | strlen         |check| | 
|  | strnlen        |check| | 
|  | strcmp         |check| | 
|  | strncmp        |check| | 
|  | strchr         |check| | 
|  | strrchr        |check| | 
|  | strspn         |check| | 
|  | strcspn        |check| | 
|  | strpbrk        |check| | 
|  | strstr         |check| | 
|  | strtok         |check| | 
|  | strtok_r       |check| | 
|  | =============  ========= | 
|  |  | 
|  | String Conversion Functions | 
|  | ============================ | 
|  |  | 
|  | These functions are not in strings.h, but are still primarily string | 
|  | functions, and are therefore tracked along with the rest of the string | 
|  | functions. | 
|  |  | 
|  | The String to float functions were implemented using the Eisel-Lemire algorithm | 
|  | (read more about the algorithm here: `The Eisel-Lemire ParseNumberF64 Algorithm | 
|  | <https://nigeltao.github.io/blog/2020/eisel-lemire.html>`_). This improved | 
|  | the performance of string to float and double, and allowed it to complete this | 
|  | comprehensive test 15% faster than glibc: `Parse Number FXX Test Data | 
|  | <https://github.com/nigeltao/parse-number-fxx-test-data>`_. The test was done | 
|  | with LLVM-libc built on 2022-04-14 and Debian GLibc version 2.33-6. The targets | 
|  | ``libc_str_to_float_comparison_test`` and | 
|  | ``libc_system_str_to_float_comparison_test`` were built and run on the test data | 
|  | 10 times each, skipping the first run since it was an outlier. | 
|  |  | 
|  |  | 
|  | =============  ========= | 
|  | Function Name  Available | 
|  | =============  ========= | 
|  | atof           |check| | 
|  | atoi           |check| | 
|  | atol           |check| | 
|  | atoll          |check| | 
|  | strtol         |check| | 
|  | strtoll        |check| | 
|  | strtoul        |check| | 
|  | strtoull       |check| | 
|  | strtof         |check| | 
|  | strtod         |check| | 
|  | strtold        |check| | 
|  | strtoimax      |check| | 
|  | strtoumax      |check| | 
|  | =============  ========= | 
|  |  | 
|  | String Error Functions | 
|  | ====================== | 
|  |  | 
|  | =============  ========= | 
|  | Function Name  Available | 
|  | =============  ========= | 
|  | strerror       |check| | 
|  | strerror_r     |check| | 
|  | =============  ========= | 
|  |  | 
|  | Localized String Functions | 
|  | ========================== | 
|  |  | 
|  | These functions require locale.h, and will be finished when locale support is | 
|  | implemented in LLVM-libc. | 
|  |  | 
|  | =============  ========= | 
|  | Function Name  Available | 
|  | =============  ========= | 
|  | strcoll        Partially | 
|  | strxfrm        Partially | 
|  | =============  ========= | 
|  |  | 
|  | --------------------------- | 
|  | \<name\>_s String Functions | 
|  | --------------------------- | 
|  |  | 
|  | Many String functions have an equivalent _s version, which is intended to be | 
|  | more secure and safe than the previous standard. These functions add runtime | 
|  | error detection and overflow protection. While they can be seen as an | 
|  | improvement, adoption remains relatively low among users. In addition, they are | 
|  | being considered for removal, see | 
|  | `Field Experience With Annex K — Bounds Checking Interfaces | 
|  | <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm>`_. For these reasons, | 
|  | there is no ongoing work to implement them. |