亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? grf.c

?? 一個曾經熱門的網絡游戲RO查看GRF工具的源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
		grf->files = (GrfFile *) calloc (sizeof (GrfFile), grf->nfiles);		for (entry = 0, index = 0, offset = 0; entry < filelist_entries; entry++) {			unsigned long ofs2;			int type;			ofs2 = offset + getlong (filelist_data + offset) + 4;			type = filelist_data[ofs2 + 12];			/* Type 0 is a directory index; skip that */			if (type != 0) {				unsigned char *name;			/* Filename */				unsigned long compressed_len;		/* Compressed file size */				unsigned long compressed_len_aligned;	/* Not sure what this is but it's used for decoding the data */				unsigned long real_len;			/* Real (uncompressed) file size */				unsigned long pos;			/* Position of the real file data */				long cycle;				char *ext;				name = decode_filename (filelist_data + offset + 6, filelist_data[offset] - 6);				compressed_len_aligned = getlong (filelist_data + ofs2 + 4) - 37579;				real_len = getlong (filelist_data + ofs2 + 8);				pos = getlong (filelist_data + ofs2 + 13) + 46;				/* Detect the file's "cycle". This contains information about how the file entry's encoded */				compressed_len = 0;				cycle = 0;				/* Only files with an extension are encoded */				if ((ext = strrchr ((const char *) name, '.')) != NULL) {					compressed_len = getlong (filelist_data + ofs2) - getlong (filelist_data + ofs2 + 8) - 715;					if (strcasecmp (ext, ".gnd") != 0 && strcasecmp (ext, ".gat") != 0					 && strcasecmp (ext, ".act") != 0 && strcasecmp (ext, ".str") != 0) {						unsigned long i;						for (i = 10, cycle = 1; compressed_len >= i; i *= 10, cycle++);					}				}				grf->files[index].name = strdup ((const char *) name);				grf->files[index].compressed_len = compressed_len;				grf->files[index].compressed_len_aligned = compressed_len_aligned;				grf->files[index].real_len = real_len;				grf->files[index].pos = pos;				grf->files[index].cycle = cycle;				grf->files[index].type = type;				index++;			}			offset = ofs2 + 17;		}		free (filelist_data);	} else if (grf->version == 2) {		/* The file list header contains two sections:		   1. Information about the number of files and how big the file list data is.		   2. The actual file list itself (compressed).		 */		unsigned char size_header[8];	/* The header that contains information about sizes */		uLongf compressed_size;		/* Size of the compressed file list data */		uLongf decompressed_size;	/* Size of the decompressed file list data */		unsigned char *rBuf;		/* Temporarily store the compress file list data */		unsigned char *filelist_data;	/* The decompressed file list data */		unsigned long entry;		int offset;		/* Get size information */		fread (size_header, 1, 8, f);		compressed_size = getlong (size_header);		decompressed_size = getlong (size_header + 4);		debug ("File header compressed:\t\t%ld bytes\n"			"File header decompressed:\t%ld bytes\n",			compressed_size, decompressed_size);		if (compressed_size > (uLongf) (grf_size - ftell (f))) {			fclose (f);			if (error) *error = GE_CORRUPTED;			free (grf);			return NULL;		}		/* Allocate a buffer to store the raw (compressed) file list data */		rBuf = (unsigned char *) malloc (compressed_size);		if (!rBuf) {			fclose (f);			if (error) *error = GE_NOMEM;			free (grf);			return NULL;		}		fread (rBuf, 1, compressed_size, f);		/* Allocate a buffer to store the decompressed file list data */		filelist_data = (unsigned char *) malloc (decompressed_size);		if (!filelist_data) {			free (rBuf);			free (filelist_data);			fclose (f);			if (error) *error = GE_NOMEM;			free (grf);			return NULL;		}		/* Decompress the file list data */		decode_zip (filelist_data, &decompressed_size, rBuf, compressed_size);		free (rBuf);		/* Store the entire file list into an array */		grf->nfiles = getlong (grf_header + 0x26) - 7;		debug ("nfiles: %ld\n"			"Allocating %d bytes of memory for file list structure.\n",			grf->nfiles,			sizeof (GrfFile) * grf->nfiles);		grf->files = (GrfFile *) calloc (sizeof (GrfFile), grf->nfiles);		if (!grf->files) {			free (filelist_data);			fclose (f);			free (grf);			if (error) *error = GE_NOMEM;			return NULL;		}		debug ("Reading file list...\n");		for (entry = 0, offset = 0; entry < grf->nfiles; entry++){			char *name;	/* This entry's filename */			int type;			int ofs2;			name = strdup ((char *) (filelist_data + offset));			ofs2 = offset + strlen (name) + 1;			type = filelist_data[ofs2 + 12];			if (type == 1 || type == 3 || type == 5) {				unsigned long compressed_len;		/* Compressed file size */				unsigned long compressed_len_aligned;	/* Not sure what this is but it's used for decoding the data */				unsigned long real_len;			/* Real (uncompressed) file size */				unsigned long pos;			/* Position of the real file data */				long cycle;				compressed_len = getlong (filelist_data + ofs2);				compressed_len_aligned = getlong (filelist_data + ofs2 + 4);				real_len = getlong (filelist_data + ofs2 + 8);				pos = getlong (filelist_data + ofs2 + 13) + 0x2e;				/* Detect the file's "cycle". This contains information about how the file entry's encoded */				if (type == 3) {					unsigned long i;					for (i = 10, cycle = 1; compressed_len >= i; i *= 10, cycle++);				} else if (type == 5) {					cycle = 0;				} else {	/* if (type == 1) */					cycle = -1;				}				grf->files[entry].compressed_len = compressed_len;				grf->files[entry].compressed_len_aligned = compressed_len_aligned;				grf->files[entry].real_len = real_len;				grf->files[entry].pos = pos;				grf->files[entry].cycle = cycle;			}			grf->files[entry].name = name;			grf->files[entry].type = type;			/* Calculate next entry's offset */			offset += strlen ((char *) (filelist_data + offset)) + 18;		}		free (filelist_data);		debug ("Done!\n");	} else {		if (error) *error = GE_NSUP;		free (grf);		fclose (f);		return NULL;	}	grf->filename = strdup (fname);	return grf;}GRFEXPORT GrfFile *grf_find (Grf *grf, char *fname, unsigned long *index){	unsigned long i;	if (!grf || !fname) return NULL;	for (i = 0; i < grf->nfiles; i++) {		if (strcmp (grf->files[i].name, fname) == 0) {			if (index) *index = i;			return &(grf->files[i]);		}	}	return NULL;}GRFEXPORT void *grf_get (Grf *grf, char *fname, unsigned long *size, GrfError *error){	unsigned long index;	if (!grf || !fname) {		if (error) *error = GE_BADARGS;		return NULL;	}	if (!grf_find (grf, fname, &index)) {		if (error) *error = GE_NOTFOUND;		return NULL;	}	return grf_index_get (grf, index, size, error);}GRFEXPORT void *grf_index_get (Grf *grf, unsigned long index, unsigned long *size, GrfError *error){	GrfFile *file;	unsigned char *buf, *decbuf;	if (!grf) {		if (error) *error = GE_BADARGS;		return NULL;	}	if (index < 0 || index >= grf->nfiles) {		if (error) *error = GE_INDEX;		return NULL;	}	file = &(grf->files[index]);	buf = (unsigned char *) calloc (file->compressed_len_aligned + 1024, 1);	if (!buf) {		if (error) *error = GE_NOMEM;		return NULL;	}	fseek (grf->f, file->pos, SEEK_SET);	fread (buf, 1, file->compressed_len_aligned, grf->f);	if (file->type == 1 || file->type == 3 || file->type == 5) {		uLongf len;		decbuf = (unsigned char *) calloc (file->real_len + 1024, 1);		/* Some data are encoded. They must be decoded first before they can be decompressed. */		if (file->cycle >= 0) {			decode_des_etc (buf, file->compressed_len_aligned,				file->cycle == 0, file->cycle);		}		/* Now, decompress the data and return it */		len = file->real_len;		decode_zip (decbuf, &len, buf, file->compressed_len);		if (size) *size = len;		if (len != file->real_len) {			fprintf (stderr, "decode_zip size miss match err: %ld != %ld\n", len, file->real_len);		}		free (buf);	} else		decbuf = buf;	return decbuf;}GRFEXPORT intgrf_extract (Grf *grf, char *fname, const char *writeToFile, GrfError *error){	unsigned long index;	if (!grf || !fname) {		if (error) *error = GE_BADARGS;		return 0;	}	if (!grf_find (grf, fname, &index)) {		if (error) *error = GE_NOTFOUND;		return 0;	}	return grf_index_extract (grf, index, writeToFile, error);}GRFEXPORT intgrf_index_extract (Grf *grf, unsigned long index, const char *writeToFile, GrfError *error){	void *buf;	unsigned long size;	FILE *f;	if (!writeToFile) {		if (error) *error = GE_BADARGS;		return 0;	}	buf = grf_index_get (grf, index, &size, error);	if (!buf) return 0;	f = fopen (writeToFile, "wb");	if (!f) {		free (buf);		if (error) *error = GE_WRITE;		return 0;	}	fwrite (buf, size, 1, f);	fclose (f);	free (buf);	return 1;}GRFEXPORT voidgrf_free (Grf *grf){	unsigned long i;	if (!grf) return;	if (grf->f) fclose (grf->f);	if (grf->filename) free (grf->filename);	if (grf->files) {		for (i = 0; i < grf->nfiles; i++) {			if (grf->files[i].name)				free (grf->files[i].name);		}		free (grf->files);	}	free (grf);}GRFEXPORT const char *grf_strerror (GrfError error){	switch (error) {	case GE_BADARGS:		return "Bad arguments passed to function.";	case GE_CANTOPEN:		return "Cannot open file.";	case GE_INVALID:		return "Not a valid GRF archive.";	case GE_CORRUPTED:		return "The GRF archive appears to be corrupted.";	case GE_NOMEM:		return "Not enough free memory.";	case GE_NSUP:		return "GRF archives of this version is not supported.";	case GE_NOTFOUND:		return "File not found inside GRF file.";	case GE_INDEX:		return "Invalid index.";	case GE_WRITE:		return "Cannot write to destination file.";	default:		return "Unknown error.";	};}#ifdef __cplusplus	}#endif /* __cplusplus */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
制服丝袜亚洲精品中文字幕| 欧美久久久久中文字幕| 一区二区三区欧美| 欧美日韩国产影片| 欧美精品一区二区三区蜜桃| 成人午夜视频网站| 91精品国产品国语在线不卡| 中文字幕高清不卡| 蜜臀久久99精品久久久久宅男 | 99精品久久只有精品| caoporn国产一区二区| 日韩欧美国产一区在线观看| 国产日韩精品一区二区三区| 97久久精品人人爽人人爽蜜臀 | 欧美中文一区二区三区| 亚洲一区影音先锋| 国产午夜亚洲精品羞羞网站| 成人免费视频一区| 国产精品自拍毛片| 久久一区二区视频| 欧美丰满美乳xxx高潮www| 成人av在线看| 久草热8精品视频在线观看| 亚洲国产成人91porn| 国产精品国产三级国产普通话三级 | 国产精品久久久久久久久动漫| 欧美mv和日韩mv的网站| 在线成人免费视频| 欧美亚洲另类激情小说| 91在线丨porny丨国产| 粉嫩av一区二区三区| 久久不见久久见免费视频7 | 久久久久久久久久久黄色| 91精品国产一区二区三区| 色综合视频在线观看| 成人高清伦理免费影院在线观看| 国产精品自拍一区| 国产寡妇亲子伦一区二区| 奇米777欧美一区二区| 日韩精品一级二级| 午夜日韩在线电影| 亚洲大片在线观看| 午夜精彩视频在线观看不卡| 亚洲成人手机在线| 午夜激情综合网| 水蜜桃久久夜色精品一区的特点| 性做久久久久久免费观看欧美| 亚洲图片欧美色图| 亚洲国产欧美在线人成| 亚洲18色成人| 日韩极品在线观看| 免费成人美女在线观看.| 秋霞影院一区二区| 久久99久久久久| 紧缚捆绑精品一区二区| 国产一区二区三区免费看| 国产传媒久久文化传媒| 不卡一区在线观看| 在线观看日韩国产| 欧美日韩视频专区在线播放| 欧美日韩精品一区二区三区| 欧美日本在线看| 日韩一区二区三区av| 精品久久久久久久久久久久久久久 | 日韩一区二区三区在线视频| 日韩写真欧美这视频| 欧美白人最猛性xxxxx69交| 久久精品网站免费观看| 中文字幕亚洲成人| 亚洲成av人片| 美腿丝袜亚洲综合| 国产不卡视频在线播放| 色婷婷av一区二区三区gif | 日韩精品一区二区三区中文精品| 久久女同互慰一区二区三区| 国产精品久久国产精麻豆99网站 | 天堂一区二区在线免费观看| 久久er99热精品一区二区| 成人性生交大片免费看在线播放| 色综合色综合色综合| 日韩视频永久免费| 综合激情网...| 日本在线不卡一区| 国产69精品久久99不卡| 精品视频一区二区不卡| 国产亚洲精品bt天堂精选| 亚洲精品欧美二区三区中文字幕| 欧美a一区二区| 91在线视频网址| 日韩欧美三级在线| 亚洲欧美经典视频| 久草热8精品视频在线观看| 99精品国产视频| 欧美一级片在线看| 国产精品不卡一区二区三区| 日韩高清不卡在线| 色综合一个色综合亚洲| 欧美mv日韩mv| 午夜精品福利一区二区三区av| 国产大片一区二区| 6080亚洲精品一区二区| 亚洲欧洲日韩在线| 国产在线播放一区| 制服视频三区第一页精品| 中文字幕亚洲不卡| 国产xxx精品视频大全| 欧美一区二区三区不卡| 亚洲人一二三区| 国产精品1024| 日韩欧美成人激情| 亚洲一区成人在线| 99久久综合国产精品| 久久老女人爱爱| 麻豆一区二区三区| 欧美日韩精品一区二区三区蜜桃| 国产精品国产三级国产有无不卡 | 国产人妖乱国产精品人妖| 首页国产欧美日韩丝袜| 99久久国产综合精品色伊| 精品国产一区二区三区不卡| 婷婷成人激情在线网| 色一区在线观看| 中文字幕中文字幕一区| 国产v综合v亚洲欧| 久久综合中文字幕| 麻豆国产精品777777在线| 欧美人xxxx| 亚洲观看高清完整版在线观看| 99久久99久久久精品齐齐| 中文字幕国产精品一区二区| 国产一区二区三区久久悠悠色av| 日韩一卡二卡三卡| 日本亚洲视频在线| 91精品视频网| 日韩黄色在线观看| 777欧美精品| 日韩高清一区在线| 91精品国产91久久综合桃花| 日韩综合小视频| 欧美日韩高清在线播放| 香蕉成人啪国产精品视频综合网| 欧美在线观看禁18| 亚洲第一二三四区| 欧美老肥妇做.爰bbww| 三级欧美在线一区| 91精品国产一区二区三区香蕉| 日韩国产高清在线| 欧美xxxxxxxx| 福利一区二区在线| 国产精品视频麻豆| 99视频超级精品| 亚洲精品成人少妇| 欧美日韩另类一区| 男男gaygay亚洲| 日韩免费高清视频| 韩国视频一区二区| 国产精品乱码久久久久久| 91在线视频观看| 亚洲成av人片在线观看无码| 日韩一区二区三区在线| 国产精品资源网| 日韩久久一区二区| 欧美日韩免费电影| 九九精品视频在线看| 国产清纯在线一区二区www| 99精品欧美一区二区蜜桃免费 | 夜夜亚洲天天久久| 91精品国产乱| 国产69精品久久99不卡| 一区二区三区影院| 欧美一区二区播放| 成人午夜免费电影| 亚洲成人免费av| 久久伊人蜜桃av一区二区| 99久久精品费精品国产一区二区| 亚洲超丰满肉感bbw| 久久久影视传媒| 欧美亚男人的天堂| 久久精品国产久精国产爱| 国产精品欧美一区喷水| 欧美日韩一区成人| 国产91精品精华液一区二区三区 | 久久色视频免费观看| 99久久综合国产精品| 日韩电影一区二区三区| 亚洲国产精品成人综合色在线婷婷 | 亚洲成av人片一区二区三区| 26uuu精品一区二区| 在线欧美小视频| 国精产品一区一区三区mba视频| 亚洲色图一区二区三区| 91精品国产乱码久久蜜臀| 91在线国产观看| 国产一区二区三区最好精华液| 亚洲免费在线视频一区 二区| 欧美videos中文字幕| 色欧美片视频在线观看在线视频| 九九国产精品视频| 五月婷婷综合在线| 亚洲色图丝袜美腿|