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

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

?? sexpeval.cpp

?? 用C語言設計的EPSON LCD控制器S1D13700驅動。
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
//============================================================================
//
//  SExpEval.cpp - Simple Expression Evaluator
//
//  Copyright (c) 2002 Epson Research and Development, Inc. 
//  All rights reserved.
//
//	The tabs in the file is formatted at 4.
//
//============================================================================

#ifdef _WIN32
#pragma warning( disable : 4100 )	// Disable "unreferenced formal parameter" warning.
#pragma warning( disable : 4514 )	// Disable "unreferenced inline function has been removed" warning (math.h generates these).
#endif


#include <string.h>
#include <stdlib.h>
#include <math.h>
#include "SExpEval.h"
#include "helper.h"




//
// MODULE FUNCTIONS
//

static bool LookupSVar(	in const char* Name, in UInt32 NameLen, in const char* NameSpace, out UInt32& ListIndex );

static int EvalNumIf(			in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalLogAnd(			in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalLogOr(			in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalLogXOr(			in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalBitAnd(			in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalBitOr(			in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalBitXOr(			in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalIsEqual(			in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalIsNotEqual(		in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalIsLT(			in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalIsGT(			in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalIsLTE(			in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalIsGTE(			in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalLeftShift(		in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalRightShift(		in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalLeftRotate(		in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalRightRotate(		in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalAdd(				in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalSubtract(		in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalMultiply(		in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalDivide(			in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalModulus(			in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalLogNot(			in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalBitComplement(	in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
static int EvalExponential(		in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );

#define	   strnewcpy(des,src)	des=new char[strlen(src)+1], strcpy(des,src)
#define    DOEXPRESSION(nth)	{ int ee = EvaluateSExpression(Expr+ExprStart[nth],ExprEnd[nth]-ExprStart[nth],&e[nth],NameSpace,ErrorMsg); if (ee) return ExprStart[nth]+ee; }
#define    ISEXPRTRUE(nth)		( e[nth].IsString ? (e[nth].StrValue[0]!='\0') : (!!e[nth].NumValue) )




//
// EXPRESSION EVALUATOR DATA
//

static ExternalVarFunc	g_cbVar = NULL;
static UInt32			g_DefaultRadix = 16;
#define					EXPR_TOKEN_LETTER	'e'
#define					MaxExprsPerTemplate	3

typedef int (*SExprFunc)( in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg );
			// Returns 0 if successful, else index into Expr to show where the error occurred.

typedef struct SExprDef
{
	char		Template[10];
	SExprFunc	EvalExpr;
} SExprDef;

static SExprDef	SExpr[] =
{
	// Characters in {braces} are NOT to be matched.
	{ "e?e:e",		EvalNumIf },
	{ "e xor e",	EvalLogXOr },
	{ "e or e",		EvalLogOr },
	{ "e and e",	EvalLogAnd },
	{ "not e",		EvalLogNot },
	{ "e||e",		EvalLogOr },
	{ "e&&e",		EvalLogAnd },
	{ "e^e",		EvalBitXOr },
	{ "e|e",		EvalBitOr },
	{ "e&e",		EvalBitAnd },
	{ "e!=e",		EvalIsNotEqual },
	{ "e==e",		EvalIsEqual },
	{ "e>{=>}e",	EvalIsGT },
	{ "e<{=<}e",	EvalIsLT },
	{ "e>=e",		EvalIsGTE },
	{ "e<=e",		EvalIsLTE },
	{ "e>>{>}e",	EvalRightShift },
	{ "e<<{<}e",	EvalLeftShift },
	{ "e>>>e",		EvalRightRotate },
	{ "e<<<e",		EvalLeftRotate },
	{ "e-e",		EvalSubtract },
	{ "e+e",		EvalAdd },
	{ "e%e",		EvalModulus },
	{ "e/e",		EvalDivide },
	{ "e*{*}e",		EvalMultiply },
	{ "~e",			EvalBitComplement },
	{ "!e",			EvalLogNot },
	{ "e**e",		EvalExponential }
};
const int nSExprs = sizeof(SExpr)/sizeof(SExpr[0]);

//
// USER-DEFINED VARIABLE DATA
//

typedef struct SVarDef
{
	char*	Name;
	bool	IsString;
	UInt32	NumValue;
	char*	StrValue;
	char*	NameSpace;
} SVarDef;

#define		MaxSVars	100
UInt32		NumSVars = 0;
SVarDef		SVars[MaxSVars];




//
// MODULE CODE
//


int EvaluateSExpression( in const char* Expr, in UInt32 ExprLen, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg )
{
	int		ExprError = 0;
	UInt32	i, iT, iE, Radix;
	UInt32	nCharsIgnored = 0;
	UInt32	TemplateLen;
	int		Depth;
	bool	WithinQuotes = false;
	bool	OuterParen;

	UInt32	TokenLen;
	bool	ToString = false;
	UInt32	ToRadix = 0;
	UInt32	ToWidth = 0;

	//
	// PREPARE EXPRESSION FOR PARSING
	//

	// Strip pre/post spacing
	for ( ; (Expr[0]==' '||Expr[0]=='\t'); Expr++,ExprLen-- );
	for ( ; (Expr[ExprLen-1]==' '||Expr[ExprLen-1]=='\t'); ExprLen-- );

	// Verify balance of parenthesis, and strip off outer parenthesis, ie. only (a+b) or (a+(b+c)), but not (a+b)+(c+d).
	OuterParen = ( Expr[0] == '(' );
	for ( iE=Depth=0; iE<ExprLen; iE++ )
	{
		switch ( Expr[iE] )
		{
			case '\"':	if (!iE||Expr[iE-1]!='\\') WithinQuotes=!WithinQuotes;	break;
			case '(':	if (!WithinQuotes) Depth++;								break;
			case ')':	if (!WithinQuotes) Depth--;								break;
		}
		if ( Depth==0 && iE!=ExprLen-1 )
			OuterParen = false;
	}
	if ( Depth != 0 )
	{
		if ( ErrorMsg )
			*ErrorMsg = "Parenthesis mismatch.";
		return 1;
	}
	if ( OuterParen )
	{
		// Made it through without encountering an area not enclosed in the outer paren, so exclude it from here.
		Expr++;
		nCharsIgnored = 1;
		ExprLen -= 2;

		// Re-Strip pre/post spacing
		for ( ; (Expr[0]==' '||Expr[0]=='\t'); Expr++,ExprLen-- );
		for ( ; (Expr[ExprLen-1]==' '||Expr[ExprLen-1]=='\t'); ExprLen-- );

	}

	//
	// ENUMERATE THRU ALL TEMPLATE EXPRESSIONS
	//

	for ( i=0; i<nSExprs; i++ )
	{
		UInt32	eStart[MaxExprsPerTemplate];
		UInt32	eEnd[MaxExprsPerTemplate];
		UInt32	nExprsFound = 0;
		bool	MatchSoFar = true;

		TemplateLen = strlen( SExpr[i].Template );

		// Is this template expression anywhere in Expr?
		iT = iE = 0;
		while ( MatchSoFar && iT<TemplateLen && iE<ExprLen )
		{
			bool   ExprExpected = false;
			UInt32 iOpEnd;

			// Does an expression preceed the next operator?
			if ( SExpr[i].Template[iT] == EXPR_TOKEN_LETTER )
			{
				ExprExpected = true;
				eStart[nExprsFound] = iE;
				iT++;
			}

			// Determine all operator characters to match.
			for ( iOpEnd=iT; iOpEnd<TemplateLen; iOpEnd++ )
				if ( SExpr[i].Template[iOpEnd] == EXPR_TOKEN_LETTER )
					break;

			if ( iOpEnd == iT )
			{
				// There are no more operators to match.
				iE = eEnd[nExprsFound] = ExprLen;
			}
			else
			{
				// An operator match is required, so find it.
				bool InQuote = false;
				int	 ScopeDepth = 0;
				MatchSoFar = false;
				for ( eEnd[nExprsFound]=iE; eEnd[nExprsFound]<ExprLen && !MatchSoFar; eEnd[nExprsFound]++ )
				{
					switch ( Expr[eEnd[nExprsFound]] )
					{
					  case '\"':
						if ( Expr[eEnd[nExprsFound]-1] != '\\' )
							InQuote = !InQuote;
						break;
					  case '(':
					  case '[':
						if ( !InQuote )
							ScopeDepth++;
						break;
					  case ')':
					  case ']':
						if ( !InQuote )
							ScopeDepth--;
						break;
					  default:
						if ( !InQuote && !ScopeDepth )
						{
							// Check to see if the next one or few characters match the operators in the template.
							const char* Operators	= SExpr[i].Template + iT;
							int			iOperators	= 0;
							int			nOperators	= iOpEnd - iT;
							const char* StrToMatch	= Expr + eEnd[nExprsFound];
							int			iStrToMatch	= 0;

							MatchSoFar = true;
							while ( MatchSoFar && iOperators<nOperators )
							{
								if ( Operators[iOperators] == '{' )
								{
									// Do NOT match with these characters.
									while ( Operators[++iOperators] != '}' )
									{
										if ( tolower(StrToMatch[iStrToMatch]) == Operators[iOperators] )
										{
											// Found an illegal match, so skip this group entirely.
											eEnd[nExprsFound] = ExprLen;
											MatchSoFar = false;
											break;
										}
									}
								}
								else if ( tolower(StrToMatch[iStrToMatch]) == Operators[iOperators] )
									iStrToMatch++;
								else
									MatchSoFar = false;
								iOperators++;
							}
							if ( MatchSoFar )
							{
								iE = eEnd[nExprsFound] + iStrToMatch;
								iT += nOperators;
								eEnd[nExprsFound]--;
							}
						}
						break;
					}
				}
			}

			if ( ExprExpected && MatchSoFar )
			{
				if ( eStart[nExprsFound] == eEnd[nExprsFound] )
				{
					if ( ErrorMsg )
						*ErrorMsg = "Expected an expression here.";
					return eStart[nExprsFound] + nCharsIgnored + 1;
				}
				nExprsFound++;
			}
		}

		if ( MatchSoFar )
		{
			// Apply the template.
			ExprError = SExpr[i].EvalExpr( Expr, eStart, eEnd, nExprsFound, EndResult, NameSpace, ErrorMsg );
			return ExprError ? ExprError+nCharsIgnored : 0;
		}
	}

	//
	// MUST BE A TOKEN
	//

	// Skip leading and post-fixed spaces.
	while ( Expr[0]==' ' || Expr[0]=='\t' ) Expr++, nCharsIgnored++, ExprLen--;
	while ( (Expr[ExprLen-1]==' ' || Expr[ExprLen-1]=='\t') && ExprLen>0 ) ExprLen--;

	// Is there a format conversion suffix? (token.nh10, etc)
	for ( TokenLen=Depth=0; TokenLen<ExprLen; TokenLen++ )
	{
		if ( Expr[TokenLen] == '\"' )
			Depth = 1 - Depth;
		else if ( !Depth && Expr[TokenLen]=='.' )
			break;
	}
	if ( TokenLen < ExprLen )
	{
		i = TokenLen + 1;
		switch ( Expr[i] )
		{
			case 's':  case 'S':  ToString=true;										break;
			case 'n':  case 'N':  ToString=false;										break;
			default:   if (ErrorMsg) *ErrorMsg="Unknown format specifier.";	return i+1;
		}
		if ( Expr[++i] )
		{
			switch ( Expr[i] )
			{
				case 'h':  case 'H':  ToRadix=16;  i++;  break;
				case 't':  case 'T':  ToRadix=10;  i++;  break;
				case 'o':  case 'O':  ToRadix=8;   i++;  break;
				case 'i':  case 'I':  ToRadix=2;   i++;  break;
			}
			if ( Expr[i]>='0' && Expr[i]<='9' )
				ToWidth = atoi32( Expr+i, 10 );
		}
	}

	// Since all expression failed to match, then this must be a value.
	if ( Expr[0] == '\"' )
	{
		// STRING VALUE
		EndResult->IsString = true;
		if ( Expr[TokenLen-1] != '\"' )
		{
			if ( ErrorMsg )
				*ErrorMsg = "Invalid string value.";
			return nCharsIgnored + 1;
		}
		UInt32 StrLen = min( TokenLen-2, MaxStringValueSize-1 );
		strncpy( EndResult->StrValue, Expr+1, StrLen );
		EndResult->StrValue[StrLen] = '\0';
	}
	else if ( isnumber(Expr,TokenLen,g_DefaultRadix,&Radix) )
	{
		// NUMERICAL VALUE
		EndResult->IsString = false;
		EndResult->NumValue = atoi32( Expr, Radix );
	}
	else if ( Expr[0] == '$' )
	{
		// USER VARIABLES
		if ( !GetSVar(Expr,TokenLen,EndResult,NameSpace) )
		{
			if ( ErrorMsg )
				*ErrorMsg = "Unknown token or expression.";
			return nCharsIgnored + 1;
		}
	}
	else
	{
		// VARIABLES OR ARRAYS
		if ( g_cbVar )
		{
			EndResult->IsString = ( ToString && !ToRadix );
			ExprError = g_cbVar( Expr, TokenLen, EndResult, ErrorMsg );
			if ( ExprError )
				return ExprError + nCharsIgnored;
		}
		else
		{
			if ( ErrorMsg )
				*ErrorMsg = "Unknown token or expression.";
			return nCharsIgnored + 1;
		}
	}

	if ( TokenLen < ExprLen )
	{
		if ( !EndResult->IsString && !ToString )
		{
			if ( ErrorMsg )
				*ErrorMsg = "Cannot convert a numerical value to a numerical value.";
			return TokenLen + 2;
		}
		if ( ToRadix == 0 )
			ToRadix = g_DefaultRadix;
		if ( EndResult->IsString && ToString )
		{
			if ( ToWidth == 0 )
				return 0;
			EndResult->StrValue[ToWidth] = '\0';
			for ( i=strlen(EndResult->StrValue); i<ToWidth; i++ )
				EndResult->StrValue[i] = ' ';
		}
		else if ( ToString )
			strcpynum( EndResult->StrValue, EndResult->NumValue, ToRadix, ToWidth );
		else
			EndResult->NumValue = aton32( EndResult->StrValue, ToWidth, ToRadix );
		EndResult->IsString = ToString;
	}

	return 0;
}




void SetSExpressionDefaultRadix( in UInt32 DefaultRadix )
{
	g_DefaultRadix = DefaultRadix;
}




bool SetSVar( in const char* Name, in UInt32 NameLen, in SValueDef* Value, in const char* NameSpace )
{
	UInt32 i;

	// Look up to see if variable already exists.
	if ( LookupSVar(Name,NameLen,NameSpace,i) )
	{
		// Existing variable found.
		if ( SVars[i].StrValue )
			delete [] SVars[i].StrValue;
		SVars[i].StrValue = NULL;
	}
	else
	{
		// Doesn't currently exist, create a new one.
		if ( NumSVars+1 > MaxSVars )
			return false; // No room!
		strnewcpy( SVars[i].Name, Name );
		SVars[i].Name[NameLen] = '\0';
		NumSVars++;
	}
	SVars[i].IsString = Value->IsString;
	SVars[i].NumValue = Value->NumValue;
	if ( Value->IsString )
		strnewcpy( SVars[i].StrValue, Value->StrValue );
	if ( NameSpace )

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精彩视频一区二区| 国产91精品免费| 国产精品一级在线| 欧美日本一道本| 亚洲国产精品成人综合色在线婷婷| 午夜免费久久看| 成人a免费在线看| 精品av久久707| 日韩高清在线观看| 欧美日韩在线直播| 亚洲视频免费在线| 成人毛片视频在线观看| 久久蜜桃av一区二区天堂 | 欧美精选午夜久久久乱码6080| 国产精品视频观看| 国产在线一区二区| 日韩视频免费直播| 天堂资源在线中文精品| 色婷婷精品大在线视频| 国产精品高潮久久久久无| 国内精品视频一区二区三区八戒| 91精品国产手机| 亚洲综合成人在线视频| 成人av网站大全| 国产精品色哟哟| 国产99久久久精品| 国产欧美精品一区二区三区四区 | 亚洲综合激情网| 日韩免费高清av| 国产精品欧美精品| 成人午夜私人影院| 国产精品久久久久aaaa| 成人免费不卡视频| 日韩理论片中文av| 在线视频国内自拍亚洲视频| 一区二区在线看| 欧美性猛交xxxx黑人交| 亚洲成人综合在线| 欧美男女性生活在线直播观看| 亚洲线精品一区二区三区| 欧美日韩高清影院| 日韩电影在线免费| 日韩午夜在线观看视频| 蜜桃视频一区二区三区| 久久综合一区二区| 成人午夜在线免费| 亚洲精品欧美激情| 欧美精品自拍偷拍动漫精品| 久久99久久99| 国产精品国产三级国产三级人妇| 99热这里都是精品| 亚洲成a人v欧美综合天堂 | 久久久久88色偷偷免费| 成人免费视频一区| 亚洲在线一区二区三区| 日韩欧美一级特黄在线播放| 激情小说欧美图片| 亚洲视频在线观看三级| 欧美日韩国产综合一区二区 | 成人一区在线观看| 一区二区三区四区中文字幕| 69堂成人精品免费视频| 国产精品主播直播| 一区二区三区四区不卡视频| 欧美一区二区三区免费| 国产不卡视频一区二区三区| 一区二区三区免费网站| 欧美xxxxx裸体时装秀| 北条麻妃一区二区三区| 五月婷婷综合激情| 国产欧美一区二区精品仙草咪| 色婷婷亚洲婷婷| 国产综合久久久久影院| 亚洲男人的天堂网| 久久综合久久鬼色中文字| 色天使久久综合网天天| 精品一区二区三区免费视频| 亚洲免费在线播放| 久久久久国产一区二区三区四区| 色悠悠亚洲一区二区| 麻豆精品一区二区综合av| 日韩毛片一二三区| 国产欧美日韩亚州综合 | 国产精品成人一区二区艾草| 7777精品伊人久久久大香线蕉的 | 日本不卡一二三区黄网| 亚洲人成在线播放网站岛国| 精品盗摄一区二区三区| 欧美日本在线观看| 色婷婷激情综合| 国产成人免费视| 蜜臀av亚洲一区中文字幕| 一区二区三区精品视频在线| 欧美极品美女视频| 久久久精品蜜桃| 日韩免费观看2025年上映的电影 | 国产日韩一级二级三级| 3d动漫精品啪啪一区二区竹菊| 国产日韩精品一区| 91精品国产色综合久久不卡电影| 91老师片黄在线观看| 国产69精品久久777的优势| 免费成人在线播放| 日韩黄色一级片| 天天操天天综合网| 午夜影院在线观看欧美| 亚洲777理论| 亚洲永久精品大片| 亚洲国产欧美日韩另类综合 | 欧美日韩国产一区二区三区地区| av不卡免费在线观看| 成人性视频免费网站| 国产精品中文欧美| 国产中文一区二区三区| 国内精品写真在线观看| 国产激情视频一区二区三区欧美| 久久成人综合网| 国产曰批免费观看久久久| 国产一区二区在线免费观看| 国产伦精品一区二区三区视频青涩 | 久久精品国产成人一区二区三区| 午夜精品成人在线视频| 蜜桃视频一区二区| 国产福利一区在线| 国产一区二区福利视频| 成人福利视频在线看| 91麻豆产精品久久久久久| 欧美午夜不卡视频| 欧美一二三四区在线| 2020日本不卡一区二区视频| 国产欧美日韩不卡免费| 亚洲欧美日韩国产综合在线| 亚洲国产一二三| 另类专区欧美蜜桃臀第一页| 丁香六月综合激情| 色狠狠av一区二区三区| 91精品国产综合久久蜜臀| 久久综合九色综合欧美亚洲| 国产精品久久久久久久久动漫 | 亚洲国产精品v| 亚洲一区二区三区四区在线| 免费成人美女在线观看.| 国产91丝袜在线18| 在线亚洲一区二区| 精品少妇一区二区三区在线播放 | 久久蜜桃av一区二区天堂| 中文字幕一区二区在线观看| 午夜欧美视频在线观看| 国产精品 日产精品 欧美精品| 91论坛在线播放| 精品粉嫩超白一线天av| 一区二区三区四区视频精品免费| 免费美女久久99| 91污在线观看| 精品乱人伦小说| 一区二区三区四区国产精品| 国产乱子轮精品视频| 欧美三级乱人伦电影| 久久人人爽人人爽| 亚洲第一久久影院| 国产传媒日韩欧美成人| 欧美绝品在线观看成人午夜影视| 久久精品视频网| 亚洲电影在线播放| 成人精品视频一区二区三区| 欧美一级免费大片| 亚洲免费伊人电影| 成人网页在线观看| 日韩三级中文字幕| 亚洲一区视频在线| 不卡一区二区三区四区| 久久嫩草精品久久久精品一| 亚洲大型综合色站| 色综合网色综合| 欧美激情一区二区三区蜜桃视频| 蜜乳av一区二区三区| 91九色最新地址| 国产精品久久久久7777按摩 | 免费观看91视频大全| 欧美日韩国产区一| 亚洲欧美一区二区在线观看| 国产一区二区网址| 欧美一级视频精品观看| 五月婷婷综合网| 欧美日韩国产乱码电影| 亚洲自拍偷拍综合| 91浏览器入口在线观看| 成人免费一区二区三区在线观看| 国产精品白丝jk白祙喷水网站| 91麻豆精品91久久久久久清纯| 亚洲一区在线电影| 欧美性生交片4| 亚洲国产视频a| 欧美日本不卡视频| 亚洲一卡二卡三卡四卡| 在线观看亚洲精品| 亚洲小说春色综合另类电影| 精品视频资源站| 视频在线观看国产精品| 欧美日韩精品一区二区三区四区|