/BSNES/core/lib/nall/string/strl.hpp

https://github.com/nicoya/OpenEmu · C++ Header · 48 lines · 34 code · 11 blank · 3 comment · 12 complexity · aeabd2a1477f4019d57a734525a6c9a5 MD5 · raw file

  1. #ifndef NALL_STRING_STRL_HPP
  2. #define NALL_STRING_STRL_HPP
  3. //strlcpy, strlcat based on OpenBSD implementation by Todd C. Miller
  4. //return = strlen(src)
  5. inline size_t strlcpy(char *dest, const char *src, size_t length) {
  6. char *d = dest;
  7. const char *s = src;
  8. size_t n = length;
  9. if(n) {
  10. while(--n && (*d++ = *s++)); //copy as many bytes as possible, or until null terminator reached
  11. }
  12. if(!n) {
  13. if(length) *d = 0;
  14. while(*s++); //traverse rest of s, so that s - src == strlen(src)
  15. }
  16. return (s - src - 1); //return length of copied string, sans null terminator
  17. }
  18. //return = strlen(src) + min(length, strlen(dest))
  19. inline size_t strlcat(char *dest, const char *src, size_t length) {
  20. char *d = dest;
  21. const char *s = src;
  22. size_t n = length;
  23. while(n-- && *d) d++; //find end of dest
  24. size_t dlength = d - dest;
  25. n = length - dlength; //subtract length of dest from maximum string length
  26. if(!n) return dlength + strlen(s);
  27. while(*s) {
  28. if(n != 1) {
  29. *d++ = *s;
  30. n--;
  31. }
  32. s++;
  33. }
  34. *d = 0;
  35. return dlength + (s - src); //return length of resulting string, sans null terminator
  36. }
  37. #endif