PageRenderTime 60ms CodeModel.GetById 33ms RepoModel.GetById 0ms app.codeStats 0ms

/nall/string/strl.hpp

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