1 /*
2  * Copyright (c) 2015, Intel Corporation
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  *  * Redistributions of source code must retain the above copyright notice,
8  *    this list of conditions and the following disclaimer.
9  *  * Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *  * Neither the name of Intel Corporation nor the names of its contributors
13  *    may be used to endorse or promote products derived from this software
14  *    without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  * POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 /** \file
30  * \brief Boundary assertions (^, $, \\A, \\Z, \\z)
31  */
32 
33 #ifndef _RE_COMPONENTBOUNDARY_H_
34 #define _RE_COMPONENTBOUNDARY_H_
35 
36 #include "Component.h"
37 #include "position.h"
38 
39 namespace ue2 {
40 
41 /** \brief Encapsulates a line/string boundary assertion. */
42 class ComponentBoundary : public Component {
43     friend class DumpVisitor;
44     friend class PrintVisitor;
45     friend class UnsafeBoundsVisitor;
46     friend class MultilineVisitor;
47 public:
48     enum Boundary {
49         BEGIN_STRING,           //!< beginning of data stream
50         END_STRING,             //!< end of data stream
51         END_STRING_OPTIONAL_LF, //!< end of data stream with an optional
52                                 //   linefeed
53         BEGIN_LINE,             //!< '(^|\\n)'
54         END_LINE                //!< '($|\\n)'
55     };
56 
57     explicit ComponentBoundary(enum Boundary bound);
58     ~ComponentBoundary() override;
59     ComponentBoundary *clone() const override;
60 
accept(ComponentVisitor & v)61     Component *accept(ComponentVisitor &v) override {
62         Component *c = v.visit(this);
63         v.post(this);
64         return c;
65     }
66 
accept(ConstComponentVisitor & v)67     void accept(ConstComponentVisitor &v) const override {
68         v.pre(*this);
69         v.during(*this);
70         v.post(*this);
71     }
72 
73     std::vector<PositionInfo> first() const override;
74     std::vector<PositionInfo> last() const override;
75     bool empty() const override;
76     bool repeatable() const override;
77     void notePositions(GlushkovBuildState &bs) override;
78     void buildFollowSet(GlushkovBuildState &bs,
79                         const std::vector<PositionInfo> &lastPos) override;
80     bool checkEmbeddedStartAnchor(bool at_start) const override;
81     bool checkEmbeddedEndAnchor(bool at_end) const override;
82 
83 private:
84     enum Boundary m_bound; //!< \brief which assertion is that?
85     Position m_newline; //!< \brief special newline state
86     std::vector<PositionInfo> m_first; //!< \brief positions returned for first()
87     std::vector<PositionInfo> m_last; //!< \brief positions returned for last()
88 
89     ComponentBoundary(const ComponentBoundary &other);
90 };
91 
92 } // namespace ue2
93 
94 #endif
95