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
17c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <iostream>
18c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <sstream>
19c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
20c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include "Generator.h"
21c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include "Specification.h"
22c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include "Utilities.h"
23c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
24c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletusing namespace std;
25c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
26c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstruct DetailedFunctionEntry {
27c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    VersionInfo info;
28c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    string htmlDeclaration;
29c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet};
30c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
312217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic const char OVERVIEW_HTML_FILE_NAME[] = "overview.html";
322217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic const char OVERVIEW_JD_FILE_NAME[] = "overview.jd";
332217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic const char INDEX_HTML_FILE_NAME[] = "index.html";
342217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic const char INDEX_JD_FILE_NAME[] = "index.jd";
352217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet
362217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic void writeHeader(GeneratedFile* file, bool forVerification, const string& title) {
372217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    if (forVerification) {
382217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet        *file << "<!DOCTYPE html>\n";
392217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet        *file << "<!-- " << AUTO_GENERATED_WARNING << "-->\n";
406386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet        *file << "<html><head>\n"
416386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet                 "<title>RenderScript Reference</title>\n"
426386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet                 "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>\n"
432217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet                 "<link rel='stylesheet' "
442217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet                 "href='http://fonts.googleapis.com/css?family=Roboto+Condensed'>\n"
452217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet                 "<link rel='stylesheet' href='http://fonts.googleapis.com/"
462217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet                 "css?family=Roboto:light,regular,medium,thin,italic,mediumitalic,bold' "
472217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet                 "title='roboto'>\n"
486386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet                 "<link href='default.css' rel='stylesheet' type='text/css'>\n"
496386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet                 "<link href='fullscreen.css' rel='stylesheet' class='fullscreen' "
502217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet                 "type='text/css'>\n"
516386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet                 "<body class='gc-documentation develop reference'>\n\n";
522217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet        *file << "<h1>" << title << "</h1>\n";
532217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    } else {
542217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet        *file << "page.title=RenderScript " << title << "\n\n";
552217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet        *file << "@jd:body\n\n";
562217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    }
57918944e41306198807728ae3f05a1799773895c5Jean-Luc Brouillet    *file << "<div class='renderscript'>\n";
58c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
59c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
602217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic void writeFooter(GeneratedFile* file, bool forVerification) {
61918944e41306198807728ae3f05a1799773895c5Jean-Luc Brouillet    *file << "</div>\n";
622217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    if (forVerification) {
636386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet        *file << "</body></html>\n";
642217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    }
65c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
66c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
67c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// If prefix starts input, copy it to stream and remove it from input.
68c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic void skipPrefix(ostringstream* stream, string* input, const string& prefix) {
69c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    size_t size = prefix.size();
70c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (input->compare(0, size, prefix) != 0) {
71c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return;
72c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
73c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    input->erase(0, size);
74c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *stream << prefix;
75c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
76c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
77c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Merge b into a.  Returns true if successful
78c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool mergeVersionInfo(VersionInfo* a, const VersionInfo& b) {
79c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (a->intSize != b.intSize) {
80c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        cerr << "Error.  We don't currently support versions that differ based on int size\n";
81c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return false;
82c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
83c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (b.minVersion != 0 && a->maxVersion == b.minVersion - 1) {
84c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        a->maxVersion = b.maxVersion;
85c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    } else if (b.maxVersion != 0 && a->minVersion == b.maxVersion + 1) {
86c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        a->minVersion = b.minVersion;
87c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    } else {
88c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        cerr << "Error.  This code currently assume that all versions are contiguous.  Don't know "
89c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                "how to merge versions (" << a->minVersion << " - " << a->maxVersion << ") and ("
90c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet             << b.minVersion << " - " << b.maxVersion << ")\n";
91c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return false;
92c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
93c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return true;
94c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
95c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
96c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic string getHtmlStringForType(const ParameterDefinition& parameter) {
97c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    string s = parameter.rsType;
98c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    ostringstream stream;
99c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    skipPrefix(&stream, &s, "const ");
100c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    skipPrefix(&stream, &s, "volatile ");
101c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    bool endsWithAsterisk = s.size() > 0 && s[s.size() - 1] == '*';
102c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (endsWithAsterisk) {
103c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        s.erase(s.size() - 1, 1);
104c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
105c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
106c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    string anchor = systemSpecification.getHtmlAnchor(s);
107c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (anchor.empty()) {
108c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        // Not a RenderScript specific type.
109c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return parameter.rsType;
110c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    } else {
111c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        stream << anchor;
112c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
113c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (endsWithAsterisk) {
114c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        stream << "*";
115c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
116c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return stream.str();
117c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
118c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
119c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic string getDetailedHtmlDeclaration(const FunctionPermutation& permutation) {
120c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    ostringstream stream;
121c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    auto ret = permutation.getReturn();
122c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (ret) {
123c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        stream << getHtmlStringForType(*ret);
124c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    } else {
125c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        stream << "void";
126c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
127c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    stream << " " << permutation.getName() << "(";
128c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    bool needComma = false;
129c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    for (auto p : permutation.getParams()) {
130c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        if (needComma) {
131c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            stream << ", ";
132c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
133c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        stream << getHtmlStringForType(*p);
134c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        if (p->isOutParameter) {
135c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            stream << "*";
136c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
137c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        if (!p->specName.empty()) {
138c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            stream << " " << p->specName;
139c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
140c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        needComma = true;
141c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
142c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    stream << ");\n";
143c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return stream.str();
144c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
145c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
146c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* Some functions (like max) have changed implementations but not their
147c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * declaration.  We need to unify these so that we don't end up with entries
148c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * like:
149c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *   char max(char a, char b);  Removed from API level 20
150c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *   char max(char a, char b);  Added to API level 20
151c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */
152c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool getUnifiedFunctionPrototypes(Function* function,
153c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                                         map<string, DetailedFunctionEntry>* entries) {
154c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    for (auto f : function->getSpecifications()) {
155c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        DetailedFunctionEntry entry;
156c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        entry.info = f->getVersionInfo();
157c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        for (auto p : f->getPermutations()) {
158c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            entry.htmlDeclaration = getDetailedHtmlDeclaration(*p);
159c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            const string s = stripHtml(entry.htmlDeclaration);
160c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            auto i = entries->find(s);
161c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            if (i == entries->end()) {
162c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                entries->insert(pair<string, DetailedFunctionEntry>(s, entry));
163c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            } else {
164c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                if (!mergeVersionInfo(&i->second.info, entry.info)) {
165c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                    return false;
166c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                }
167c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            }
168c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
169c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
170c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return true;
171c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
172c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
173c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Convert words starting with @ into HTML references.  Returns false if error.
174c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool convertDocumentationRefences(string* s) {
175c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    bool success = true;
176c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    size_t end = 0;
177c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    for (;;) {
178c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        size_t start = s->find('@', end);
179c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        if (start == string::npos) {
180c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            break;
181c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
182c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        // Find the end of the identifier
183c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        end = start;
184c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        char c;
185c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        do {
186c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            c = (*s)[++end];
187c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        } while (isalnum(c) || c == '_');
188c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
189c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        const string id = s->substr(start + 1, end - start - 1);
190c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        string anchor = systemSpecification.getHtmlAnchor(id);
191c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        if (anchor.empty()) {
192c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            cerr << "Error:  Can't convert the documentation reference @" << id << "\n";
193c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            success = false;
194c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
195c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        s->replace(start, end - start, anchor);
196c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
197c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return success;
198c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
199c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
200c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool generateHtmlParagraphs(GeneratedFile* file, const vector<string>& description) {
201c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    bool inParagraph = false;
202c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    for (auto s : description) {
203c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        // Empty lines in the .spec marks paragraphs.
204c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        if (s.empty()) {
205c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            if (inParagraph) {
206c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                *file << "</p>\n";
207c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                inParagraph = false;
208c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            }
209c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        } else {
210c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            if (!inParagraph) {
211c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                *file << "<p> ";
212c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                inParagraph = true;
213c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            }
214c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
215c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        if (!convertDocumentationRefences(&s)) {
216c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            return false;
217c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
218c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << s << "\n";
219c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
220c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (inParagraph) {
221c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "</p>\n";
222c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
223c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return true;
224c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
225c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
2264a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletstatic void writeSummaryTableStart(GeneratedFile* file, const string& label, bool labelIsHeading) {
227c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (labelIsHeading) {
2286386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet        *file << "<h2 style='margin-bottom: 0px;'>" << label << "</h2>\n";
229c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
2304a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *file << "<table class='jd-sumtable'><tbody>\n";
231c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!labelIsHeading) {
2324a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        *file << "  <tr><th colspan='2'>" << label << "</th></tr>\n";
233c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
234c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
235c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
236c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic void writeSummaryTableEnd(GeneratedFile* file) {
237c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "</tbody></table>\n";
238c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
239c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
2404a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletenum DeprecatedSelector {
2414a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    DEPRECATED_ONLY,
2424a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    NON_DEPRECATED_ONLY,
2434a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    ALL,
2444a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet};
2454a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet
2464a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletstatic void writeSummaryTableEntry(ostream* stream, Definition* definition,
2474a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                                   DeprecatedSelector deprecatedSelector) {
2484a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    if (definition->hidden()) {
249c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return;
250c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
2514a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    const bool deprecated = definition->deprecated();
2524a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    if ((deprecatedSelector == DEPRECATED_ONLY && !deprecated) ||
2534a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        (deprecatedSelector == NON_DEPRECATED_ONLY && deprecated)) {
254c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return;
255c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
2564a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet
2574a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *stream << "  <tr class='alt-color api apilevel-1'>\n";
2584a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *stream << "    <td class='jd-linkcol'>\n";
2592217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    *stream << "      <a href='" << definition->getUrl() << "'>" << definition->getName()
2602217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet            << "</a>\n";
2614a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *stream << "    </td>\n";
2624a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *stream << "    <td class='jd-descrcol' width='100%'>\n";
2634a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *stream << "      ";
2644a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    if (deprecated) {
2654a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        *stream << "<b>Deprecated</b>.  ";
2664a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    }
2674a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *stream << definition->getSummary() << "\n";
2684a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *stream << "    </td>\n";
2694a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *stream << "  </tr>\n";
270c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
271c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
2724a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletstatic void writeSummaryTable(GeneratedFile* file, const ostringstream* entries, const char* name,
2734a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                              DeprecatedSelector deprecatedSelector, bool labelAsHeader) {
2744a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    string s = entries->str();
2754a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    if (!s.empty()) {
2764a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        string prefix;
2774a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        if (deprecatedSelector == DEPRECATED_ONLY) {
2784a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            prefix = "Deprecated ";
2794a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        }
2804a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        writeSummaryTableStart(file, prefix + name, labelAsHeader);
2814a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        *file << s;
2824a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        writeSummaryTableEnd(file);
2834a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    }
284c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
285c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
286c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic void writeSummaryTables(GeneratedFile* file, const map<string, Constant*>& constants,
287c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                               const map<string, Type*>& types,
2884a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                               const map<string, Function*>& functions,
2894a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                               DeprecatedSelector deprecatedSelector, bool labelAsHeader) {
2904a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    ostringstream constantStream;
2914a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    for (auto e : constants) {
2924a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        writeSummaryTableEntry(&constantStream, e.second, deprecatedSelector);
293c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
2944a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    writeSummaryTable(file, &constantStream, "Constants", deprecatedSelector, labelAsHeader);
295c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
2964a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    ostringstream typeStream;
2974a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    for (auto e : types) {
2984a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        writeSummaryTableEntry(&typeStream, e.second, deprecatedSelector);
299c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
3004a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    writeSummaryTable(file, &typeStream, "Types", deprecatedSelector, labelAsHeader);
301c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
3024a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    ostringstream functionStream;
3034a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    for (auto e : functions) {
3044a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        writeSummaryTableEntry(&functionStream, e.second, deprecatedSelector);
305c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
3064a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    writeSummaryTable(file, &functionStream, "Functions", deprecatedSelector, labelAsHeader);
307c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
308c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
309ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hinesstatic void writeHtmlVersionTag(GeneratedFile* file, VersionInfo info,
310ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines                                bool addSpacing) {
3114a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    ostringstream stream;
312c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (info.intSize == 32) {
3134a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        stream << "When compiling for 32 bits. ";
314c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    } else if (info.intSize == 64) {
3154a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        stream << "When compiling for 64 bits. ";
316c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
317c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
318c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (info.minVersion > 1 || info.maxVersion) {
319c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        const char* mid =
320c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                    "<a "
321c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                    "href='http://developer.android.com/guide/topics/manifest/"
322c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                    "uses-sdk-element.html#ApiLevels'>API level ";
323c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        if (info.minVersion <= 1) {
324c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            // No minimum
325c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            if (info.maxVersion > 0) {
326ffc1710c382168e74386ef87d0101de65aca91b0Jean-Luc Brouillet                stream << "Removed from " << mid << info.maxVersion + 1 << " and higher";
327c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            }
328c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        } else {
329c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            if (info.maxVersion == 0) {
330c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                // No maximum
3314a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                stream << "Added in " << mid << info.minVersion;
332c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            } else {
3334a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                stream << mid << info.minVersion << " - " << info.maxVersion;
334c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            }
335c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
3364a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        stream << "</a>";
3374a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    }
338ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines    string s = stream.str();
339ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines    // Remove any trailing whitespace
340ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines    while (s.back() == ' ') {
341ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines        s.pop_back();
342ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines    }
3434a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    if (!s.empty()) {
344ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines        *file << (addSpacing ? "    " : "") << s << "\n";
345c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
346c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
347c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
34836e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouilletstatic void writeDetailedTypeSpecification(GeneratedFile* file, const TypeSpecification* spec) {
34936e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet    switch (spec->getKind()) {
35036e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet        case SIMPLE: {
35136e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet            Type* type = spec->getType();
35236e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet            *file << "<p>A typedef of: " << spec->getSimpleType()
353ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines                  << makeAttributeTag(spec->getAttribute(), "", type->getDeprecatedApiLevel(),
35436e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet                                      type->getDeprecatedMessage())
3554a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                  << "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
356ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines            writeHtmlVersionTag(file, spec->getVersionInfo(), false);
357ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines            *file << "</p>\n";
358ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines            break;
359ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines        }
360ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines        case RS_OBJECT: {
361ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines            *file << "<p>";
362ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines            writeHtmlVersionTag(file, spec->getVersionInfo(), false);
3634a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "</p>\n";
364c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            break;
36536e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet        }
366c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        case ENUM: {
3674a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "<p>An enum with the following values:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n";
368ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines            writeHtmlVersionTag(file, spec->getVersionInfo(), false);
3694a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "</p>\n";
370c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
3714a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "  <table class='jd-tagtable'><tbody>\n";
37236e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet            const vector<string>& values = spec->getValues();
37336e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet            const vector<string>& valueComments = spec->getValueComments();
374c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            for (size_t i = 0; i < values.size(); i++) {
3754a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                *file << "    <tr><th>" << values[i] << "</th><td>";
3764a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                if (valueComments.size() > i) {
3774a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                    *file << valueComments[i];
378c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                }
3794a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                *file << "</td></tr>\n";
380c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            }
3814a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "  </tbody></table><br/>\n";
382c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            break;
383c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
384c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        case STRUCT: {
3854a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "<p>A structure with the following fields:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
386ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines            writeHtmlVersionTag(file, spec->getVersionInfo(), false);
3874a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "</p>\n";
3884a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet
3894a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "  <table class='jd-tagtable'><tbody>\n";
39036e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet            const vector<string>& fields = spec->getFields();
39136e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet            const vector<string>& fieldComments = spec->getFieldComments();
392c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            for (size_t i = 0; i < fields.size(); i++) {
3934a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                *file << "    <tr><th>" << fields[i] << "</th><td>";
394c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                if (fieldComments.size() > i && !fieldComments[i].empty()) {
3954a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                    *file << fieldComments[i];
396c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                }
3974a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                *file << "</td></tr>\n";
398c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            }
3994a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "  </tbody></table><br/>\n";
400c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            break;
401c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
402c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
403c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
404c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
4054a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletstatic void writeDetailedConstantSpecification(GeneratedFile* file, ConstantSpecification* c) {
4064a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *file << "      <tr><td>";
407c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "Value: " << c->getValue() << "\n";
408ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines    writeHtmlVersionTag(file, c->getVersionInfo(), true);
4094a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *file << "      </td></tr>\n";
4104a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *file << "<br/>\n";
411c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
412c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
413c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool writeOverviewForFile(GeneratedFile* file, const SpecFile& specFile) {
414c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    bool success = true;
415c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "<h2>" << specFile.getBriefDescription() << "</h2>\n";
416c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!generateHtmlParagraphs(file, specFile.getFullDescription())) {
417c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        success = false;
418c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
419c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
420c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    // Write the summary tables.
421c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    // file << "<h2>Summary</h2>\n";
4227c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet    writeSummaryTables(file, specFile.getDocumentedConstants(), specFile.getDocumentedTypes(),
4234a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                       specFile.getDocumentedFunctions(), NON_DEPRECATED_ONLY, false);
4244a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet
425c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return success;
426c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
427c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
4282217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic bool generateOverview(const string& directory, bool forVerification) {
429c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    GeneratedFile file;
4302217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    if (!file.start(directory, forVerification ? OVERVIEW_HTML_FILE_NAME : OVERVIEW_JD_FILE_NAME)) {
431c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return false;
432c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
433c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    bool success = true;
434c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
4356386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    writeHeader(&file, forVerification, "Runtime API Reference");
436c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
437c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    for (auto specFile : systemSpecification.getSpecFiles()) {
438c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        if (!writeOverviewForFile(&file, *specFile)) {
439c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            success = false;
440c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
441c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
442c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
4432217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    writeFooter(&file, forVerification);
444c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    file.close();
445c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return success;
446c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
447c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
4482217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic bool generateAlphabeticalIndex(const string& directory, bool forVerification) {
449c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    GeneratedFile file;
4502217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    if (!file.start(directory, forVerification ? INDEX_HTML_FILE_NAME : INDEX_JD_FILE_NAME)) {
451c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return false;
452c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
4532217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    writeHeader(&file, forVerification, "Index");
454c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
455c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    writeSummaryTables(&file, systemSpecification.getConstants(), systemSpecification.getTypes(),
4564a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                       systemSpecification.getFunctions(), NON_DEPRECATED_ONLY, true);
4574a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet
4584a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    writeSummaryTables(&file, systemSpecification.getConstants(), systemSpecification.getTypes(),
4594a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet                       systemSpecification.getFunctions(), DEPRECATED_ONLY, true);
460c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
4612217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    writeFooter(&file, forVerification);
462c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    file.close();
463c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return true;
464c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
465c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
4664a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletstatic void writeDeprecatedWarning(GeneratedFile* file, Definition* definition) {
4674a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    if (definition->deprecated()) {
4684a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        *file << "    <p><b>Deprecated.</b>  ";
4694a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        string s = definition->getDeprecatedMessage();
4704a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        convertDocumentationRefences(&s);
4714a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        if (!s.empty()) {
4724a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << s;
4734a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        } else {
4744a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "Do not use.";
4754a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        }
4764a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        *file << "</p>\n";
4774a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    }
4784a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet}
4794a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet
480c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool writeDetailedConstant(GeneratedFile* file, Constant* constant) {
481c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (constant->hidden()) {
482c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return true;
483c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
484c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    const string& name = constant->getName();
485c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
486918944e41306198807728ae3f05a1799773895c5Jean-Luc Brouillet    *file << "<a name='android_rs:" << name << "'></a>\n";
487c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "<div class='jd-details'>\n";
488c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  <h4 class='jd-details-title'>\n";
489c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    <span class='sympad'>" << name << "</span>\n";
490c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    <span class='normal'>: " << constant->getSummary() << "</span>\n";
491c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  </h4>\n";
492c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
493c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  <div class='jd-details-descr'>\n";
494c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    <table class='jd-tagtable'><tbody>\n";
4954a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    auto specifications = constant->getSpecifications();
4964a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    bool addSeparator = specifications.size() > 1;
4974a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    for (auto spec : specifications) {
4984a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        if (addSeparator) {
4994a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet            *file << "    <h5 class='jd-tagtitle'>Variant:</h5>\n";
5004a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        }
5014a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        writeDetailedConstantSpecification(file, spec);
502c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
503c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    </tbody></table>\n";
504c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  </div>\n";
505c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
506c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    <div class='jd-tagdata jd-tagdescr'>\n";
507c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
5084a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    writeDeprecatedWarning(file, constant);
509c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!generateHtmlParagraphs(file, constant->getDescription())) {
510c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return false;
511c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
512c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    </div>\n";
513c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
514c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "</div>\n";
515c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "\n";
516c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return true;
517c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
518c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
519c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool writeDetailedType(GeneratedFile* file, Type* type) {
520c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (type->hidden()) {
521c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return true;
522c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
523c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    const string& name = type->getName();
524c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
525918944e41306198807728ae3f05a1799773895c5Jean-Luc Brouillet    *file << "<a name='android_rs:" << name << "'></a>\n";
526c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "<div class='jd-details'>\n";
527c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  <h4 class='jd-details-title'>\n";
528c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    <span class='sympad'>" << name << "</span>\n";
529c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    <span class='normal'>: " << type->getSummary() << "</span>\n";
530c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  </h4>\n";
531c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
532c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  <div class='jd-details-descr'>\n";
5334a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    for (auto spec : type->getSpecifications()) {
5344a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        writeDetailedTypeSpecification(file, spec);
535c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
536c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
5374a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    writeDeprecatedWarning(file, type);
538c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!generateHtmlParagraphs(file, type->getDescription())) {
539c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return false;
540c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
541c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
5424a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *file << "  </div>\n";
543c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "</div>\n";
544c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "\n";
545c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return true;
546c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
547c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
548c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool writeDetailedFunction(GeneratedFile* file, Function* function) {
5496386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    if (function->hidden()) {
5506386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet        return true;
5516386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    }
552c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    const string& name = function->getName();
553c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
554918944e41306198807728ae3f05a1799773895c5Jean-Luc Brouillet    *file << "<a name='android_rs:" << name << "'></a>\n";
555c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "<div class='jd-details'>\n";
556c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  <h4 class='jd-details-title'>\n";
557c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    <span class='sympad'>" << name << "</span>\n";
558c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    <span class='normal'>: " << function->getSummary() << "</span>\n";
559c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  </h4>\n";
560c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
561c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  <div class='jd-details-descr'>\n";
562c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    map<string, DetailedFunctionEntry> entries;
563c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!getUnifiedFunctionPrototypes(function, &entries)) {
564c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return false;
565c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
5664a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    *file << "    <table class='jd-tagtable'><tbody>\n";
567c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    for (auto i : entries) {
568c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "      <tr>\n";
5694a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        *file << "        <td>" << i.second.htmlDeclaration << "</td>\n";
570c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "        <td>";
571ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines        writeHtmlVersionTag(file, i.second.info, true);
5724a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet        *file << "        </td>\n";
573c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "      </tr>\n";
574c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
575c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "    </tbody></table>\n";
576c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  </div>\n";
577c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
578c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (function->someParametersAreDocumented()) {
579c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "  <div class='jd-tagdata'>";
580c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "    <h5 class='jd-tagtitle'>Parameters</h5>\n";
581c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "    <table class='jd-tagtable'><tbody>\n";
582c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        for (ParameterEntry* p : function->getParameters()) {
583c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            *file << "    <tr><th>" << p->name << "</th><td>" << p->documentation << "</td></tr>\n";
584c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
585c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "    </tbody></table>\n";
586c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "  </div>\n";
587c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
588c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
589c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    string ret = function->getReturnDocumentation();
590c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!ret.empty()) {
591c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "  <div class='jd-tagdata'>";
592c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "    <h5 class='jd-tagtitle'>Returns</h5>\n";
593c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "    <table class='jd-tagtable'><tbody>\n";
594c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "    <tr><td>" << ret << "</td></tr>\n";
595c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "    </tbody></table>\n";
596c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *file << "  </div>\n";
597c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
598c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
599c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  <div class='jd-tagdata jd-tagdescr'>\n";
6004a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    writeDeprecatedWarning(file, function);
601c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!generateHtmlParagraphs(file, function->getDescription())) {
602c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return false;
603c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
604c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "  </div>\n";
605c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
606c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "</div>\n";
607c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    *file << "\n";
608c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return true;
609c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
610c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
6112217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic bool writeDetailedDocumentationFile(const string& directory, const SpecFile& specFile,
6122217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet                                           bool forVerification) {
6132217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    if (!specFile.hasSpecifications()) {
6142217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet        // This is true for rs_core.spec
6152217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet        return true;
6162217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    }
6172217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet
618c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    GeneratedFile file;
6192217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    const string fileName = stringReplace(specFile.getSpecFileName(), ".spec",
6202217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet                                          forVerification ? ".html" : ".jd");
6212217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    if (!file.start(directory, fileName)) {
622c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return false;
623c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
624c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    bool success = true;
625c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
6262217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    string title = specFile.getBriefDescription();
6272217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    writeHeader(&file, forVerification, title);
628c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
629c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    file << "<h2>Overview</h2>\n";
630c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!generateHtmlParagraphs(&file, specFile.getFullDescription())) {
631c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        success = false;
632c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
633c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
634c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    // Write the summary tables.
635c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    file << "<h2>Summary</h2>\n";
6367c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet    const auto& constants = specFile.getDocumentedConstants();
6377c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet    const auto& types = specFile.getDocumentedTypes();
6387c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet    const auto& functions = specFile.getDocumentedFunctions();
6394a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet
6404a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    writeSummaryTables(&file, constants, types, functions, NON_DEPRECATED_ONLY, false);
6414a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    writeSummaryTables(&file, constants, types, functions, DEPRECATED_ONLY, false);
642c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
643c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    // Write the full details of each constant, type, and function.
644c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!constants.empty()) {
645c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        file << "<h2>Constants</h2>\n";
646c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        for (auto i : constants) {
647c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            if (!writeDetailedConstant(&file, i.second)) {
648c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                success = false;
649c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            }
650c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
651c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
652c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!types.empty()) {
653c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        file << "<h2>Types</h2>\n";
654c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        for (auto i : types) {
655c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            if (!writeDetailedType(&file, i.second)) {
656c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                success = false;
657c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            }
658c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
659c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
660c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!functions.empty()) {
661c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        file << "<h2>Functions</h2>\n";
662c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        for (auto i : functions) {
663c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            if (!writeDetailedFunction(&file, i.second)) {
664c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                success = false;
665c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            }
666c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
667c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
668c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
6692217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    writeFooter(&file, forVerification);
670c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    file.close();
671c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
672c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    if (!success) {
673c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        // If in error, write a final message to make it easier to figure out which file failed.
6742217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet        cerr << fileName << ": Failed due to errors.\n";
675c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
676c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return success;
677c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
678c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
6792217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic void generateSnippet(GeneratedFile* file, const string& fileName, const string& title) {
6802217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    const char offset[] = "                  ";
6812217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    *file << offset << "<li><a href=\"<?cs var:toroot ?>guide/topics/renderscript/reference/"
6822217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet          << fileName << "\">\n";
6832217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    *file << offset << "  <span class=\"en\">" << title << "</span>\n";
6842217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    *file << offset << "</a></li>\n";
6852217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet}
6862217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet
6872217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet/* Generate a partial file of links that should be cut & pasted into the proper section of the
6882217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet * guide_toc.cs file.
6892217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet */
6902217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic bool generateAndroidTableOfContentSnippet(const string& directory) {
6912217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    GeneratedFile file;
6922217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    if (!file.start(directory, "guide_toc.cs")) {
6932217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet        return false;
6942217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    }
6952217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    file << "<!-- Copy and paste the following lines into the RenderScript section of\n";
6962217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    file << "     platform/frameworks/base/docs/html/guide/guide_toc.cs\n\n";
6972217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet
6986386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    const char offset[] = "              ";
6996386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    file << offset << "<li class=\"nav-section\">\n";
7006386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    file << offset << "  <div class=\"nav-section-header\">\n";
7016386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    file << offset << "    <a href=\"<?cs var:toroot ?>guide/topics/renderscript/reference/" <<
7026386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet            OVERVIEW_HTML_FILE_NAME << "\">\n";
7036386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    file << offset << "      <span class=\"en\">Runtime API Reference</span>\n";
7046386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    file << offset << "    </a></div>\n";
7056386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    file << offset << "  <ul>\n";
7066386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet
7072217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    for (auto specFile : systemSpecification.getSpecFiles()) {
7082217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet        if (specFile->hasSpecifications()) {
7092217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet            const string fileName = stringReplace(specFile->getSpecFileName(), ".spec", ".html");
7102217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet            generateSnippet(&file, fileName, specFile->getBriefDescription());
7112217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet        }
7122217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    }
7132217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    generateSnippet(&file, INDEX_HTML_FILE_NAME, "Index");
7146386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet
7156386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    file << offset << "  </ul>\n";
7166386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    file << offset << "</li>\n";
7176386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet
7182217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    return true;
7192217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet}
7202217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet
7212217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletbool generateDocumentation(const string& directory, bool forVerification) {
7222217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet    bool success = generateOverview(directory, forVerification) &&
7232217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet                   generateAlphabeticalIndex(directory, forVerification) &&
7242217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet                   generateAndroidTableOfContentSnippet(directory);
725c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    for (auto specFile : systemSpecification.getSpecFiles()) {
7262217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet        if (!writeDetailedDocumentationFile(directory, *specFile, forVerification)) {
727c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet            success = false;
728c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        }
729c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
730c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    return success;
731c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}
732