PageRenderTime 25ms CodeModel.GetById 37ms RepoModel.GetById 0ms app.codeStats 0ms

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

https://github.com/nicoya/OpenEmu
C++ Header | 48 lines | 34 code | 11 blank | 3 comment | 8 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