Mercurial > projects > dil
annotate trunk/src/dil/doc/Macro.d @ 724:0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Sat, 02 Feb 2008 12:39:37 +0100 |
parents | 5dd17d4568ce |
children | 84291c0a9e13 |
rev | line source |
---|---|
718
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
1 /++ |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
2 Author: Aziz Köksal |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
3 License: GPL3 |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
4 +/ |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
5 module dil.doc.Macro; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
6 |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
7 import dil.lexer.Funcs; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
8 import dil.Unicode; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
9 import common; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
10 |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
11 class Macro |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
12 { |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
13 string name; /// The name of the macro. |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
14 string text; /// Substitution text. |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
15 this (string name, string text) |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
16 { |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
17 this.name = name; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
18 this.text = text; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
19 } |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
20 } |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
21 |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
22 class MacroTable |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
23 { |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
24 MacroTable parent; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
25 Macro[string] table; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
26 |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
27 this(MacroTable parent = null) |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
28 { |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
29 this.parent = parent; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
30 } |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
31 |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
32 void insert(Macro macro_) |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
33 { |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
34 table[macro_.name] = macro_; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
35 } |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
36 |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
37 Macro search(string name) |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
38 { |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
39 auto pmacro = name in table; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
40 if (pmacro) |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
41 return *pmacro; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
42 if (parent) |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
43 return parent.search(name); |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
44 return null; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
45 } |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
46 |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
47 bool isRoot() |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
48 { return parent is null; } |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
49 } |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
50 |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
51 struct MacroParser |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
52 { |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
53 char* p; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
54 char* textEnd; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
55 |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
56 Macro[] parse(string text) |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
57 { |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
58 if (!text.length) |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
59 return null; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
60 if (text[$-1] != '\0') |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
61 text ~= '\0'; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
62 p = text.ptr; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
63 textEnd = p + text.length; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
64 |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
65 Macro[] macros; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
66 |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
67 char* idBegin, idEnd, bodyBegin; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
68 char* nextIdBegin, nextIdEnd, nextBodyBegin; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
69 |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
70 // Init. |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
71 findNextMacroId(idBegin, idEnd, bodyBegin); |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
72 // Continue. |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
73 while (findNextMacroId(nextIdBegin, nextIdEnd, nextBodyBegin)) |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
74 { |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
75 macros ~= new Macro(makeString(idBegin, idEnd), makeString(bodyBegin, nextIdBegin)); |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
76 idBegin = nextIdBegin; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
77 idEnd = nextIdEnd; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
78 bodyBegin = nextBodyBegin; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
79 } |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
80 // Add last macro. |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
81 macros ~= new Macro(makeString(idBegin, idEnd), makeString(bodyBegin, textEnd)); |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
82 return macros; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
83 } |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
84 |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
85 bool findNextMacroId(ref char* ref_idBegin, ref char* ref_idEnd, ref char* ref_bodyBegin) |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
86 { |
723
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
87 while (p < textEnd) |
718
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
88 { |
723
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
89 skipWhitespace(); |
718
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
90 auto idBegin = p; |
722
ceaac6a24258
Added isUnicodeAlpha() for DDocParser and MacroParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
718
diff
changeset
|
91 if (isidbeg(*p) || isUnicodeAlpha(p, textEnd)) // IdStart |
718
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
92 { |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
93 do // IdChar* |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
94 p++; |
722
ceaac6a24258
Added isUnicodeAlpha() for DDocParser and MacroParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
718
diff
changeset
|
95 while (isident(*p) || isUnicodeAlpha(p, textEnd)) |
718
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
96 auto idEnd = p; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
97 |
723
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
98 skipWhitespace(); |
718
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
99 if (*p == '=') |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
100 { |
723
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
101 p++; |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
102 skipWhitespace(); |
718
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
103 ref_idBegin = idBegin; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
104 ref_idEnd = idEnd; |
723
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
105 ref_bodyBegin = p; |
718
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
106 return true; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
107 } |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
108 } |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
109 skipLine(); |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
110 } |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
111 return false; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
112 } |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
113 |
723
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
114 void skipWhitespace() |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
115 { |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
116 while (p < textEnd && (isspace(*p) || *p == '\n')) |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
117 p++; |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
118 } |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
119 |
718
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
120 void skipLine() |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
121 { |
723
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
122 while (p < textEnd && *p != '\n') |
718
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
123 p++; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
124 p++; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
125 } |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
126 } |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
127 |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
128 char[] makeString(char* begin, char* end) |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
129 { |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
130 return begin[0 .. end - begin]; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
131 } |
722
ceaac6a24258
Added isUnicodeAlpha() for DDocParser and MacroParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
718
diff
changeset
|
132 |
ceaac6a24258
Added isUnicodeAlpha() for DDocParser and MacroParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
718
diff
changeset
|
133 char[] expandMacros(MacroTable table, char[] text) |
ceaac6a24258
Added isUnicodeAlpha() for DDocParser and MacroParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
718
diff
changeset
|
134 { |
ceaac6a24258
Added isUnicodeAlpha() for DDocParser and MacroParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
718
diff
changeset
|
135 char[] result; |
ceaac6a24258
Added isUnicodeAlpha() for DDocParser and MacroParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
718
diff
changeset
|
136 char* p = text.ptr; |
ceaac6a24258
Added isUnicodeAlpha() for DDocParser and MacroParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
718
diff
changeset
|
137 char* textEnd = p + text.length; |
723
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
138 char* macroEnd = p; |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
139 while (p+3 < textEnd) // minimum 4 chars: $(x) |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
140 { |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
141 if (*p == '$' && p[1] == '(') |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
142 { |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
143 // Copy string between macros. |
724
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
144 if (macroEnd !is p) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
145 result ~= makeString(macroEnd, p); |
723
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
146 p += 2; |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
147 auto idBegin = p; |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
148 if (isidbeg(*p) || isUnicodeAlpha(p, textEnd)) // IdStart |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
149 { |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
150 do // IdChar* |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
151 p++; |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
152 while (p < textEnd && (isident(*p) || isUnicodeAlpha(p, textEnd))) |
724
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
153 // Create macro name. |
723
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
154 auto macroName = makeString(idBegin, p); |
724
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
155 // Get arguments. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
156 auto args = scanArguments(p, textEnd); |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
157 // TODO: still expand macro if no closing bracket was found? |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
158 if (p == textEnd) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
159 break; // No closing bracket found. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
160 assert(*p == ')'); |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
161 p++; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
162 macroEnd = p; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
163 |
723
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
164 auto macro_ = table.search(macroName); |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
165 if (macro_) |
724
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
166 result ~= expandArguments(macro_.text, args); |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
167 continue; |
723
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
168 } |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
169 } |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
170 p++; |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
171 } |
724
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
172 if (macroEnd < textEnd) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
173 result ~= makeString(macroEnd, textEnd); |
722
ceaac6a24258
Added isUnicodeAlpha() for DDocParser and MacroParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
718
diff
changeset
|
174 return result; |
ceaac6a24258
Added isUnicodeAlpha() for DDocParser and MacroParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
718
diff
changeset
|
175 } |
ceaac6a24258
Added isUnicodeAlpha() for DDocParser and MacroParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
718
diff
changeset
|
176 |
724
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
177 /// Scans until the closing ')' is found. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
178 /// Returns [$0, $1, $2 ...]. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
179 char[][] scanArguments(ref char* p, char* textEnd) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
180 { |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
181 // D specs: "The argument text can contain nested parentheses, |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
182 // "" or '' strings, comments, or tags." |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
183 uint level = 1; // Nesting level of the parentheses. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
184 char[][] args; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
185 |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
186 // Skip leading spaces. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
187 while (p < textEnd && isspace(*p)) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
188 p++; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
189 |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
190 char* arg0Begin = p; // Whole argument list. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
191 char* argBegin = p; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
192 Loop: |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
193 while (p < textEnd) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
194 { |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
195 switch (*p) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
196 { |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
197 case ',': |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
198 // Add a new argument. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
199 args ~= makeString(argBegin, p); |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
200 while (++p < textEnd && isspace(*p)) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
201 {} |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
202 argBegin = p; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
203 continue; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
204 case '(': |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
205 level++; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
206 break; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
207 case ')': |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
208 if (--level == 0) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
209 break Loop; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
210 break; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
211 case '"', '\'': |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
212 auto c = *p; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
213 while (++p < textEnd && *p != c) // Scan to next " or '. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
214 {} |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
215 assert(*p == c || p == textEnd); |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
216 if (p == textEnd) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
217 break Loop; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
218 break; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
219 case '<': |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
220 if (p+3 < textEnd && p[1] == '!' && p[2] == '-' && p[3] == '-') // <!-- |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
221 { |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
222 p += 3; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
223 // Scan to closing "-->". |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
224 while (++p + 2 < textEnd) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
225 if (*p == '-' && p[1] == '-' && p[2] == '>') |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
226 { |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
227 p += 3; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
228 continue Loop; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
229 } |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
230 p = textEnd; // p += 2; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
231 } // <tag ...> or </tag> |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
232 else if (p+1 < textEnd && (isalpha(p[1]) || p[1] == '/')) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
233 while (++p < textEnd && *p != '>') // Skip to closing '>'. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
234 {} |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
235 if (p == textEnd) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
236 break Loop; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
237 break; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
238 default: |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
239 } |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
240 p++; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
241 } |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
242 assert(*p == ')' && level == 0 || p == textEnd); |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
243 if (arg0Begin is p) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
244 return null; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
245 // arg0 spans the whole argument list. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
246 auto arg0 = makeString(arg0Begin, p); |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
247 // Add last argument. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
248 args ~= makeString(argBegin, p); |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
249 return arg0 ~ args; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
250 } |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
251 |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
252 /// Expands "$+", "$0" - "$9" with args[n] in text. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
253 /// Params: |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
254 /// text = the text to scan for argument placeholders. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
255 /// args = the first element, args[0], is the whole argument string and |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
256 /// the following elements are slices into it. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
257 /// The array is empty if there are no arguments. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
258 char[] expandArguments(char[] text, char[][] args) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
259 in { assert(args.length != 1, "zero or more than 1 args expected"); } |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
260 body |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
261 { |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
262 char[] result; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
263 char* p = text.ptr; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
264 char* textEnd = p + text.length; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
265 char* placeholderEnd = p; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
266 |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
267 while (p+1 < textEnd) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
268 { |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
269 if (*p == '$' && (p[1] == '+' || isdigit(p[1]))) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
270 { |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
271 // Copy string between argument placeholders. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
272 if (placeholderEnd !is p) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
273 result ~= makeString(placeholderEnd, p); |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
274 p++; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
275 placeholderEnd = p + 1; // Set new argument end. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
276 |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
277 if (args.length == 0) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
278 continue; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
279 |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
280 if (*p == '+') |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
281 { // $+ = $2 to $n |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
282 if (args.length > 1) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
283 result ~= makeString(args[2].ptr, args[0].ptr + args[0].length); |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
284 } |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
285 else |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
286 { // 0 - 9 |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
287 uint nthArg = *p - '0'; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
288 if (nthArg < args.length) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
289 result ~= args[nthArg]; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
290 } |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
291 } |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
292 p++; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
293 } |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
294 if (placeholderEnd < textEnd) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
295 result ~= makeString(placeholderEnd, textEnd); |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
296 return result; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
297 } |