1 /*
2  * Copyright (c) 2015-2018, 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 #include "pcre_util.h"
30 
31 #include "hs.h"
32 
33 #include <assert.h>
34 #include <pcre.h> /* for pcre flags */
35 
getPcreFlags(unsigned int hs_flags,unsigned int * flags,bool * highlander,bool * prefilter,bool * som,bool * combination,bool * quiet)36 bool getPcreFlags(unsigned int hs_flags, unsigned int *flags,
37                   bool *highlander, bool *prefilter, bool *som,
38                   bool *combination, bool *quiet) {
39     assert(flags);
40     assert(highlander);
41     assert(prefilter);
42     assert(som);
43     *flags = 0;
44     *highlander = false;
45     *prefilter = false;
46     *som = false;
47 
48     if (hs_flags & HS_FLAG_CASELESS) {
49         *flags |= PCRE_CASELESS;
50         hs_flags &= ~HS_FLAG_CASELESS;
51     }
52     if (hs_flags & HS_FLAG_DOTALL) {
53         *flags |= PCRE_DOTALL;
54         hs_flags &= ~HS_FLAG_DOTALL;
55     }
56     if (hs_flags & HS_FLAG_MULTILINE) {
57         *flags |= PCRE_MULTILINE;
58         hs_flags &= ~HS_FLAG_MULTILINE;
59     }
60     if (hs_flags & HS_FLAG_UCP) {
61         *flags |= PCRE_UCP;
62         hs_flags &= ~HS_FLAG_UCP;
63     }
64     if (hs_flags & HS_FLAG_UTF8) {
65         *flags |= PCRE_UTF8;
66         hs_flags &= ~HS_FLAG_UTF8;
67     }
68     if (hs_flags & HS_FLAG_SINGLEMATCH) {
69         *highlander = true;
70         hs_flags &= ~HS_FLAG_SINGLEMATCH;
71     }
72     if (hs_flags & HS_FLAG_PREFILTER) {
73         *prefilter = true;
74         hs_flags &= ~HS_FLAG_PREFILTER;
75     }
76     if (hs_flags & HS_FLAG_SOM_LEFTMOST) {
77         *som = true;
78         hs_flags &= ~HS_FLAG_SOM_LEFTMOST;
79     }
80     if (hs_flags & HS_FLAG_COMBINATION) {
81         *combination = true;
82         hs_flags &= ~HS_FLAG_COMBINATION;
83     }
84     if (hs_flags & HS_FLAG_QUIET) {
85         *quiet = true;
86         hs_flags &= ~HS_FLAG_QUIET;
87     }
88 
89     // Flags that are irrelevant to PCRE.
90     hs_flags &= ~HS_FLAG_ALLOWEMPTY;
91 
92     if (hs_flags) {
93         // You've added new flags, haven't you?
94         assert(0);
95         return false;
96     }
97 
98     return true;
99 }
100