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

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

?? sql.c

?? ctags的最新版5.7,可以比較5.6版看看,免費下載
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* *	$Id: sql.c 574 2007-06-26 23:05:27Z dfishburn $ * *	Copyright (c) 2002-2003, Darren Hiebert * *	This source code is released for free distribution under the terms of the *	GNU General Public License. * *	This module contains functions for generating tags for PL/SQL language *	files. *//* *	 INCLUDE FILES */#include "general.h"	/* must always come first */#include <ctype.h>	/* to define isalpha () */#include <setjmp.h>#ifdef DEBUG#include <stdio.h>#endif#include "debug.h"#include "entry.h"#include "keyword.h"#include "parse.h"#include "read.h"#include "routines.h"#include "vstring.h"/* *	On-line PL/SQL Reference Guide: *	http://info-it.umsystem.edu/oradocs/doc/server/doc/PLS23/toc.htm * *	Sample PL/SQL code is available from: *	http://www.orafaq.com/faqscrpt.htm#GENPLSQL * *	On-line SQL Anywhere Documentation *	http://www.ianywhere.com/developer/product_manuals/sqlanywhere/index.html *//* *	 MACROS */#define isType(token,t)		(boolean) ((token)->type == (t))#define isKeyword(token,k)	(boolean) ((token)->keyword == (k))/* *	 DATA DECLARATIONS */typedef enum eException { ExceptionNone, ExceptionEOF } exception_t;/* * Used to specify type of keyword. */typedef enum eKeywordId {	KEYWORD_NONE = -1,	KEYWORD_is,	KEYWORD_begin,	KEYWORD_body,	KEYWORD_cursor,	KEYWORD_declare,	KEYWORD_end,	KEYWORD_function,	KEYWORD_if,	KEYWORD_loop,	KEYWORD_case,	KEYWORD_for,	KEYWORD_call,	KEYWORD_package,	KEYWORD_pragma,	KEYWORD_procedure,	KEYWORD_record,	KEYWORD_object,	KEYWORD_ref,	KEYWORD_rem,	KEYWORD_return,	KEYWORD_returns,	KEYWORD_subtype,	KEYWORD_table,	KEYWORD_trigger,	KEYWORD_type,	KEYWORD_index,	KEYWORD_event,	KEYWORD_publication,	KEYWORD_service,	KEYWORD_domain,	KEYWORD_datatype,	KEYWORD_result,	KEYWORD_when,	KEYWORD_then,	KEYWORD_variable,	KEYWORD_exception,	KEYWORD_at,	KEYWORD_on,	KEYWORD_primary,	KEYWORD_references,	KEYWORD_unique,	KEYWORD_check,	KEYWORD_constraint,	KEYWORD_foreign,	KEYWORD_ml_table,	KEYWORD_ml_table_lang,	KEYWORD_ml_table_dnet,	KEYWORD_ml_table_java,	KEYWORD_ml_table_chk,	KEYWORD_ml_conn,	KEYWORD_ml_conn_lang,	KEYWORD_ml_conn_dnet,	KEYWORD_ml_conn_java,	KEYWORD_ml_conn_chk,	KEYWORD_local,	KEYWORD_temporary,	KEYWORD_drop,	KEYWORD_view,	KEYWORD_synonym,	KEYWORD_handler,	KEYWORD_comment,	KEYWORD_go} keywordId;/* * Used to determine whether keyword is valid for the token language and *	what its ID is. */typedef struct sKeywordDesc {	const char *name;	keywordId id;} keywordDesc;typedef enum eTokenType {	TOKEN_UNDEFINED,	TOKEN_BLOCK_LABEL_BEGIN,	TOKEN_BLOCK_LABEL_END,	TOKEN_CHARACTER,	TOKEN_CLOSE_PAREN,	TOKEN_SEMICOLON,	TOKEN_COMMA,	TOKEN_IDENTIFIER,	TOKEN_KEYWORD,	TOKEN_OPEN_PAREN,	TOKEN_OPERATOR,	TOKEN_OTHER,	TOKEN_STRING,	TOKEN_PERIOD,	TOKEN_OPEN_CURLY,	TOKEN_CLOSE_CURLY,	TOKEN_TILDE,	TOKEN_FORWARD_SLASH} tokenType;typedef struct sTokenInfo {	tokenType	type;	keywordId	keyword;	vString *	string;	vString *	scope;	unsigned long lineNumber;	fpos_t filePosition;} tokenInfo;/* *	DATA DEFINITIONS */static langType Lang_sql;static jmp_buf Exception;typedef enum {	SQLTAG_CURSOR,	SQLTAG_PROTOTYPE,	SQLTAG_FUNCTION,	SQLTAG_FIELD,	SQLTAG_LOCAL_VARIABLE,	SQLTAG_BLOCK_LABEL,	SQLTAG_PACKAGE,	SQLTAG_PROCEDURE,	SQLTAG_RECORD,	SQLTAG_SUBTYPE,	SQLTAG_TABLE,	SQLTAG_TRIGGER,	SQLTAG_VARIABLE,	SQLTAG_INDEX,	SQLTAG_EVENT,	SQLTAG_PUBLICATION,	SQLTAG_SERVICE,	SQLTAG_DOMAIN,	SQLTAG_VIEW,	SQLTAG_SYNONYM,	SQLTAG_MLTABLE,	SQLTAG_MLCONN,	SQLTAG_COUNT} sqlKind;static kindOption SqlKinds [] = {	{ TRUE,  'c', "cursor",		  "cursors"				   },	{ FALSE, 'd', "prototype",	  "prototypes"			   },	{ TRUE,  'f', "function",	  "functions"			   },	{ TRUE,  'F', "field",		  "record fields"		   },	{ FALSE, 'l', "local",		  "local variables"		   },	{ TRUE,  'L', "label",		  "block label"			   },	{ TRUE,  'P', "package",	  "packages"			   },	{ TRUE,  'p', "procedure",	  "procedures"			   },	{ FALSE, 'r', "record",		  "records"				   },	{ TRUE,  's', "subtype",	  "subtypes"			   },	{ TRUE,  't', "table",		  "tables"				   },	{ TRUE,  'T', "trigger",	  "triggers"			   },	{ TRUE,  'v', "variable",	  "variables"			   },	{ TRUE,  'i', "index",		  "indexes"				   },	{ TRUE,  'e', "event",		  "events"				   },	{ TRUE,  'U', "publication",  "publications"		   },	{ TRUE,  'R', "service",	  "services"			   },	{ TRUE,  'D', "domain",		  "domains"				   },	{ TRUE,  'V', "view",		  "views"				   },	{ TRUE,  'n', "synonym",	  "synonyms"			   },	{ TRUE,  'x', "mltable",	  "MobiLink Table Scripts" },	{ TRUE,  'y', "mlconn",		  "MobiLink Conn Scripts"  }};static const keywordDesc SqlKeywordTable [] = {	/* keyword		keyword ID */	{ "as",								KEYWORD_is				      },	{ "begin",							KEYWORD_begin			      },	{ "body",							KEYWORD_body			      },	{ "cursor",							KEYWORD_cursor			      },	{ "declare",						KEYWORD_declare			      },	{ "end",							KEYWORD_end				      },	{ "function",						KEYWORD_function		      },	{ "if",								KEYWORD_if				      },	{ "is",								KEYWORD_is				      },	{ "loop",							KEYWORD_loop			      },	{ "case",							KEYWORD_case			      },	{ "for",							KEYWORD_for				      },	{ "call",							KEYWORD_call			      },	{ "package",						KEYWORD_package			      },	{ "pragma",							KEYWORD_pragma			      },	{ "procedure",						KEYWORD_procedure		      },	{ "record",							KEYWORD_record			      },	{ "object",							KEYWORD_object			      },	{ "ref",							KEYWORD_ref				      },	{ "rem",							KEYWORD_rem				      },	{ "return",							KEYWORD_return			      },	{ "returns",						KEYWORD_returns			      },	{ "subtype",						KEYWORD_subtype			      },	{ "table",							KEYWORD_table			      },	{ "trigger",						KEYWORD_trigger			      },	{ "type",							KEYWORD_type			      },	{ "index",							KEYWORD_index			      },	{ "event",							KEYWORD_event			      },	{ "publication",					KEYWORD_publication		      },	{ "service",						KEYWORD_service			      },	{ "result",							KEYWORD_result			      },	{ "when",							KEYWORD_when			      },	{ "then",							KEYWORD_then			      },	{ "variable",						KEYWORD_variable		      },	{ "exception",						KEYWORD_exception		      },	{ "at",								KEYWORD_at				      },	{ "on",								KEYWORD_on				      },	{ "primary",						KEYWORD_primary			      },	{ "references",						KEYWORD_references		      },	{ "unique",							KEYWORD_unique			      },	{ "check",							KEYWORD_check			      },	{ "constraint",						KEYWORD_constraint		      },	{ "foreign",						KEYWORD_foreign			      },	{ "ml_add_table_script",			KEYWORD_ml_table		      },	{ "ml_add_lang_table_script",		KEYWORD_ml_table_lang	      },	{ "ml_add_dnet_table_script",		KEYWORD_ml_table_dnet	      },	{ "ml_add_java_table_script",		KEYWORD_ml_table_java	      },	{ "ml_add_lang_table_script_chk",	KEYWORD_ml_table_chk	      },	{ "ml_add_connection_script",		KEYWORD_ml_conn			      },	{ "ml_add_lang_connection_script",	KEYWORD_ml_conn_lang	      },	{ "ml_add_dnet_connection_script",	KEYWORD_ml_conn_dnet	      },	{ "ml_add_java_connection_script",	KEYWORD_ml_conn_java	      },	{ "ml_add_lang_conn_script_chk",	KEYWORD_ml_conn_chk 	      },	{ "local",							KEYWORD_local			      },	{ "temporary",						KEYWORD_temporary		      },	{ "drop",							KEYWORD_drop			      },	{ "view",							KEYWORD_view			      },	{ "synonym",						KEYWORD_synonym			      },	{ "handler",						KEYWORD_handler			      },	{ "comment",						KEYWORD_comment			      },	{ "go",								KEYWORD_go				      }};/* *	 FUNCTION DECLARATIONS *//* Recursive calls */static void parseBlock (tokenInfo *const token, const boolean local);/* *	 FUNCTION DEFINITIONS */static boolean isIdentChar1 (const int c){	/*	 * Other databases are less restrictive on the first character of	 * an identifier.	 * isIdentChar1 is used to identify the first character of an 	 * identifier, so we are removing some restrictions.	 */	return (boolean)		(isalpha (c) || c == '@' || c == '_' );}static boolean isIdentChar (const int c){	return (boolean)		(isalpha (c) || isdigit (c) || c == '$' || 		 c == '@' || c == '_' || c == '#');}static boolean isCmdTerm (tokenInfo *const token){#ifdef DEBUGed	printf( "\n isCmdTerm: token same  tt:%d  tk:%d\n"			, token->type			, token->keyword		  );#endif	/*	 * Based on the various customer sites I have been at	 * the most common command delimiters are	 *	   ;	 *	   ~	 *	   /	 *	   go	 * This routine will check for any of these, more	 * can easily be added by modifying readToken and	 * either adding the character to:	 *	   enum eTokenType	 *	   enum eTokenType	 */	return ( isType (token, TOKEN_SEMICOLON) || 			isType (token, TOKEN_TILDE) || 			isType (token, TOKEN_FORWARD_SLASH) || 			isKeyword (token, KEYWORD_go) );}static void buildSqlKeywordHash (void){	const size_t count = sizeof (SqlKeywordTable) /		sizeof (SqlKeywordTable [0]);	size_t i;	for (i = 0	;  i < count  ;  ++i)	{		const keywordDesc* const p = &SqlKeywordTable [i];		addKeyword (p->name, Lang_sql, (int) p->id);	}}static tokenInfo *newToken (void){	tokenInfo *const token = xMalloc (1, tokenInfo);	token->type			= TOKEN_UNDEFINED;	token->keyword		= KEYWORD_NONE;	token->string		= vStringNew ();	token->scope		= vStringNew ();	return token;}static void deleteToken (tokenInfo *const token){	vStringDelete (token->string);	vStringDelete (token->scope);	eFree (token);}/* *	 Tag generation functions */static void makeConstTag (tokenInfo *const token, const sqlKind kind){	if (SqlKinds [kind].enabled)	{		const char *const name = vStringValue (token->string);		tagEntryInfo e;		initTagEntry (&e, name);		e.lineNumber   = token->lineNumber;		e.filePosition = token->filePosition;		e.kindName	   = SqlKinds [kind].name;		e.kind		   = SqlKinds [kind].letter;		makeTagEntry (&e);	}}static void makeSqlTag (tokenInfo *const token, const sqlKind kind){	vString *	fulltag;	if (SqlKinds [kind].enabled)	{		/*		 * If a scope has been added to the token, change the token		 * string to include the scope when making the tag.		 */		if ( vStringLength(token->scope) > 0 )		{			fulltag = vStringNew ();			vStringCopy(fulltag, token->scope);			vStringCatS (fulltag, ".");			vStringCatS (fulltag, vStringValue(token->string));			vStringTerminate(fulltag);			vStringCopy(token->string, fulltag);			vStringDelete (fulltag);		}		makeConstTag (token, kind);	}}/* *	 Parsing functions */static int skipToCharacter (const int c){	int d;	do	{		d = fileGetc ();	} while (d != EOF  &&  d != c);	return d;}static void parseString (vString *const string, const int delimiter){	boolean end = FALSE;	int c;	while (! end)	{		c = fileGetc ();		if (c == EOF)			end = TRUE;		else if (c == delimiter)			end = TRUE;		else			vStringPut (string, c);	}	vStringTerminate (string);}/*	Read a C identifier beginning with "firstChar" and places it into "name".*/static void parseIdentifier (vString *const string, const int firstChar){	int c = firstChar;	Assert (isIdentChar1 (c));	do	{		vStringPut (string, c);		c = fileGetc ();	} while (isIdentChar (c));	vStringTerminate (string);	if (!isspace (c))		fileUngetc (c);		/* unget non-identifier character */}static keywordId analyzeToken (vString *const name){	vString *keyword = vStringNew ();	keywordId result;	vStringCopyToLower (keyword, name);	result = (keywordId) lookupKeyword (vStringValue (keyword), Lang_sql);	vStringDelete (keyword);	return result;}static void readToken (tokenInfo *const token){	int c;	token->type			= TOKEN_UNDEFINED;	token->keyword		= KEYWORD_NONE;	vStringClear (token->string);getNextChar:	do	{		c = fileGetc ();		/* 		 * Added " to the list of ignores, not sure what this 		 * might break but it gets by this issue:		 *	  create table "t1" (...)		 *		 * Darren, the code passes all my tests for both 		 * Oracle and SQL Anywhere, but maybe you can tell me		 * what this may effect.		 */	}	while (c == '\t'  ||  c == ' ' ||  c == '\n');	switch (c)	{		case EOF: longjmp (Exception, (int)ExceptionEOF);	break;		case '(': token->type = TOKEN_OPEN_PAREN;		break;		case ')': token->type = TOKEN_CLOSE_PAREN;		break;		case ';': token->type = TOKEN_SEMICOLON;		break;		case '.': token->type = TOKEN_PERIOD;				break;		case ',': token->type = TOKEN_COMMA;			break;		case '{': token->type = TOKEN_OPEN_CURLY;		break;		case '}': token->type = TOKEN_CLOSE_CURLY;		break;		case '~': token->type = TOKEN_TILDE;			break;		case '\'':		case '"':				  token->type = TOKEN_STRING;				  parseString (token->string, c);				  token->lineNumber = getSourceLineNumber ();				  token->filePosition = getInputFilePosition ();				  break;		case '-':				  c = fileGetc ();				  if (c == '-')		/* -- is this the start of a comment? */				  {					  skipToCharacter ('\n');					  goto getNextChar;				  }				  else				  {					  if (!isspace (c))						  fileUngetc (c);					  token->type = TOKEN_OPERATOR;				  }				  break;		case '<':		case '>':				  {					  const int initial = c;					  int d = fileGetc ();					  if (d == initial)					  {						  if (initial == '<')							  token->type = TOKEN_BLOCK_LABEL_BEGIN;						  else							  token->type = TOKEN_BLOCK_LABEL_END;					  }					  else					  {						  fileUngetc (d);						  token->type = TOKEN_UNDEFINED;					  }					  break;				  }		case '/':				  {					  int d = fileGetc ();					  if ( (d != '*') &&		/* is this the start of a comment? */							  (d != '/') )			/* is a one line comment? */					  {						  token->type = TOKEN_FORWARD_SLASH;						  fileUngetc (d);					  }					  else					  {						  if (d == '*')						  {							  do							  {								  skipToCharacter ('*');								  c = fileGetc ();								  if (c == '/')									  break;								  else									  fileUngetc (c);							  } while (c != EOF && c != '\0');							  goto getNextChar;						  }						  else if (d == '/')	/* is this the start of a comment?  */						  {							  skipToCharacter ('\n');							  goto getNextChar;						  }					  }					  break;				  }		default:				  if (! isIdentChar1 (c))					  token->type = TOKEN_UNDEFINED;				  else				  {					  parseIdentifier (token->string, c);					  token->lineNumber = getSourceLineNumber ();					  token->filePosition = getInputFilePosition ();					  token->keyword = analyzeToken (token->string);					  if (isKeyword (token, KEYWORD_rem))					  {						  vStringClear (token->string);						  skipToCharacter ('\n');						  goto getNextChar;					  }					  else if (isKeyword (token, KEYWORD_NONE))						  token->type = TOKEN_IDENTIFIER;					  else						  token->type = TOKEN_KEYWORD;				  }				  break;	}}/* *	 Token parsing functions */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99精品视频一区| 95精品视频在线| 精品处破学生在线二十三| 亚洲欧美日韩久久精品| 欧美激情资源网| 欧美性猛交xxxx黑人交| 久久精品理论片| 免费欧美高清视频| 亚洲一区影音先锋| 免费一级片91| 午夜不卡在线视频| ...中文天堂在线一区| 欧美三级中文字| 欧美一区二区观看视频| 精品国产免费人成电影在线观看四季 | 国产视频一区在线观看| 国产欧美日本一区视频| 亚洲女同女同女同女同女同69| 一区二区三区精品视频在线| 日韩**一区毛片| 麻豆精品在线视频| 99国内精品久久| 欧美日韩一级大片网址| 久久精品日产第一区二区三区高清版 | 欧美日韩中文国产| 国产精品天天看| 一区二区三区波多野结衣在线观看 | 久久久99精品久久| 人人精品人人爱| 国产亚洲欧洲997久久综合| 国产精品国产三级国产普通话蜜臀| 一区二区三区视频在线看| 国产91在线观看| 久久综合色鬼综合色| 免费在线成人网| 91精品免费在线| 婷婷夜色潮精品综合在线| 欧美在线播放高清精品| 亚洲欧美一区二区在线观看| 成人深夜视频在线观看| 久久精品亚洲乱码伦伦中文| 激情深爱一区二区| 中文字幕乱码日本亚洲一区二区| 精品系列免费在线观看| 欧美—级在线免费片| 99精品视频一区| 亚洲bt欧美bt精品| 精品国产乱码久久久久久影片| 美国毛片一区二区| 精品免费视频.| 99re在线视频这里只有精品| 18欧美乱大交hd1984| 欧美性色黄大片| 久久国产夜色精品鲁鲁99| 久久久99久久精品欧美| 欧美色视频一区| 国产精品自拍毛片| 亚洲一区二区三区影院| 2020国产精品久久精品美国| 成人亚洲一区二区一| 日本女人一区二区三区| 精品国产第一区二区三区观看体验| 国产成人av一区| 中文字幕电影一区| 欧美剧在线免费观看网站 | 欧美日韩国产一区| 国产成人精品三级| 免费高清在线一区| 亚洲另类在线视频| 中文久久乱码一区二区| 欧美性一区二区| 亚洲欧洲av在线| 精品欧美乱码久久久久久1区2区| av一二三不卡影片| 婷婷夜色潮精品综合在线| 久久久精品国产99久久精品芒果 | 一本色道久久综合狠狠躁的推荐| 久久福利资源站| 亚洲一二三四在线观看| 精品久久久网站| 欧美巨大另类极品videosbest | 亚洲成人7777| 亚洲三级电影网站| 在线播放91灌醉迷j高跟美女| 免费成人美女在线观看.| 一区二区不卡在线视频 午夜欧美不卡在 | 2021中文字幕一区亚洲| 欧美日韩精品欧美日韩精品一| 东方欧美亚洲色图在线| 久久精品国产成人一区二区三区| 亚洲欧美成人一区二区三区| 久久精品视频网| av资源站一区| 91捆绑美女网站| 国产精品亲子伦对白| 精品999在线播放| 国产丝袜欧美中文另类| 国产日韩欧美亚洲| 国产精品伦一区二区三级视频| 精品国产区一区| 欧美国产一区二区| 亚洲靠逼com| 视频一区视频二区中文字幕| 香蕉影视欧美成人| 免费不卡在线视频| 高清在线不卡av| 成人免费视频国产在线观看| 99这里都是精品| 9191久久久久久久久久久| 久久夜色精品国产噜噜av| 久久精品欧美日韩| 亚洲自拍偷拍图区| 国内不卡的二区三区中文字幕| 国产成人超碰人人澡人人澡| 91国偷自产一区二区开放时间| av午夜一区麻豆| 69堂成人精品免费视频| 555www色欧美视频| 国产精品国产精品国产专区不片| 中文字幕成人av| 青青草伊人久久| 97久久精品人人做人人爽| 欧美zozozo| 日本欧美韩国一区三区| 在线中文字幕不卡| 国产亚洲1区2区3区| 三级影片在线观看欧美日韩一区二区| 国产一区二区三区四区在线观看| 欧美日韩卡一卡二| 国产精品久久网站| 国产美女av一区二区三区| 欧美日韩黄色影视| 亚洲精品国产第一综合99久久 | 国产三级久久久| 久久电影网站中文字幕| 欧美日韩亚洲高清一区二区| 最新日韩av在线| 97久久精品人人做人人爽| 欧美韩日一区二区三区| 久久不见久久见免费视频7| 欧美精品亚洲二区| 一区二区三区在线视频免费| 本田岬高潮一区二区三区| 日韩一级大片在线观看| 久久精品免费观看| 精品伦理精品一区| 国产成人精品在线看| 中文字幕一区二区不卡 | 国产一区亚洲一区| 国产精品国产三级国产aⅴ无密码| 成人国产精品免费观看动漫| 2021国产精品久久精品| 成人午夜激情视频| 亚洲精品免费在线观看| 这里只有精品99re| 捆绑调教一区二区三区| 久久精品一区蜜桃臀影院| 99久久国产综合精品女不卡| 国产日韩欧美制服另类| 色伊人久久综合中文字幕| 美女一区二区视频| 国产精品久久福利| 欧美一区二区私人影院日本| 高清国产午夜精品久久久久久| 亚洲国产一区二区三区| 精品少妇一区二区三区视频免付费 | 中文字幕精品一区| 4438成人网| 不卡一区二区中文字幕| 亚洲精品国产一区二区精华液| 久久男人中文字幕资源站| 一本大道av伊人久久综合| 国产一区二区免费视频| 五月婷婷另类国产| 欧美激情一区二区三区四区| 欧美成人三级在线| 欧美一级专区免费大片| 欧洲激情一区二区| caoporn国产一区二区| 国产揄拍国内精品对白| 奇米四色…亚洲| 日韩不卡免费视频| 香蕉影视欧美成人| 亚洲永久精品国产| 亚洲精品中文在线观看| 国产精品久久久久毛片软件| 久久久精品欧美丰满| 欧美精品一区二区三区很污很色的| 欧美精品色一区二区三区| 在线亚洲+欧美+日本专区| 色哟哟在线观看一区二区三区| 91在线免费播放| 波多野结衣一区二区三区| 成人国产在线观看| 91亚洲永久精品| 欧洲精品中文字幕| 欧美高清一级片在线| 日韩视频免费观看高清在线视频| 在线综合视频播放| 欧美日韩高清影院|