Mercurial > projects > dil
annotate trunk/src/dil/doc/Macro.d @ 737:f88b5285b86b
Implemented DDocEmitter.
Fixed quite a few bugs.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Sat, 09 Feb 2008 02:00:20 +0100 |
parents | ca7607226caa |
children | 49fe21aa387c |
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 |
727
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
725
diff
changeset
|
7 import dil.doc.Parser; |
718
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
8 import dil.lexer.Funcs; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
9 import dil.Unicode; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
10 import common; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
11 |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
12 class Macro |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
13 { |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
14 string name; /// The name of the macro. |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
15 string text; /// Substitution text. |
725
84291c0a9e13
Added member callLevel to class Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
724
diff
changeset
|
16 uint callLevel; /// Recursive call level. |
718
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
17 this (string name, string text) |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
18 { |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
19 this.name = name; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
20 this.text = text; |
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 } |
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 class MacroTable |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
25 { |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
26 MacroTable parent; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
27 Macro[string] table; |
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(MacroTable parent = null) |
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 this.parent = parent; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
32 } |
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 void insert(Macro 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 table[macro_.name] = macro_; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
37 } |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
38 |
727
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
725
diff
changeset
|
39 void insert(Macro[] macros) |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
725
diff
changeset
|
40 { |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
725
diff
changeset
|
41 foreach (macro_; macros) |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
725
diff
changeset
|
42 insert(macro_); |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
725
diff
changeset
|
43 } |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
725
diff
changeset
|
44 |
737
f88b5285b86b
Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
731
diff
changeset
|
45 void insert(string name, string text) |
f88b5285b86b
Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
731
diff
changeset
|
46 { |
f88b5285b86b
Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
731
diff
changeset
|
47 insert(new Macro(name, text)); |
f88b5285b86b
Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
731
diff
changeset
|
48 } |
f88b5285b86b
Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
731
diff
changeset
|
49 |
f88b5285b86b
Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
731
diff
changeset
|
50 void insert(string[] names, string[] texts) |
f88b5285b86b
Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
731
diff
changeset
|
51 { |
f88b5285b86b
Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
731
diff
changeset
|
52 assert(names.length == texts.length); |
f88b5285b86b
Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
731
diff
changeset
|
53 foreach (i, name; names) |
f88b5285b86b
Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
731
diff
changeset
|
54 insert(name, texts[i]); |
f88b5285b86b
Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
731
diff
changeset
|
55 } |
f88b5285b86b
Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
731
diff
changeset
|
56 |
718
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
57 Macro search(string name) |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
58 { |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
59 auto pmacro = name in table; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
60 if (pmacro) |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
61 return *pmacro; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
62 if (parent) |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
63 return parent.search(name); |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
64 return null; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
65 } |
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 bool isRoot() |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
68 { return parent is null; } |
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 |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
71 struct MacroParser |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
72 { |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
73 Macro[] parse(string text) |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
74 { |
727
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
725
diff
changeset
|
75 IdentValueParser parser; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
725
diff
changeset
|
76 auto idvalues = parser.parse(text); |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
725
diff
changeset
|
77 auto macros = new Macro[idvalues.length]; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
725
diff
changeset
|
78 foreach (i, idvalue; idvalues) |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
725
diff
changeset
|
79 macros[i] = new Macro(idvalue.ident, idvalue.value); |
718
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
80 return macros; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
81 } |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
82 } |
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 char[] makeString(char* begin, char* end) |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
85 { |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
86 return begin[0 .. end - begin]; |
be887ada3e3e
Added new module dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
87 } |
722
ceaac6a24258
Added isUnicodeAlpha() for DDocParser and MacroParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
718
diff
changeset
|
88 |
725
84291c0a9e13
Added member callLevel to class Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
724
diff
changeset
|
89 char[] expandMacros(MacroTable table, char[] text, char[][] args = null) |
722
ceaac6a24258
Added isUnicodeAlpha() for DDocParser and MacroParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
718
diff
changeset
|
90 { |
ceaac6a24258
Added isUnicodeAlpha() for DDocParser and MacroParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
718
diff
changeset
|
91 char[] result; |
ceaac6a24258
Added isUnicodeAlpha() for DDocParser and MacroParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
718
diff
changeset
|
92 char* p = text.ptr; |
ceaac6a24258
Added isUnicodeAlpha() for DDocParser and MacroParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
718
diff
changeset
|
93 char* textEnd = p + text.length; |
723
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
94 char* macroEnd = p; |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
95 while (p+3 < textEnd) // minimum 4 chars: $(x) |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
96 { |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
97 if (*p == '$' && p[1] == '(') |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
98 { |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
99 // 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
|
100 if (macroEnd !is p) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
101 result ~= makeString(macroEnd, p); |
723
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
102 p += 2; |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
103 auto idBegin = p; |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
104 if (isidbeg(*p) || isUnicodeAlpha(p, textEnd)) // IdStart |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
105 { |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
106 do // IdChar* |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
107 p++; |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
108 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
|
109 // Create macro name. |
723
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
110 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
|
111 // Get arguments. |
725
84291c0a9e13
Added member callLevel to class Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
724
diff
changeset
|
112 auto macroArgs = scanArguments(p, textEnd); |
724
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
113 // 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
|
114 if (p == textEnd) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
115 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
|
116 assert(*p == ')'); |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
117 p++; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
118 macroEnd = p; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
119 |
723
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
120 auto macro_ = table.search(macroName); |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
121 if (macro_) |
725
84291c0a9e13
Added member callLevel to class Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
724
diff
changeset
|
122 { // Ignore recursive macro if: |
84291c0a9e13
Added member callLevel to class Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
724
diff
changeset
|
123 if (macro_.callLevel != 0 && |
84291c0a9e13
Added member callLevel to class Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
724
diff
changeset
|
124 (macroArgs.length == 0 || // Macro has no arguments. |
84291c0a9e13
Added member callLevel to class Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
724
diff
changeset
|
125 args.length && args[0] == macroArgs[0]) // arg0 == macroArg0. |
84291c0a9e13
Added member callLevel to class Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
724
diff
changeset
|
126 ) |
84291c0a9e13
Added member callLevel to class Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
724
diff
changeset
|
127 continue; |
84291c0a9e13
Added member callLevel to class Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
724
diff
changeset
|
128 macro_.callLevel++; |
84291c0a9e13
Added member callLevel to class Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
724
diff
changeset
|
129 auto expandedText = expandArguments(macro_.text, macroArgs); |
84291c0a9e13
Added member callLevel to class Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
724
diff
changeset
|
130 result ~= expandMacros(table, expandedText, macroArgs); |
84291c0a9e13
Added member callLevel to class Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
724
diff
changeset
|
131 macro_.callLevel--; |
84291c0a9e13
Added member callLevel to class Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
724
diff
changeset
|
132 } |
724
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
133 continue; |
723
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
134 } |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
135 } |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
136 p++; |
5dd17d4568ce
Wrote code for expandMacros().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
722
diff
changeset
|
137 } |
724
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
138 if (macroEnd < textEnd) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
139 result ~= makeString(macroEnd, textEnd); |
722
ceaac6a24258
Added isUnicodeAlpha() for DDocParser and MacroParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
718
diff
changeset
|
140 return result; |
ceaac6a24258
Added isUnicodeAlpha() for DDocParser and MacroParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
718
diff
changeset
|
141 } |
ceaac6a24258
Added isUnicodeAlpha() for DDocParser and MacroParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
718
diff
changeset
|
142 |
724
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
143 /// 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
|
144 /// Returns [$0, $1, $2 ...]. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
145 char[][] scanArguments(ref char* p, char* textEnd) |
725
84291c0a9e13
Added member callLevel to class Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
724
diff
changeset
|
146 out(args) { assert(args.length != 1); } |
84291c0a9e13
Added member callLevel to class Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
724
diff
changeset
|
147 body |
724
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
148 { |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
149 // 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
|
150 // "" 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
|
151 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
|
152 char[][] args; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
153 |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
154 // Skip leading spaces. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
155 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
|
156 p++; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
157 |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
158 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
|
159 char* argBegin = p; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
160 Loop: |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
161 while (p < textEnd) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
162 { |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
163 switch (*p) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
164 { |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
165 case ',': |
731
ca7607226caa
Added new module cmd.DDoc.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
727
diff
changeset
|
166 if (level != 1) // Ignore comma if inside (). |
ca7607226caa
Added new module cmd.DDoc.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
727
diff
changeset
|
167 break; |
724
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
168 // Add a new argument. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
169 args ~= makeString(argBegin, p); |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
170 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
|
171 {} |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
172 argBegin = p; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
173 continue; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
174 case '(': |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
175 level++; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
176 break; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
177 case ')': |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
178 if (--level == 0) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
179 break Loop; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
180 break; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
181 case '"', '\'': |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
182 auto c = *p; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
183 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
|
184 {} |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
185 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
|
186 if (p == textEnd) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
187 break Loop; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
188 break; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
189 case '<': |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
190 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
|
191 { |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
192 p += 3; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
193 // Scan to closing "-->". |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
194 while (++p + 2 < textEnd) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
195 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
|
196 { |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
197 p += 3; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
198 continue Loop; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
199 } |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
200 p = textEnd; // p += 2; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
201 } // <tag ...> or </tag> |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
202 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
|
203 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
|
204 {} |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
205 if (p == textEnd) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
206 break Loop; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
207 break; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
208 default: |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
209 } |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
210 p++; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
211 } |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
212 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
|
213 if (arg0Begin is p) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
214 return null; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
215 // 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
|
216 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
|
217 // Add last argument. |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
218 args ~= makeString(argBegin, p); |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
219 return arg0 ~ args; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
220 } |
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 /// 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
|
223 /// Params: |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
224 /// 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
|
225 /// 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
|
226 /// 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
|
227 /// 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
|
228 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
|
229 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
|
230 body |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
231 { |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
232 char[] result; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
233 char* p = text.ptr; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
234 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
|
235 char* placeholderEnd = p; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
236 |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
237 while (p+1 < textEnd) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
238 { |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
239 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
|
240 { |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
241 // 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
|
242 if (placeholderEnd !is p) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
243 result ~= makeString(placeholderEnd, p); |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
244 p++; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
245 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
|
246 |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
247 if (args.length == 0) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
248 continue; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
249 |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
250 if (*p == '+') |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
251 { // $+ = $2 to $n |
725
84291c0a9e13
Added member callLevel to class Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
724
diff
changeset
|
252 if (args.length > 2) |
724
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
253 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
|
254 } |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
255 else |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
256 { // 0 - 9 |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
257 uint nthArg = *p - '0'; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
258 if (nthArg < args.length) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
259 result ~= args[nthArg]; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
260 } |
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 p++; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
263 } |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
264 if (placeholderEnd < textEnd) |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
265 result ~= makeString(placeholderEnd, textEnd); |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
266 return result; |
0b8a6e876b6d
Added scanArguments() and expandArguments() to dil.doc.Macro.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
723
diff
changeset
|
267 } |