NESe (pronounced "Nessie") is a NES emulator based on the e6502 emulator, also written in C with a focus on speed and portability for use on embedded platforms, especially ARM.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
2.2KB

  1. #include <errno.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "file.h"
  5. const char* basename(const char* filename) {
  6. const char* slash = filename + strlen(filename) - 1;
  7. for ( ; slash >= filename &&
  8. *slash != '\\' &&
  9. *slash != '/';
  10. --slash );
  11. return &slash[1];
  12. }
  13. int replace_extension(char* filename, int max_len,
  14. const char* orig_name, const char* ext) {
  15. int status = 0;
  16. int remain = max_len;
  17. const char* orig_base = basename(orig_name);
  18. const char* orig_dot = strrchr(orig_base, '.');
  19. int orig_base_len = (NULL == orig_dot) ?
  20. strlen(orig_name) :
  21. (orig_dot - orig_name);
  22. if (orig_base_len <= remain) {
  23. strncpy(filename, orig_name, orig_base_len);
  24. remain -= orig_base_len;
  25. filename += orig_base_len;
  26. } else {
  27. status = -1;
  28. }
  29. if (0 == status && NULL != ext) {
  30. int ext_len = strlen(ext);
  31. if ((ext_len + 1) <= remain) {
  32. *filename++ = '.';
  33. strncpy(filename, ext, ext_len);
  34. remain -= (ext_len + 1);
  35. } else {
  36. status = -1;
  37. }
  38. }
  39. return (status < 0 ? status : (max_len - remain));
  40. }
  41. int write_file(const char* filename, const void* data, int len) {
  42. int status = -1;
  43. FILE* file = fopen(filename, "wb");
  44. if (NULL != file) {
  45. if (1 == fwrite(data, len, 1, file)) {
  46. status = 0;
  47. } else {
  48. fprintf(stderr, "Failed to write %d bytes from %s: %d\n", len, filename, errno);
  49. }
  50. fclose(file);
  51. } else {
  52. fprintf(stderr, "Failed to open %s: %d\n", filename, errno);
  53. }
  54. return status;
  55. }
  56. int read_file(const char* filename, void* data, int len) {
  57. int status = -1;
  58. FILE* file = fopen(filename, "rb");
  59. if (NULL != file) {
  60. if (1 == fread(data, len, 1, file)) {
  61. status = 0;
  62. } else {
  63. fprintf(stderr, "Failed to read %d bytes from %s: %d\n", len, filename, errno);
  64. }
  65. fclose(file);
  66. } else {
  67. fprintf(stderr, "Failed to open %s: %d\n", filename, errno);
  68. }
  69. return status;
  70. }