annotate dmd/doc.c @ 1112:829ac3f30103

Updating revisions.pl.in: - Change the way the LLVM SVN revision is detected, using `svn info` instead of `svnversion`. This speeds it up significantly on my machine (especially when the LLVM SVN checkout isn't in disk cache). - Add "last changed date" to SVN checkouts too, not just unpacked tarballs - No longer rely on SVN revision to detect release vs trunk checkouts, treat release checkout the same as unpacked release tarball. (Except for date determination, which uses SVN date instead of filesystem date)
author Frits van Bommel <fvbommel wxs.nl>
date Fri, 13 Mar 2009 16:18:01 +0100
parents b30fe7e1dbb9
children eeb8b95ea92e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2 // Compiler implementation of the D programming language
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
3 // Copyright (c) 1999-2008 by Digital Mars
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
4 // All Rights Reserved
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
5 // written by Walter Bright
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
6 // http://www.digitalmars.com
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
7 // License for redistribution is by either the Artistic License
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
9 // See the included readme.txt for details.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
10
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
11 // This implements the Ddoc capability.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
12
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
13 #include <stdio.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
14 #include <string.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
15 #include <time.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
16 #include <ctype.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
17 #include <assert.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
18
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 876
diff changeset
19 #include "rmem.h"
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
20
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
21 #include "root.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
22
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
23 #include "mars.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
24 #include "dsymbol.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
25 #include "macro.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
26 #include "template.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
27 #include "lexer.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
28 #include "aggregate.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
29 #include "declaration.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
30 #include "enum.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
31 #include "id.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
32 #include "module.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
33 #include "scope.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
34 #include "hdrgen.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
35 #include "doc.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
36 #include "mtype.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
37
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
38 struct Escape
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
39 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
40 const char *strings[256];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
41
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
42 static const char *escapeChar(unsigned c);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
43 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
44
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
45 struct Section
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
46 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
47 unsigned char *name;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
48 unsigned namelen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
49
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
50 unsigned char *body;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
51 unsigned bodylen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
52
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
53 int nooutput;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
54
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
55 virtual void write(DocComment *dc, Scope *sc, Dsymbol *s, OutBuffer *buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
56 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
57
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
58 struct ParamSection : Section
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
59 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
60 void write(DocComment *dc, Scope *sc, Dsymbol *s, OutBuffer *buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
61 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
62
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
63 struct MacroSection : Section
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
64 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
65 void write(DocComment *dc, Scope *sc, Dsymbol *s, OutBuffer *buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
66 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
67
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
68 struct DocComment
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
69 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
70 Array sections; // Section*[]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
71
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
72 Section *summary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
73 Section *copyright;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
74 Section *macros;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
75 Macro **pmacrotable;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
76 Escape **pescapetable;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
77
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
78 DocComment();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
79
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
80 static DocComment *parse(Scope *sc, Dsymbol *s, unsigned char *comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
81 static void parseMacros(Escape **pescapetable, Macro **pmacrotable, unsigned char *m, unsigned mlen);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
82 static void parseEscapes(Escape **pescapetable, unsigned char *textstart, unsigned textlen);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
83
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
84 void parseSections(unsigned char *comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
85 void writeSections(Scope *sc, Dsymbol *s, OutBuffer *buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
86 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
87
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
88
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
89 int cmp(const char *stringz, void *s, size_t slen);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
90 int icmp(const char *stringz, void *s, size_t slen);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
91 int isDitto(unsigned char *comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
92 unsigned char *skipwhitespace(unsigned char *p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
93 unsigned skiptoident(OutBuffer *buf, unsigned i);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
94 unsigned skippastident(OutBuffer *buf, unsigned i);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
95 unsigned skippastURL(OutBuffer *buf, unsigned i);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
96 void highlightText(Scope *sc, Dsymbol *s, OutBuffer *buf, unsigned offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
97 void highlightCode(Scope *sc, Dsymbol *s, OutBuffer *buf, unsigned offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
98 void highlightCode2(Scope *sc, Dsymbol *s, OutBuffer *buf, unsigned offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
99 Argument *isFunctionParameter(Dsymbol *s, unsigned char *p, unsigned len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
100
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
101 static unsigned char ddoc_default[] = "\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
102 DDOC = <html><head>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
103 <META http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
104 <title>$(TITLE)</title>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
105 </head><body>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
106 <h1>$(TITLE)</h1>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
107 $(BODY)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
108 <hr>$(SMALL Page generated by $(LINK2 http://www.digitalmars.com/d/1.0/ddoc.html, Ddoc). $(COPYRIGHT))\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
109 </body></html>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
110 \n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
111 B = <b>$0</b>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
112 I = <i>$0</i>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
113 U = <u>$0</u>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
114 P = <p>$0</p>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
115 DL = <dl>$0</dl>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
116 DT = <dt>$0</dt>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
117 DD = <dd>$0</dd>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
118 TABLE = <table>$0</table>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
119 TR = <tr>$0</tr>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
120 TH = <th>$0</th>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
121 TD = <td>$0</td>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
122 OL = <ol>$0</ol>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
123 UL = <ul>$0</ul>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
124 LI = <li>$0</li>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
125 BIG = <big>$0</big>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
126 SMALL = <small>$0</small>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
127 BR = <br>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
128 LINK = <a href=\"$0\">$0</a>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
129 LINK2 = <a href=\"$1\">$+</a>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
130 \n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
131 RED = <font color=red>$0</font>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
132 BLUE = <font color=blue>$0</font>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
133 GREEN = <font color=green>$0</font>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
134 YELLOW =<font color=yellow>$0</font>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
135 BLACK = <font color=black>$0</font>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
136 WHITE = <font color=white>$0</font>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
137 \n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
138 D_CODE = <pre class=\"d_code\">$0</pre>\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
139 D_COMMENT = $(GREEN $0)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
140 D_STRING = $(RED $0)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
141 D_KEYWORD = $(BLUE $0)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
142 D_PSYMBOL = $(U $0)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
143 D_PARAM = $(I $0)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
144 \n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
145 DDOC_COMMENT = <!-- $0 -->\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
146 DDOC_DECL = $(DT $(BIG $0))\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
147 DDOC_DECL_DD = $(DD $0)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
148 DDOC_DITTO = $(BR)$0\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
149 DDOC_SECTIONS = $0\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
150 DDOC_SUMMARY = $0$(BR)$(BR)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
151 DDOC_DESCRIPTION = $0$(BR)$(BR)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
152 DDOC_AUTHORS = $(B Authors:)$(BR)\n$0$(BR)$(BR)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
153 DDOC_BUGS = $(RED BUGS:)$(BR)\n$0$(BR)$(BR)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
154 DDOC_COPYRIGHT = $(B Copyright:)$(BR)\n$0$(BR)$(BR)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
155 DDOC_DATE = $(B Date:)$(BR)\n$0$(BR)$(BR)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
156 DDOC_DEPRECATED = $(RED Deprecated:)$(BR)\n$0$(BR)$(BR)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
157 DDOC_EXAMPLES = $(B Examples:)$(BR)\n$0$(BR)$(BR)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
158 DDOC_HISTORY = $(B History:)$(BR)\n$0$(BR)$(BR)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
159 DDOC_LICENSE = $(B License:)$(BR)\n$0$(BR)$(BR)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
160 DDOC_RETURNS = $(B Returns:)$(BR)\n$0$(BR)$(BR)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
161 DDOC_SEE_ALSO = $(B See Also:)$(BR)\n$0$(BR)$(BR)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
162 DDOC_STANDARDS = $(B Standards:)$(BR)\n$0$(BR)$(BR)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
163 DDOC_THROWS = $(B Throws:)$(BR)\n$0$(BR)$(BR)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
164 DDOC_VERSION = $(B Version:)$(BR)\n$0$(BR)$(BR)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
165 DDOC_SECTION_H = $(B $0)$(BR)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
166 DDOC_SECTION = $0$(BR)$(BR)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
167 DDOC_MEMBERS = $(DL $0)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
168 DDOC_MODULE_MEMBERS = $(DDOC_MEMBERS $0)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
169 DDOC_CLASS_MEMBERS = $(DDOC_MEMBERS $0)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
170 DDOC_STRUCT_MEMBERS = $(DDOC_MEMBERS $0)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
171 DDOC_ENUM_MEMBERS = $(DDOC_MEMBERS $0)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
172 DDOC_TEMPLATE_MEMBERS = $(DDOC_MEMBERS $0)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
173 DDOC_PARAMS = $(B Params:)$(BR)\n$(TABLE $0)$(BR)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
174 DDOC_PARAM_ROW = $(TR $0)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
175 DDOC_PARAM_ID = $(TD $0)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
176 DDOC_PARAM_DESC = $(TD $0)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
177 DDOC_BLANKLINE = $(BR)$(BR)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
178 \n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
179 DDOC_PSYMBOL = $(U $0)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
180 DDOC_KEYWORD = $(B $0)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
181 DDOC_PARAM = $(I $0)\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
182 \n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
183 ESCAPES = /</&lt;/\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
184 />/&gt;/\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
185 /&/&amp;/\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
186 ";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
187
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
188 static char ddoc_decl_s[] = "$(DDOC_DECL ";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
189 static char ddoc_decl_e[] = ")\n";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
190
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
191 static char ddoc_decl_dd_s[] = "$(DDOC_DECL_DD ";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
192 static char ddoc_decl_dd_e[] = ")\n";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
193
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
194
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
195 /****************************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
196 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
197
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
198 void Module::gendocfile()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
199 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
200 static OutBuffer mbuf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
201 static int mbuf_done;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
202
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
203 OutBuffer buf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
204
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
205 //printf("Module::gendocfile()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
206
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
207 if (!mbuf_done) // if not already read the ddoc files
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
208 { mbuf_done = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
209
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
210 // Use our internal default
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
211 mbuf.write(ddoc_default, sizeof(ddoc_default) - 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
212
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
213 // Override with DDOCFILE specified in the sc.ini file
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
214 char *p = getenv("DDOCFILE");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
215 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
216 global.params.ddocfiles->shift(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
217
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
218 // Override with the ddoc macro files from the command line
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
219 for (int i = 0; i < global.params.ddocfiles->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
220 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
221 FileName f((char *)global.params.ddocfiles->data[i], 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
222 File file(&f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
223 file.readv();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
224 // BUG: convert file contents to UTF-8 before use
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
225
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
226 //printf("file: '%.*s'\n", file.len, file.buffer);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
227 mbuf.write(file.buffer, file.len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
228 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
229 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
230 DocComment::parseMacros(&escapetable, &macrotable, mbuf.data, mbuf.offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
231
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
232 Scope *sc = Scope::createGlobal(this); // create root scope
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
233 sc->docbuf = &buf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
234
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
235 DocComment *dc = DocComment::parse(sc, this, comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
236 dc->pmacrotable = &macrotable;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
237 dc->pescapetable = &escapetable;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
238
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
239 // Generate predefined macros
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
240
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
241 // Set the title to be the name of the module
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
242 { char *p = toPrettyChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
243 Macro::define(&macrotable, (unsigned char *)"TITLE", 5, (unsigned char *)p, strlen(p));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
244 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
245
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
246 time_t t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
247 time(&t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
248 char *p = ctime(&t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
249 p = mem.strdup(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
250 Macro::define(&macrotable, (unsigned char *)"DATETIME", 8, (unsigned char *)p, strlen(p));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
251 Macro::define(&macrotable, (unsigned char *)"YEAR", 4, (unsigned char *)p + 20, 4);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
252
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
253 char *docfilename = docfile->toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
254 Macro::define(&macrotable, (unsigned char *)"DOCFILENAME", 11, (unsigned char *)docfilename, strlen(docfilename));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
255
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
256 if (dc->copyright)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
257 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
258 dc->copyright->nooutput = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
259 Macro::define(&macrotable, (unsigned char *)"COPYRIGHT", 9, dc->copyright->body, dc->copyright->bodylen);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
260 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
261
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
262 buf.printf("$(DDOC_COMMENT Generated by Ddoc from %s)\n", srcfile->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
263 if (isDocFile)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
264 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
265 size_t commentlen = strlen((char *)comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
266 if (dc->macros)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
267 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
268 commentlen = dc->macros->name - comment;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
269 dc->macros->write(dc, sc, this, sc->docbuf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
270 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
271 sc->docbuf->write(comment, commentlen);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
272 highlightText(NULL, this, sc->docbuf, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
273 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
274 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
275 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
276 dc->writeSections(sc, this, sc->docbuf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
277 emitMemberComments(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
278 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
279
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
280 //printf("BODY= '%.*s'\n", buf.offset, buf.data);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
281 Macro::define(&macrotable, (unsigned char *)"BODY", 4, buf.data, buf.offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
282
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
283 OutBuffer buf2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
284 buf2.writestring("$(DDOC)\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
285 unsigned end = buf2.offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
286 macrotable->expand(&buf2, 0, &end, NULL, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
287
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
288 #if 1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
289 /* Remove all the escape sequences from buf2,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
290 * and make CR-LF the newline.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
291 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
292 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
293 buf.setsize(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
294 buf.reserve(buf2.offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
295 unsigned char *p = buf2.data;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
296 for (unsigned j = 0; j < buf2.offset; j++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
297 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
298 unsigned char c = p[j];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
299 if (c == 0xFF && j + 1 < buf2.offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
300 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
301 j++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
302 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
303 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
304 if (c == '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
305 buf.writeByte('\r');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
306 else if (c == '\r')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
307 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
308 buf.writestring("\r\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
309 if (j + 1 < buf2.offset && p[j + 1] == '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
310 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
311 j++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
312 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
313 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
314 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
315 buf.writeByte(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
316 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
317 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
318
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
319 // Transfer image to file
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
320 assert(docfile);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
321 docfile->setbuffer(buf.data, buf.offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
322 docfile->ref = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
323 char *pt = FileName::path(docfile->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
324 if (*pt)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
325 FileName::ensurePathExists(pt);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
326 mem.free(pt);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
327 docfile->writev();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
328 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
329 /* Remove all the escape sequences from buf2
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
330 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
331 { unsigned i = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
332 unsigned char *p = buf2.data;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
333 for (unsigned j = 0; j < buf2.offset; j++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
334 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
335 if (p[j] == 0xFF && j + 1 < buf2.offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
336 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
337 j++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
338 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
339 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
340 p[i] = p[j];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
341 i++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
342 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
343 buf2.setsize(i);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
344 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
345
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
346 // Transfer image to file
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
347 docfile->setbuffer(buf2.data, buf2.offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
348 docfile->ref = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
349 char *pt = FileName::path(docfile->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
350 if (*pt)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
351 FileName::ensurePathExists(pt);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
352 mem.free(pt);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
353 docfile->writev();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
354 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
355 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
356
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
357 /******************************* emitComment **********************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
358
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
359 /*
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
360 * Emit doc comment to documentation file
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
361 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
362
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
363 void Dsymbol::emitDitto(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
364 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
365 //printf("Dsymbol::emitDitto() %s %s\n", kind(), toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
366 OutBuffer *buf = sc->docbuf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
367 unsigned o;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
368 OutBuffer b;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
369
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
370 b.writestring("$(DDOC_DITTO ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
371 o = b.offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
372 toDocBuffer(&b);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
373 //printf("b: '%.*s'\n", b.offset, b.data);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
374 /* If 'this' is a function template, then highlightCode() was
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
375 * already run by FuncDeclaration::toDocbuffer().
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
376 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
377 TemplateDeclaration *td;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
378 if (parent &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
379 (td = parent->isTemplateDeclaration()) != NULL &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
380 td->onemember == this)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
381 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
382 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
383 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
384 highlightCode(sc, this, &b, o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
385 b.writeByte(')');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
386 buf->spread(sc->lastoffset, b.offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
387 memcpy(buf->data + sc->lastoffset, b.data, b.offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
388 sc->lastoffset += b.offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
389 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
390
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
391 void ScopeDsymbol::emitMemberComments(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
392 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
393 //printf("ScopeDsymbol::emitMemberComments() %s\n", toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
394 OutBuffer *buf = sc->docbuf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
395
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
396 if (members)
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
397 { const char *m = "$(DDOC_MEMBERS \n";
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
398
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
399 if (isModule())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
400 m = "$(DDOC_MODULE_MEMBERS \n";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
401 else if (isClassDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
402 m = "$(DDOC_CLASS_MEMBERS \n";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
403 else if (isStructDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
404 m = "$(DDOC_STRUCT_MEMBERS \n";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
405 else if (isEnumDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
406 m = "$(DDOC_ENUM_MEMBERS \n";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
407 else if (isTemplateDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
408 m = "$(DDOC_TEMPLATE_MEMBERS \n";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
409
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
410 unsigned offset1 = buf->offset; // save starting offset
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
411 buf->writestring(m);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
412 unsigned offset2 = buf->offset; // to see if we write anything
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
413 sc = sc->push(this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
414 for (int i = 0; i < members->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
415 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
416 Dsymbol *s = (Dsymbol *)members->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
417 //printf("\ts = '%s'\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
418 s->emitComment(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
419 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
420 sc->pop();
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
421 if (buf->offset == offset2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
422 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
423 /* Didn't write out any members, so back out last write
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
424 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
425 buf->offset = offset1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
426 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
427 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
428 buf->writestring(")\n");
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
429 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
430 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
431
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
432 void emitProtection(OutBuffer *buf, PROT prot)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
433 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
434 const char *p;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
435
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
436 switch (prot)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
437 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
438 case PROTpackage: p = "package"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
439 case PROTprotected: p = "protected"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
440 case PROTexport: p = "export"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
441 default: p = NULL; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
442 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
443 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
444 buf->printf("%s ", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
445 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
446
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
447 void Dsymbol::emitComment(Scope *sc) { }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
448 void InvariantDeclaration::emitComment(Scope *sc) { }
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
449 #if DMDV2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
450 void PostBlitDeclaration::emitComment(Scope *sc) { }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
451 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
452 void DtorDeclaration::emitComment(Scope *sc) { }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
453 void StaticCtorDeclaration::emitComment(Scope *sc) { }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
454 void StaticDtorDeclaration::emitComment(Scope *sc) { }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
455 void ClassInfoDeclaration::emitComment(Scope *sc) { }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
456 void ModuleInfoDeclaration::emitComment(Scope *sc) { }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
457 void TypeInfoDeclaration::emitComment(Scope *sc) { }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
458
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
459
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
460 void Declaration::emitComment(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
461 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
462 //printf("Declaration::emitComment(%p '%s'), comment = '%s'\n", this, toChars(), comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
463 //printf("type = %p\n", type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
464
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
465 if (protection == PROTprivate || !ident ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
466 (!type && !isCtorDeclaration() && !isAliasDeclaration()))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
467 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
468 if (!comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
469 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
470
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
471 OutBuffer *buf = sc->docbuf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
472 DocComment *dc = DocComment::parse(sc, this, comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
473 unsigned o;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
474
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
475 if (!dc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
476 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
477 emitDitto(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
478 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
479 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
480 dc->pmacrotable = &sc->module->macrotable;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
481
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
482 buf->writestring(ddoc_decl_s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
483 o = buf->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
484 toDocBuffer(buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
485 highlightCode(sc, this, buf, o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
486 sc->lastoffset = buf->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
487 buf->writestring(ddoc_decl_e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
488
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
489 buf->writestring(ddoc_decl_dd_s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
490 dc->writeSections(sc, this, buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
491 buf->writestring(ddoc_decl_dd_e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
492 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
493
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
494 void AggregateDeclaration::emitComment(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
495 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
496 //printf("AggregateDeclaration::emitComment() '%s'\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
497 if (prot() == PROTprivate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
498 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
499 if (!comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
500 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
501
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
502 OutBuffer *buf = sc->docbuf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
503 DocComment *dc = DocComment::parse(sc, this, comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
504
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
505 if (!dc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
506 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
507 emitDitto(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
508 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
509 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
510 dc->pmacrotable = &sc->module->macrotable;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
511
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
512 buf->writestring(ddoc_decl_s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
513 toDocBuffer(buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
514 sc->lastoffset = buf->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
515 buf->writestring(ddoc_decl_e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
516
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
517 buf->writestring(ddoc_decl_dd_s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
518 dc->writeSections(sc, this, buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
519 emitMemberComments(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
520 buf->writestring(ddoc_decl_dd_e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
521 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
522
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
523 void TemplateDeclaration::emitComment(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
524 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
525 //printf("TemplateDeclaration::emitComment() '%s', kind = %s\n", toChars(), kind());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
526 if (prot() == PROTprivate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
527 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
528
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
529 unsigned char *com = comment;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
530 int hasmembers = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
531
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
532 Dsymbol *ss = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
533
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
534 if (onemember)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
535 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
536 ss = onemember->isAggregateDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
537 if (!ss)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
538 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
539 ss = onemember->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
540 if (ss)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
541 { hasmembers = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
542 if (com != ss->comment)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
543 com = Lexer::combineComments(com, ss->comment);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
544 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
545 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
546 ss = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
547 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
548 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
549
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
550 if (!com)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
551 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
552
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
553 OutBuffer *buf = sc->docbuf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
554 DocComment *dc = DocComment::parse(sc, this, com);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
555 unsigned o;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
556
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
557 if (!dc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
558 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
559 ss->emitDitto(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
560 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
561 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
562 dc->pmacrotable = &sc->module->macrotable;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
563
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
564 buf->writestring(ddoc_decl_s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
565 o = buf->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
566 ss->toDocBuffer(buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
567 if (ss == this)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
568 highlightCode(sc, this, buf, o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
569 sc->lastoffset = buf->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
570 buf->writestring(ddoc_decl_e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
571
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
572 buf->writestring(ddoc_decl_dd_s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
573 dc->writeSections(sc, this, buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
574 if (hasmembers)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
575 ((ScopeDsymbol *)ss)->emitMemberComments(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
576 buf->writestring(ddoc_decl_dd_e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
577 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
578
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
579 void EnumDeclaration::emitComment(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
580 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
581 if (prot() == PROTprivate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
582 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
583 // if (!comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
584 { if (isAnonymous() && members)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
585 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
586 for (int i = 0; i < members->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
587 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
588 Dsymbol *s = (Dsymbol *)members->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
589 s->emitComment(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
590 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
591 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
592 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
593 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
594 if (!comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
595 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
596 if (isAnonymous())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
597 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
598
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
599 OutBuffer *buf = sc->docbuf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
600 DocComment *dc = DocComment::parse(sc, this, comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
601
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
602 if (!dc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
603 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
604 emitDitto(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
605 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
606 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
607 dc->pmacrotable = &sc->module->macrotable;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
608
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
609 buf->writestring(ddoc_decl_s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
610 toDocBuffer(buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
611 sc->lastoffset = buf->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
612 buf->writestring(ddoc_decl_e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
613
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
614 buf->writestring(ddoc_decl_dd_s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
615 dc->writeSections(sc, this, buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
616 emitMemberComments(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
617 buf->writestring(ddoc_decl_dd_e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
618 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
619
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
620 void EnumMember::emitComment(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
621 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
622 //printf("EnumMember::emitComment(%p '%s'), comment = '%s'\n", this, toChars(), comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
623 if (prot() == PROTprivate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
624 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
625 if (!comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
626 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
627
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
628 OutBuffer *buf = sc->docbuf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
629 DocComment *dc = DocComment::parse(sc, this, comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
630 unsigned o;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
631
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
632 if (!dc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
633 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
634 emitDitto(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
635 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
636 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
637 dc->pmacrotable = &sc->module->macrotable;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
638
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
639 buf->writestring(ddoc_decl_s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
640 o = buf->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
641 toDocBuffer(buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
642 highlightCode(sc, this, buf, o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
643 sc->lastoffset = buf->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
644 buf->writestring(ddoc_decl_e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
645
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
646 buf->writestring(ddoc_decl_dd_s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
647 dc->writeSections(sc, this, buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
648 buf->writestring(ddoc_decl_dd_e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
649 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
650
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
651 /******************************* toDocBuffer **********************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
652
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
653 void Dsymbol::toDocBuffer(OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
654 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
655 //printf("Dsymbol::toDocbuffer() %s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
656 HdrGenState hgs;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
657
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
658 hgs.ddoc = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
659 toCBuffer(buf, &hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
660 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
661
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
662 void prefix(OutBuffer *buf, Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
663 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
664 if (s->isDeprecated())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
665 buf->writestring("deprecated ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
666 Declaration *d = s->isDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
667 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
668 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
669 emitProtection(buf, d->protection);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
670 if (d->isAbstract())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
671 buf->writestring("abstract ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
672 if (d->isStatic())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
673 buf->writestring("static ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
674 if (d->isConst())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
675 buf->writestring("const ");
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
676 #if DMDV2
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
677 if (d->isInvariant())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
678 buf->writestring("invariant ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
679 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
680 if (d->isFinal())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
681 buf->writestring("final ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
682 if (d->isSynchronized())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
683 buf->writestring("synchronized ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
684 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
685 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
686
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
687 void Declaration::toDocBuffer(OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
688 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
689 //printf("Declaration::toDocbuffer() %s, originalType = %p\n", toChars(), originalType);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
690 if (ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
691 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
692 prefix(buf, this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
693
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
694 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
695 { HdrGenState hgs;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
696 hgs.ddoc = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
697 if (originalType)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
698 { //originalType->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
699 originalType->toCBuffer(buf, ident, &hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
700 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
701 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
702 type->toCBuffer(buf, ident, &hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
703 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
704 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
705 buf->writestring(ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
706 buf->writestring(";\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
707 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
708 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
709
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
710
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
711 void AliasDeclaration::toDocBuffer(OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
712 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
713 //printf("AliasDeclaration::toDocbuffer() %s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
714 if (ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
715 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
716 if (isDeprecated())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
717 buf->writestring("deprecated ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
718
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
719 emitProtection(buf, protection);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
720 buf->writestring("alias ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
721 buf->writestring(toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
722 buf->writestring(";\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
723 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
724 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
725
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
726
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
727 void TypedefDeclaration::toDocBuffer(OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
728 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
729 if (ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
730 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
731 if (isDeprecated())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
732 buf->writestring("deprecated ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
733
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
734 emitProtection(buf, protection);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
735 buf->writestring("typedef ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
736 buf->writestring(toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
737 buf->writestring(";\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
738 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
739 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
740
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
741
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
742 void FuncDeclaration::toDocBuffer(OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
743 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
744 //printf("FuncDeclaration::toDocbuffer() %s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
745 if (ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
746 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
747 TemplateDeclaration *td;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
748
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
749 if (parent &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
750 (td = parent->isTemplateDeclaration()) != NULL &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
751 td->onemember == this)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
752 { /* It's a function template
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
753 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
754 HdrGenState hgs;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
755 unsigned o = buf->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
756 TypeFunction *tf = (TypeFunction *)type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
757
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
758 hgs.ddoc = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
759 prefix(buf, td);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
760 tf->next->toCBuffer(buf, NULL, &hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
761 buf->writeByte(' ');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
762 buf->writestring(ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
763 buf->writeByte('(');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
764 for (int i = 0; i < td->origParameters->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
765 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
766 TemplateParameter *tp = (TemplateParameter *)td->origParameters->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
767 if (i)
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
768 buf->writestring(", ");
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
769 tp->toCBuffer(buf, &hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
770 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
771 buf->writeByte(')');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
772 Argument::argsToCBuffer(buf, &hgs, tf->parameters, tf->varargs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
773 buf->writestring(";\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
774
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
775 highlightCode(NULL, this, buf, o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
776 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
777 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
778 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
779 Declaration::toDocBuffer(buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
780 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
781 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
782 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
783
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
784 void CtorDeclaration::toDocBuffer(OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
785 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
786 HdrGenState hgs;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
787
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
788 buf->writestring("this");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
789 Argument::argsToCBuffer(buf, &hgs, arguments, varargs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
790 buf->writestring(";\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
791 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
792
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
793
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
794 void AggregateDeclaration::toDocBuffer(OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
795 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
796 if (ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
797 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
798 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
799 emitProtection(buf, protection);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
800 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
801 buf->printf("%s $(DDOC_PSYMBOL %s)", kind(), toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
802 buf->writestring(";\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
803 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
804 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
805
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
806 void StructDeclaration::toDocBuffer(OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
807 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
808 //printf("StructDeclaration::toDocbuffer() %s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
809 if (ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
810 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
811 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
812 emitProtection(buf, protection);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
813 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
814 TemplateDeclaration *td;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
815
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
816 if (parent &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
817 (td = parent->isTemplateDeclaration()) != NULL &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
818 td->onemember == this)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
819 { unsigned o = buf->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
820 td->toDocBuffer(buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
821 highlightCode(NULL, this, buf, o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
822 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
823 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
824 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
825 buf->printf("%s $(DDOC_PSYMBOL %s)", kind(), toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
826 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
827 buf->writestring(";\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
828 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
829 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
830
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
831 void ClassDeclaration::toDocBuffer(OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
832 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
833 //printf("ClassDeclaration::toDocbuffer() %s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
834 if (ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
835 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
836 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
837 emitProtection(buf, protection);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
838 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
839 TemplateDeclaration *td;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
840
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
841 if (parent &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
842 (td = parent->isTemplateDeclaration()) != NULL &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
843 td->onemember == this)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
844 { unsigned o = buf->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
845 td->toDocBuffer(buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
846 highlightCode(NULL, this, buf, o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
847 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
848 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
849 {
876
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
850 if (isAbstract())
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
851 buf->writestring("abstract ");
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
852 buf->printf("%s $(DDOC_PSYMBOL %s)", kind(), toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
853 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
854 int any = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
855 for (int i = 0; i < baseclasses.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
856 { BaseClass *bc = (BaseClass *)baseclasses.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
857
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
858 if (bc->protection == PROTprivate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
859 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
860 if (bc->base && bc->base->ident == Id::Object)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
861 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
862
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
863 if (any)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
864 buf->writestring(", ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
865 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
866 { buf->writestring(": ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
867 any = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
868 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
869 emitProtection(buf, bc->protection);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
870 if (bc->base)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
871 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
872 buf->writestring(bc->base->toPrettyChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
873 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
874 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
875 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
876 HdrGenState hgs;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
877 bc->type->toCBuffer(buf, NULL, &hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
878 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
879 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
880 buf->writestring(";\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
881 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
882 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
883
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
884
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
885 void EnumDeclaration::toDocBuffer(OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
886 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
887 if (ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
888 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
889 buf->printf("%s $(DDOC_PSYMBOL %s)", kind(), toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
890 buf->writestring(";\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
891 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
892 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
893
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
894 void EnumMember::toDocBuffer(OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
895 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
896 if (ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
897 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
898 buf->writestring(toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
899 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
900 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
901
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
902
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
903 /********************************* DocComment *********************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
904
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
905 DocComment::DocComment()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
906 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
907 memset(this, 0, sizeof(DocComment));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
908 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
909
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
910 DocComment *DocComment::parse(Scope *sc, Dsymbol *s, unsigned char *comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
911 { unsigned idlen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
912
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
913 //printf("parse(%s): '%s'\n", s->toChars(), comment);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
914 if (sc->lastdc && isDitto(comment))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
915 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
916
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
917 DocComment *dc = new DocComment();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
918 if (!comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
919 return dc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
920
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
921 dc->parseSections(comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
922
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
923 for (int i = 0; i < dc->sections.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
924 { Section *s = (Section *)dc->sections.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
925
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
926 if (icmp("copyright", s->name, s->namelen) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
927 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
928 dc->copyright = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
929 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
930 if (icmp("macros", s->name, s->namelen) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
931 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
932 dc->macros = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
933 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
934 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
935
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
936 sc->lastdc = dc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
937 return dc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
938 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
939
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
940 /*****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
941 * Parse next paragraph out of *pcomment.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
942 * Update *pcomment to point past paragraph.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
943 * Returns NULL if no more paragraphs.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
944 * If paragraph ends in 'identifier:',
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
945 * then (*pcomment)[0 .. idlen] is the identifier.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
946 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
947
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
948 void DocComment::parseSections(unsigned char *comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
949 { unsigned char *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
950 unsigned char *pstart;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
951 unsigned char *pend;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
952 unsigned char *q;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
953 unsigned char *idstart;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
954 unsigned idlen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
955
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
956 unsigned char *name = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
957 unsigned namelen = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
958
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
959 //printf("parseSections('%s')\n", comment);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
960 p = comment;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
961 while (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
962 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
963 p = skipwhitespace(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
964 pstart = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
965
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
966 /* Find end of section, which is ended by one of:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
967 * 'identifier:'
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
968 * '\0'
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
969 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
970 idlen = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
971 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
972 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
973 if (isalpha(*p) || *p == '_')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
974 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
975 q = p + 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
976 while (isalnum(*q) || *q == '_')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
977 q++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
978 if (*q == ':') // identifier: ends it
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
979 { idlen = q - p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
980 idstart = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
981 for (pend = p; pend > pstart; pend--)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
982 { if (pend[-1] == '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
983 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
984 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
985 p = q + 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
986 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
987 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
988 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
989 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
990 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
991 if (!*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
992 { pend = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
993 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
994 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
995 if (*p == '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
996 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
997 if (*p == '\n' && !summary && !namelen)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
998 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
999 pend = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1000 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1001 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1002 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1003 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1004 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1005 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1006 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1007 p = skipwhitespace(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1008 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1009 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1010
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1011 if (namelen || pstart < pend)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1012 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1013 Section *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1014 if (icmp("Params", name, namelen) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1015 s = new ParamSection();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1016 else if (icmp("Macros", name, namelen) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1017 s = new MacroSection();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1018 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1019 s = new Section();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1020 s->name = name;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1021 s->namelen = namelen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1022 s->body = pstart;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1023 s->bodylen = pend - pstart;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1024 s->nooutput = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1025
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1026 //printf("Section: '%.*s' = '%.*s'\n", s->namelen, s->name, s->bodylen, s->body);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1027
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1028 sections.push(s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1029
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1030 if (!summary && !namelen)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1031 summary = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1032 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1033
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1034 if (idlen)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1035 { name = idstart;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1036 namelen = idlen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1037 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1038 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1039 { name = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1040 namelen = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1041 if (!*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1042 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1043 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1044 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1045 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1046
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1047 void DocComment::writeSections(Scope *sc, Dsymbol *s, OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1048 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1049 //printf("DocComment::writeSections()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1050 if (sections.dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1051 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1052 buf->writestring("$(DDOC_SECTIONS \n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1053 for (int i = 0; i < sections.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1054 { Section *sec = (Section *)sections.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1055
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1056 if (sec->nooutput)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1057 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1058 //printf("Section: '%.*s' = '%.*s'\n", sec->namelen, sec->name, sec->bodylen, sec->body);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1059 if (sec->namelen || i)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1060 sec->write(this, sc, s, buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1061 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1062 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1063 buf->writestring("$(DDOC_SUMMARY ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1064 unsigned o = buf->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1065 buf->write(sec->body, sec->bodylen);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1066 highlightText(sc, s, buf, o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1067 buf->writestring(")\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1068 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1069 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1070 buf->writestring(")\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1071 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1072 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1073 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1074 buf->writestring("$(DDOC_BLANKLINE)\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1075 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1076 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1077
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1078 /***************************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1079 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1080
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1081 void Section::write(DocComment *dc, Scope *sc, Dsymbol *s, OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1082 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1083 if (namelen)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1084 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
1085 static const char *table[] =
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1086 { "AUTHORS", "BUGS", "COPYRIGHT", "DATE",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1087 "DEPRECATED", "EXAMPLES", "HISTORY", "LICENSE",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1088 "RETURNS", "SEE_ALSO", "STANDARDS", "THROWS",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1089 "VERSION" };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1090
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1091 for (int i = 0; i < sizeof(table) / sizeof(table[0]); i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1092 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1093 if (icmp(table[i], name, namelen) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1094 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1095 buf->printf("$(DDOC_%s ", table[i]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1096 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1097 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1098 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1099
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1100 buf->writestring("$(DDOC_SECTION ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1101 // Replace _ characters with spaces
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1102 buf->writestring("$(DDOC_SECTION_H ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1103 for (unsigned u = 0; u < namelen; u++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1104 { unsigned char c = name[u];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1105 buf->writeByte((c == '_') ? ' ' : c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1106 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1107 buf->writestring(":)\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1108 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1109 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1110 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1111 buf->writestring("$(DDOC_DESCRIPTION ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1112 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1113 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1114 unsigned o = buf->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1115 buf->write(body, bodylen);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1116 highlightText(sc, s, buf, o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1117 buf->writestring(")\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1118 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1119
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1120 /***************************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1121 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1122
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1123 void ParamSection::write(DocComment *dc, Scope *sc, Dsymbol *s, OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1124 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1125 unsigned char *p = body;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1126 unsigned len = bodylen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1127 unsigned char *pend = p + len;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1128
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1129 unsigned char *tempstart;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1130 unsigned templen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1131
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1132 unsigned char *namestart;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1133 unsigned namelen = 0; // !=0 if line continuation
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1134
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1135 unsigned char *textstart;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1136 unsigned textlen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1137
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1138 unsigned o;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1139 Argument *arg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1140
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1141 buf->writestring("$(DDOC_PARAMS \n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1142 while (p < pend)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1143 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1144 // Skip to start of macro
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1145 for (; 1; p++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1146 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1147 switch (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1148 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1149 case ' ':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1150 case '\t':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1151 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1152
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1153 case '\n':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1154 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1155 goto Lcont;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1156
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1157 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1158 if (!(isalpha(*p) || *p == '_'))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1159 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1160 if (namelen)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1161 goto Ltext; // continuation of prev macro
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1162 goto Lskipline;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1163 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1164 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1165 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1166 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1167 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1168 tempstart = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1169
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1170 while (isalnum(*p) || *p == '_')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1171 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1172 templen = p - tempstart;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1173
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1174 while (*p == ' ' || *p == '\t')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1175 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1176
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1177 if (*p != '=')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1178 { if (namelen)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1179 goto Ltext; // continuation of prev macro
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1180 goto Lskipline;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1181 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1182 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1183
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1184 if (namelen)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1185 { // Output existing param
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1186
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1187 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1188 //printf("param '%.*s' = '%.*s'\n", namelen, namestart, textlen, textstart);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1189 HdrGenState hgs;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1190 buf->writestring("$(DDOC_PARAM_ROW ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1191 buf->writestring("$(DDOC_PARAM_ID ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1192 o = buf->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1193 arg = isFunctionParameter(s, namestart, namelen);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1194 if (arg && arg->type && arg->ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1195 arg->type->toCBuffer(buf, arg->ident, &hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1196 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1197 buf->write(namestart, namelen);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1198 highlightCode(sc, s, buf, o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1199 buf->writestring(")\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1200
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1201 buf->writestring("$(DDOC_PARAM_DESC ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1202 o = buf->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1203 buf->write(textstart, textlen);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1204 highlightText(sc, s, buf, o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1205 buf->writestring(")");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1206 buf->writestring(")\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1207 namelen = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1208 if (p >= pend)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1209 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1210 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1211
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1212 namestart = tempstart;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1213 namelen = templen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1214
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1215 while (*p == ' ' || *p == '\t')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1216 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1217 textstart = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1218
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1219 Ltext:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1220 while (*p != '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1221 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1222 textlen = p - textstart;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1223 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1224
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1225 Lcont:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1226 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1227
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1228 Lskipline:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1229 // Ignore this line
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1230 while (*p++ != '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1231 ;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1232 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1233 if (namelen)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1234 goto L1; // write out last one
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1235 buf->writestring(")\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1236 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1237
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1238 /***************************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1239 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1240
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1241 void MacroSection::write(DocComment *dc, Scope *sc, Dsymbol *s, OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1242 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1243 //printf("MacroSection::write()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1244 DocComment::parseMacros(dc->pescapetable, dc->pmacrotable, body, bodylen);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1245 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1246
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1247 /************************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1248 * Parse macros out of Macros: section.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1249 * Macros are of the form:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1250 * name1 = value1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1251 *
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1252 * name2 = value2
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1253 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1254
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1255 void DocComment::parseMacros(Escape **pescapetable, Macro **pmacrotable, unsigned char *m, unsigned mlen)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1256 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1257 unsigned char *p = m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1258 unsigned len = mlen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1259 unsigned char *pend = p + len;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1260
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1261 unsigned char *tempstart;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1262 unsigned templen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1263
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1264 unsigned char *namestart;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1265 unsigned namelen = 0; // !=0 if line continuation
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1266
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1267 unsigned char *textstart;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1268 unsigned textlen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1269
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1270 while (p < pend)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1271 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1272 // Skip to start of macro
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1273 for (; 1; p++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1274 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1275 if (p >= pend)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1276 goto Ldone;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1277 switch (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1278 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1279 case ' ':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1280 case '\t':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1281 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1282
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1283 case '\n':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1284 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1285 goto Lcont;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1286
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1287 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1288 if (!(isalpha(*p) || *p == '_'))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1289 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1290 if (namelen)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1291 goto Ltext; // continuation of prev macro
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1292 goto Lskipline;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1293 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1294 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1295 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1296 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1297 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1298 tempstart = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1299
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1300 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1301 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1302 if (p >= pend)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1303 goto Ldone;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1304 if (!(isalnum(*p) || *p == '_'))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1305 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1306 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1307 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1308 templen = p - tempstart;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1309
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1310 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1311 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1312 if (p >= pend)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1313 goto Ldone;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1314 if (!(*p == ' ' || *p == '\t'))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1315 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1316 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1317 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1318
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1319 if (*p != '=')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1320 { if (namelen)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1321 goto Ltext; // continuation of prev macro
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1322 goto Lskipline;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1323 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1324 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1325 if (p >= pend)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1326 goto Ldone;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1327
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1328 if (namelen)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1329 { // Output existing macro
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1330 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1331 //printf("macro '%.*s' = '%.*s'\n", namelen, namestart, textlen, textstart);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1332 if (icmp("ESCAPES", namestart, namelen) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1333 parseEscapes(pescapetable, textstart, textlen);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1334 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1335 Macro::define(pmacrotable, namestart, namelen, textstart, textlen);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1336 namelen = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1337 if (p >= pend)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1338 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1339 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1340
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1341 namestart = tempstart;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1342 namelen = templen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1343
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1344 while (p < pend && (*p == ' ' || *p == '\t'))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1345 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1346 textstart = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1347
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1348 Ltext:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1349 while (p < pend && *p != '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1350 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1351 textlen = p - textstart;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1352
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1353 // Remove trailing \r if there is one
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1354 if (p > m && p[-1] == '\r')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1355 textlen--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1356
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1357 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1358 //printf("p = %p, pend = %p\n", p, pend);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1359
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1360 Lcont:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1361 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1362
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1363 Lskipline:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1364 // Ignore this line
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1365 while (p < pend && *p++ != '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1366 ;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1367 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1368 Ldone:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1369 if (namelen)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1370 goto L1; // write out last one
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1371 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1372
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1373 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1374 * Parse escapes of the form:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1375 * /c/string/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1376 * where c is a single character.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1377 * Multiple escapes can be separated
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1378 * by whitespace and/or commas.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1379 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1380
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1381 void DocComment::parseEscapes(Escape **pescapetable, unsigned char *textstart, unsigned textlen)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1382 { Escape *escapetable = *pescapetable;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1383
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1384 if (!escapetable)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1385 { escapetable = new Escape;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1386 *pescapetable = escapetable;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1387 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1388 unsigned char *p = textstart;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1389 unsigned char *pend = p + textlen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1390
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1391 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1392 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1393 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1394 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1395 if (p + 4 >= pend)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1396 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1397 if (!(*p == ' ' || *p == '\t' || *p == '\n' || *p == ','))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1398 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1399 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1400 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1401 if (p[0] != '/' || p[2] != '/')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1402 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1403 unsigned char c = p[1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1404 p += 3;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1405 unsigned char *start = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1406 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1407 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1408 if (p >= pend)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1409 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1410 if (*p == '/')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1411 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1412 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1413 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1414 size_t len = p - start;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1415 char *s = (char *)memcpy(mem.malloc(len + 1), start, len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1416 s[len] = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1417 escapetable->strings[c] = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1418 //printf("%c = '%s'\n", c, s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1419 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1420 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1421 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1422
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1423
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1424 /******************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1425 * Compare 0-terminated string with length terminated string.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1426 * Return < 0, ==0, > 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1427 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1428
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
1429 int cmp(const char *stringz, void *s, size_t slen)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1430 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1431 size_t len1 = strlen(stringz);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1432
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1433 if (len1 != slen)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1434 return len1 - slen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1435 return memcmp(stringz, s, slen);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1436 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1437
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
1438 int icmp(const char *stringz, void *s, size_t slen)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1439 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1440 size_t len1 = strlen(stringz);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1441
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1442 if (len1 != slen)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1443 return len1 - slen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1444 return memicmp(stringz, (char *)s, slen);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1445 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1446
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1447 /*****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1448 * Return !=0 if comment consists entirely of "ditto".
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1449 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1450
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1451 int isDitto(unsigned char *comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1452 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1453 if (comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1454 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1455 unsigned char *p = skipwhitespace(comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1456
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1457 if (memicmp((char *)p, "ditto", 5) == 0 && *skipwhitespace(p + 5) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1458 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1459 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1460 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1461 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1462
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1463 /**********************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1464 * Skip white space.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1465 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1466
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1467 unsigned char *skipwhitespace(unsigned char *p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1468 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1469 for (; 1; p++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1470 { switch (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1471 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1472 case ' ':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1473 case '\t':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1474 case '\n':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1475 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1476 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1477 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1478 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1479 return p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1480 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1481
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1482
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1483 /************************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1484 * Scan forward to one of:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1485 * start of identifier
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1486 * beginning of next line
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1487 * end of buf
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1488 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1489
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1490 unsigned skiptoident(OutBuffer *buf, unsigned i)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1491 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1492 for (; i < buf->offset; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1493 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1494 // BUG: handle unicode alpha's
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1495 unsigned char c = buf->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1496 if (isalpha(c) || c == '_')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1497 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1498 if (c == '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1499 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1500 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1501 return i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1502 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1503
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1504 /************************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1505 * Scan forward past end of identifier.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1506 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1507
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1508 unsigned skippastident(OutBuffer *buf, unsigned i)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1509 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1510 for (; i < buf->offset; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1511 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1512 // BUG: handle unicode alpha's
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1513 unsigned char c = buf->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1514 if (!(isalnum(c) || c == '_'))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1515 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1516 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1517 return i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1518 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1519
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1520
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1521 /************************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1522 * Scan forward past URL starting at i.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1523 * We don't want to highlight parts of a URL.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1524 * Returns:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1525 * i if not a URL
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1526 * index just past it if it is a URL
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1527 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1528
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1529 unsigned skippastURL(OutBuffer *buf, unsigned i)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1530 { unsigned length = buf->offset - i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1531 unsigned char *p = &buf->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1532 unsigned j;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1533 unsigned sawdot = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1534
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1535 if (length > 7 && memicmp((char *)p, "http://", 7) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1536 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1537 j = 7;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1538 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1539 else if (length > 8 && memicmp((char *)p, "https://", 8) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1540 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1541 j = 8;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1542 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1543 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1544 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1545
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1546 for (; j < length; j++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1547 { unsigned char c = p[j];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1548 if (isalnum(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1549 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1550 if (c == '-' || c == '_' || c == '?' ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1551 c == '=' || c == '%' || c == '&' ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1552 c == '/' || c == '+' || c == '#' ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1553 c == '~')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1554 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1555 if (c == '.')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1556 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1557 sawdot = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1558 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1559 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1560 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1561 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1562 if (sawdot)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1563 return i + j;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1564
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1565 Lno:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1566 return i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1567 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1568
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1569
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1570 /****************************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1571 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1572
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1573 int isKeyword(unsigned char *p, unsigned len)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1574 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
1575 static const char *table[] = { "true", "false", "null" };
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1576
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1577 for (int i = 0; i < sizeof(table) / sizeof(table[0]); i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1578 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1579 if (cmp(table[i], p, len) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1580 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1581 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1582 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1583 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1584
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1585 /****************************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1586 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1587
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1588 Argument *isFunctionParameter(Dsymbol *s, unsigned char *p, unsigned len)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1589 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1590 FuncDeclaration *f = s->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1591
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1592 /* f->type may be NULL for template members.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1593 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1594 if (f && f->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1595 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1596 TypeFunction *tf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1597 if (f->originalType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1598 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1599 tf = (TypeFunction *)f->originalType;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1600 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1601 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1602 tf = (TypeFunction *)f->type;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1603
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1604 if (tf->parameters)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1605 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1606 for (size_t k = 0; k < tf->parameters->dim; k++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1607 { Argument *arg = (Argument *)tf->parameters->data[k];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1608
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1609 if (arg->ident && cmp(arg->ident->toChars(), p, len) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1610 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1611 return arg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1612 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1613 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1614 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1615 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1616 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1617 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1618
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1619 /**************************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1620 * Highlight text section.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1621 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1622
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1623 void highlightText(Scope *sc, Dsymbol *s, OutBuffer *buf, unsigned offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1624 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1625 //printf("highlightText()\n");
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
1626 const char *sid = s->ident->toChars();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1627 FuncDeclaration *f = s->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1628 unsigned char *p;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
1629 const char *se;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1630
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1631 int leadingBlank = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1632 int inCode = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1633 int inComment = 0; // in <!-- ... --> comment
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1634 unsigned iCodeStart; // start of code section
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1635
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1636 unsigned iLineStart = offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1637
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1638 for (unsigned i = offset; i < buf->offset; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1639 { unsigned char c = buf->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1640
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1641 Lcont:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1642 switch (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1643 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1644 case ' ':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1645 case '\t':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1646 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1647
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1648 case '\n':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1649 if (sc && !inCode && i == iLineStart && i + 1 < buf->offset) // if "\n\n"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1650 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1651 static char blankline[] = "$(DDOC_BLANKLINE)\n";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1652
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1653 i = buf->insert(i, blankline, sizeof(blankline) - 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1654 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1655 leadingBlank = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1656 iLineStart = i + 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1657 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1658
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1659 case '<':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1660 leadingBlank = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1661 if (inCode)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1662 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1663 p = &buf->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1664
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1665 // Skip over comments
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1666 if (p[1] == '!' && p[2] == '-' && p[3] == '-')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1667 { unsigned j = i + 4;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1668 p += 4;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1669 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1670 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1671 if (j == buf->offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1672 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1673 if (p[0] == '-' && p[1] == '-' && p[2] == '>')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1674 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1675 i = j + 2; // place on closing '>'
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1676 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1677 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1678 j++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1679 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1680 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1681 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1682 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1683
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1684 // Skip over HTML tag
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1685 if (isalpha(p[1]) || (p[1] == '/' && isalpha(p[2])))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1686 { unsigned j = i + 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1687 p += 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1688 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1689 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1690 if (j == buf->offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1691 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1692 if (p[0] == '>')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1693 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1694 i = j; // place on closing '>'
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1695 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1696 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1697 j++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1698 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1699 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1700 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1701 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1702
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1703 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1704 // Replace '<' with '&lt;' character entity
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1705 se = Escape::escapeChar('<');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1706 if (se)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1707 { size_t len = strlen(se);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1708 buf->remove(i, 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1709 i = buf->insert(i, se, len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1710 i--; // point to ';'
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1711 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1712 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1713
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1714 case '>':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1715 leadingBlank = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1716 if (inCode)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1717 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1718 // Replace '>' with '&gt;' character entity
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1719 se = Escape::escapeChar('>');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1720 if (se)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1721 { size_t len = strlen(se);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1722 buf->remove(i, 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1723 i = buf->insert(i, se, len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1724 i--; // point to ';'
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1725 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1726 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1727
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1728 case '&':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1729 leadingBlank = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1730 if (inCode)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1731 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1732 p = &buf->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1733 if (p[1] == '#' || isalpha(p[1]))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1734 break; // already a character entity
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1735 // Replace '&' with '&amp;' character entity
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1736 se = Escape::escapeChar('&');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1737 if (se)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1738 { size_t len = strlen(se);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1739 buf->remove(i, 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1740 i = buf->insert(i, se, len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1741 i--; // point to ';'
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1742 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1743 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1744
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1745 case '-':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1746 /* A line beginning with --- delimits a code section.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1747 * inCode tells us if it is start or end of a code section.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1748 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1749 if (leadingBlank)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1750 { int istart = i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1751 int eollen = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1752
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1753 leadingBlank = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1754 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1755 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1756 ++i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1757 if (i >= buf->offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1758 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1759 c = buf->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1760 if (c == '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1761 { eollen = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1762 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1763 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1764 if (c == '\r')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1765 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1766 eollen = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1767 if (i + 1 >= buf->offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1768 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1769 if (buf->data[i + 1] == '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1770 { eollen = 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1771 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1772 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1773 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1774 // BUG: handle UTF PS and LS too
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1775 if (c != '-')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1776 goto Lcont;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1777 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1778 if (i - istart < 3)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1779 goto Lcont;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1780
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1781 // We have the start/end of a code section
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1782
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1783 // Remove the entire --- line, including blanks and \n
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1784 buf->remove(iLineStart, i - iLineStart + eollen);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1785 i = iLineStart;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1786
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1787 if (inCode)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1788 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1789 inCode = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1790 // The code section is from iCodeStart to i
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1791 OutBuffer codebuf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1792
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1793 codebuf.write(buf->data + iCodeStart, i - iCodeStart);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1794 codebuf.writeByte(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1795 highlightCode2(sc, s, &codebuf, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1796 buf->remove(iCodeStart, i - iCodeStart);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1797 i = buf->insert(iCodeStart, codebuf.data, codebuf.offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1798 i = buf->insert(i, ")\n", 2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1799 i--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1800 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1801 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1802 { static char pre[] = "$(D_CODE \n";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1803
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1804 inCode = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1805 i = buf->insert(i, pre, sizeof(pre) - 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1806 iCodeStart = i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1807 i--; // place i on >
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1808 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1809 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1810 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1811
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1812 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1813 leadingBlank = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1814 if (sc && !inCode && (isalpha(c) || c == '_'))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1815 { unsigned j;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1816
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1817 j = skippastident(buf, i);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1818 if (j > i)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1819 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1820 unsigned k = skippastURL(buf, i);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1821 if (k > i)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1822 { i = k - 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1823 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1824 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1825
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1826 if (buf->data[i] == '_') // leading '_' means no highlight
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1827 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1828 buf->remove(i, 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1829 i = j - 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1830 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1831 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1832 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1833 if (cmp(sid, buf->data + i, j - i) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1834 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1835 i = buf->bracket(i, "$(DDOC_PSYMBOL ", j, ")") - 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1836 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1837 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1838 else if (isKeyword(buf->data + i, j - i))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1839 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1840 i = buf->bracket(i, "$(DDOC_KEYWORD ", j, ")") - 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1841 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1842 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1843 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1844 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1845 if (f && isFunctionParameter(f, buf->data + i, j - i))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1846 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1847 //printf("highlighting arg '%s', i = %d, j = %d\n", arg->ident->toChars(), i, j);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1848 i = buf->bracket(i, "$(DDOC_PARAM ", j, ")") - 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1849 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1850 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1851 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1852 i = j - 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1853 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1854 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1855 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1856 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1857 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1858 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1859 Ldone:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1860 ;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1861 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1862
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1863 /**************************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1864 * Highlight code for DDOC section.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1865 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1866
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1867 void highlightCode(Scope *sc, Dsymbol *s, OutBuffer *buf, unsigned offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1868 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1869 char *sid = s->ident->toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1870 FuncDeclaration *f = s->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1871
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1872 //printf("highlightCode(s = '%s', kind = %s)\n", sid, s->kind());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1873 for (unsigned i = offset; i < buf->offset; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1874 { unsigned char c = buf->data[i];
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
1875 const char *se;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1876
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1877 se = Escape::escapeChar(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1878 if (se)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1879 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1880 size_t len = strlen(se);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1881 buf->remove(i, 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1882 i = buf->insert(i, se, len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1883 i--; // point to ';'
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1884 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1885 else if (isalpha(c) || c == '_')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1886 { unsigned j;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1887
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1888 j = skippastident(buf, i);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1889 if (j > i)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1890 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1891 if (cmp(sid, buf->data + i, j - i) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1892 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1893 i = buf->bracket(i, "$(DDOC_PSYMBOL ", j, ")") - 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1894 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1895 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1896 else if (f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1897 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1898 if (isFunctionParameter(f, buf->data + i, j - i))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1899 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1900 //printf("highlighting arg '%s', i = %d, j = %d\n", arg->ident->toChars(), i, j);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1901 i = buf->bracket(i, "$(DDOC_PARAM ", j, ")") - 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1902 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1903 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1904 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1905 i = j - 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1906 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1907 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1908 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1909 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1910
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1911 /****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1912 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1913
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1914 void highlightCode3(OutBuffer *buf, unsigned char *p, unsigned char *pend)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1915 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1916 for (; p < pend; p++)
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
1917 { const char *s = Escape::escapeChar(*p);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1918 if (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1919 buf->writestring(s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1920 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1921 buf->writeByte(*p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1922 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1923 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1924
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1925 /**************************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1926 * Highlight code for CODE section.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1927 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1928
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1929
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1930 void highlightCode2(Scope *sc, Dsymbol *s, OutBuffer *buf, unsigned offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1931 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1932 char *sid = s->ident->toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1933 FuncDeclaration *f = s->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1934 unsigned errorsave = global.errors;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1935 Lexer lex(NULL, buf->data, 0, buf->offset - 1, 0, 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1936 Token tok;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1937 OutBuffer res;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1938 unsigned char *lastp = buf->data;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
1939 const char *highlight;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1940
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1941 //printf("highlightCode2('%.*s')\n", buf->offset - 1, buf->data);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1942 res.reserve(buf->offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1943 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1944 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1945 lex.scan(&tok);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1946 highlightCode3(&res, lastp, tok.ptr);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1947 highlight = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1948 switch (tok.value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1949 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1950 case TOKidentifier:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1951 if (!sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1952 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1953 if (cmp(sid, tok.ptr, lex.p - tok.ptr) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1954 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1955 highlight = "$(D_PSYMBOL ";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1956 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1957 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1958 else if (f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1959 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1960 if (isFunctionParameter(f, tok.ptr, lex.p - tok.ptr))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1961 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1962 //printf("highlighting arg '%s', i = %d, j = %d\n", arg->ident->toChars(), i, j);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1963 highlight = "$(D_PARAM ";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1964 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1965 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1966 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1967 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1968
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1969 case TOKcomment:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1970 highlight = "$(D_COMMENT ";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1971 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1972
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1973 case TOKstring:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1974 highlight = "$(D_STRING ";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1975 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1976
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1977 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1978 if (tok.isKeyword())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1979 highlight = "$(D_KEYWORD ";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1980 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1981 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1982 if (highlight)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1983 res.writestring(highlight);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1984 highlightCode3(&res, tok.ptr, lex.p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1985 if (highlight)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1986 res.writeByte(')');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1987 if (tok.value == TOKeof)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1988 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1989 lastp = lex.p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1990 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1991 buf->setsize(offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1992 buf->write(&res);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1993 global.errors = errorsave;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1994 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1995
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1996 /***************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1997 * Find character string to replace c with.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1998 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1999
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
2000 const char *Escape::escapeChar(unsigned c)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
2001 { const char *s;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2002
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2003 switch (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2004 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2005 case '<':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2006 s = "&lt;";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2007 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2008 case '>':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2009 s = "&gt;";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2010 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2011 case '&':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2012 s = "&amp;";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2013 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2014 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2015 s = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2016 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2017 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2018 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2019 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2020