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

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

?? python.c

?? ultraEdit的Ctag標簽工具的實現源代碼
?? C
字號:
/*
*   $Id: python.c,v 1.8 2003/04/01 04:55:27 darren Exp $
*
*   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 Python 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"

/*
*   DATA DEFINITIONS
*/
typedef enum {
    K_CLASS, K_FUNCTION, K_MEMBER
} pythonKind;

static kindOption PythonKinds[] = {
    {TRUE, 'c', "class",    "classes"},
    {TRUE, 'f', "function", "functions"},
    {TRUE, 'm', "member",   "class members"}
};

/*
*   FUNCTION DEFINITIONS
*/
/* tagEntryInfo and vString should be preinitialized/preallocated but not
 * necessary. If successful you will find class name in vString
 */

static boolean isIdentifierFirstCharacter (int c)
{
    return (boolean) (isalpha (c) || c == '_');
}

static boolean isIdentifierCharacter (int c)
{
    return (boolean) (isalnum (c) || c == '_');
}

static void makeFunctionTag (vString *const function, vString *const class)
{
    tagEntryInfo tag;
    initTagEntry (&tag, vStringValue (function));
    if (vStringLength (class) > 0)
    {
	tag.kindName = "member";
	tag.kind = 'm';
	tag.extensionFields.scope [0] = "class";
	tag.extensionFields.scope [1] = vStringValue (class);
    }
    else
    {
	tag.kindName = "function";
	tag.kind = 'f';
    }
    if (strncmp (vStringValue (function), "__", 2) == 0 &&
	strcmp (vStringValue (function), "__init__") != 0)
    {
	tag.extensionFields.access = "private";
	tag.isFileScope = TRUE;
    }
    else
    {
	tag.extensionFields.access = "public";
    }
    makeTagEntry (&tag);
    if (vStringLength (class) > 0  &&  Option.include.qualifiedTags)
    {
	vString *tagname = vStringNew ();
	vStringCat (tagname, class);
	vStringPut (tagname, '.');
	vStringCat (tagname, function);
	tag.name = vStringValue (tagname);
	makeTagEntry (&tag);
	vStringDelete (tagname);
    }
}

static void makeClassTag (vString *const class, vString *const inheritance)
{
    tagEntryInfo tag;
    initTagEntry (&tag, vStringValue (class));
    tag.kindName = "class";
    tag.kind = 'c';
    tag.extensionFields.inheritance = vStringValue (inheritance);
    makeTagEntry (&tag);
}

static const unsigned char *skipSpace (const unsigned char *cp)
{
    while (isspace ((int) *cp))
	++cp;
    return cp;
}

static const unsigned char *parseIdentifier (
	const unsigned char *cp, vString *const identifier)
{
    vStringClear (identifier);
    while (isIdentifierCharacter ((int) *cp))
    {
	vStringPut (identifier, (int) *cp);
	++cp;
    }
    vStringTerminate (identifier);
    return cp;
}

static void parseClass (const unsigned char *cp, vString *const class)
{
    vString *const inheritance = vStringNew ();
    vStringClear (inheritance);
    cp = parseIdentifier (cp, class);
    cp = skipSpace (cp);
    if (*cp == '(')
    {
	++cp;
	while (*cp != ')'  &&  *cp != '\0')
	{
	    vStringPut (inheritance, *cp);
	    ++cp;
	}
	vStringTerminate (inheritance);
    }
    makeClassTag (class, inheritance);
    vStringDelete (inheritance);
}

static void parseFunction (const unsigned char *cp, vString *const class)
{
    vString *const identifier = vStringNew ();
    cp = parseIdentifier (cp, identifier);
    makeFunctionTag (identifier, class);
    vStringDelete (identifier);
}

static void findPythonTags (void)
{
    vString *const class = vStringNew ();
    vString *const identifier = vStringNew ();
    const unsigned char *line;
    int class_indent = 0;
    boolean longStringLiteral = FALSE;

    while ((line = fileReadLine ()) != NULL)
    {
	const unsigned char *cp = line;
	int indent;

	cp = skipSpace (cp);
	indent = cp - line;

	if (*cp == '#' || *cp == '\0')	/* skip comment or blank line */
	    continue;
	
	if (longStringLiteral)
	{
	    cp = (const unsigned char*) strstr ((const char*) cp, "\"\"\"");
	    if (cp == NULL)
		continue;
	    else
	    {
		longStringLiteral = FALSE;
		cp += 3;
	    }
	}
	if (isIdentifierFirstCharacter ((int) *cp))
	{
	    if (indent <= class_indent)
		vStringClear (class);

	    cp = parseIdentifier (cp, identifier);
	    if (isspace ((int) *cp))
	    {
		cp = skipSpace (cp);
		if (strcmp (vStringValue (identifier), "def") == 0)
		    parseFunction (cp, class);
		else if (strcmp (vStringValue (identifier), "class") == 0)
		{
		    parseClass (cp, class);
		    class_indent = indent;
		}
	    }
	}
	if ((cp = (const unsigned char*) strstr ((const char*)cp, "\"\"\"")) != NULL)
	{
	    cp += 3;
	    cp = (const unsigned char*) strstr ((const char*) cp, "\"\"\"");
	    if (cp == NULL)
		longStringLiteral = TRUE;
	}
    }
    vStringDelete (identifier);
    vStringDelete (class);
}

extern parserDefinition *PythonParser (void)
{
    static const char *const extensions[] = { "py", "python", NULL };
    parserDefinition *def = parserNew ("Python");
    def->kinds = PythonKinds;
    def->kindCount = KIND_COUNT (PythonKinds);
    def->extensions = extensions;
    def->parser = findPythonTags;
    return def;
}

/* vi:set tabstop=8 shiftwidth=4: */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费在线观看成人| 一区二区三区中文字幕精品精品 | **网站欧美大片在线观看| 国产一区91精品张津瑜| 久久综合九色欧美综合狠狠| 狠狠狠色丁香婷婷综合久久五月| 精品福利视频一区二区三区| 国产黑丝在线一区二区三区| 中文成人综合网| 91香蕉国产在线观看软件| 亚洲愉拍自拍另类高清精品| 欧美疯狂做受xxxx富婆| 国产原创一区二区三区| 亚洲色图第一区| 91.xcao| 国产一区欧美一区| 国产精品你懂的在线| 欧美专区日韩专区| 久久99国内精品| 亚洲人亚洲人成电影网站色| 欧美日韩精品高清| 国产成人精品免费在线| 一区二区三区成人| 欧美精品一区二区三区蜜桃| 99re视频这里只有精品| 免费在线观看日韩欧美| 国产精品国产三级国产普通话蜜臀 | 日日骚欧美日韩| 中文字幕免费一区| 欧美三级在线视频| 国产91精品免费| 日韩高清在线一区| 亚洲日本在线视频观看| 精品对白一区国产伦| 日本久久精品电影| 国产乱子伦视频一区二区三区| 亚洲综合999| 2023国产精品自拍| 欧美日韩国产高清一区二区| 粉嫩av一区二区三区在线播放| 亚洲成a人片在线不卡一二三区| 国产亚洲成年网址在线观看| 在线不卡一区二区| 不卡视频在线看| 久久国产人妖系列| 五月开心婷婷久久| 一区二区三区在线影院| 国产欧美日韩精品a在线观看| 777亚洲妇女| 日本韩国一区二区三区| 成人午夜看片网址| 国产一区在线看| 奇米综合一区二区三区精品视频| 亚洲精品免费看| 国产精品成人网| 欧美国产乱子伦| 久久久亚洲精品一区二区三区 | 韩国av一区二区三区| 亚洲成人免费视| 樱花草国产18久久久久| 亚洲天堂久久久久久久| 国产精品女人毛片| 欧美国产日韩一二三区| 久久精品一区八戒影视| 精品福利av导航| 精品国产一区二区三区久久久蜜月| 欧美男男青年gay1069videost| 色综合久久综合网| 91亚洲精品乱码久久久久久蜜桃| 国产成a人亚洲精品| 国产成人亚洲精品狼色在线| 精品一区二区三区免费| 久久精品国产在热久久| 奇米精品一区二区三区四区 | 国产一区二区在线视频| 麻豆精品新av中文字幕| 久久精品国内一区二区三区| 久久精品国产99国产精品| 久久成人久久爱| 国产一区二区福利| 国产suv精品一区二区三区| 成人激情文学综合网| 成人看片黄a免费看在线| 成人高清视频免费观看| av成人动漫在线观看| 日本精品视频一区二区| 欧美三级乱人伦电影| 91精品欧美福利在线观看| 日韩欧美二区三区| 欧美精品一区二区三区视频| 国产精品少妇自拍| 亚洲伦理在线免费看| 亚洲福利一区二区三区| 日韩精品久久理论片| 国产呦精品一区二区三区网站| 成人午夜在线免费| 色婷婷激情综合| 日韩视频免费直播| 久久美女高清视频| 亚洲欧美日韩成人高清在线一区| 亚洲永久精品国产| 麻豆国产一区二区| 成人国产精品免费网站| 成人免费观看视频| 国产激情精品久久久第一区二区| 国产资源在线一区| 91免费在线看| 日韩西西人体444www| 国产欧美视频在线观看| 一区二区理论电影在线观看| 天堂av在线一区| 成人午夜大片免费观看| 欧美艳星brazzers| 日韩欧美中文字幕公布| 国产精品美女久久久久久久久 | 欧美日本在线看| 久久午夜电影网| 亚洲美腿欧美偷拍| 国模一区二区三区白浆| 91美女福利视频| 精品福利二区三区| 亚洲va欧美va天堂v国产综合| 国产精品2024| 欧美伦理影视网| 国产精品免费久久| 免费看精品久久片| 欧洲精品一区二区| 日本一区免费视频| 日韩电影在线一区| 一本久道中文字幕精品亚洲嫩| 精品国产露脸精彩对白| 亚洲一区二区三区影院| 高清久久久久久| 精品美女一区二区三区| 一区二区三区中文在线观看| 国产精品一区二区无线| 欧美精品久久天天躁| 亚洲色图清纯唯美| 国产精品亚洲视频| 欧美一区二区黄| 亚洲福利电影网| gogogo免费视频观看亚洲一| 久久夜色精品国产欧美乱极品| 亚洲一区二区三区四区在线观看 | 亚洲成人高清在线| 92精品国产成人观看免费| 久久亚洲二区三区| 美女网站在线免费欧美精品| 欧洲国产伦久久久久久久| 亚洲视频在线一区二区| 高清免费成人av| 国产婷婷色一区二区三区四区| 免费在线看成人av| 欧美裸体一区二区三区| 亚洲一区二区三区四区在线 | 欧美日韩国产一级片| 亚洲日本成人在线观看| 不卡的av电影在线观看| 国产午夜精品久久久久久久| 国产综合成人久久大片91| 日韩午夜小视频| 蜜桃av一区二区三区| 日韩一区二区免费在线观看| 日韩专区在线视频| 欧美一区二区二区| 奇米色777欧美一区二区| 日韩视频免费观看高清完整版| 婷婷久久综合九色综合伊人色| 91国内精品野花午夜精品| 亚洲精品视频自拍| 91福利视频久久久久| 亚洲码国产岛国毛片在线| 色拍拍在线精品视频8848| 亚洲三级视频在线观看| 91搞黄在线观看| 首页综合国产亚洲丝袜| 在线不卡欧美精品一区二区三区| 日韩在线一二三区| 精品粉嫩超白一线天av| 国产99精品在线观看| 亚洲欧洲精品天堂一级| 欧洲亚洲精品在线| 男人操女人的视频在线观看欧美| 精品日韩一区二区三区免费视频| 国产精品一区二区免费不卡| 国产精品网站导航| 欧洲生活片亚洲生活在线观看| 亚洲成a人片在线不卡一二三区 | 欧美日韩一区高清| 免费在线观看视频一区| 久久精品夜色噜噜亚洲aⅴ| 99亚偷拍自图区亚洲| 亚洲国产一区二区视频| 日韩精品专区在线| 丁香天五香天堂综合| 一二三区精品视频| 日韩欧美成人一区二区| a4yy欧美一区二区三区| 日日夜夜免费精品视频| 国产精品无人区|