aboutsummaryrefslogtreecommitdiff
path: root/tools/bookmaker/includeWriter.h
diff options
context:
space:
mode:
Diffstat (limited to 'tools/bookmaker/includeWriter.h')
-rw-r--r--tools/bookmaker/includeWriter.h243
1 files changed, 243 insertions, 0 deletions
diff --git a/tools/bookmaker/includeWriter.h b/tools/bookmaker/includeWriter.h
new file mode 100644
index 0000000000..6271ac7425
--- /dev/null
+++ b/tools/bookmaker/includeWriter.h
@@ -0,0 +1,243 @@
+/*
+ * Copyright 2018 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef includeWriter_DEFINED
+#define includeWriter_DEFINED
+
+#include "includeParser.h"
+
+class IncludeWriter : public IncludeParser {
+public:
+ enum class Word {
+ kStart,
+ kCap,
+ kFirst,
+ kUnderline,
+ kMixed,
+ };
+
+ enum class Phrase {
+ kNo,
+ kYes,
+ };
+
+ enum class PunctuationState {
+ kStart,
+ kDelimiter,
+ kParen, // treated as a delimiter unless following a space, and followed by word
+ kPeriod,
+ kSpace,
+ };
+
+ enum class RefType {
+ kUndefined,
+ kNormal,
+ kExternal,
+ };
+
+ enum class SkipFirstLine {
+ kNo,
+ kYes,
+ };
+
+ enum class Wrote {
+ kNone,
+ kLF,
+ kChars,
+ };
+
+ enum class MemberPass {
+ kCount,
+ kOut,
+ };
+
+ enum class ItemState {
+ kNone,
+ kName,
+ kValue,
+ kComment,
+ };
+
+ struct IterState {
+ IterState (list<Definition>::iterator tIter, list<Definition>::iterator tIterEnd)
+ : fDefIter(tIter)
+ , fDefEnd(tIterEnd) {
+ }
+ list<Definition>::iterator fDefIter;
+ list<Definition>::iterator fDefEnd;
+ };
+
+ struct ParentPair {
+ const Definition* fParent;
+ const ParentPair* fPrev;
+ };
+
+ struct Preprocessor {
+ Preprocessor() {
+ reset();
+ }
+
+ void reset() {
+ fDefinition = nullptr;
+ fStart = nullptr;
+ fEnd = nullptr;
+ fWord = false;
+ }
+
+ const Definition* fDefinition;
+ const char* fStart;
+ const char* fEnd;
+ bool fWord;
+ };
+
+ struct Item {
+ void reset() {
+ fName = "";
+ fValue = "";
+ }
+
+ string fName;
+ string fValue;
+ };
+
+ struct LastItem {
+ const char* fStart;
+ const char* fEnd;
+ };
+
+ struct ItemLength {
+ int fCurName;
+ int fCurValue;
+ int fLongestName;
+ int fLongestValue;
+ };
+
+ IncludeWriter() : IncludeParser() {
+ this->reset();
+ }
+
+ ~IncludeWriter() override {}
+
+ bool contentFree(int size, const char* data) const {
+ while (size > 0 && data[0] <= ' ') {
+ --size;
+ ++data;
+ }
+ while (size > 0 && data[size - 1] <= ' ') {
+ --size;
+ }
+ return 0 == size;
+ }
+
+ bool checkChildCommentLength(const Definition* parent, MarkType childType) const;
+ void checkEnumLengths(const Definition& child, string enumName, ItemLength* length) const;
+ void constOut(const Definition* memberStart, const Definition* bmhConst);
+ void constSizeMembers(const RootDefinition* root);
+ bool defineOut(const Definition& );
+ bool descriptionOut(const Definition* def, SkipFirstLine , Phrase );
+ void enumHeaderOut(RootDefinition* root, const Definition& child);
+ string enumMemberComment(const Definition* currentEnumItem, const Definition& child) const;
+ const Definition* enumMemberForComment(const Definition* currentEnumItem) const;
+ ItemState enumMemberName(const Definition& child,
+ const Definition* token, Item* , LastItem* , const Definition** enumItem);
+ void enumMemberOut(const Definition* currentEnumItem, const Definition& child,
+ const Item& , Preprocessor& );
+ void enumMembersOut(Definition& child);
+ bool enumPreprocessor(Definition* token, MemberPass pass,
+ vector<IterState>& iterStack, IterState** iterState, Preprocessor* );
+ void enumSizeItems(const Definition& child);
+ bool findEnumSubtopic(string undername, const Definition** ) const;
+ void firstBlock(int size, const char* data);
+ bool firstBlockTrim(int size, const char* data);
+ Definition* findMemberCommentBlock(const vector<Definition*>& bmhChildren, string name) const;
+ Definition* findMethod(string name, RootDefinition* ) const;
+
+ void indentDeferred(IndentKind kind) {
+ if (fIndentNext) {
+ this->indentIn(kind);
+ fIndentNext = false;
+ }
+ }
+
+ int lookupMethod(const PunctuationState punctuation, const Word word,
+ const int start, const int run, int lastWrite,
+ const char* data, bool hasIndirection);
+ int lookupReference(const PunctuationState punctuation, const Word word,
+ const int start, const int run, int lastWrite, const char last,
+ const char* data);
+ const Definition* matchMemberName(string matchName, const Definition& child) const;
+ void methodOut(Definition* method, const Definition& child);
+ bool populate(Definition* def, ParentPair* parentPair, RootDefinition* root);
+ bool populate(BmhParser& bmhParser);
+
+ void reset() override {
+ INHERITED::resetCommon();
+ fBmhParser = nullptr;
+ fDeferComment = nullptr;
+ fBmhMethod = nullptr;
+ fEnumDef = nullptr;
+ fMethodDef = nullptr;
+ fBmhConst = nullptr;
+ fConstDef = nullptr;
+ fLastDescription = nullptr;
+ fStartSetter = nullptr;
+ fBmhStructDef = nullptr;
+ fContinuation = nullptr;
+ fInStruct = false;
+ fWroteMethod = false;
+ fIndentNext = false;
+ fPendingMethod = false;
+ fFirstWrite = false;
+ fStructEnded = false;
+ fWritingIncludes = true;
+ }
+
+ string resolveAlias(const Definition* );
+ string resolveMethod(const char* start, const char* end, bool first);
+ string resolveRef(const char* start, const char* end, bool first, RefType* refType);
+ Wrote rewriteBlock(int size, const char* data, Phrase phrase);
+ void setStart(const char* start, const Definition * );
+ void setStartBack(const char* start, const Definition * );
+ Definition* structMemberOut(const Definition* memberStart, const Definition& child);
+ void structOut(const Definition* root, const Definition& child,
+ const char* commentStart, const char* commentEnd);
+ void structSizeMembers(const Definition& child);
+ bool writeHeader(std::pair<const string, Definition>& );
+private:
+ vector<const Definition* > fICSStack;
+ BmhParser* fBmhParser;
+ Definition* fDeferComment;
+ const Definition* fBmhMethod;
+ const Definition* fEnumDef;
+ const Definition* fMethodDef;
+ const Definition* fBmhConst;
+ const Definition* fConstDef;
+ const Definition* fLastDescription;
+ const Definition* fStartSetter;
+ Definition* fBmhStructDef;
+ const char* fContinuation; // used to construct paren-qualified method name
+ int fAnonymousEnumCount;
+ int fEnumItemValueTab;
+ int fEnumItemCommentTab;
+ int fStructMemberTab;
+ int fStructValueTab;
+ int fStructCommentTab;
+ int fStructMemberLength;
+ int fConstValueTab;
+ int fConstCommentTab;
+ int fConstLength;
+ bool fInStruct; // set if struct is inside class
+ bool fWroteMethod;
+ bool fIndentNext;
+ bool fPendingMethod;
+ bool fFirstWrite; // set to write file information just after includes
+ bool fStructEnded; // allow resetting indent after struct is complete
+
+ typedef IncludeParser INHERITED;
+};
+
+#endif