Example #1
0
static int process_module(char *credits, size_t credits_len, char *filename)
{
	FILE *modfile;
	struct stat st;
	size_t modfilelen;
	unsigned char *buf;
	char pre[11];
	char tmpstr[256];
	size_t rb;
#ifndef EMSCRIPTEN 
	if (!(modfile = fopen(filename, "rb")))
		return 0;

	if (fstat(fileno(modfile), &st))
		return 0;

	modfilelen = st.st_size;
#else
	struct AFILE *uo= uade_fopen(filename, "rb");
  	
	if ((modfile = uo->file) == NULL)	{
		if (uo->async_status<0)
			return -1;
		return 0;
	}
	modfilelen= uade_get_file_size(filename);
#endif	
	if ((buf = malloc(modfilelen)) == NULL) {
		fprintf(stderr, "uade: can't allocate mem in process_module()");
		fclose(modfile);
		return 0;
	}

	rb = 0;
	while (rb < modfilelen) {
		size_t ret = fread(&buf[rb], 1, modfilelen - rb, modfile);
		if (ret == 0)
			break;
		rb += ret;
	}

	fclose(modfile);

	if (rb < modfilelen) {
		fprintf(stderr, "uade: song info could not read %s fully\n",
			filename);
		free(buf);
		return 0;
	}

	snprintf(tmpstr, sizeof tmpstr, "UADE2 MODINFO:\n\nFile name:      %s\nFile length:    %zd bytes\n", filename, modfilelen);
	strlcpy(credits, tmpstr, credits_len);

	/* Get filetype in pre */
	uade_filemagic(buf, modfilelen, pre, modfilelen, filename, 0);

	snprintf(tmpstr, sizeof tmpstr, "File prefix:    %s.*\n", pre);
	strlcat(credits, tmpstr, credits_len);

	if (strcasecmp(pre, "CUST") == 0) {
		/* CUST */
		process_custom(credits, credits_len, buf, modfilelen);

	} else if (strcasecmp(pre, "DM2") == 0) {
		/* DM2 */
		process_dm2_mod(credits, credits_len, buf, modfilelen);

	} else if (strcasecmp(pre, "DIGI") == 0) {
		/* DIGIBooster */
		process_digi_mod(credits, credits_len, buf, modfilelen);

	} else if ((strcasecmp(pre, "AHX") == 0) ||
		   (strcasecmp(pre, "THX") == 0)) {
		/* AHX */
		process_ahx_mod(credits, credits_len, buf, modfilelen);

	} else if ((strcasecmp(pre, "MOD15") == 0) ||
		   (strcasecmp(pre, "MOD15_UST") == 0) ||
		   (strcasecmp(pre, "MOD15_MST") == 0) ||
		   (strcasecmp(pre, "MOD15_ST-IV") == 0)) {
		/*MOD15 */
		process_ptk_mod(credits, credits_len, 15, buf, modfilelen);

	} else if ((strcasecmp(pre, "MOD") == 0) ||
		   (strcasecmp(pre, "MOD_DOC") == 0) ||
		   (strcasecmp(pre, "MOD_NTK") == 0) ||
		   (strcasecmp(pre, "MOD_NTK1") == 0) ||
		   (strcasecmp(pre, "MOD_NTK2") == 0) ||
		   (strcasecmp(pre, "MOD_FLT4") == 0) ||
		   (strcasecmp(pre, "MOD_FLT8") == 0) ||
		   (strcasecmp(pre, "MOD_ADSC4") == 0) ||
		   (strcasecmp(pre, "MOD_ADSC8") == 0) ||
		   (strcasecmp(pre, "MOD_COMP") == 0) ||
		   (strcasecmp(pre, "MOD_NTKAMP") == 0) ||
		   (strcasecmp(pre, "PPK") == 0) ||
		   (strcasecmp(pre, "MOD_PC") == 0) ||
		   (strcasecmp(pre, "ICE") == 0) ||
		   (strcasecmp(pre, "ADSC") == 0)) {
		 /*MOD*/
		    process_ptk_mod(credits, credits_len, 31, buf, modfilelen);
	} else if (strcasecmp(pre, "DL") == 0) {
		process_WTWT_mod(credits, credits_len, buf, modfilelen, "UNCL",
				 "EART", 0x28);
	} else if (strcasecmp(pre, "BSS") == 0) {
		process_WTWT_mod(credits, credits_len, buf, modfilelen, "BEAT",
				 "HOVE", 0x1c);
	} else if (strcasecmp(pre, "GRAY") == 0) {
		process_WTWT_mod(credits, credits_len, buf, modfilelen, "FRED",
				 "GRAY", 0x10);
	} else if (strcasecmp(pre, "JMF") == 0) {
		process_WTWT_mod(credits, credits_len, buf, modfilelen, "J.FL",
				 "OGEL", 0x14);
	} else if (strcasecmp(pre, "SPL") == 0) {
		process_WTWT_mod(credits, credits_len, buf, modfilelen, "!SOP",
				 "ROL!", 0x10);
	} else if (strcasecmp(pre, "HD") == 0) {
		process_WTWT_mod(credits, credits_len, buf, modfilelen, "H.DA",
				 "VIES", 24);
	} else if (strcasecmp(pre, "RIFF") == 0) {
		process_WTWT_mod(credits, credits_len, buf, modfilelen, "RIFF",
				 "RAFF", 0x14);
	} else if (strcasecmp(pre, "FP") == 0) {
		process_WTWT_mod(credits, credits_len, buf, modfilelen, "F.PL",
				 "AYER", 0x8);
	} else if (strcasecmp(pre, "CORE") == 0) {
		process_WTWT_mod(credits, credits_len, buf, modfilelen, "S.PH",
				 "IPPS", 0x20);
	} else if (strcasecmp(pre, "BDS") == 0) {
		process_WTWT_mod(credits, credits_len, buf, modfilelen, "DAGL",
				 "ISH!", 0x14);
	}

	free(buf);

	return 0;
}
Example #2
0
static struct eagleplayer *analyze_file_format(int *content,
					       const char *modulename,
					       struct uade_state *state)
{
	struct stat st;
	char ext[MAX_SUFFIX_LENGTH];
	FILE *f;
	struct eagleplayer *contentcandidate = NULL;
	struct eagleplayer *namecandidate = NULL;
	char *prefix, *postfix, *t;
	size_t bufsize, bytesread;
	uint8_t buf[8192];

	*content = 0;

	if ((f = fopen(modulename, "rb")) == NULL)
		return NULL;

	if (fstat(fileno(f), &st))
		uadeerror("Very weird stat error: %s (%s)\n", modulename, strerror(errno));

	bufsize = sizeof buf;
	bytesread = atomic_fread(buf, 1, bufsize, f);
	fclose(f);
	if (bytesread == 0)
		return NULL;
	memset(&buf[bytesread], 0, bufsize - bytesread);

	uade_filemagic(buf, bytesread, ext, st.st_size, modulename, state->config.verbose);

	if (strcmp(ext, "reject") == 0)
		return NULL;

	if (ext[0] != 0 && state->config.verbose)
		__android_log_print(ANDROID_LOG_VERBOSE, "UADE", "Content recognized: %s (%s)\n", ext, modulename);

	if (strcmp(ext, "packed") == 0)
		return NULL;

	if (!load_playerstore(state))
		return NULL;

	/* First do filename detection (we'll later do content detection) */
	t = xbasename(modulename);

	if (strlcpy((char *) buf, t, sizeof buf) >= sizeof buf)
		return NULL;

	t = strchr((char *) buf, '.');
	if (t == NULL)
		return NULL;

	*t = 0;
	prefix = (char *) buf;

	if (strlen(prefix) < MAX_SUFFIX_LENGTH)
		namecandidate = get_eagleplayer(prefix, state->playerstore);

	if (namecandidate == NULL) {
		/* Try postfix */
		t = xbasename(modulename);
		strlcpy((char *) buf, t, sizeof buf);
		postfix = strrchr((char *) buf, '.') + 1; /* postfix != NULL */

		if (strlen(postfix) < MAX_SUFFIX_LENGTH)
			namecandidate = get_eagleplayer(postfix, state->playerstore);
	}

	/* If filemagic found a match, we'll use player plugins associated with
	   that extension */
	if (ext[0]) {
		contentcandidate = get_eagleplayer(ext, state->playerstore);
		if (contentcandidate != NULL) {
			/* Do not recognize name detectable eagleplayers by
			   content */
			if (namecandidate == NULL ||
			    (namecandidate->flags & ES_NAME_DETECTION) == 0) {
				*content = 1;
				return contentcandidate;
			}
		} else {
			if (state->config.verbose)
				__android_log_print(ANDROID_LOG_VERBOSE, "UADE", "%s not in eagleplayer.conf\n", ext);
		}
	}

	if (state->config.verbose)
		__android_log_print(ANDROID_LOG_VERBOSE, "UADE", "Format detection by filename\n");

	return namecandidate;
}