示例#1
0
/* 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;
}
示例#2
0
/* 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;
}