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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? sql.c

?? ctags的最新版5.7,可以比較5.6版看看,免費(fèi)下載
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* * static void addContext (tokenInfo* const parent, const tokenInfo* const child) * { *	   if (vStringLength (parent->string) > 0) *	   { *		   vStringCatS (parent->string, "."); *	   } *	   vStringCatS (parent->string, vStringValue(child->string)); *	   vStringTerminate(parent->string); * } */static void addToScope (tokenInfo* const token, vString* const extra){	if (vStringLength (token->scope) > 0)	{		vStringCatS (token->scope, ".");	}	vStringCatS (token->scope, vStringValue(extra));	vStringTerminate(token->scope);}/* *	 Scanning functions */static void findToken (tokenInfo *const token, const tokenType type){	while (! isType (token, type))	{		readToken (token);	}}static void findCmdTerm (tokenInfo *const token, const boolean check_first){	if ( check_first ) 	{		if ( isCmdTerm(token) )			return;	}	do	{		readToken (token);	} while ( !isCmdTerm(token) );}static void skipArgumentList (tokenInfo *const token){	int nest_level = 0;	/*	 * Other databases can have arguments with fully declared	 * datatypes:	 *	 (	name varchar(30), text binary(10)  )	 * So we must check for nested open and closing parantheses	 */	if (isType (token, TOKEN_OPEN_PAREN))	/* arguments? */	{		nest_level++;		while (! (isType (token, TOKEN_CLOSE_PAREN) && (nest_level == 0)))		{			readToken (token);			if (isType (token, TOKEN_OPEN_PAREN))			{				nest_level++;			}			if (isType (token, TOKEN_CLOSE_PAREN))			{				if (nest_level > 0)				{					nest_level--;				}			}		} 		readToken (token);	}}static void parseSubProgram (tokenInfo *const token){	tokenInfo *const name  = newToken ();	/*	 * This must handle both prototypes and the body of	 * the procedures.	 *	 * Prototype:	 *	   FUNCTION func_name RETURN integer;	 *	   PROCEDURE proc_name( parameters );	 * Procedure	 *	   FUNCTION GET_ML_USERNAME RETURN VARCHAR2	 *	   IS	 *	   BEGIN	 *		   RETURN v_sync_user_id;	 *	   END GET_ML_USERNAME;	 *	 *	   PROCEDURE proc_name( parameters )	 *		   IS	 *		   BEGIN	 *		   END;	 *	   CREATE PROCEDURE proc_name( parameters )	 *		   EXTERNAL NAME ... ;	 *	   CREATE PROCEDURE proc_name( parameters )	 *		   BEGIN	 *		   END;	 *	 *	   CREATE FUNCTION f_GetClassName(	 *		   IN @object VARCHAR(128)	 *		  ,IN @code   VARCHAR(128)	 *	   )	 *	   RETURNS VARCHAR(200)	 *	   DETERMINISTIC	 *	   BEGIN	 *	   	 *		   IF( @object = 'user_state' ) THEN	 *			   SET something = something;	 *		   END IF;	 *	   	 *		   RETURN @name;	 *	   END;	 */	const sqlKind kind = isKeyword (token, KEYWORD_function) ?		SQLTAG_FUNCTION : SQLTAG_PROCEDURE;	Assert (isKeyword (token, KEYWORD_function) ||			isKeyword (token, KEYWORD_procedure));	readToken (name);	readToken (token);	if (isType (token, TOKEN_PERIOD))	{		readToken (name);		readToken (token);	}	skipArgumentList (token);	if (kind == SQLTAG_FUNCTION)	{		if (isKeyword (token, KEYWORD_return))		{			/* Read datatype */			readToken (token);			/*			 * Read token after which could be the			 * command terminator if a prototype			 */			readToken (token);		}	}	if( isCmdTerm (token) )	{		makeSqlTag (name, SQLTAG_PROTOTYPE);	} 	else 	{		while (!(isKeyword (token, KEYWORD_is) ||					isKeyword (token, KEYWORD_begin) ||					isCmdTerm (token)				)			  )		{			/* read return type */			readToken (token);		}		if (isKeyword (token, KEYWORD_is) || 				isKeyword (token, KEYWORD_begin) )		{			addToScope(token, name->string);			if (isType (name, TOKEN_IDENTIFIER) ||					isType (name, TOKEN_STRING) ||					!isKeyword (token, KEYWORD_NONE)			   )				makeSqlTag (name, kind);			parseBlock (token, TRUE);			vStringClear (token->scope);		} 	}	deleteToken (name);}static void parseRecord (tokenInfo *const token){	/*	 * Make it a bit forgiving, this is called from	 * multiple functions, parseTable, parseType	 */	if (!isType (token, TOKEN_OPEN_PAREN))		readToken (token);	Assert (isType (token, TOKEN_OPEN_PAREN));	do	{		if ( isType (token, TOKEN_COMMA) || isType (token, TOKEN_OPEN_PAREN) )			readToken (token);		/*		 * Create table statements can end with various constraints		 * which must be excluded from the SQLTAG_FIELD.		 *	  create table t1 (		 *		  c1 integer,		 *		  c2 char(30),		 *		  c3 numeric(10,5),		 *		  c4 integer,		 *		  constraint whatever,		 *		  primary key(c1),		 *		  foreign key (), 		 *		  check ()		 *	  )		 */		if (! (isKeyword(token, KEYWORD_primary) ||					isKeyword(token, KEYWORD_references) ||					isKeyword(token, KEYWORD_unique) ||					isKeyword(token, KEYWORD_check) ||					isKeyword(token, KEYWORD_constraint) ||					isKeyword(token, KEYWORD_foreign) ) )		{			if (isType (token, TOKEN_IDENTIFIER) ||					isType (token, TOKEN_STRING))				makeSqlTag (token, SQLTAG_FIELD);		}		while (!(isType (token, TOKEN_COMMA) ||					isType (token, TOKEN_CLOSE_PAREN) ||					isType (token, TOKEN_OPEN_PAREN) 				))		{			readToken (token);			/* 			 * A table structure can look like this:			 *	  create table t1 (			 *		  c1 integer,			 *		  c2 char(30),			 *		  c3 numeric(10,5),			 *		  c4 integer			 *	  )			 * We can't just look for a COMMA or CLOSE_PAREN			 * since that will not deal with the numeric(10,5)			 * case.  So we need to skip the argument list 			 * when we find an open paren.			 */			if (isType (token, TOKEN_OPEN_PAREN))			{				/* Reads to the next token after the TOKEN_CLOSE_PAREN */				skipArgumentList(token);			}		}	} while (! isType (token, TOKEN_CLOSE_PAREN));}static void parseType (tokenInfo *const token){	tokenInfo *const name = newToken ();	vString * saveScope = vStringNew ();	vStringCopy(saveScope, token->scope);	/* If a scope has been set, add it to the name */	addToScope (name, token->scope);	readToken (name);	if (isType (name, TOKEN_IDENTIFIER))	{		readToken (token);		if (isKeyword (token, KEYWORD_is))		{			readToken (token);			addToScope (token, name->string);			switch (token->keyword)			{				case KEYWORD_record:				case KEYWORD_object:					makeSqlTag (name, SQLTAG_RECORD);					parseRecord (token);					break;				case KEYWORD_table:					makeSqlTag (name, SQLTAG_TABLE);					break;				case KEYWORD_ref:					readToken (token);					if (isKeyword (token, KEYWORD_cursor))						makeSqlTag (name, SQLTAG_CURSOR);					break;				default: break;			}			vStringClear (token->scope);		}	}	vStringCopy(token->scope, saveScope);	deleteToken (name);	vStringDelete(saveScope);}static void parseSimple (tokenInfo *const token, const sqlKind kind){	/* This will simply make the tagname from the first word found */	readToken (token);	if (isType (token, TOKEN_IDENTIFIER) ||			isType (token, TOKEN_STRING))		makeSqlTag (token, kind);}static void parseDeclare (tokenInfo *const token, const boolean local){	/*	 * PL/SQL declares are of this format:	 *	  IS|AS	 *	  [declare]	 *		 CURSOR curname ...	 *		 varname1 datatype;	 *		 varname2 datatype;	 *		 varname3 datatype;	 *	  begin	 */	if (isKeyword (token, KEYWORD_declare))		readToken (token);	while (! isKeyword (token, KEYWORD_begin) && ! isKeyword (token, KEYWORD_end))	{		switch (token->keyword)		{			case KEYWORD_cursor:	parseSimple (token, SQLTAG_CURSOR); break;			case KEYWORD_function:	parseSubProgram (token); break;			case KEYWORD_procedure: parseSubProgram (token); break;			case KEYWORD_subtype:	parseSimple (token, SQLTAG_SUBTYPE); break;			case KEYWORD_trigger:	parseSimple (token, SQLTAG_TRIGGER); break;			case KEYWORD_type:		parseType (token); break;			default:									if (isType (token, TOKEN_IDENTIFIER))									{										if (local)										{											makeSqlTag (token, SQLTAG_LOCAL_VARIABLE);										} 										else 										{											makeSqlTag (token, SQLTAG_VARIABLE);										}									}									break;		}		findToken (token, TOKEN_SEMICOLON);		readToken (token);	}}static void parseDeclareANSI (tokenInfo *const token, const boolean local){	tokenInfo *const type = newToken ();	/*	 * ANSI declares are of this format:	 *	 BEGIN	 *		 DECLARE varname1 datatype;	 *		 DECLARE varname2 datatype;	 *		 ...	 *	 * This differ from PL/SQL where DECLARE preceeds the BEGIN block	 * and the DECLARE keyword is not repeated.	 */	while (isKeyword (token, KEYWORD_declare))	{		readToken (token);		readToken (type);		if (isKeyword (type, KEYWORD_cursor))			makeSqlTag (token, SQLTAG_CURSOR);		else if (isKeyword (token, KEYWORD_local) &&				isKeyword (type, KEYWORD_temporary))		{			/*			 * DECLARE LOCAL TEMPORARY TABLE table_name (			 *	  c1 int,			 *	  c2 int			 * );			 */			readToken (token);			if (isKeyword (token, KEYWORD_table))			{				readToken (token);				if (isType(token, TOKEN_IDENTIFIER) || 						isType(token, TOKEN_STRING) )				{					makeSqlTag (token, SQLTAG_TABLE);				}			}		}		else if (isType (token, TOKEN_IDENTIFIER) || 				isType (token, TOKEN_STRING))		{			if (local)				makeSqlTag (token, SQLTAG_LOCAL_VARIABLE);			else				makeSqlTag (token, SQLTAG_VARIABLE);		}		findToken (token, TOKEN_SEMICOLON);		readToken (token);	}	deleteToken (type);}static void parseLabel (tokenInfo *const token){	/*	 * A label has this format:	 *	   <<tobacco_dependency>>	 *	   DECLARE	 *		  v_senator VARCHAR2(100) := 'THURMOND, JESSE';	 *	   BEGIN	 *		  IF total_contributions (v_senator, 'TOBACCO') > 25000	 *		  THEN	 *			 <<alochol_dependency>>	 *			 DECLARE	 *				v_senator VARCHAR2(100) := 'WHATEVERIT, TAKES';	 *			 BEGIN	 *				...	 */	Assert (isType (token, TOKEN_BLOCK_LABEL_BEGIN));	readToken (token);	if (isType (token, TOKEN_IDENTIFIER))	{		makeSqlTag (token, SQLTAG_BLOCK_LABEL);		readToken (token);		  /* read end of label */	}}static void parseStatements (tokenInfo *const token){	do	{		if (isType (token, TOKEN_BLOCK_LABEL_BEGIN))			parseLabel (token);		else		{			switch (token->keyword)			{				case KEYWORD_exception:					/*					 * EXCEPTION					 *	 <exception handler>;					 *					 * Where an exception handler could be:					 *	 BEGIN					 *		WHEN OTHERS THEN					 *			x := x + 3;					 *	 END;					 * In this case we need to skip this keyword and 					 * move on to the next token without reading until					 * TOKEN_SEMICOLON;					 */					readToken (token);					continue;				case KEYWORD_when:					/*					 * WHEN statements can be used in exception clauses					 * and CASE statements.  The CASE statement should skip					 * these given below we skip over to an END statement.					 * But for an exception clause, we can have:					 *	   EXCEPTION					 *		   WHEN OTHERS THEN					 *		   BEGIN					 *				  x := x + 3;					 *		   END;					 * If we skip to the TOKEN_SEMICOLON, we miss the begin					 * of a nested BEGIN END block.  So read the next token					 * after the THEN and restart the LOOP.					 */					while (! isKeyword (token, KEYWORD_then))						readToken (token);					readToken (token);					continue;				case KEYWORD_if:					/*					 * We do not want to look for a ; since for an empty					 * IF block, it would skip over the END.					 *	IF...THEN					 *	END IF;					 */					while (! isKeyword (token, KEYWORD_then))						readToken (token);					parseStatements (token);					/* 					 * parseStatements returns when it finds an END, an IF					 * statement should be followed by an IF (ANSI anyway)					 * so read the following IF as well					 */					readToken (token);					break;				case KEYWORD_loop:				case KEYWORD_case:				case KEYWORD_for:					/*					 *	LOOP...					 *	END LOOP;					 *						 *	FOR loop_name AS cursor_name CURSOR FOR ...					 *	END FOR;					 */					readToken (token);					parseStatements (token);					break;				case KEYWORD_declare:				case KEYWORD_begin:					parseBlock (token, TRUE);					break;				default:					readToken (token);					break;			}			/*			 * Not all statements must end in a semi-colon 			 *	   begin			 *		   if current publisher <> 'publish' then			 *			 signal UE_FailStatement			 *		   end if			 *	   end;			 * The last statement prior to an end ("signal" above) does			 * not need a semi-colon, nor does the end if, since it is 			 * also the last statement prior to the end of the block.			 *			 * So we must read to the first semi-colon or an END block			 */			while (! (isKeyword (token, KEYWORD_end) ||						(isType (token, TOKEN_SEMICOLON)))	  )			{				readToken (token);			}		}		/*		 * We assumed earlier all statements ended with a semi-colon,		 * see comment above, now, only read if the current token 		 * is not a semi-colon		 */		if ( isType (token, TOKEN_SEMICOLON) )		{			readToken (token);		}	} while (! isKeyword (token, KEYWORD_end));}static void parseBlock (tokenInfo *const token, const boolean local){	if (isType (token, TOKEN_BLOCK_LABEL_BEGIN))	{		parseLabel (token);		readToken (token);	}	if (! isKeyword (token, KEYWORD_begin))	{		readToken (token);		/*		 * These are Oracle style declares which generally come		 * between an IS/AS and BEGIN block.		 */		parseDeclare (token, local);	}	if (isKeyword (token, KEYWORD_begin))	{		readToken (token);		/*		 * Check for ANSI declarations which always follow		 * a BEGIN statement.  This routine will not advance		 * the token if none are found.		 */		parseDeclareANSI (token, local);		while (! isKeyword (token, KEYWORD_end))		{			parseStatements (token);		}		findCmdTerm (token, FALSE);	}}static void parsePackage (tokenInfo *const token){	/* 	 * Packages can be specified in a number of ways:	 *		CREATE OR REPLACE PACKAGE pkg_name AS	 * or	 *		CREATE OR REPLACE PACKAGE owner.pkg_name AS	 * or by specifying a package body	 *	   CREATE OR REPLACE PACKAGE BODY pkg_name AS	 *	   CREATE OR REPLACE PACKAGE BODY owner.pkg_name AS	 */	tokenInfo *const name = newToken ();	readToken (name);	if (isKeyword (name, KEYWORD_body))	{		/*		 * Ignore the BODY tag since we will process		 * the body or prototypes in the same manner		 */		readToken (name);	}	/* Check for owner.pkg_name */	while (! isKeyword (token, KEYWORD_is))	{		readToken (token);		if ( isType(token, TOKEN_PERIOD) )		{			readToken (name);		}	}	if (isKeyword (token, KEYWORD_is))	{		if (isType (name, TOKEN_IDENTIFIER) ||				isType (name, TOKEN_STRING))

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人av在线电影| 色丁香久综合在线久综合在线观看| 日本一区二区动态图| 欧美专区在线观看一区| 国产精品综合一区二区| 亚洲成人午夜影院| 中文字幕一区二区三| 欧美岛国在线观看| 欧洲人成人精品| 成人福利电影精品一区二区在线观看| 五月天欧美精品| 1024国产精品| 日本一区二区三区在线不卡 | 九九精品视频在线看| 亚洲综合一二三区| 亚洲欧美在线aaa| 久久一区二区三区国产精品| 欧美久久久久中文字幕| 91在线视频在线| 成人在线综合网| 国产精品一线二线三线精华| 狂野欧美性猛交blacked| 亚洲一区二区av在线| 亚洲欧美日韩国产中文在线| 国产欧美视频在线观看| 精品久久国产老人久久综合| 6080午夜不卡| 欧美酷刑日本凌虐凌虐| 欧美精品在线观看播放| 欧美美女一区二区| 欧美性猛片aaaaaaa做受| 色综合婷婷久久| 色婷婷综合久久久中文一区二区 | 精品一区二区免费视频| 三级一区在线视频先锋| 亚洲一区二区三区四区五区黄| 国产精品国产三级国产a| 国产精品五月天| 亚洲国产激情av| 国产精品视频yy9299一区| 日本一二三不卡| 国产精品国产三级国产aⅴ入口 | 日韩视频在线永久播放| 91精品国产一区二区| 欧美一区二区三区视频免费 | 日韩精品五月天| 麻豆国产欧美日韩综合精品二区| 日本伊人色综合网| 裸体在线国模精品偷拍| 国产精品一区免费视频| 成人激情免费网站| 色悠悠亚洲一区二区| 欧美在线一区二区| 91精品久久久久久蜜臀| 欧美成人性福生活免费看| 亚洲精品一区二区三区影院 | 久久午夜免费电影| 国产丝袜欧美中文另类| 亚洲视频精选在线| 一区二区三区四区高清精品免费观看 | 欧美xxxxxxxxx| 国产日韩欧美a| 亚洲欧洲日韩一区二区三区| 夜夜精品浪潮av一区二区三区| 亚洲成人精品一区| 国产精品一区二区黑丝| 色婷婷综合久久久中文一区二区 | 日本中文一区二区三区| 国产精品99久久久久久宅男| 99re热视频这里只精品| 欧美久久久久免费| 国产精品天美传媒| 亚洲电影在线免费观看| 国产传媒久久文化传媒| 色婷婷av一区二区三区软件 | 日韩vs国产vs欧美| 懂色av中文字幕一区二区三区| 色综合色综合色综合色综合色综合 | 在线视频你懂得一区| 精品日韩成人av| 中文字幕一区二| 蜜桃在线一区二区三区| 成人激情免费电影网址| 777色狠狠一区二区三区| 久久精品一区二区三区av| 亚洲一区日韩精品中文字幕| 国产一区二区三区精品欧美日韩一区二区三区| 懂色av一区二区三区免费观看| 欧美在线一区二区| 欧美国产日产图区| 日日摸夜夜添夜夜添精品视频| 成人久久视频在线观看| 欧美一级艳片视频免费观看| 综合欧美一区二区三区| 久久精品国产99久久6| 91福利在线看| 国产精品国产馆在线真实露脸| 日韩精品91亚洲二区在线观看| av电影在线观看不卡| 精品国产免费人成电影在线观看四季 | 欧美一区二区大片| 亚洲一级片在线观看| 粉嫩嫩av羞羞动漫久久久| 在线综合视频播放| 亚洲精品视频一区二区| 成人午夜视频网站| 久久久三级国产网站| 奇米色一区二区三区四区| 欧洲亚洲国产日韩| **性色生活片久久毛片| 国产一区二区日韩精品| 欧美一级在线观看| 午夜精品久久一牛影视| 91黄色激情网站| 国产精品成人一区二区艾草 | 成人综合婷婷国产精品久久免费| 日韩欧美在线一区二区三区| 亚洲一区二区在线观看视频| 成人理论电影网| 国产精品丝袜91| 成人性生交大片| 国产欧美一区视频| 国产一区二区三区四区五区入口| 欧美军同video69gay| 亚洲成在人线免费| 欧美亚洲精品一区| 亚洲成精国产精品女| 日本道免费精品一区二区三区| 亚洲男人的天堂av| 色婷婷一区二区三区四区| 亚洲女同一区二区| 在线看日韩精品电影| 亚洲成人一区二区在线观看| 欧洲国内综合视频| 亚洲mv在线观看| 欧美一区二区三区的| 奇米一区二区三区av| 欧美va亚洲va| thepron国产精品| 日韩一区在线免费观看| 色综合久久久久久久久| 亚洲午夜久久久久久久久电影院| 欧美在线影院一区二区| 石原莉奈一区二区三区在线观看| 69久久夜色精品国产69蝌蚪网| 日韩一区精品视频| 日韩欧美在线网站| 国产精品一区三区| 亚洲人一二三区| 在线视频观看一区| 日日摸夜夜添夜夜添亚洲女人| 日韩一级成人av| 国产高清精品网站| 亚洲精品国产a| 欧美日韩综合在线免费观看| 日韩黄色免费网站| 国产视频一区在线观看| 99麻豆久久久国产精品免费优播| 亚洲免费毛片网站| 日韩欧美国产综合在线一区二区三区| 久久成人免费电影| 自拍av一区二区三区| 欧美男男青年gay1069videost| 青青草国产精品亚洲专区无| 久久久精品人体av艺术| 色综合天天综合网国产成人综合天| 亚洲免费在线观看视频| 欧美美女bb生活片| 国产精品一区二区久久精品爱涩| 亚洲乱码中文字幕| 日韩欧美国产一区在线观看| 国产馆精品极品| 亚洲国产精品久久久久婷婷884 | 日本一区二区三区四区在线视频| 色综合一个色综合亚洲| 日日夜夜免费精品| 国产精品色哟哟| 欧美日韩精品一区二区三区四区 | 成人精品国产免费网站| 亚洲一区在线免费观看| 久久婷婷一区二区三区| 一本色道久久综合亚洲91 | 91浏览器入口在线观看| 蜜臀av性久久久久蜜臀aⅴ流畅 | 奇米四色…亚洲| 亚洲欧美国产三级| 久久婷婷国产综合精品青草| 波多野结衣中文字幕一区二区三区| 亚洲第四色夜色| 日韩一区有码在线| 2021国产精品久久精品| 日本高清成人免费播放| 国产91精品久久久久久久网曝门| 亚洲一区在线播放| 中文字幕av一区二区三区| 日韩一区二区电影| 91精品福利视频| 丰满放荡岳乱妇91ww| 麻豆精品视频在线观看| 亚洲成a人在线观看|