/* opens file in amiga namespace */ FILE *uade_open_amiga_file(char *aname, const char *playerdir) { char *separator; char *ptr; char copy[PATH_MAX]; char dirname[PATH_MAX]; char fake[PATH_MAX]; char real[PATH_MAX]; int len; DIR *dir; FILE *file; if (strlcpy(copy, aname, sizeof(copy)) >= sizeof(copy)) { __android_log_print(ANDROID_LOG_VERBOSE, "UADE", "UADE: error: Amiga tried to open a very long filename\nplease REPORT THIS!\n"); return NULL; } ptr = copy; if ((separator = strchr(ptr, (int) ':'))) { len = (int) (separator - ptr); memcpy(dirname, ptr, len); dirname[len] = 0; if (!strcasecmp(dirname, "ENV")) { snprintf(dirname, sizeof(dirname), "%s/ENV/", playerdir); } else if (!strcasecmp(dirname, "S")) { snprintf(dirname, sizeof(dirname), "%s/S/", playerdir); } else { __android_log_print(ANDROID_LOG_VERBOSE, "UADE", "UADE: open_amiga_file: unknown amiga volume (%s)\n", aname); return NULL; } if (!(dir = opendir(dirname))) { __android_log_print(ANDROID_LOG_VERBOSE, "UADE", "UADE: Can't open dir (%s) (volume parsing)\n", dirname); return NULL; } closedir(dir); ptr = separator + 1; } else { if (*ptr == '/') { /* absolute path */ strlcpy(dirname, "/", sizeof(dirname)); ptr++; } else { /* relative path */ strlcpy(dirname, "./", sizeof(dirname)); } } while ((separator = strchr(ptr, (int) '/'))) { len = (int) (separator - ptr); if (!len) { ptr++; continue; } memcpy(fake, ptr, len); fake[len] = 0; if (uade_amiga_scandir(real, dirname, fake, sizeof(real))) { /* found matching entry */ if (strlcat(dirname, real, sizeof(dirname)) >= sizeof(dirname)) { __android_log_print(ANDROID_LOG_VERBOSE, "UADE", "UADE: Too long dir path (%s + %s)\n", dirname, real); return NULL; } if (strlcat(dirname, "/", sizeof(dirname)) >= sizeof(dirname)) { __android_log_print(ANDROID_LOG_VERBOSE, "UADE", "UADE: Too long dir path (%s + %s)\n", dirname, "/"); return NULL; } } else { /* didn't find entry */ return NULL; } ptr = separator + 1; } if (!(dir = opendir(dirname))) { __android_log_print(ANDROID_LOG_VERBOSE, "UADE", "Can't open dir (%s) (after dir scanning)\n", dirname); return NULL; } closedir(dir); if (uade_amiga_scandir(real, dirname, ptr, sizeof(real))) { /* found matching entry */ if (strlcat(dirname, real, sizeof(dirname)) >= sizeof(dirname)) { __android_log_print(ANDROID_LOG_VERBOSE, "UADE", "UADE: Too long dir path (%s + %s)\n", dirname, real); return NULL; } } else { /* didn't find entry */ return NULL; } if (!(file = fopen(dirname, "r"))) { __android_log_print(ANDROID_LOG_VERBOSE, "UADE", "UADE: Couldn't open file (%s) induced by (%s)\n", dirname, aname); } return file; }
/* opens file in amiga namespace */ FILE *uade_open_amiga_file(char *aname, const char *playerdir) { char *separator; char *ptr; char copy[PATH_MAX]; char dirname[PATH_MAX]; char fake[PATH_MAX]; char real[PATH_MAX]; int len; DIR *dir; FILE *file; // printf("open amiga file: %s\nin: %s\n",aname,playerdir); //hack for TFMX if (strstr(aname,".mdat")&&strstr(aname,"smpl.")) { char tmp_str[PATH_MAX]; char *tmp_str_ptr1,*tmp_str_ptr2; strcpy(tmp_str,aname); tmp_str_ptr1=strrchr(tmp_str,'.'); *tmp_str_ptr1=0; sprintf(aname,"%s.smpl",tmp_str); tmp_str_ptr1=strstr(aname,"smpl."); *tmp_str_ptr1=0; tmp_str_ptr2=tmp_str_ptr1+5; sprintf(tmp_str,"%s%s",aname,tmp_str_ptr2); strcpy(aname,tmp_str); } char *tmp_str; tmp_str=strchr(aname,':'); if (tmp_str) { tmp_str=strrchr(aname,'/'); if (!tmp_str) tmp_str=aname; else tmp_str++; if (strlcpy(copy, tmp_str, sizeof(copy)) >= sizeof(copy)) { printf("uade: error: amiga tried to open a very long filename\nplease REPORT THIS!\n"); return NULL; } ptr = copy; // printf("uade: opening %s\n", ptr); sprintf(real,"%s/%s",playerdir,copy); // printf("uade: really opening %s\n", real); file=fopen(real,"rb"); return file; } else { file=fopen(aname,"rb"); //dirty hack for some files if (!file) { if (strstr(aname,"SMP.")) { //Richard Joseph file: try to open smp.xxx instead of SMP.xxx char *tmp_str=strstr(aname,"SMP."); tmp_str[0]='s'; tmp_str[1]='m'; tmp_str[2]='p'; //printf("real: %s\n",aname); file=fopen(aname,"rb"); } } return file; } if ((separator = strchr(aname, (int) ':'))) { /* len = (int) (separator - ptr); memcpy(dirname, ptr, len); dirname[len] = 0; if (!strcasecmp(dirname, "ENV")) { snprintf(dirname, sizeof(dirname), "%s/ENV/", playerdir); } else if (!strcasecmp(dirname, "S")) { snprintf(dirname, sizeof(dirname), "%s/S/", playerdir); } else { fprintf(stderr, "uade: open_amiga_file: unknown amiga volume (%s)\n", aname); return NULL; }*/ //snprintf(dirname, sizeof(dirname), "%s/", playerdir); sprintf(dirname,"%s/",playerdir); // printf("uade: opening really %s\n", dirname); if (!(dir = opendir(dirname))) { fprintf(stderr, "uade: can't open dir (%s) (volume parsing)\n", dirname); return NULL; } closedir(dir); /* fprintf(stderr, "uade: opening from dir %s\n", dirname); */ //ptr = separator + 1; } else { /*if (*ptr == '/') { // absolute path strlcpy(dirname, "/", sizeof(dirname)); ptr++; } else { // relative path strlcpy(dirname, "./", sizeof(dirname)); }*/ } while ((separator = strchr(ptr, (int) '/'))) { len = (int) (separator - ptr); if (!len) { ptr++; continue; } memcpy(fake, ptr, len); fake[len] = 0; if (uade_amiga_scandir(real, dirname, fake, sizeof(real))) { /* found matching entry */ if (strlcat(dirname, real, sizeof(dirname)) >= sizeof(dirname)) { fprintf(stderr, "uade: too long dir path (%s + %s)\n", dirname, real); return NULL; } if (strlcat(dirname, "/", sizeof(dirname)) >= sizeof(dirname)) { fprintf(stderr, "uade: too long dir path (%s + %s)\n", dirname, "/"); return NULL; } } else { /* didn't find entry */ /* fprintf (stderr, "uade: %s not found from (%s) (dir scanning)\n", fake, dirname); */ return NULL; } ptr = separator + 1; } /* fprintf(stderr, "uade: pass 3: (%s) (%s)\n", dirname, ptr); */ if (!(dir = opendir(dirname))) { fprintf(stderr, "can't open dir (%s) (after dir scanning)\n", dirname); return NULL; } closedir(dir); if (uade_amiga_scandir(real, dirname, ptr, sizeof(real))) { /* found matching entry */ if (strlcat(dirname, real, sizeof(dirname)) >= sizeof(dirname)) { printf("uade: too long dir path (%s + %s)\n", dirname, real); return NULL; } } else { /* didn't find entry */ printf (stderr, "uade: %s not found from %s\n", ptr, dirname); return NULL; } if (!(file = fopen(dirname, "r"))) { printf ("uade: couldn't open file (%s) induced by (%s)\n", dirname, aname); } return file; }