/tests/libc/string.c

https://github.com/jbush001/GPGPU · C · 167 lines · 117 code · 31 blank · 19 comment · 3 complexity · 62fa5aea1f88a1a8d8f9cb16bb55a4af MD5 · raw file

  1. //
  2. // Copyright 2016 Jeff Bush
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. //
  8. // http://www.apache.org/licenses/LICENSE-2.0
  9. //
  10. // Unless required by applicable law or agreed to in writing, software
  11. // distributed under the License is distributed on an "AS IS" BASIS,
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. // See the License for the specific language governing permissions and
  14. // limitations under the License.
  15. //
  16. #include <stdio.h>
  17. #include <string.h>
  18. // Wrappers keep LLVM from creating inline versions of these automatically
  19. int get_sign(int value)
  20. {
  21. if (value < 0)
  22. return -1;
  23. else if (value > 0)
  24. return 1;
  25. return 0;
  26. }
  27. int __attribute__((noinline)) noinline_strcmp(const char *str1, const char *str2)
  28. {
  29. return strcmp(str1, str2);
  30. }
  31. int __attribute__((noinline)) noinline_memcmp(const void *a, const void *b, size_t length)
  32. {
  33. return memcmp(a, b, length);
  34. }
  35. int __attribute__((noinline)) noinline_strcasecmp(const char *str1, const char *str2)
  36. {
  37. return strcasecmp(str1, str2);
  38. }
  39. int __attribute__((noinline)) noinline_strncasecmp(const char *str1, const char *str2,
  40. size_t length)
  41. {
  42. return strncasecmp(str1, str2, length);
  43. }
  44. int __attribute__((noinline)) noinline_strncmp(const char *str1, const char *str2,
  45. size_t len)
  46. {
  47. return strncmp(str1, str2, len);
  48. }
  49. size_t __attribute__((noinline)) noinline_strlen(const char *str)
  50. {
  51. return strlen(str);
  52. }
  53. char __attribute__((noinline)) *noinline_strcpy(char *dest, const char *src)
  54. {
  55. return strcpy(dest, src);
  56. }
  57. char __attribute__((noinline)) *noinline_strncpy(char *dest, const char *src,
  58. size_t length)
  59. {
  60. return strncpy(dest, src, length);
  61. }
  62. char __attribute__((noinline)) *noinline_strchr(const char *string, int c)
  63. {
  64. return strchr(string, c);
  65. }
  66. void __attribute__((noinline)) *noinline_memchr(const void *string, int c, size_t n)
  67. {
  68. return memchr(string, c, n);
  69. }
  70. char __attribute__((noinline)) *noinline_strcat(char *c, const char *s)
  71. {
  72. return strcat(c, s);
  73. }
  74. int main()
  75. {
  76. char dest[64];
  77. printf("1.1 %d\n", get_sign(noinline_strcmp("foo", "foot"))); // CHECK: 1.1 -1
  78. printf("1.2 %d\n", get_sign(noinline_strcmp("foo", "fpo"))); // CHECK: 1.2 -1
  79. printf("1.3 %d\n", get_sign(noinline_strcmp("foo", "foo"))); // CHECK: 1.3 0
  80. printf("1.4 %d\n", get_sign(noinline_strcmp("foot", "foo"))); // CHECK: 1.4 1
  81. printf("1.5 %d\n", get_sign(noinline_strcmp("fpo", "foo"))); // CHECK: 1.5 1
  82. printf("2.1 %d\n", get_sign(noinline_memcmp("aaa", "aab", 3))); // CHECK: 2.1 -1
  83. printf("2.2 %d\n", get_sign(noinline_memcmp("aab", "aaa", 3))); // CHECK: 2.2 1
  84. printf("2.3 %d\n", get_sign(noinline_memcmp("aaa", "aaa", 3))); // CHECK: 2.3 0
  85. printf("3.1 %d\n", get_sign(noinline_strcasecmp("foo", "foot"))); // CHECK: 3.1 -1
  86. printf("3.2 %d\n", get_sign(noinline_strcasecmp("foo", "fpo"))); // CHECK: 3.2 -1
  87. printf("3.3 %d\n", get_sign(noinline_strcasecmp("foo", "foo"))); // CHECK: 3.3 0
  88. printf("3.4 %d\n", get_sign(noinline_strcasecmp("Foo", "foo"))); // CHECK: 3.4 0
  89. printf("3.5 %d\n", get_sign(noinline_strcasecmp("foot", "foo"))); // CHECK: 3.5 1
  90. printf("3.6 %d\n", get_sign(noinline_strcasecmp("fpo", "foo"))); // CHECK: 3.6 1
  91. printf("4.1 %d\n", get_sign(noinline_strncasecmp("foo", "foot", 4))); // CHECK: 4.1 -1
  92. printf("4.2 %d\n", get_sign(noinline_strncasecmp("foo", "fpo", 4))); // CHECK: 4.2 -1
  93. printf("4.3 %d\n", get_sign(noinline_strncasecmp("foo", "foo", 4))); // CHECK: 4.3 0
  94. printf("4.4 %d\n", get_sign(noinline_strncasecmp("Foo", "foo", 4))); // CHECK: 4.4 0
  95. printf("4.5 %d\n", get_sign(noinline_strncasecmp("Foot", "foo", 3))); // CHECK: 4.5 0
  96. printf("4.6 %d\n", get_sign(noinline_strncasecmp("foot", "foo", 4))); // CHECK: 4.6 1
  97. printf("4.7 %d\n", get_sign(noinline_strncasecmp("fpo", "foo", 4))); // CHECK: 4.7 1
  98. printf("5.1 %d\n", get_sign(noinline_strncmp("foo", "foot", 4))); // CHECK: 5.1 -1
  99. printf("5.2 %d\n", get_sign(noinline_strncmp("foo", "fpo", 4))); // CHECK: 5.2 -1
  100. printf("5.3 %d\n", get_sign(noinline_strncmp("foo", "foo", 4))); // CHECK: 5.3 0
  101. printf("5.4 %d\n", get_sign(noinline_strncmp("foot", "foo", 3))); // CHECK: 5.4 0
  102. printf("5.5 %d\n", get_sign(noinline_strncmp("foot", "foo", 4))); // CHECK: 5.5 1
  103. printf("5.6 %d\n", get_sign(noinline_strncmp("fpo", "foo", 4))); // CHECK: 5.6 1
  104. printf("6.1 %zu\n", noinline_strlen("")); // CHECK: 6.1 0
  105. printf("6.2 %zu\n", noinline_strlen("a")); // CHECK: 6.2 1
  106. printf("6.3 %zu\n", noinline_strlen("ab")); // CHECK: 6.3 2
  107. printf("6.4 %zu\n", noinline_strlen("abcdefg")); // CHECK: 6.4 7
  108. noinline_strcpy(dest, "jasdfha");
  109. printf("7.1 \"%s\"\n", dest); // CHECK: 7.1 "jasdfha"
  110. // This string is shorter. Ensure it null terminates properly.
  111. noinline_strcpy(dest, "zyx");
  112. printf("7.2 \"%s\"\n", dest); // CHECK: 7.2 "zyx"
  113. noinline_strncpy(dest, "poiuytrewq", 16);
  114. printf("8.1 \"%s\"\n", dest); // CHECK: 8.1 "poiuytrewq"
  115. // Copy over top of previous string.
  116. // Check that this doesn't null terminate and only copies 4 characters
  117. noinline_strncpy(dest, "lkjhgfdsa", 4);
  118. printf("8.2 \"%s\"\n", dest); // CHECK: 8.2 "lkjhytrewq"
  119. const char *search_str = "abcdefg";
  120. printf("9.1 %d\n", noinline_strchr(search_str, 'a') - search_str); // CHECK: 9.1 0
  121. printf("9.2 %d\n", noinline_strchr(search_str, 'c') - search_str); // CHECK: 9.2 2
  122. printf("9.3 %d\n", noinline_strchr(search_str, 'g') - search_str); // CHECK: 9.3 6
  123. printf("9.4 %p\n", noinline_strchr(search_str, 'h')); // CHECK: 9.4 0
  124. printf("10.1 %td\n", (char*) noinline_memchr(search_str, 'a', 7) - search_str); // CHECK: 10.1 0
  125. printf("10.2 %td\n", (char*) noinline_memchr(search_str, 'c', 7) - search_str); // CHECK: 10.2 2
  126. printf("10.3 %td\n", (char*) noinline_memchr(search_str, 'g', 7) - search_str); // CHECK: 10.3 6
  127. printf("10.4 %p\n", (char*) noinline_memchr(search_str, 'h', 7)); // CHECK: 10.4 0
  128. printf("10.5 %p\n", (char*) noinline_memchr(search_str, 'd', 3)); // CHECK: 10.5 0
  129. dest[0] = '\0';
  130. noinline_strcat(dest, "abc");
  131. printf("11.1 %s\n", dest); // CHECK: 11.1 abc
  132. noinline_strcat(dest, "def");
  133. printf("11.2 %s\n", dest); // CHECK: 11.2 abcdef
  134. noinline_strcat(dest, "ghi");
  135. printf("11.3 %s\n", dest); // CHECK: 11.3 abcdefghi
  136. }