1c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/*
2c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Copyright (C) 2015 The Android Open Source Project
3c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *
4c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Licensed under the Apache License, Version 2.0 (the "License");
5c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * you may not use this file except in compliance with the License.
6c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * You may obtain a copy of the License at
7c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *
8c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *      http://www.apache.org/licenses/LICENSE-2.0
9c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *
10c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Unless required by applicable law or agreed to in writing, software
11c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * distributed under the License is distributed on an "AS IS" BASIS,
12c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * See the License for the specific language governing permissions and
14c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * limitations under the License.
15c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */
16c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
1732d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung#include <algorithm>
18c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <iostream>
19c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <sstream>
20c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
21c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include "Generator.h"
22c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include "Specification.h"
23c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include "Utilities.h"
24c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
25c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletusing namespace std;
26c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
27c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstruct DetailedFunctionEntry {
28c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    VersionInfo info;
29c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    string htmlDeclaration;
30c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet};
31c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
322217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic const char OVERVIEW_HTML_FILE_NAME[] = "overview.html";
332217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic const char INDEX_HTML_FILE_NAME[] = "index.html";
3432d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung
3532d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sungstatic void writeHeader(GeneratedFile* file, const string& title,
3632d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung                        const SpecFile& specFile) {
3732d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung    // Generate DevSite markups
3832d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung    *file
3932d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung        << "<html devsite>\n"
4032d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung           "<!-- " << AUTO_GENERATED_WARNING << "-->\n"
4132d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung           "<head>\n"
4232d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung           "  <title>RenderScript " << title << "</title>\n"
4332d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung           "  <meta name=\"top_category\" value=\"develop\" />\n"
4432d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung           "  <meta name=\"subcategory\" value=\"guide\" />\n"
4532d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung           "  <meta name=\"book_path\" value=\"/guide/_book.yaml\" />\n"
4632d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung           "  <meta name=\"project_path\" value=\"/guide/_project.yaml\" />\n";
4732d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung    auto desc = specFile.getFullDescription();
4832d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung    if (desc.size()) {
4932d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung        *file << "  <meta name=\"description\" content=\"";
5032d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung        // Output only the first two lines. Assuming there's no other HTML
5132d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung        // markups there
5232d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung        // TODO: escape/remove markups
536e6b65617d3a779d939e7d6dd26663a898205ee3I-Jui (Ray) Sung        for (unsigned int i = 0; i < std::min(desc.size(), 2UL); ++i) {
5432d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung            if (i) *file << " ";
5532d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung            *file << desc[i];
5632d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung        }
5732d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung        *file << "…\">\n";
582217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    }
5932d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung    *file << "</head>\n\n"
6032d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung             "<body>\n\n";
61918944e41306198807728ae3f05a1799773895c5Jean-Luc Brouillet    *file << "<div class='renderscript'>\n";
62c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
63c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
6432d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sungstatic void writeFooter(GeneratedFile* file) {
65918944e41306198807728ae3f05a1799773895c5Jean-Luc Brouillet    *file << "</div>\n";
6632d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung    *file << "\n\n</body>\n";
6732d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung    *file << "</html>\n";
68c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
69c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
70c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// If prefix starts input, copy it to stream and remove it from input.
71c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic void skipPrefix(ostringstream* stream, string* input, const string& prefix) {
72c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    size_t size = prefix.size();
73c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (input->compare(0, size, prefix) != 0) {
74c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return;
75c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
76c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    input->erase(0, size);
77c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *stream << prefix;
78c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
79c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
80c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Merge b into a.  Returns true if successful
81c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool mergeVersionInfo(VersionInfo* a, const VersionInfo& b) {
82c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (a->intSize != b.intSize) {
83c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        cerr << "Error.  We don't currently support versions that differ based on int size\n";
84c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return false;
85c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
86c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (b.minVersion != 0 && a->maxVersion == b.minVersion - 1) {
87c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        a->maxVersion = b.maxVersion;
88c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    } else if (b.maxVersion != 0 && a->minVersion == b.maxVersion + 1) {
89c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        a->minVersion = b.minVersion;
90c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    } else {
91c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        cerr << "Error.  This code currently assume that all versions are contiguous.  Don't know "
92c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                "how to merge versions (" << a->minVersion << " - " << a->maxVersion << ") and ("
93c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet             << b.minVersion << " - " << b.maxVersion << ")\n";
94c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return false;
95c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
96c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return true;
97c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
98c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
99c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic string getHtmlStringForType(const ParameterDefinition& parameter) {
100c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    string s = parameter.rsType;
101c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    ostringstream stream;
102c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    skipPrefix(&stream, &s, "const ");
103c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    skipPrefix(&stream, &s, "volatile ");
104c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    bool endsWithAsterisk = s.size() > 0 && s[s.size() - 1] == '*';
105c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (endsWithAsterisk) {
106c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        s.erase(s.size() - 1, 1);
107c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
108c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
109c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    string anchor = systemSpecification.getHtmlAnchor(s);
110c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (anchor.empty()) {
111c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        // Not a RenderScript specific type.
112c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return parameter.rsType;
113c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    } else {
114c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        stream << anchor;
115c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
116c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (endsWithAsterisk) {
117c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        stream << "*";
118c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
119c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return stream.str();
120c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
121c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
122c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic string getDetailedHtmlDeclaration(const FunctionPermutation& permutation) {
123c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    ostringstream stream;
124c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    auto ret = permutation.getReturn();
125c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (ret) {
126c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        stream << getHtmlStringForType(*ret);
127c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    } else {
128c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        stream << "void";
129c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
130c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    stream << " " << permutation.getName() << "(";
131c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    bool needComma = false;
132c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    for (auto p : permutation.getParams()) {
133c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        if (needComma) {
134c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            stream << ", ";
135c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
136c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        stream << getHtmlStringForType(*p);
137c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        if (p->isOutParameter) {
138c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            stream << "*";
139c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
140c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        if (!p->specName.empty()) {
141c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            stream << " " << p->specName;
142c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
143c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        needComma = true;
144c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
145c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    stream << ");\n";
146c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return stream.str();
147c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
148c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
149c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* Some functions (like max) have changed implementations but not their
150c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * declaration.  We need to unify these so that we don't end up with entries
151c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * like:
152c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *   char max(char a, char b);  Removed from API level 20
153c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *   char max(char a, char b);  Added to API level 20
154c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */
155c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool getUnifiedFunctionPrototypes(Function* function,
156c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                                         map<string, DetailedFunctionEntry>* entries) {
157c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    for (auto f : function->getSpecifications()) {
158c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        DetailedFunctionEntry entry;
159c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        entry.info = f->getVersionInfo();
160c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        for (auto p : f->getPermutations()) {
161c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            entry.htmlDeclaration = getDetailedHtmlDeclaration(*p);
162c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            const string s = stripHtml(entry.htmlDeclaration);
163c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            auto i = entries->find(s);
164c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            if (i == entries->end()) {
165c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                entries->insert(pair<string, DetailedFunctionEntry>(s, entry));
166c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            } else {
167c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                if (!mergeVersionInfo(&i->second.info, entry.info)) {
168c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                    return false;
169c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                }
170c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            }
171c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
172c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
173c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return true;
174c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
175c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
176c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Convert words starting with @ into HTML references.  Returns false if error.
177c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool convertDocumentationRefences(string* s) {
178c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    bool success = true;
179c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    size_t end = 0;
180c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    for (;;) {
181c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        size_t start = s->find('@', end);
182c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        if (start == string::npos) {
183c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            break;
184c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
185c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        // Find the end of the identifier
186c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        end = start;
187c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        char c;
188c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        do {
189c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            c = (*s)[++end];
190c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        } while (isalnum(c) || c == '_');
191c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
192c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        const string id = s->substr(start + 1, end - start - 1);
193c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        string anchor = systemSpecification.getHtmlAnchor(id);
194c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        if (anchor.empty()) {
195c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            cerr << "Error:  Can't convert the documentation reference @" << id << "\n";
196c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            success = false;
197c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
198c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        s->replace(start, end - start, anchor);
199c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
200c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return success;
201c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
202c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
203c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool generateHtmlParagraphs(GeneratedFile* file, const vector<string>& description) {
204c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    bool inParagraph = false;
205c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    for (auto s : description) {
206c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        // Empty lines in the .spec marks paragraphs.
207c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        if (s.empty()) {
208c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            if (inParagraph) {
209c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                *file << "</p>\n";
210c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                inParagraph = false;
211c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            }
212c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        } else {
213c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            if (!inParagraph) {
214c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                *file << "<p> ";
215c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                inParagraph = true;
216c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            }
217c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
218c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        if (!convertDocumentationRefences(&s)) {
219c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            return false;
220c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
221c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << s << "\n";
222c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
223c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (inParagraph) {
224c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "</p>\n";
225c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
226c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return true;
227c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
228c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
2294a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletstatic void writeSummaryTableStart(GeneratedFile* file, const string& label, bool labelIsHeading) {
230c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (labelIsHeading) {
2316386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet        *file << "<h2 style='margin-bottom: 0px;'>" << label << "</h2>\n";
232c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
2334a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *file << "<table class='jd-sumtable'><tbody>\n";
234c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!labelIsHeading) {
2354a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        *file << "  <tr><th colspan='2'>" << label << "</th></tr>\n";
236c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
237c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
238c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
239c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic void writeSummaryTableEnd(GeneratedFile* file) {
240c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "</tbody></table>\n";
241c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
242c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
2434a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletenum DeprecatedSelector {
2444a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    DEPRECATED_ONLY,
2454a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    NON_DEPRECATED_ONLY,
2464a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    ALL,
2474a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet};
2484a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet
2494a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletstatic void writeSummaryTableEntry(ostream* stream, Definition* definition,
2504a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                                   DeprecatedSelector deprecatedSelector) {
2514a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    if (definition->hidden()) {
252c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return;
253c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
2544a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    const bool deprecated = definition->deprecated();
2554a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    if ((deprecatedSelector == DEPRECATED_ONLY && !deprecated) ||
2564a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        (deprecatedSelector == NON_DEPRECATED_ONLY && deprecated)) {
257c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return;
258c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
2594a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet
2604a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *stream << "  <tr class='alt-color api apilevel-1'>\n";
2614a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *stream << "    <td class='jd-linkcol'>\n";
2622217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    *stream << "      <a href='" << definition->getUrl() << "'>" << definition->getName()
2632217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet            << "</a>\n";
2644a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *stream << "    </td>\n";
2654a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *stream << "    <td class='jd-descrcol' width='100%'>\n";
2664a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *stream << "      ";
2674a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    if (deprecated) {
2684a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        *stream << "<b>Deprecated</b>.  ";
2694a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    }
2704a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *stream << definition->getSummary() << "\n";
2714a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *stream << "    </td>\n";
2724a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *stream << "  </tr>\n";
273c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
274c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
2754a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletstatic void writeSummaryTable(GeneratedFile* file, const ostringstream* entries, const char* name,
2764a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                              DeprecatedSelector deprecatedSelector, bool labelAsHeader) {
2774a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    string s = entries->str();
2784a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    if (!s.empty()) {
2794a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        string prefix;
2804a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        if (deprecatedSelector == DEPRECATED_ONLY) {
2814a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            prefix = "Deprecated ";
2824a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        }
2834a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        writeSummaryTableStart(file, prefix + name, labelAsHeader);
2844a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        *file << s;
2854a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        writeSummaryTableEnd(file);
2864a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    }
287c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
288c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
289c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic void writeSummaryTables(GeneratedFile* file, const map<string, Constant*>& constants,
290c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                               const map<string, Type*>& types,
2914a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                               const map<string, Function*>& functions,
2924a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                               DeprecatedSelector deprecatedSelector, bool labelAsHeader) {
2934a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    ostringstream constantStream;
2944a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    for (auto e : constants) {
2954a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        writeSummaryTableEntry(&constantStream, e.second, deprecatedSelector);
296c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
2974a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    writeSummaryTable(file, &constantStream, "Constants", deprecatedSelector, labelAsHeader);
298c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
2994a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    ostringstream typeStream;
3004a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    for (auto e : types) {
3014a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        writeSummaryTableEntry(&typeStream, e.second, deprecatedSelector);
302c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
3034a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    writeSummaryTable(file, &typeStream, "Types", deprecatedSelector, labelAsHeader);
304c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
3054a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    ostringstream functionStream;
3064a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    for (auto e : functions) {
3074a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        writeSummaryTableEntry(&functionStream, e.second, deprecatedSelector);
308c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
3094a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    writeSummaryTable(file, &functionStream, "Functions", deprecatedSelector, labelAsHeader);
310c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
311c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
312ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hinesstatic void writeHtmlVersionTag(GeneratedFile* file, VersionInfo info,
313ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines                                bool addSpacing) {
3144a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    ostringstream stream;
315c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (info.intSize == 32) {
3164a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        stream << "When compiling for 32 bits. ";
317c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    } else if (info.intSize == 64) {
3184a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        stream << "When compiling for 64 bits. ";
319c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
320c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
321c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (info.minVersion > 1 || info.maxVersion) {
322c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        const char* mid =
323c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                    "<a "
324c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                    "href='http://developer.android.com/guide/topics/manifest/"
325c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                    "uses-sdk-element.html#ApiLevels'>API level ";
326c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        if (info.minVersion <= 1) {
327c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            // No minimum
328c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            if (info.maxVersion > 0) {
329ffc1710c382168e74386ef87d0101de65aca91b0Jean-Luc Brouillet                stream << "Removed from " << mid << info.maxVersion + 1 << " and higher";
330c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            }
331c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        } else {
332c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            if (info.maxVersion == 0) {
333c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                // No maximum
3344a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                stream << "Added in " << mid << info.minVersion;
335c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            } else {
3364a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                stream << mid << info.minVersion << " - " << info.maxVersion;
337c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            }
338c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
3394a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        stream << "</a>";
3404a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    }
341ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines    string s = stream.str();
342ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines    // Remove any trailing whitespace
343ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines    while (s.back() == ' ') {
344ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines        s.pop_back();
345ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines    }
3464a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    if (!s.empty()) {
347ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines        *file << (addSpacing ? "    " : "") << s << "\n";
348c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
349c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
350c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
35136e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouilletstatic void writeDetailedTypeSpecification(GeneratedFile* file, const TypeSpecification* spec) {
35236e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet    switch (spec->getKind()) {
35336e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet        case SIMPLE: {
35436e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet            Type* type = spec->getType();
35536e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet            *file << "<p>A typedef of: " << spec->getSimpleType()
356ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines                  << makeAttributeTag(spec->getAttribute(), "", type->getDeprecatedApiLevel(),
35736e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet                                      type->getDeprecatedMessage())
3584a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                  << "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
359ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines            writeHtmlVersionTag(file, spec->getVersionInfo(), false);
360ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines            *file << "</p>\n";
361ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines            break;
362ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines        }
363ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines        case RS_OBJECT: {
364ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines            *file << "<p>";
365ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines            writeHtmlVersionTag(file, spec->getVersionInfo(), false);
3664a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "</p>\n";
367c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            break;
36836e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet        }
369c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        case ENUM: {
3704a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "<p>An enum with the following values:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n";
371ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines            writeHtmlVersionTag(file, spec->getVersionInfo(), false);
3724a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "</p>\n";
373c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
3744a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "  <table class='jd-tagtable'><tbody>\n";
37536e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet            const vector<string>& values = spec->getValues();
37636e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet            const vector<string>& valueComments = spec->getValueComments();
377c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            for (size_t i = 0; i < values.size(); i++) {
3784a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                *file << "    <tr><th>" << values[i] << "</th><td>";
3794a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                if (valueComments.size() > i) {
3804a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                    *file << valueComments[i];
381c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                }
3824a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                *file << "</td></tr>\n";
383c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            }
3844a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "  </tbody></table><br/>\n";
385c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            break;
386c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
387c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        case STRUCT: {
3884a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "<p>A structure with the following fields:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
389ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines            writeHtmlVersionTag(file, spec->getVersionInfo(), false);
3904a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "</p>\n";
3914a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet
3924a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "  <table class='jd-tagtable'><tbody>\n";
39336e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet            const vector<string>& fields = spec->getFields();
39436e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet            const vector<string>& fieldComments = spec->getFieldComments();
395c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            for (size_t i = 0; i < fields.size(); i++) {
3964a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                *file << "    <tr><th>" << fields[i] << "</th><td>";
397c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                if (fieldComments.size() > i && !fieldComments[i].empty()) {
3984a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                    *file << fieldComments[i];
399c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                }
4004a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                *file << "</td></tr>\n";
401c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            }
4024a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "  </tbody></table><br/>\n";
403c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            break;
404c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
405c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
406c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
407c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
4084a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletstatic void writeDetailedConstantSpecification(GeneratedFile* file, ConstantSpecification* c) {
4094a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *file << "      <tr><td>";
410c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "Value: " << c->getValue() << "\n";
411ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines    writeHtmlVersionTag(file, c->getVersionInfo(), true);
4124a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *file << "      </td></tr>\n";
4134a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *file << "<br/>\n";
414c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
415c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
416c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool writeOverviewForFile(GeneratedFile* file, const SpecFile& specFile) {
417c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    bool success = true;
418c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "<h2>" << specFile.getBriefDescription() << "</h2>\n";
419c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!generateHtmlParagraphs(file, specFile.getFullDescription())) {
420c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        success = false;
421c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
422c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
423c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    // Write the summary tables.
424c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    // file << "<h2>Summary</h2>\n";
4257c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet    writeSummaryTables(file, specFile.getDocumentedConstants(), specFile.getDocumentedTypes(),
4264a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                       specFile.getDocumentedFunctions(), NON_DEPRECATED_ONLY, false);
4274a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet
428c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return success;
429c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
430c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
43132d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sungstatic bool generateOverview(const string& directory) {
432c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    GeneratedFile file;
43332d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung    if (!file.start(directory, OVERVIEW_HTML_FILE_NAME)) {
434c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return false;
435c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
436c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    bool success = true;
437c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
43832d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung    // Take the description from the first spec file (rs_core.spec, based on how
43932d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung    // currently this generator is called)
44032d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung    writeHeader(&file, "Runtime API Reference",
44132d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung                *(systemSpecification.getSpecFiles()[0]));
442c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
443c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    for (auto specFile : systemSpecification.getSpecFiles()) {
444c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        if (!writeOverviewForFile(&file, *specFile)) {
445c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            success = false;
446c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
447c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
448c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
44932d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung    writeFooter(&file);
450c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    file.close();
451c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return success;
452c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
453c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
45432d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sungstatic bool generateAlphabeticalIndex(const string& directory) {
455c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    GeneratedFile file;
45632d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung    if (!file.start(directory, INDEX_HTML_FILE_NAME)) {
457c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return false;
458c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
45932d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung    writeHeader(&file, "Index", SpecFile(""));
460c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
461c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    writeSummaryTables(&file, systemSpecification.getConstants(), systemSpecification.getTypes(),
4624a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                       systemSpecification.getFunctions(), NON_DEPRECATED_ONLY, true);
4634a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet
4644a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    writeSummaryTables(&file, systemSpecification.getConstants(), systemSpecification.getTypes(),
4654a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                       systemSpecification.getFunctions(), DEPRECATED_ONLY, true);
466c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
46732d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung    writeFooter(&file);
468c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    file.close();
469c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return true;
470c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
471c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
4724a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletstatic void writeDeprecatedWarning(GeneratedFile* file, Definition* definition) {
4734a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    if (definition->deprecated()) {
4744a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        *file << "    <p><b>Deprecated.</b>  ";
4754a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        string s = definition->getDeprecatedMessage();
4764a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        convertDocumentationRefences(&s);
4774a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        if (!s.empty()) {
4784a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << s;
4794a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        } else {
4804a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "Do not use.";
4814a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        }
4824a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        *file << "</p>\n";
4834a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    }
4844a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet}
4854a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet
486c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool writeDetailedConstant(GeneratedFile* file, Constant* constant) {
487c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (constant->hidden()) {
488c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return true;
489c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
490c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    const string& name = constant->getName();
491c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
492918944e41306198807728ae3f05a1799773895c5Jean-Luc Brouillet    *file << "<a name='android_rs:" << name << "'></a>\n";
493c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "<div class='jd-details'>\n";
494c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  <h4 class='jd-details-title'>\n";
495c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    <span class='sympad'>" << name << "</span>\n";
496c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    <span class='normal'>: " << constant->getSummary() << "</span>\n";
497c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  </h4>\n";
498c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
499c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  <div class='jd-details-descr'>\n";
500c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    <table class='jd-tagtable'><tbody>\n";
5014a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    auto specifications = constant->getSpecifications();
5024a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    bool addSeparator = specifications.size() > 1;
5034a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    for (auto spec : specifications) {
5044a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        if (addSeparator) {
5054a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "    <h5 class='jd-tagtitle'>Variant:</h5>\n";
5064a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        }
5074a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        writeDetailedConstantSpecification(file, spec);
508c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
509c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    </tbody></table>\n";
510c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  </div>\n";
511c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
512c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    <div class='jd-tagdata jd-tagdescr'>\n";
513c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
5144a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    writeDeprecatedWarning(file, constant);
515c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!generateHtmlParagraphs(file, constant->getDescription())) {
516c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return false;
517c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
518c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    </div>\n";
519c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
520c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "</div>\n";
521c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "\n";
522c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return true;
523c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
524c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
525c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool writeDetailedType(GeneratedFile* file, Type* type) {
526c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (type->hidden()) {
527c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return true;
528c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
529c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    const string& name = type->getName();
530c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
531918944e41306198807728ae3f05a1799773895c5Jean-Luc Brouillet    *file << "<a name='android_rs:" << name << "'></a>\n";
532c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "<div class='jd-details'>\n";
533c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  <h4 class='jd-details-title'>\n";
534c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    <span class='sympad'>" << name << "</span>\n";
535c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    <span class='normal'>: " << type->getSummary() << "</span>\n";
536c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  </h4>\n";
537c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
538c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  <div class='jd-details-descr'>\n";
5394a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    for (auto spec : type->getSpecifications()) {
5404a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        writeDetailedTypeSpecification(file, spec);
541c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
542c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
5434a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    writeDeprecatedWarning(file, type);
544c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!generateHtmlParagraphs(file, type->getDescription())) {
545c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return false;
546c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
547c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
5484a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *file << "  </div>\n";
549c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "</div>\n";
550c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "\n";
551c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return true;
552c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
553c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
554c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool writeDetailedFunction(GeneratedFile* file, Function* function) {
5556386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    if (function->hidden()) {
5566386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet        return true;
5576386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    }
558c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    const string& name = function->getName();
559c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
560918944e41306198807728ae3f05a1799773895c5Jean-Luc Brouillet    *file << "<a name='android_rs:" << name << "'></a>\n";
561c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "<div class='jd-details'>\n";
562c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  <h4 class='jd-details-title'>\n";
563c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    <span class='sympad'>" << name << "</span>\n";
564c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    <span class='normal'>: " << function->getSummary() << "</span>\n";
565c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  </h4>\n";
566c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
567c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  <div class='jd-details-descr'>\n";
568c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    map<string, DetailedFunctionEntry> entries;
569c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!getUnifiedFunctionPrototypes(function, &entries)) {
570c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return false;
571c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
5724a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *file << "    <table class='jd-tagtable'><tbody>\n";
573c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    for (auto i : entries) {
574c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "      <tr>\n";
5754a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        *file << "        <td>" << i.second.htmlDeclaration << "</td>\n";
576c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "        <td>";
577ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines        writeHtmlVersionTag(file, i.second.info, true);
5784a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        *file << "        </td>\n";
579c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "      </tr>\n";
580c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
581c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    </tbody></table>\n";
582c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  </div>\n";
583c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
584c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (function->someParametersAreDocumented()) {
585c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "  <div class='jd-tagdata'>";
586c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "    <h5 class='jd-tagtitle'>Parameters</h5>\n";
587c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "    <table class='jd-tagtable'><tbody>\n";
588c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        for (ParameterEntry* p : function->getParameters()) {
589c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            *file << "    <tr><th>" << p->name << "</th><td>" << p->documentation << "</td></tr>\n";
590c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
591c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "    </tbody></table>\n";
592c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "  </div>\n";
593c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
594c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
595c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    string ret = function->getReturnDocumentation();
596c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!ret.empty()) {
597c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "  <div class='jd-tagdata'>";
598c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "    <h5 class='jd-tagtitle'>Returns</h5>\n";
599c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "    <table class='jd-tagtable'><tbody>\n";
600c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "    <tr><td>" << ret << "</td></tr>\n";
601c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "    </tbody></table>\n";
602c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "  </div>\n";
603c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
604c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
605c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  <div class='jd-tagdata jd-tagdescr'>\n";
6064a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    writeDeprecatedWarning(file, function);
607c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!generateHtmlParagraphs(file, function->getDescription())) {
608c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return false;
609c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
610c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  </div>\n";
611c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
612c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "</div>\n";
613c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "\n";
614c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return true;
615c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
616c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
61732d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sungstatic bool writeDetailedDocumentationFile(const string& directory,
61832d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung                                           const SpecFile& specFile) {
6192217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    if (!specFile.hasSpecifications()) {
6202217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet        // This is true for rs_core.spec
6212217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet        return true;
6222217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    }
6232217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet
624c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    GeneratedFile file;
6252217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    const string fileName = stringReplace(specFile.getSpecFileName(), ".spec",
62632d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung                                          ".html");
6272217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    if (!file.start(directory, fileName)) {
628c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return false;
629c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
630c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    bool success = true;
631c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
6322217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    string title = specFile.getBriefDescription();
63332d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung    writeHeader(&file, title, specFile);
634c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
635c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    file << "<h2>Overview</h2>\n";
636c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!generateHtmlParagraphs(&file, specFile.getFullDescription())) {
637c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        success = false;
638c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
639c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
640c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    // Write the summary tables.
641c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    file << "<h2>Summary</h2>\n";
6427c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet    const auto& constants = specFile.getDocumentedConstants();
6437c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet    const auto& types = specFile.getDocumentedTypes();
6447c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet    const auto& functions = specFile.getDocumentedFunctions();
6454a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet
6464a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    writeSummaryTables(&file, constants, types, functions, NON_DEPRECATED_ONLY, false);
6474a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    writeSummaryTables(&file, constants, types, functions, DEPRECATED_ONLY, false);
648c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
649c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    // Write the full details of each constant, type, and function.
650c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!constants.empty()) {
651c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        file << "<h2>Constants</h2>\n";
652c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        for (auto i : constants) {
653c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            if (!writeDetailedConstant(&file, i.second)) {
654c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                success = false;
655c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            }
656c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
657c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
658c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!types.empty()) {
659c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        file << "<h2>Types</h2>\n";
660c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        for (auto i : types) {
661c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            if (!writeDetailedType(&file, i.second)) {
662c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                success = false;
663c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            }
664c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
665c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
666c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!functions.empty()) {
667c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        file << "<h2>Functions</h2>\n";
668c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        for (auto i : functions) {
669c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            if (!writeDetailedFunction(&file, i.second)) {
670c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                success = false;
671c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            }
672c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
673c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
674c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
67532d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung    writeFooter(&file);
676c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    file.close();
677c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
678c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!success) {
679c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        // If in error, write a final message to make it easier to figure out which file failed.
6802217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet        cerr << fileName << ": Failed due to errors.\n";
681c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
682c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return success;
683c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
684c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
6852217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic void generateSnippet(GeneratedFile* file, const string& fileName, const string& title) {
6862217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    const char offset[] = "                  ";
6872217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    *file << offset << "<li><a href=\"<?cs var:toroot ?>guide/topics/renderscript/reference/"
6882217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet          << fileName << "\">\n";
6892217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    *file << offset << "  <span class=\"en\">" << title << "</span>\n";
6902217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    *file << offset << "</a></li>\n";
6912217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet}
6922217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet
6932217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet/* Generate a partial file of links that should be cut & pasted into the proper section of the
6942217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet * guide_toc.cs file.
6952217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet */
6962217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic bool generateAndroidTableOfContentSnippet(const string& directory) {
6972217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    GeneratedFile file;
6982217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    if (!file.start(directory, "guide_toc.cs")) {
6992217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet        return false;
7002217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    }
7012217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    file << "<!-- Copy and paste the following lines into the RenderScript section of\n";
7022217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    file << "     platform/frameworks/base/docs/html/guide/guide_toc.cs\n\n";
7032217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet
7046386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    const char offset[] = "              ";
7056386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    file << offset << "<li class=\"nav-section\">\n";
7066386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    file << offset << "  <div class=\"nav-section-header\">\n";
7076386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    file << offset << "    <a href=\"<?cs var:toroot ?>guide/topics/renderscript/reference/" <<
7086386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet            OVERVIEW_HTML_FILE_NAME << "\">\n";
7096386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    file << offset << "      <span class=\"en\">Runtime API Reference</span>\n";
7106386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    file << offset << "    </a></div>\n";
7116386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    file << offset << "  <ul>\n";
7126386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet
7132217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    for (auto specFile : systemSpecification.getSpecFiles()) {
7142217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet        if (specFile->hasSpecifications()) {
7152217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet            const string fileName = stringReplace(specFile->getSpecFileName(), ".spec", ".html");
7162217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet            generateSnippet(&file, fileName, specFile->getBriefDescription());
7172217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet        }
7182217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    }
7192217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    generateSnippet(&file, INDEX_HTML_FILE_NAME, "Index");
7206386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet
7216386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    file << offset << "  </ul>\n";
7226386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    file << offset << "</li>\n";
7236386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet
7242217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    return true;
7252217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet}
7262217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet
72732d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sungbool generateDocumentation(const string& directory) {
72832d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung    bool success = generateOverview(directory) &&
72932d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung                   generateAlphabeticalIndex(directory) &&
7302217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet                   generateAndroidTableOfContentSnippet(directory);
731c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    for (auto specFile : systemSpecification.getSpecFiles()) {
73232d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung        if (!writeDetailedDocumentationFile(directory, *specFile)) {
733c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            success = false;
734c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
735c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
736c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return success;
737c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
738