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

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

?? msearch.cpp

?? 問題重述:有一個內含有大約40萬條常用詞匯的詞庫。現給定一篇文章
?? CPP
字號:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>

#define SHIFT3 4
#define SHIFT2 10
#define SHIFT1_USED 10
#define SHIFT1 (32-SHIFT2-SHIFT3)

static char * ChangeFileExt(const char * fn, const char * fext)
{
	int l=strlen(fn);
	int le=strlen(fext);
	for(int i=l-1; fn[i]!='.' && fn[i]!='\\' && fn[i]!='/' && fn[i]!=':' && i>=0; i--);
	char * fnext;
	// if extensible name does not exist
	if(i<=0||fn[i]=='\\'||fn[i]=='/'||fn[i]==':')
	{
		// allocate memory for new name
		fnext=new char[l+le+2];
		strcpy(fnext,fn);
		fnext[l]='.';
		l++;
		strcpy(fnext+l,fext);
	}
	else
	{
		l=i+1;
		// allocate
		fnext=new char[l+le+1];
		strcpy(fnext,fn);
		strcpy(fnext+l,fext);
	}
	return fnext;
}


#define LBUF_SIZE 1024  // line buffer size

#define MEMORY_MIRROR   // process dictionary file in memory (unused)

#define DEBUG
#ifdef DEBUG
static void dumpBytes(const void * _bytes, size_t len)
{
	const unsigned char * bytes = (const unsigned char *)_bytes;
	size_t j;
	for(j=0; j<len; j++)
		printf("%02x ", (int)bytes[j] );
}
#endif

#pragma pack(1)

// Dictionary file header
typedef struct _DictHeader
{
	char maodict[8]; // string "MAODICT"
	long so;  // index start offset
	long eo;  // index end offset
} DictHeader;

// Index item structure(5 bytes)
typedef struct _IndexItem
{
	union
	{
		long offset;  // string offset
		char * str;   // string pointer(unused)
	};
	char length;  // string length
} IndexItem;


// A list node of searching result
typedef struct _ResultNode
{
	int index;  // index number in dictionary
	int count;  // match times of word
	//ResultNode * next;
} ResultNode;

// Global variables
static FILE * fpDict;
static char * lbuf;
static size_t lbufLen;
static char * buf;

static int compareItem(const void * a1, const void * a2)
{
	IndexItem * it1 = (IndexItem *)a1;
	IndexItem * it2 = (IndexItem *)a2;
	size_t len1 = it1->length;
	size_t len2 = it2->length;
	int ret;

	ret = strncmp(buf + it1->offset, buf + it2->offset, (len1<len2)?len1:len2 );
	if(ret==0)
	{
		if(len1>len2)
			ret = 1;
		else if(len1<len2)
			ret = -1;
	}
	return ret;	
}

// Create binary format dictionary (one word per line in text file, need not sorted or unique)
static int textToBinaryFile(const char * fnDictT, const char * fnDict)
{
	FILE * fpDictT;
	//FILE * fpDict;
	FILE * fpTemp;
	size_t lbufSize;
	//char * lbuf;
	//size_t lbufLen;
	DictHeader hdr;
	int rcCount;  // record count
	IndexItem it;
	IndexItem * indexes;
	size_t strAreaSize;
	int i;
	int lastWIndex;  // last written index number
	int rcCountF;  // record count after filted

	fpDictT = fopen(fnDictT, "r");
	if(fpDictT==NULL)
	{
		printf("Cannot open source file [%s].\n", fnDictT);
		return -1;
	}
	fpDict = fopen(fnDict, "wb");
	if(fpDict==NULL)
	{
		printf("Cannot open target file [%s].\n", fnDict);
		fclose(fpDictT);
		return -1;
	}
	fpTemp = tmpfile();
	if(fpTemp==NULL)
	{
		printf("Cannot create temporary file.\n");
		fclose(fpDictT);
		fclose(fpDict);
		return -1;
	}
	lbufSize = LBUF_SIZE;
	lbuf = (char *)malloc(lbufSize*sizeof(char));

	// write target file header
	memset(&hdr, 0, sizeof(hdr));
	strcpy(hdr.maodict, "MAODICT");
	fwrite(&hdr, sizeof(hdr), 1, fpDict);

	printf("Reading and creating data area... ");
	// read all lines
	rcCount = 0;
	while(!feof(fpDictT))
	{
		fgets(lbuf, lbufSize, fpDictT);
		lbufLen = strlen(lbuf);
		// trim the terminal '\n'
		if(lbufLen>0)
			if(lbuf[lbufLen-1]=='\n' || lbuf[lbufLen-1]=='\r')
				lbuf[--lbufLen] = '\0';
		if(lbufLen==0)
			continue;
		it.offset = ftell(fpDict);
		it.length = (char)lbufLen;
		fwrite(lbuf, sizeof(char), lbufLen+1, fpDict);
		fwrite(&it, sizeof(it), 1, fpTemp);
		rcCount++;
		//printf("%d: %d %s\n", rcCount, lbufLen, lbuf);
	}
	printf("done!\n");
	// get the whole string area size
	strAreaSize = ftell(fpDict);
	fclose(fpDictT);
	indexes = (IndexItem *)malloc(rcCount*sizeof(IndexItem));
	fseek(fpTemp, 0, SEEK_SET);
	fread(indexes, sizeof(IndexItem), rcCount, fpTemp);
	fclose(fpTemp);
	// now, only fpDict is open
	// reopen the file for read+write
	fclose(fpDict);
	fpDict = fopen(fnDict, "r+b");

	printf("Sorting and building index table... ");

	buf = (char *)malloc(strAreaSize);
	fseek(fpDict, 0, SEEK_SET);
	fread(buf, 1, strAreaSize, fpDict);

	qsort(indexes, rcCount, sizeof(IndexItem), compareItem);
	printf("done!\n");

	/*
	// output all records for check
	for(i=0; i<rcCount; i++)
	{
		fseek(fpDict, indexes[i].offset, SEEK_SET);
		fread(lbuf, sizeof(char), indexes[i].length, fpDict);
		lbuf[indexes[i].length] = '\0';
		printf("%6d: %s\n", i, lbuf);
	}
	*/

	fseek(fpDict, 0, SEEK_END);
	hdr.so = ftell(fpDict);
	printf("Writing index table... ");
	lastWIndex = -1;
	rcCountF = 0;
	for(i=0; i<rcCount; i++)
	{
		if(lastWIndex != -1)
			if(indexes[i].length == indexes[lastWIndex].length)
				if(strncmp(buf + indexes[i].offset, buf + indexes[lastWIndex].offset, indexes[i].length) == 0)
					continue;
		fwrite(&indexes[i], sizeof(IndexItem), 1, fpDict);
		lastWIndex = i;
		rcCountF++;
	}
	printf("done!\n");
	hdr.eo = ftell(fpDict);
	free(buf);
	
	fseek(fpDict, 0, SEEK_SET);
	fwrite(&hdr, sizeof(hdr), 1, fpDict);

	/*
	fseek(fpDict, hdr.so, SEEK_SET);
	fread(indexes, sizeof(IndexItem), rcCountF, fpDict);
	// output all records for check
	for(i=0; i<rcCountF; i++)
	{
		fseek(fpDict, indexes[i].offset, SEEK_SET);
		fread(lbuf, sizeof(char), indexes[i].length, fpDict);
		lbuf[indexes[i].length] = '\0';
		printf("%s\n", lbuf);
	}
	*/
	fclose(fpDict);

	printf("Dictionary file [%s] is created.\n", fnDict);

	free(indexes);
	free(lbuf);
	return 0;
}

/*
 * dbuf: data area pointer
 * idx:  index area pointer
 * ch:   current character
 * j:    current character's position in word
 * _si, _li: previous range
 * return: 1 - fonnd; 0 - not found
*/
static inline int getCharIndex( const char      * dbuf,
							    const IndexItem * idx, 
							    int ch, 
							    int j, int * _si, int * _li)
{
	int si = *_si;
	int li = *_li;
	int mi;
	int ssi, lli, mmi;

#define GETCH(x) ( (unsigned char)*(dbuf + idx[x].offset + j) )

	if(ch < GETCH(si))
	{
		// above the upper border [not found - case 1]
		*_si = *_li = si;
		return 0;

	}
	else if(ch == GETCH(si))
	{
		// start position
		*_si = si;
		if(ch == GETCH(li))
		{
			// li is just the end
			*_li = li;
			return 1;
		}
		else
		{
			/* ch < GETCH(li) */
			// using binary search, find the end 
			ssi = si;
			lli = li;
			while(lli-ssi>1)
			{
				mmi = (ssi + lli) / 2;
				if(ch < GETCH(mmi))
					lli = mmi;
				else
					ssi = mmi;
			}
			*_li = ssi;
			return 1;
		}

	}
	else
	{
		/* ch > GETCH(si) */

		if(ch > GETCH(li))
		{
			// below the lower border [not found - case 2]
			*_si = *_li = li+1;
			return 0;
		}
		else if(ch == GETCH(li))
		{
			*_li = li;
			// using binary search, find the start
			ssi = si;
			lli = li;
			while(lli-ssi>1)
			{
				mmi = (ssi + lli) / 2;
				if(ch <= GETCH(mmi))
					lli = mmi;
				else
					ssi = mmi;
			}
			*_si = lli;
			return 1;
		}
		else
		{
			/* ch < GETCH(li) */
			// the most common case
			while(li-si>1)
			{
				mi = (si + li) / 2;
				if(ch < GETCH(mi))
					li = mi;
				else if(ch > GETCH(mi))
					si = mi;
				else
				{
					/* == found */

					// search the upper border
					ssi = si;
					lli = mi;
					while(lli-ssi>1)
					{
						mmi = (ssi + lli) / 2;
						if(ch <= GETCH(mmi))
							lli = mmi;
						else
							ssi = mmi;
					}
					*_si = lli;

					// search the lower border
					ssi = mi;
					lli = li;
					while(lli-ssi>1)
					{
						mmi = (ssi + lli) / 2;
						if(ch < GETCH(mmi))
							lli = mmi;
						else
							ssi = mmi;
					}
					*_li = ssi;

					return 1;

				}
			}
			// not included [not found - case 3]
			*_si = *_li = li;
			return 0;

		}

	}

}

static int compareResultNode(const void * a1, const void * a2)
{
	return -( ((ResultNode *)a1)->count - ((ResultNode *)a2)->count );
}

int SearchTextFile(const char * fnDict, FILE * fp)
{
	DictHeader hdr;
	int si, li;
	int rcCount;
	char * dbuf;     // data buffer
	IndexItem * idx; // index buffer
	//unsigned char * lbuf;
	int * cbuf;
	//size_t dbufSize;
	//size_t lbufSize = LBUF_SIZE;
	size_t cbufSize = LBUF_SIZE;
	//int ch;
	int i, j, k;
	int ret;
	int t1, t2, t3;
	size_t cs;   // calculated size
	size_t msizeCount = 0; // malloc size count
	int * * * resultMap = NULL;
	clock_t startClock, finishClock;
	int resultCount = 0;
	ResultNode * resultList = NULL;
	int resultListSize = 1024;
	//ResultNode * * pCurrentRN = &resultList;
	//ResultNode * currentRN;
	// variables for File Mapping
	HFILE  hDictFile;
	HANDLE hMapFile;
	HANDLE hMapView;
	OFSTRUCT opBuf;

	//
	lbuf = (char *)malloc(MAX_PATH);
	cbuf = (int *)malloc(cbufSize);
	
	// 3 steps to map a file: OpenFile, CreateFileMapping, MapViewOfFile
	
		hDictFile = OpenFile(fnDict, &opBuf, OF_READ);
	if(hDictFile == HFILE_ERROR)
	{
		fprintf(stderr, "Cannot open dictionary file [%s].\n", fnDict);
		return -1;
	}

	hMapFile = CreateFileMapping((HANDLE)hDictFile, NULL, PAGE_READONLY, 0, 0, "DictMap");
	if(hMapFile == NULL)
	{
		fprintf(stderr, "Mapping file failed.\n");
		CloseHandle((HANDLE)hDictFile);
		return -1;
	}
	CloseHandle((HANDLE)hDictFile);
	hDictFile = 0;

	hMapView = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
	if(hMapView == NULL)
	{
		fprintf(stderr, "Mapping view failed.\n");
		CloseHandle(hMapFile);
		return -1;
	}
	// memory - file mapped

	dbuf = (char *)hMapView;
	memcpy(&hdr, dbuf, sizeof(hdr));
	if(strncmp(hdr.maodict, "MAODICT", sizeof(hdr.maodict)) != 0)
	{
		printf("Invalid dictionary format, expecting \"MAODICT\".\n");
		UnmapViewOfFile(hMapView);
		CloseHandle(hMapFile);
		return -1;
	}
	
	idx = (IndexItem *)(dbuf + hdr.so);
	rcCount = (hdr.eo - hdr.so) / sizeof(IndexItem);

	// initialize the first class mapping table
	cs = (1<<SHIFT1_USED)*sizeof(*resultMap);
	resultMap = (int ***)malloc(cs);
	memset(resultMap, NULL, cs);
	msizeCount += cs;

	//fprintf(stderr, "Searching... ");

	// remember when we start
	startClock = clock();

	j = 0;  // word char index
	k = 0;  // number of buffered chars

	do
	{
		j = 0;  // return zero

		si = 0;
		li = rcCount-1;
		for(j=0; ; j++)
		{
			while(k<=j)
				cbuf[k++] = fgetc(fp);
			if(cbuf[j]==EOF)
				break;

			ret = getCharIndex(dbuf, idx, cbuf[j], j, &si, &li);

			//======================================
			// if this is a complete word, add it
			if(ret && j==idx[si].length-1)
			{
				t1 = si >> (SHIFT2+SHIFT3);
				t2 = ((unsigned int)si<<SHIFT1) >> (SHIFT1+SHIFT3);
				t3 = ((unsigned int)si << (SHIFT1+SHIFT2) ) >> (SHIFT1+SHIFT2);
				if(resultMap[t1]==NULL)
				{
					cs = (1<<SHIFT2) * sizeof(resultMap[0][0]);
					resultMap[t1] = (int **)malloc(cs);
					memset(resultMap[t1], NULL, cs);
					msizeCount += cs;
				}
				if(resultMap[t1][t2]==NULL)
				{
					cs = (1<<SHIFT3) * sizeof(resultMap[0][0][0]);
					resultMap[t1][t2] = (int *)malloc(cs);
					memset(resultMap[t1][t2], 0, cs);
					msizeCount += cs;
				}
				//printf("%d: %d %d %d\n", si, t1, t2, t3);
				resultMap[t1][t2][t3] += 1;
			}
			//======================================
			if(!ret)
				break;
			else
			{
				if(li-si==0)
					if(j==idx[si].length-1)
						break;
			}

		}
		// move buffer one step foward (overlapped spaces!!!)
		if(k>1)
			memmove(cbuf, cbuf+1, (k-1)*sizeof(cbuf[0]));
		//printf("%d\n", k);
		k --;
	} while(cbuf[0]!=EOF);

	finishClock = clock();

	//fprintf(stderr, "complete!\n");
	fprintf(stderr, "Processed in %.3fs.\n", double(finishClock-startClock)/CLOCKS_PER_SEC );

	fprintf(stderr, "Totally allocated memory: %.2fKB\n", (double)msizeCount/1024 );

	//================================================
	
	resultList = (ResultNode *)malloc(resultListSize*sizeof(ResultNode) );

	for(i=0; i<(1<<SHIFT1_USED); i++)
		if(resultMap[i])
			for(j=0; j<(1<<SHIFT2); j++)
				if(resultMap[i][j])
					for(k=0; k<(1<<SHIFT3); k++)
						if(resultMap[i][j][k]>0)
						{
							//printf("\"%s\" -- %d\n", dbuf + idx[(i<<(SHIFT2+SHIFT3))|(j<<SHIFT3)|k].offset, resultMap[i][j][k] );

							// add to result list
							if(resultCount >= resultListSize)
							{
								resultListSize *= 2;
								resultList = (ResultNode *)realloc(resultList, resultListSize*sizeof(ResultNode) );
							}
							resultList[resultCount].index = (i<<(SHIFT2+SHIFT3))|(j<<SHIFT3)|k;
							resultList[resultCount].count = resultMap[i][j][k];
							/*
							*pCurrentRN = (ResultNode *)malloc( 1*sizeof(ResultNode) );
							(*pCurrentRN)->index = (i<<(SHIFT2+SHIFT3))|(j<<SHIFT3)|k;
							(*pCurrentRN)->count = resultMap[i][j][k];
							(*pCurrentRN)->next = NULL;
							pCurrentRN = &(*pCurrentRN)->next;
							*/
							resultCount += 1;
						}

	// save them to array
	/*
	ResultNode * * results = (ResultNode * *)malloc( resultCount*sizeof(ResultNode *) );
	j = 0;
	for(currentRN=resultList; currentRN!=NULL; currentRN=currentRN->next)
	{
		results[j++] = currentRN;
	}
	*/

	// sort
	qsort(resultList, resultCount, sizeof(ResultNode), compareResultNode);

	// output result
	//fprintf(stderr, "Result:\n");
	for(j=0; j<resultCount; j++)
	{
		printf("%s -- %d\n", dbuf + idx[resultList[j].index].offset, resultList[j].count );
	}

	free(resultList);
	UnmapViewOfFile(hMapView);

	return 0;
}

int main(int argc, char * argv[])
{
	char * fileName = NULL;
	char opcode = 's';
	int i;
	const char * fnDict = "English.dat";
	//FILE * fp;
	//FILE * fpDict;

	for(i=1; i<argc && i<3; i++)
	{
		if(argv[i][0]=='-')
			opcode = argv[i][1];
		else
			fileName = argv[i];
	}

	// select an operation
	switch(opcode)
	{
	case 'c':
		if(fileName==NULL)
		{
			fprintf(stderr, "File name is needed.\n");
			return -1;
		}
		textToBinaryFile(fileName, ChangeFileExt(fileName, "dat") );
		//textToTrieFile(fileName, ChangeFileExt(fileName, "dat") );
		break;
	case 's':
		if(fileName==NULL)
		{
			fprintf(stderr, "File name is needed.\n");
			return -1;
		}
		SearchTextFile(fileName, stdin);
		break;
	case 'h':
	default:
		printf("Usage:\n");
		printf("  msearch -c <source file>  .... Convert text file to dictionary.\n");
		printf("  msearch <dict file>       .... Input text to search, ended with [Ctrl+Z].\n");
		printf("  msearch -h                .... Print help information.\n");
		printf("Examples:\n");
		printf("  msearch -c English.txt    .... Create English.dat.\n");
		printf("  msearch English.dat <gpl3.txt >result.txt \n"
		       "             .... Search keywords in gpl3.txt and write results to result.txt,\n"
			   "                  using dictionary English.dat\n");
		return -1;
	}

	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美丰满高潮xxxx喷水动漫| 91久久精品国产91性色tv| 国产一区二区三区美女| 972aa.com艺术欧美| 欧美一区二区三区视频免费 | 国产精品中文字幕日韩精品| 91碰在线视频| 久久综合九色综合欧美98| 免费人成黄页网站在线一区二区| 国产aⅴ精品一区二区三区色成熟| 欧美中文字幕一区| 国产精品美女久久久久久| 日韩高清欧美激情| 色噜噜狠狠色综合中国| 久久久精品天堂| 日韩av在线播放中文字幕| jiyouzz国产精品久久| 久久综合成人精品亚洲另类欧美 | 日韩精品一区二| 一区二区久久久久久| 成人深夜视频在线观看| 日韩一区二区三区视频在线| 亚洲午夜一区二区三区| 99久久精品国产观看| 国产免费久久精品| 韩国一区二区三区| 欧美成人一区二区三区| 日韩成人dvd| 7777精品伊人久久久大香线蕉经典版下载 | 风间由美中文字幕在线看视频国产欧美 | 日韩国产欧美在线播放| 欧美性videosxxxxx| 亚洲欧美电影一区二区| 69堂精品视频| 午夜欧美视频在线观看| 欧美中文字幕一二三区视频| 伊人色综合久久天天人手人婷| 成人app在线观看| 日本一区二区在线不卡| 国产成人av网站| 2021久久国产精品不只是精品| 久久国产精品色婷婷| 欧美xxxxxxxxx| 国产一区二区三区精品欧美日韩一区二区三区| 91精品久久久久久久91蜜桃| 日本怡春院一区二区| 日韩欧美一区在线| 精品系列免费在线观看| 久久久美女毛片| 国产99久久精品| 国产精品久久精品日日| 91在线丨porny丨国产| 亚洲卡通欧美制服中文| 在线免费亚洲电影| 日韩精品一二三区| 日韩精品一区二区三区视频播放| 看电视剧不卡顿的网站| 国产欧美精品区一区二区三区 | 久久综合九色综合欧美98| 国内精品国产成人| 国产精品黄色在线观看| 在线视频综合导航| 日本成人在线不卡视频| 久久久午夜精品| 99re热这里只有精品视频| 亚洲国产欧美另类丝袜| 欧美成人猛片aaaaaaa| 成人免费视频网站在线观看| 亚洲男人的天堂一区二区 | 一级中文字幕一区二区| 欧美人与z0zoxxxx视频| 国产真实乱对白精彩久久| 国产精品免费人成网站| 欧美日韩精品一区二区三区| 国产美女精品在线| 亚洲男女毛片无遮挡| 精品蜜桃在线看| 日本精品裸体写真集在线观看| 欧美aa在线视频| 亚洲精品一二三区| 精品国产伦一区二区三区观看方式| 成人h动漫精品一区二| 日本欧美一区二区| 国产精品高清亚洲| 日韩精品一区二区在线观看| 91视视频在线观看入口直接观看www | 91精品国产91久久久久久一区二区 | 欧美大黄免费观看| 91在线高清观看| 久久99精品一区二区三区| 亚洲欧美一区二区三区孕妇| 26uuu精品一区二区在线观看| 欧洲国内综合视频| 成人黄色在线看| 久久99在线观看| 亚洲成av人片在线观看| 亚洲欧美在线观看| 国产午夜亚洲精品不卡| 欧美一级高清大全免费观看| 日本韩国视频一区二区| 国产成人免费在线| 国产在线不卡一区| 男男成人高潮片免费网站| 亚洲一区二区三区四区中文字幕| 中文字幕免费观看一区| 久久精品视频一区二区| 欧美成人三级电影在线| 91精品在线一区二区| 欧美久久一二区| 欧美人牲a欧美精品| 91激情五月电影| 色综合一个色综合亚洲| 成人看片黄a免费看在线| 秋霞午夜av一区二区三区| 亚洲最大的成人av| 伊人开心综合网| 亚洲欧美色综合| 亚洲色图视频网| 亚洲欧美日韩中文播放| 一色桃子久久精品亚洲| 亚洲少妇30p| 亚洲伦理在线精品| 一个色妞综合视频在线观看| 亚洲精品乱码久久久久久久久| 亚洲欧美日韩人成在线播放| 亚洲欧美激情在线| 亚洲图片有声小说| 肉丝袜脚交视频一区二区| 日韩电影免费一区| 看电影不卡的网站| 国产一区二区伦理片| 六月婷婷色综合| 国产成人精品在线看| 国产精品主播直播| av电影在线观看一区| 白白色 亚洲乱淫| 91福利国产精品| 69p69国产精品| 久久先锋影音av鲁色资源网| 国产精品无圣光一区二区| 亚洲欧洲国产专区| 亚洲动漫第一页| 久久91精品久久久久久秒播| 国内精品国产三级国产a久久| 成人黄色小视频| 欧美日韩日日夜夜| 精品免费国产一区二区三区四区| 国产精品视频yy9299一区| 一区二区在线免费| 韩国女主播成人在线| 99国产精品99久久久久久| 欧美日韩一区二区不卡| 日韩美女在线视频 | 久久精品欧美日韩| 亚洲精品日韩综合观看成人91| 亚洲伊人伊色伊影伊综合网| 老司机精品视频线观看86| 懂色av噜噜一区二区三区av| 欧美亚洲日本一区| 久久亚洲一区二区三区四区| 亚洲精品成人天堂一二三| 美女视频黄频大全不卡视频在线播放| 高清在线观看日韩| 欧美日韩精品免费观看视频| 国产日韩精品一区二区三区在线| 亚洲精品日韩专区silk| 国产在线日韩欧美| 欧美日韩高清在线| 欧美国产精品一区| 麻豆91在线看| 欧美亚洲动漫制服丝袜| 国产午夜精品久久久久久免费视| 亚洲尤物视频在线| 成人av网站大全| 精品国产乱码久久久久久1区2区| 亚洲素人一区二区| 国产成人在线免费| 91精品国产色综合久久不卡蜜臀| 国产精品福利一区| 久久99国产精品久久| 欧美日韩一区二区三区四区| 中文字幕在线视频一区| 狠狠色丁香婷婷综合| 337p亚洲精品色噜噜| 亚洲精品欧美激情| 成人高清视频在线观看| 2023国产精品视频| 蜜桃av一区二区| 在线电影国产精品| 亚洲电影一区二区| 色婷婷久久久综合中文字幕| 国产日韩欧美一区二区三区乱码 | 国产精品入口麻豆九色| 国产一区视频网站| 欧美成人bangbros| 老司机精品视频导航| 欧美一卡在线观看| 日韩高清不卡在线| 欧美军同video69gay| 午夜精品视频在线观看|