This file describes the implementation status and some notes; information is taken from the C99 standard (ISO/IEC 9899:1999), section 7 ("Library"). # Notes for implementers 7.1.2§6: Use (extern) in all function prototypes 7.1.3§1: Only expose standard identifiers; anything else might be defined as a macro. Make sure every argument name, internal function name, etc. starts with either "__" or "_X" (where X is any uppercase letter) 7.1.4§1: Always give a function even if there is a macro definition, so that the address of the function can be taken; don't rely on the macro being defined, as the user can remove it except in some special cases String functions (mainly in ) can use 4-byte accesses, and in doing so read up to 3 bytes after the end of the string if it is not padded (which malloc'd strings and literal strings both are, leaving only stack-allocated and statically-allocated ones). This allows important speed optimizations. The extra access cannot trigger memory protection because there is no valid memory less than 4 bytes before the end of any protection region. The extra access might trigger the UBC in very specific scenarios, but we don't really care. # Status In this file, every definition is classified in one of several implementation statuses. There are 5 stages that every definition should go through. TODO: Function/symbol/macro is not implemented/defined BDEPS(...): Function/symbol/macro needs ... to build LDEPS(...): Function/symbol/macro needs ... to link TEST: Function/symbol/macro needs to be tested -: Function/symbol/macro is defined, builds, links, and is tested 7.2 7.2.1 assert LDEPS(fprintf,stderr) 7.3 => OpenLibm 7.4 7.4.1 is* - 7.4.2 to* - 7.5 7.5.2 EDOM, EILSEQ, ERANGE - 7.6 => OpenLibm 7.7 => GCC 7.8 7.8.1 PRI* macros - 7.8.1 SCN* macros - 7.8.2.1 imaxabs - 7.8.2.2 imaxdiv - 7.8.2.3 strtoimax, strtoumax - 7.8.2.4 wcstoimax, wcstoumax TODO 7.9 => GCC 7.10 => GCC 7.11 7.11.1 setlocale TEST 7.11.2 localeconv TEST 7.12 => OpenLibm 7.13 7.13.1 setjmp - 7.13.2 longjmp - 7.14 7.14.1.1 signal - 7.14.1.2 raise - 7.15 => GCC 7.16 => GCC 7.17 => GCC 7.18 => GCC 7.19 7.19.1 Introduction - (no wide-oriented streams *) 7.19.1 stdin, stdout, stderr - 7.19.4.1 remove TEST 7.19.4.2 rename TODO 7.19.4.3 tmpfile TODO 7.19.4.4 tmpnam TODO 7.19.5.1 fclose - 7.19.5.2 fflush - (fflush(NULL) not supported yet) 7.19.5.3 fopen - (EXT) fdopen - 7.19.5.4 freopen - 7.19.5.5 setbuf - 7.19.5.6 setvbuf - 7.19.6.1 fprintf - 7.19.6.2 fscanf TODO 7.19.6.3 printf - 7.19.6.4 scanf TODO 7.19.6.5 snprintf - 7.19.6.6 sprintf - 7.19.6.7 sscanf TODO 7.19.6.8 vfprintf - 7.19.6.9 vfscanf TODO 7.19.6.10 vprintf - 7.19.6.11 vscanf TODO 7.19.6.12 vsnprintf - 7.19.6.13 vsprintf - 7.19.6.14 vsscanf TODO (EXT) asprintf - (EXT) vasprintf - (EXT) dprintf - (EXT) vdprintf - 7.19.7.1 fgetc - 7.19.7.2 fgets - 7.19.7.3 fputc - 7.19.7.4 fputs - 7.19.7.5 getc - 7.19.7.6 getchar - 7.19.7.7 gets - 7.19.7.8 putc - 7.19.7.9 putchar - 7.19.7.10 puts - 7.19.7.11 ungetc - (EXT) getline - (EXT) getdelim - 7.19.8.1 fread - 7.19.8.2 fwrite - 7.19.9.1 fgetpos - 7.19.9.2 fseek - 7.19.9.3 fsetpos - 7.19.9.4 ftell - 7.19.9.5 rewind - 7.19.10.1 clearerr - 7.19.10.2 feof - 7.19.10.3 ferror - 7.19.10.4 perror - 7.20 7.20 MB_CUR_MAX TODO 7.20.1.1 atof - 7.20.1.2 atoi, atol, atoll - 7.20.1.3 strtod, strtof, strtold - 7.20.1.4 strtol, strtoul - 7.20.1.4 strtoll, strtoull - 7.20.2.1 rand - 7.20.2.2 srand - 7.20.3.1 calloc - 7.20.3.2 free - (gint) 7.20.3.3 malloc - (gint) 7.20.3.4 realloc - (gint) 7.20.4.1 abort - (stream flushing/closing/etc?) 7.20.4.2 atexit TODO 7.20.4.3 exit - (stream flushing/closing/etc?) 7.20.4.4 _Exit - (gint) 7.20.4.5 getenv TODO 7.20.4.6 system TODO 7.20.5.1 bsearch TODO 7.20.5.2 qsort TEST 7.20.6.1 abs, labs, llabs - 7.20.6.2 div, ldiv, lldiv - 7.20.7 Multibyte/wide char conv TODO 7.20.8 Multibyte/wide string conv TODO 7.21 7.21.2.1 memcpy - 7.21.2.2 memmove - (Unoptimized: byte-by-byte) 7.21.2.3 strcpy - 7.21.2.4 strncpy - 7.21.3.1 strcat - 7.21.3.2 strncat - 7.21.4.1 memcmp - 7.21.4.2 strcmp - 7.21.4.3 strcoll - 7.21.4.4 strncmp - 7.21.4.5 strxfrm - 7.21.5.1 memchr - 7.21.5.2 strchr - 7.21.5.3 strcspn - 7.21.5.4 strpbrk - 7.21.5.5 strrchr - 7.21.5.6 strspn - 7.21.5.7 strstr - 7.21.5.8 strtok - 7.21.6.1 memset - 7.21.6.2 strerror - 7.21.6.3 strlen - (EXT) strnlen - (EXT) strchrnul - (EXT) strcasestr - (EXT) strcasecmp - (EXT) strncasecmp - (EXT) strdup - (EXT) strndup - (EXT) memrchr - (Unoptimized: byte-by-byte) 7.22 => GCC 7.23 7.23.2.1 clock - 7.23.2.2 difftime - 7.23.2.3 mktime - (DST flag ignored) 7.23.2.4 time - 7.23.3.1 asctime - 7.23.3.2 ctime - 7.23.3.3 gmtime - 7.23.3.4 localtime - (No timezones; same as gmtime) 7.23.3.5 strftime - (No %g, %G, %U, %V, %W, %z, %Z) 7.24 TODO (not a priority) 7.25 TODO (not a priority) # Supporting locales What if we wanted to support more locales? -> Need to a mechanism to supply the raw information, similar to the text files in /usr/share/i18n/locales -> Implement setlocale() and localeconv() properly (not hard) -> Probably support nl_langinfo(), which is much better than localeconv() -> Fix the "TODO: locale: ..." messages wherever assumptions on the locale are made in the code -> Properly implement strcoll() and strxfrm() -> Add support in strftime() # Supporting text and binary files (newline translation) Because of 7.19.2§1.223 we don't need to support newline translation. # Support wide-oriented streams This requires all the wide-char functions but also updating fpos_t to be a structure with at least some mbstate_t member (7.19.2§6). I really don't want to do that. Use multi-byte functions with UTF-8. # Supporting timezones -> Update localtime() -> Add some timezone API