Merge "string.h: add __attribute__ ((pure)) to string functions"
diff --git a/libc/include/string.h b/libc/include/string.h
index 613dcd7..6e6c8e6 100644
--- a/libc/include/string.h
+++ b/libc/include/string.h
@@ -35,54 +35,54 @@
 __BEGIN_DECLS
 
 extern void*  memccpy(void *, const void *, int, size_t);
-extern void*  memchr(const void *, int, size_t);
-extern void*  memrchr(const void *, int, size_t);
-extern int    memcmp(const void *, const void *, size_t);
+extern void*  memchr(const void *, int, size_t) __purefunc;
+extern void*  memrchr(const void *, int, size_t) __purefunc;
+extern int    memcmp(const void *, const void *, size_t) __purefunc;
 extern void*  memcpy(void *, const void *, size_t);
 extern void*  memmove(void *, const void *, size_t);
 extern void*  memset(void *, int, size_t);
-extern void*  memmem(const void *, size_t, const void *, size_t);
+extern void*  memmem(const void *, size_t, const void *, size_t) __purefunc;
 extern void   memswap(void *, void *, size_t);
 
-extern char*  index(const char *, int);
-extern char*  rindex(const char *, int);
-extern char*  strchr(const char *, int);
-extern char*  strrchr(const char *, int);
+extern char*  index(const char *, int) __purefunc;
+extern char*  rindex(const char *, int) __purefunc;
+extern char*  strchr(const char *, int) __purefunc;
+extern char*  strrchr(const char *, int) __purefunc;
 
-extern size_t strlen(const char *);
-extern int    strcmp(const char *, const char *);
+extern size_t strlen(const char *) __purefunc;
+extern int    strcmp(const char *, const char *) __purefunc;
 extern char*  strcpy(char *, const char *);
 extern char*  strcat(char *, const char *);
 
-extern int    strcasecmp(const char *, const char *);
-extern int    strncasecmp(const char *, const char *, size_t);
+extern int    strcasecmp(const char *, const char *) __purefunc;
+extern int    strncasecmp(const char *, const char *, size_t) __purefunc;
 extern char*  strdup(const char *);
 
-extern char*  strstr(const char *, const char *);
-extern char*  strcasestr(const char *haystack, const char *needle);
+extern char*  strstr(const char *, const char *) __purefunc;
+extern char*  strcasestr(const char *haystack, const char *needle) __purefunc;
 extern char*  strtok(char *, const char *);
 extern char*  strtok_r(char *, const char *, char**);
 
 extern char*  strerror(int);
 extern int    strerror_r(int errnum, char *buf, size_t n);
 
-extern size_t strnlen(const char *, size_t);
+extern size_t strnlen(const char *, size_t) __purefunc;
 extern char*  strncat(char *, const char *, size_t);
 extern char*  strndup(const char *, size_t);
-extern int    strncmp(const char *, const char *, size_t);
+extern int    strncmp(const char *, const char *, size_t) __purefunc;
 extern char*  strncpy(char *, const char *, size_t);
 
 extern size_t strlcat(char *, const char *, size_t);
 extern size_t strlcpy(char *, const char *, size_t);
 
-extern size_t strcspn(const char *, const char *);
-extern char*  strpbrk(const char *, const char *);
+extern size_t strcspn(const char *, const char *) __purefunc;
+extern char*  strpbrk(const char *, const char *) __purefunc;
 extern char*  strsep(char **, const char *);
 extern size_t strspn(const char *, const char *);
 
 extern char*  strsignal(int  sig);
 
-extern int    strcoll(const char *, const char *);
+extern int    strcoll(const char *, const char *) __purefunc;
 extern size_t strxfrm(char *, const char *, size_t);
 
 __END_DECLS
diff --git a/libc/include/sys/cdefs.h b/libc/include/sys/cdefs.h
index 92035d4..71b419c 100644
--- a/libc/include/sys/cdefs.h
+++ b/libc/include/sys/cdefs.h
@@ -306,9 +306,11 @@
 #if __GNUC_PREREQ__(2, 96)
 #define __noreturn    __attribute__((__noreturn__))
 #define __mallocfunc  __attribute__((malloc))
+#define __purefunc    __attribute__((pure))
 #else
 #define __noreturn
 #define __mallocfunc
+#define __purefunc
 #endif
 
 /*