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.
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

88 rindas
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. }