view dmd/ddoc/Sections.d @ 149:78bf0fe43974

merge
author Trass3r
date Tue, 14 Sep 2010 15:46:50 +0200
parents dmd/Section.d@e28b18c23469 dmd/Section.d@786ea1839396
children 560eaedcb7a2
line wrap: on
line source

module dmd.ddoc.Sections;

import dmd.common;
import dmd.ddoc.DocComment;
import dmd.Array;
import dmd.Scope;
import dmd.Dsymbol;
import dmd.OutBuffer;

//!
alias Vector!Section Sections;

//!
class Section
{
    string name;
    string body_;

    int nooutput;

	void write(DocComment dc, Scope sc, Dsymbol s, OutBuffer buf)
	{
		if (namelen)
		{
			static string[] table =
			{	   "AUTHORS", "BUGS", "COPYRIGHT", "DATE",
					"DEPRECATED", "EXAMPLES", "HISTORY", "LICENSE",
					"RETURNS", "SEE_ALSO", "STANDARDS", "THROWS",
					"VERSION" };
     
			for (int i = 0; i < table.length; i++)
			{
				if (icmp(table[i], name, namelen) == 0)
				{
					buf.printf("$(DDOC_%s ", table[i]);
					goto L1;
				}
			}

			buf.writestring("$(DDOC_SECTION ");
				// Replace _ characters with spaces
				buf.writestring("$(DDOC_SECTION_H ");
				size_t o = buf.offset;
				for (size_t u = 0; u < namelen; u++)
				{
					char c = name[u];
					buf.writeByte((c == '_') ? ' ' : c);
				}
				escapeStrayParenthesis(buf, o, s.loc);
				buf.writestring(":)\n");
		}
		else
		{
			buf.writestring("$(DDOC_DESCRIPTION ");
		}
	  L1:
		unsigned o = buf.offset;
		buf.write(body_, bodylen);
		escapeStrayParenthesis(buf, o, s.loc);
		highlightText(sc, s, buf, o);
		buf.writestring(")\n");
	}
}

//!
class ParamSection : Section
{
	override void write(DocComment dc, Scope sc, Dsymbol s, OutBuffer buf)
	{
		ubyte*p = body_;
		unsigned len = bodylen;
		ubyte*pend = p + len;

		ubyte*tempstart;
		unsigned templen;

		ubyte*namestart;
		unsigned namelen = 0;	   // !=0 if line continuation

		ubyte*textstart;
		unsigned textlen;

		unsigned o;
		Parameter *arg;

		buf.writestring("$(DDOC_PARAMS \n");
		while (p < pend)
		{
			// Skip to start of macro
			while (1)
			{
				switch (*p)
				{
					case ' ':
					case '\t':
						p++;
						continue;

					case '\n':
						p++;
						goto Lcont;

					default:
						if (isIdStart(p))
							break;
						if (namelen)
							goto Ltext;			 // continuation of prev macro
						goto Lskipline;
				}
				break;
			}
			tempstart = p;

			while (isIdTail(p))
				p += utfStride(p);
			templen = p - tempstart;

			while (*p == ' ' || *p == '\t')
				p++;

			if (*p != '=')
			{   if (namelen)
					goto Ltext;			 // continuation of prev macro
				goto Lskipline;
			}
			p++;

			if (namelen)
			{   // Output existing param

			L1:
				//printf("param '%.*s' = '%.*s'\n", namelen, namestart, textlen, textstart);
				HdrGenState hgs;
				buf.writestring("$(DDOC_PARAM_ROW ");
					buf.writestring("$(DDOC_PARAM_ID ");
						o = buf.offset;
						arg = isFunctionParameter(s, namestart, namelen);
						if (arg && arg.type && arg.ident)
							arg.type.toCBuffer(buf, arg.ident, &hgs);
						else
							buf.write(namestart, namelen);
						escapeStrayParenthesis(buf, o, s.loc);
						highlightCode(sc, s, buf, o);
					buf.writestring(")\n");

					buf.writestring("$(DDOC_PARAM_DESC ");
						o = buf.offset;
						buf.write(textstart, textlen);
						escapeStrayParenthesis(buf, o, s.loc);
						highlightText(sc, s, buf, o);
					buf.writestring(")");
				buf.writestring(")\n");
				namelen = 0;
				if (p >= pend)
					break;
			}

			namestart = tempstart;
			namelen = templen;

			while (*p == ' ' || *p == '\t')
				p++;
			textstart = p;

		  Ltext:
			while (*p != '\n')
				p++;
			textlen = p - textstart;
			p++;

		 Lcont:
			continue;

		 Lskipline:
			// Ignore this line
			while (*p++ != '\n') {}
		}
		if (namelen)
			goto L1;				// write out last one
		buf.writestring(")\n");
	}
}

//!
class MacroSection : Section
{
	override void write(DocComment dc, Scope sc, Dsymbol s, OutBuffer buf)
	{
		// writef("MacroSection.write()\n");
		DocComment.parseMacros(dc.pescapetable, dc.pmacrotable, body_, bodylen);
	}
}