⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pprint.c

📁 我搜集到的一个java常用类库的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
        if (indent + linelen < wraplen)            wraphere = linelen;        else            PCondFlushLine(fout, indent);    }    AddC(delim, linelen++);    if (value)    {        InString = no;        while (*value != '\0')        {            c = (unsigned char)*value;            if (wrappable && c == ' ' && indent + linelen < wraplen)            {                wraphere = linelen;                wasinstring = InString;            }            if (wrappable && wraphere > 0 && indent + linelen >= wraplen)                WrapAttrVal(fout, indent, wasinstring);            if (c == (uint)delim)            {                char *entity;                entity = (c == '"' ? "&quot;" : "&#39;");                while (*entity != '\0')                    AddC(*entity++, linelen++);                ++value;                continue;            }            else if (c == '"')            {                if (QuoteMarks)                {                    AddC('&', linelen++);                    AddC('q', linelen++);                    AddC('u', linelen++);                    AddC('o', linelen++);                    AddC('t', linelen++);                    AddC(';', linelen++);                }                else                    AddC('"', linelen++);                if (delim == '\'')                    InString = (Bool)(!InString);                ++value;                continue;            }            else if (c == '\'')            {                if (QuoteMarks)                {                    AddC('&', linelen++);                    AddC('#', linelen++);                    AddC('3', linelen++);                    AddC('9', linelen++);                    AddC(';', linelen++);                }                else                    AddC('\'', linelen++);                if (delim == '"')                    InString = (Bool)(!InString);                ++value;                continue;            }            /* look for UTF-8 multibyte character */            if (c > 0x7F)                 value += GetUTF8((unsigned char *)value, &c);            ++value;            if (c == '\n')            {                PFlushLine(fout, indent);                continue;            }            PPrintChar(c, mode);        }    }    InString = no;    AddC(delim, linelen++);}void PPrintAttribute(Out *fout, uint indent, Node *node, AttVal *attr){    char *name;    Bool wrappable = no;    if (IndentAttributes)    {        PFlushLine(fout, indent);        indent += spaces;    }    name = attr->attribute;    if (indent + linelen >= wraplen)        WrapLine(fout, indent);    if (!XmlTags && !XmlOut && attr->dict)    {        if (IsScript(name))            wrappable = WrapScriptlets;        else if (!attr->dict->nowrap || WrapAttVals)            wrappable = yes;    }    if (indent + linelen < wraplen)    {        wraphere = linelen;        AddC(' ', linelen++);    }    else    {        PCondFlushLine(fout, indent);        AddC(' ', linelen++);    }    while (*name != '\0')        AddC(FoldCase(*name++, UpperCaseAttrs), linelen++);    if (indent + linelen >= wraplen)        WrapLine(fout, indent);     if (attr->value == null)    {        if (XmlTags || XmlOut)            PPrintAttrValue(fout, indent, attr->attribute, attr->delim, yes);        else if (!IsBoolAttribute(attr) && !IsNewNode(node))            PPrintAttrValue(fout, indent, "", attr->delim, yes);        else if (indent + linelen < wraplen)            wraphere = linelen;    }    else        PPrintAttrValue(fout, indent, attr->value, attr->delim, wrappable);}void PPrintAttrs(Out *fout, uint indent, Lexer *lexer, Node *node, AttVal *attr){    if (attr)    {        if (attr->next)            PPrintAttrs(fout, indent, lexer, node, attr->next);        if (attr->attribute != null)            PPrintAttribute(fout, indent, node, attr);        else if (attr->asp != null)        {            AddC(' ', linelen++);            PPrintAsp(fout, indent, lexer, attr->asp);        }        else if (attr->php != null)        {            AddC(' ', linelen++);            PPrintPhp(fout, indent, lexer, attr->php);        }    }}/* Line can be wrapped immediately after inline start tag provided if follows a text node ending in a space, or it parent is an inline element that that rule applies to. This behaviour was reverse engineered from Netscape 3.0*/Bool AfterSpace(Lexer *lexer, Node *node){    Node *prev;    uint c;    if (!node || !node->tag || !(node->tag->model & CM_INLINE))        return yes;    prev = node->prev;    if (prev)    {        if (prev->type == TextNode && prev->end > prev->start)        {            c = (unsigned char)lexer->lexbuf[prev->end - 1];            if (c == 160 || c == ' ' || c == '\n')                return yes;        }        return no;    }    return AfterSpace(lexer, node->parent);}void PPrintTag(Lexer *lexer, Out *fout, uint mode, uint indent, Node *node){    char c, *p;    AddC('<', linelen++);    if (node->type == EndTag)        AddC('/', linelen++);    for (p = node->element; (c = *p); ++p)        AddC(FoldCase(c, UpperCaseTags), linelen++);    PPrintAttrs(fout, indent, lexer, node, node->attributes);    if ((XmlOut == yes || lexer->isvoyager) &&            (node->type == StartEndTag || node->tag->model & CM_EMPTY ))    {        AddC(' ', linelen++);   /* compatibility hack */        AddC('/', linelen++);    }    AddC('>', linelen++);;    if (node->type != StartEndTag && !(mode & PREFORMATTED))    {        if (indent + linelen >= wraplen)            WrapLine(fout, indent);        if (indent + linelen < wraplen)        {            /*             avoid wrapping after inline start tag unless             it or its parent follows a space and its not             an empty tag (e.g. IMG) followed by </a>            */            if (AfterSpace(lexer, node))            {                if (!(mode & NOWRAP) &&                    !((node->tag->model & CM_EMPTY) &&                       node->next == null &&                      node->parent->tag == tag_a))                {                    wraphere = linelen;                }            }        }        else            PCondFlushLine(fout, indent);    }}void PPrintEndTag(Out *fout, uint mode, uint indent, Node *node){    char c, *p;   /*     Netscape ignores SGML standard by not ignoring a     line break before </A> or </U> etc. To avoid rendering      this as an underlined space, I disable line wrapping     before inline end tags by the #if 0 ... #endif   */#if 0    if (indent + linelen < wraplen && !(mode & NOWRAP))        wraphere = linelen;#endif    AddC('<', linelen++);    AddC('/', linelen++);    for (p = node->element; (c = *p); ++p)        AddC(FoldCase(c, UpperCaseTags), linelen++);    AddC('>', linelen++);}void PPrintComment(Out *fout, uint indent,                   Lexer *lexer, Node *node){    if (indent + linelen < wraplen)        wraphere = linelen;    AddC('<', linelen++);    AddC('!', linelen++);    AddC('-', linelen++);    AddC('-', linelen++);#if 0    if (linelen < wraplen)        wraphere = linelen;#endif    PPrintText(fout, COMMENT, indent,                    lexer, node->start, node->end);#if 0    if (indent + linelen < wraplen)        wraphere = linelen;    AddC('-', linelen++);    AddC('-', linelen++);#endif    AddC('>', linelen++);}void PPrintDocType(Out *fout, uint indent,                   Lexer *lexer, Node *node){    Bool q = QuoteMarks;    QuoteMarks = no;    if (indent + linelen < wraplen)        wraphere = linelen;    PCondFlushLine(fout, indent);    AddC('<', linelen++);    AddC('!', linelen++);    AddC('D', linelen++);    AddC('O', linelen++);    AddC('C', linelen++);    AddC('T', linelen++);    AddC('Y', linelen++);    AddC('P', linelen++);    AddC('E', linelen++);    AddC(' ', linelen++);    if (indent + linelen < wraplen)        wraphere = linelen;    PPrintText(fout, null, indent,                    lexer, node->start, node->end);    if (linelen < wraplen)        wraphere = linelen;    AddC('>', linelen++);    QuoteMarks = q;    PCondFlushLine(fout, indent);}void PPrintPI(Out *fout, uint indent,                   Lexer *lexer, Node *node){    if (indent + linelen < wraplen)        wraphere = linelen;    AddC('<', linelen++);    AddC('?', linelen++);    /* set CDATA to pass < and > unescaped */    PPrintText(fout, CDATA, indent,                    lexer, node->start, node->end);    if (lexer->lexbuf[node->end - 1] != '?')        AddC('?', linelen++);    AddC('>', linelen++);    /* PCondFlushLine(fout, indent); */}/* note ASP and JSTE share <% ... %> syntax */void PPrintAsp(Out *fout, uint indent,                   Lexer *lexer, Node *node){    int savewraplen = wraplen;    /* disable wrapping if so requested */    if (!WrapAsp || !WrapJste)        wraplen = 0xFFFFFF;  /* a very large number */#if 0    if (indent + linelen < wraplen)        wraphere = linelen;#endif    AddC('<', linelen++);    AddC('%', linelen++);    PPrintText(fout, (WrapAsp ? CDATA : COMMENT), indent,                    lexer, node->start, node->end);    AddC('%', linelen++);    AddC('>', linelen++);    /* PCondFlushLine(fout, indent); */    wraplen = savewraplen;}/* JSTE also supports <# ... #> syntax */void PPrintJste(Out *fout, uint indent,                   Lexer *lexer, Node *node){    int savewraplen = wraplen;    /* disable wrapping if so requested */    if (!WrapAsp)        wraplen = 0xFFFFFF;  /* a very large number */    AddC('<', linelen++);    AddC('#', linelen++);    PPrintText(fout, (WrapJste ? CDATA : COMMENT), indent,                    lexer, node->start, node->end);    AddC('#', linelen++);    AddC('>', linelen++);    /* PCondFlushLine(fout, indent); */    wraplen = savewraplen;}/* PHP is based on XML processing instructions */void PPrintPhp(Out *fout, uint indent,                   Lexer *lexer, Node *node){    int savewraplen = wraplen;    /* disable wrapping if so requested */    if (!WrapPhp)        wraplen = 0xFFFFFF;  /* a very large number */#if 0    if (indent + linelen < wraplen)        wraphere = linelen;#endif    AddC('<', linelen++);    AddC('?', linelen++);    PPrintText(fout, (WrapPhp ? CDATA : COMMENT), indent,                    lexer, node->start, node->end);    AddC('?', linelen++);    AddC('>', linelen++);    /* PCondFlushLine(fout, indent); */    wraplen = savewraplen;}void PPrintCDATA(Out *fout, uint indent,                   Lexer *lexer, Node *node){    int savewraplen = wraplen;    PCondFlushLine(fout, indent);    /* disable wrapping */    wraplen = 0xFFFFFF;  /* a very large number */    AddC('<', linelen++);    AddC('!', linelen++);    AddC('[', linelen++);    AddC('C', linelen++);    AddC('D', linelen++);    AddC('A', linelen++);    AddC('T', linelen++);    AddC('A', linelen++);    AddC('[', linelen++);    PPrintText(fout, COMMENT, indent,                    lexer, node->start, node->end);    AddC(']', linelen++);    AddC(']', linelen++);    AddC('>', linelen++);    PCondFlushLine(fout, indent);    wraplen = savewraplen;}void PPrintSection(Out *fout, uint indent,                   Lexer *lexer, Node *node){    int savewraplen = wraplen;    /* disable wrapping if so requested */    if (!WrapSection)        wraplen = 0xFFFFFF;  /* a very large number */#if 0    if (indent + linelen < wraplen)        wraphere = linelen;#endif    AddC('<', linelen++);    AddC('!', linelen++);    AddC('[', linelen++);    PPrintText(fout, (WrapSection ? CDATA : COMMENT), indent,                    lexer, node->start, node->end);    AddC(']', linelen++);    AddC('>', linelen++);    /* PCondFlushLine(fout, indent); */    wraplen = savewraplen;}Bool ShouldIndent(Node *node){    if (IndentContent == no)        return no;    if (SmartIndent)    {        if (node->content && (node->tag->model & CM_NO_INDENT))        {            for (node = node->content; node; node = node->next)                if (node->tag && node->tag->model & CM_BLOCK)                    return yes;            return no;        }        if (node->tag->model & CM_HEADING)            return no;        if (node->tag == tag_p)            return no;        if (node->tag == tag_title)            return no;    }    if (node->tag->model & (CM_FIELD | CM_OBJECT))        return yes;    if (node->tag == tag_map)        return yes;    return (Bool)(!(node->tag->model & CM_INLINE));}void PPrintTree(Out *fout, uint mode, uint indent,                    Lexer *lexer, Node *node){    Node *content, *last;    if (node == null)        return;    if (node->type == TextNode)        PPrintText(fout, mode, indent,                    lexer, node->start, node->end);    else if (node->type == CommentTag)    {        PPrintComment(fout, indent, lexer, node);    }    else if (node->type == RootNode)    {        for (content = node->content;                content != null;                content = content->next)           PPrintTree(fout, mode, indent, lexer, content);    }    else if (node->type == DocTypeTag)        PPrintDocType(fout, indent, lexer, node);    else if (node->type == ProcInsTag)        PPrintPI(fout, indent, lexer, node);    else if (node->type == CDATATag)        PPrintCDATA(fout, indent, lexer, node);    else if (node->type == SectionTag)        PPrintSection(fout, indent, lexer, node);    else if (node->type == AspTag)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -