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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }