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

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

?? perl.c

?? ctags的最新版5.7,可以比較5.6版看看,免費下載
?? C
字號:
/**   $Id: perl.c 601 2007-08-02 04:45:16Z perlguy0 $**   Copyright (c) 2000-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 PERL language*   files.*//**   INCLUDE FILES*/#include "general.h"  /* must always come first */#include <string.h>#include "entry.h"#include "options.h"#include "read.h"#include "routines.h"#include "vstring.h"#define TRACE_PERL_C 0#define TRACE if (TRACE_PERL_C) printf("perl.c:%d: ", __LINE__), printf/**   DATA DEFINITIONS*/typedef enum {	K_NONE = -1,	K_CONSTANT,	K_FORMAT,	K_LABEL,	K_PACKAGE,	K_SUBROUTINE,	K_SUBROUTINE_DECLARATION} perlKind;static kindOption PerlKinds [] = {	{ TRUE,  'c', "constant",               "constants" },	{ TRUE,  'f', "format",                 "formats" },	{ TRUE,  'l', "label",                  "labels" },	{ TRUE,  'p', "package",                "packages" },	{ TRUE,  's', "subroutine",             "subroutines" },	{ FALSE, 'd', "subroutine declaration", "subroutine declarations" },};/**   FUNCTION DEFINITIONS*/static boolean isIdentifier1 (int c){	return (boolean) (isalpha (c) || c == '_');}static boolean isIdentifier (int c){	return (boolean) (isalnum (c) || c == '_');}static boolean isPodWord (const char *word){	boolean result = FALSE;	if (isalpha (*word))	{		const char *const pods [] = {			"head1", "head2", "head3", "head4", "over", "item", "back",			"pod", "begin", "end", "for"		};		const size_t count = sizeof (pods) / sizeof (pods [0]);		const char *white = strpbrk (word, " \t");		const size_t len = (white!=NULL) ? (size_t)(white-word) : strlen (word);		char *const id = (char*) eMalloc (len + 1);		size_t i;		strncpy (id, word, len);		id [len] = '\0';		for (i = 0  ;  i < count  &&  ! result  ;  ++i)		{			if (strcmp (id, pods [i]) == 0)				result = TRUE;		}		eFree (id);	}	return result;}/* * Perl subroutine declaration may look like one of the following: * *  sub abc; *  sub abc :attr; *  sub abc (proto); *  sub abc (proto) :attr; * * Note that there may be more than one attribute.  Attributes may * have things in parentheses (they look like arguments).  Anything * inside of those parentheses goes.  Prototypes may contain semi-colons. * The matching end when we encounter (outside of any parentheses) either * a semi-colon (that'd be a declaration) or an left curly brace * (definition). * * This is pretty complicated parsing (plus we all know that only perl can * parse Perl), so we are only promising best effort here. * * If we can't determine what this is (due to a file ending, for example), * we will return FALSE. */static boolean isSubroutineDeclaration (const unsigned char *cp){	boolean attr = FALSE;	int nparens = 0;	do {		for ( ; *cp; ++cp) {SUB_DECL_SWITCH:			switch (*cp) {				case ':':					if (nparens)						break;					else if (TRUE == attr)						return FALSE;    /* Invalid attribute name */					else						attr = TRUE;					break;				case '(':					++nparens;					break;				case ')':					--nparens;					break;				case ' ':				case '\t':					break;				case ';':					if (!nparens)						return TRUE;				case '{':					if (!nparens)						return FALSE;				default:					if (attr) {						if (isIdentifier1(*cp)) {							cp++;							while (isIdentifier (*cp))								cp++;							attr = FALSE;							goto SUB_DECL_SWITCH; /* Instead of --cp; */						} else {							return FALSE;						}					} else if (nparens) {						break;					} else {						return FALSE;					}			}		}	} while (NULL != (cp = fileReadLine ()));	return FALSE;}/* Algorithm adapted from from GNU etags. * Perl support by Bart Robinson <lomew@cs.utah.edu> * Perl sub names: look for /^ [ \t\n]sub [ \t\n]+ [^ \t\n{ (]+/ */static void findPerlTags (void){	vString *name = vStringNew ();	vString *package = NULL;	boolean skipPodDoc = FALSE;	const unsigned char *line;	while ((line = fileReadLine ()) != NULL)	{		boolean spaceRequired = FALSE;		boolean qualified = FALSE;		const unsigned char *cp = line;		perlKind kind = K_NONE;		tagEntryInfo e;		if (skipPodDoc)		{			if (strncmp ((const char*) line, "=cut", (size_t) 4) == 0)				skipPodDoc = FALSE;			continue;		}		else if (line [0] == '=')		{			skipPodDoc = isPodWord ((const char*)line + 1);			continue;		}		else if (strcmp ((const char*) line, "__DATA__") == 0)			break;		else if (strcmp ((const char*) line, "__END__") == 0)			break;		else if (line [0] == '#')			continue;		while (isspace (*cp))			cp++;		if (strncmp((const char*) cp, "sub", (size_t) 3) == 0)		{			TRACE("this looks like a sub\n");			cp += 3;			kind = K_SUBROUTINE;			spaceRequired = TRUE;			qualified = TRUE;		}		else if (strncmp((const char*) cp, "use", (size_t) 3) == 0)		{			cp += 3;			if (!isspace(*cp))				continue;			while (*cp && isspace (*cp))				++cp;			if (strncmp((const char*) cp, "constant", (size_t) 8) != 0)				continue;			cp += 8;			kind = K_CONSTANT;			spaceRequired = TRUE;			qualified = TRUE;		}		else if (strncmp((const char*) cp, "package", (size_t) 7) == 0)		{			/* This will point to space after 'package' so that a tag			   can be made */			const unsigned char *space = cp += 7;			if (package == NULL)				package = vStringNew ();			else				vStringClear (package);			while (isspace (*cp))				cp++;			while ((int) *cp != ';'  &&  !isspace ((int) *cp))			{				vStringPut (package, (int) *cp);				cp++;			}			vStringCatS (package, "::");			cp = space;	 /* Rewind */			kind = K_PACKAGE;			spaceRequired = TRUE;			qualified = TRUE;		}		else if (strncmp((const char*) cp, "format", (size_t) 6) == 0)		{			cp += 6;			kind = K_FORMAT;			spaceRequired = TRUE;			qualified = TRUE;		}		else		{			if (isIdentifier1 (*cp))			{				const unsigned char *p = cp;				while (isIdentifier (*p))					++p;				while (isspace (*p))					++p;				if ((int) *p == ':' && (int) *(p + 1) != ':')					kind = K_LABEL;			}		}		if (kind != K_NONE)		{			TRACE("cp0: %s\n", (const char *) cp);			if (spaceRequired && *cp && !isspace (*cp))				continue;			TRACE("cp1: %s\n", (const char *) cp);			while (isspace (*cp))				cp++;			while (!*cp || '#' == *cp) { /* Gobble up empty lines				                            and comments */				cp = fileReadLine ();				if (!cp)					goto END_MAIN_WHILE;				while (isspace (*cp))					cp++;			}			while (isIdentifier (*cp) || (K_PACKAGE == kind && ':' == *cp))			{				vStringPut (name, (int) *cp);				cp++;			}			if (K_FORMAT == kind &&				vStringLength (name) == 0 && /* cp did not advance */				'=' == *cp)			{				/* format's name is optional.  If it's omitted, 'STDOUT'				   is assumed. */				vStringCatS (name, "STDOUT");			}			vStringTerminate (name);			TRACE("name: %s\n", name->buffer);			if (0 == vStringLength(name)) {				vStringClear(name);				continue;			}			if (K_SUBROUTINE == kind)			{				/*				 * isSubroutineDeclaration() may consume several lines.  So				 * we record line positions.				 */				initTagEntry(&e, vStringValue(name));				if (TRUE == isSubroutineDeclaration(cp)) {					if (TRUE == PerlKinds[K_SUBROUTINE_DECLARATION].enabled) {						kind = K_SUBROUTINE_DECLARATION;					} else {						vStringClear (name);						continue;					}				}				e.kind     = PerlKinds[kind].letter;				e.kindName = PerlKinds[kind].name;				makeTagEntry(&e);				if (Option.include.qualifiedTags && qualified &&					package != NULL  && vStringLength (package) > 0)				{					vString *const qualifiedName = vStringNew ();					vStringCopy (qualifiedName, package);					vStringCat (qualifiedName, name);					e.name = vStringValue(qualifiedName);					makeTagEntry(&e);					vStringDelete (qualifiedName);				}			} else if (vStringLength (name) > 0)			{				makeSimpleTag (name, PerlKinds, kind);				if (Option.include.qualifiedTags && qualified &&					K_PACKAGE != kind &&					package != NULL  && vStringLength (package) > 0)				{					vString *const qualifiedName = vStringNew ();					vStringCopy (qualifiedName, package);					vStringCat (qualifiedName, name);					makeSimpleTag (qualifiedName, PerlKinds, kind);					vStringDelete (qualifiedName);				}			}			vStringClear (name);		}	}END_MAIN_WHILE:	vStringDelete (name);	if (package != NULL)		vStringDelete (package);}extern parserDefinition* PerlParser (void){	static const char *const extensions [] = { "pl", "pm", "plx", "perl", NULL };	parserDefinition* def = parserNew ("Perl");	def->kinds      = PerlKinds;	def->kindCount  = KIND_COUNT (PerlKinds);	def->extensions = extensions;	def->parser     = findPerlTags;	return def;}/* vi:set tabstop=4 shiftwidth=4 noexpandtab: */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产一区| 亚洲最大的成人av| 亚洲最快最全在线视频| 国产一区二区91| 欧美日韩一二三| 中文字幕在线一区免费| 精品夜夜嗨av一区二区三区| 色偷偷久久一区二区三区| 久久亚洲精品国产精品紫薇| 午夜久久久影院| 欧美在线免费视屏| 亚洲欧美在线观看| 成熟亚洲日本毛茸茸凸凹| 欧美电视剧免费全集观看| 亚洲大片免费看| 在线一区二区三区做爰视频网站| 国产精品美女一区二区在线观看| 久久国产精品无码网站| 日韩欧美一级特黄在线播放| 天天射综合影视| 欧美日韩免费电影| 亚洲成av人**亚洲成av**| 欧美午夜一区二区| 亚洲午夜在线观看视频在线| 色欧美乱欧美15图片| 国产精品伦一区| 不卡的电视剧免费网站有什么| 337p粉嫩大胆噜噜噜噜噜91av| 久久不见久久见免费视频1| 欧美一三区三区四区免费在线看| 亚洲国产精品一区二区久久恐怖片| 91国模大尺度私拍在线视频| 亚洲欧美日韩国产一区二区三区 | 美女在线一区二区| 欧美高清激情brazzers| 日韩电影在线观看一区| 欧美一区二区久久| 久久精品国产999大香线蕉| www国产精品av| 成人激情免费电影网址| 亚洲人吸女人奶水| 欧美日韩成人激情| 美女久久久精品| 久久久亚洲精华液精华液精华液 | 久久九九久精品国产免费直播| 国产一区二区三区香蕉| 中文字幕精品三区| 97se亚洲国产综合自在线不卡| 亚洲欧美福利一区二区| 欧美亚洲动漫另类| 美腿丝袜亚洲三区| 国产精品狼人久久影院观看方式| 91丨porny丨国产入口| 亚洲福利电影网| 精品免费国产二区三区| 不卡欧美aaaaa| 亚洲va在线va天堂| 久久久五月婷婷| 色999日韩国产欧美一区二区| 日日夜夜免费精品视频| 久久久久高清精品| 欧美性猛片aaaaaaa做受| 久久99精品网久久| 樱桃视频在线观看一区| 欧美xfplay| 色素色在线综合| 国产在线精品视频| 一区二区免费看| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 国产一区在线观看视频| 亚洲日本在线天堂| 欧美成人一级视频| 色综合久久综合网欧美综合网 | 欧美精品视频www在线观看| 蜜桃av一区二区| 亚洲精品你懂的| 26uuu色噜噜精品一区二区| 在线一区二区观看| 国产一区欧美一区| 一级女性全黄久久生活片免费| 日韩一二三四区| 色婷婷狠狠综合| 国产成人综合视频| 欧美aaa在线| 亚洲成人一区二区| 中文字幕一区二区三区四区不卡| 欧美一级日韩一级| 欧洲一区在线观看| 不卡av在线网| 国产不卡在线视频| 精品综合免费视频观看| 亚洲地区一二三色| 一区二区三区**美女毛片| 国产色产综合色产在线视频| 日韩欧美二区三区| 欧美乱妇15p| 欧美日本不卡视频| 欧美群妇大交群中文字幕| 色婷婷综合视频在线观看| 99视频在线精品| 成人精品鲁一区一区二区| 国产一区二区美女| 蜜桃视频在线观看一区二区| 五月婷婷综合激情| 香蕉av福利精品导航| 亚洲自拍偷拍欧美| 亚洲一区二区在线视频| 亚洲曰韩产成在线| 亚洲最新视频在线观看| 亚洲一区影音先锋| 亚洲444eee在线观看| 婷婷六月综合亚洲| 亚洲成人免费在线| 日韩成人dvd| 美腿丝袜亚洲一区| 精品在线播放免费| 国产电影一区在线| jlzzjlzz亚洲女人18| 99国产精品视频免费观看| 91网站在线播放| 91精彩视频在线观看| 欧美日韩激情在线| 欧美xfplay| 国产精品水嫩水嫩| 亚洲视频免费在线| 午夜精品在线看| 极品少妇xxxx精品少妇偷拍| 国产一区视频导航| 99re亚洲国产精品| 欧美美女网站色| 欧美电影免费观看高清完整版在| 欧美精品一区二区三区蜜臀| 国产精品嫩草影院com| 一区二区激情视频| 婷婷国产v国产偷v亚洲高清| 青青草成人在线观看| 国产不卡在线一区| 欧美性色欧美a在线播放| 日韩精品一区在线| 中文字幕日本乱码精品影院| 亚洲五月六月丁香激情| 韩国一区二区三区| 91香蕉视频mp4| 正在播放一区二区| 国产亚洲精品久| 亚洲国产一区视频| 国产精品影音先锋| 欧美色倩网站大全免费| 精品国产乱子伦一区| 亚洲色图.com| 精品在线免费观看| 91黄色小视频| 亚洲国产精品av| 青青草一区二区三区| 色一情一伦一子一伦一区| 欧美电影免费观看高清完整版在| 最新国产精品久久精品| 美女任你摸久久| 色婷婷久久综合| 国产欧美日韩在线看| 日韩国产欧美在线观看| 99精品桃花视频在线观看| 精品福利一二区| 亚洲mv大片欧洲mv大片精品| 国产成人免费在线观看不卡| 91麻豆精品国产91久久久久久久久| 国产精品亲子乱子伦xxxx裸| 日本不卡不码高清免费观看| 色综合天天综合在线视频| 欧美本精品男人aⅴ天堂| 亚洲国产另类av| 91香蕉视频黄| 国产精品人妖ts系列视频| 精品一二三四在线| 日韩一区二区在线观看| 亚洲一区二区三区四区五区中文| 国产东北露脸精品视频| 欧美成人aa大片| 亚洲狠狠爱一区二区三区| 91在线免费看| 亚洲日本免费电影| 成人丝袜18视频在线观看| 久久久国际精品| 久久国产精品99久久人人澡| 欧美久久一二三四区| 亚洲五月六月丁香激情| 在线精品亚洲一区二区不卡| 亚洲欧美日韩国产中文在线| av电影天堂一区二区在线 | 在线不卡一区二区| 亚洲香肠在线观看| 欧美亚洲国产bt| 亚洲电影一级片| 欧美日韩不卡在线| 日本欧洲一区二区| 91精品国产综合久久久蜜臀图片| 亚洲第一狼人社区| 777久久久精品| 奇米一区二区三区| 精品免费日韩av|