/*
* (C) Copyright 2001-2015 Diomidis Spinellis
*
* This file is part of CScout.
*
* CScout is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* CScout is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with CScout. If not, see .
*
*
* Encapsulates a (user interface) function query
*
*/
#ifndef FUNQUERY_
#define FUNQUERY_
#include
using namespace std;
#include "query.h"
#include "mquery.h"
#include "fileid.h"
#include "call.h"
class FunQuery : public Query {
private:
// Regular expression match specs
string str_fnre; // Function name RE
string str_fdre; // Called function name RE (down)
string str_fure; // Calling function name RE (up)
string str_fre; // Filename RE
// Compiled REs
CompiledRE fnre; // Function name RE
CompiledRE fdre; // Called function name RE (down)
CompiledRE fure; // Calling function name RE (up)
CompiledRE fre; // Filename RE
// Match rules
bool match_fnre; // Function name RE
bool match_fdre; // Called function name RE (down)
bool match_fure; // Calling function name RE (up)
bool match_fre; // Filename RE
// Exclude options
bool exclude_fnre; // Function name RE
bool exclude_fdre; // Called function name RE (down)
bool exclude_fure; // Calling function name RE (up)
bool exclude_fre; // Filename RE
// Query arguments
char match_type; // Type of boolean match
bool cfun; // True if C function
bool macro; // True if function-like macro
bool writable; // True if writable
bool ro; // True if read-only
bool pscope; // True if project scoped
bool fscope; // True if file scoped
bool defined; // True if a definition was found
Fileid fid; // Match from this file
bool match_fid; // True to use the above
int ncallers; // Number of callers
int ncallerop; // Operator for comparing them
Eclass *id_ec; // True if identifier EC matches
// No other evaluation takes place
Call *call; // True if call matches
// No other evaluation takes place
string name; // Query name
Attributes::size_type current_project; // Restrict evaluation to this project
// The query part for the metrics
MQuery mquery;
public:
// Construct object based on URL parameters
FunQuery(FILE *f, bool icase, Attributes::size_type current_project, bool e = true, bool r = true);
// Default
FunQuery() : Query(), match_fnre(false), match_fdre(false), match_fure(false), match_fre(false), match_fid(false) {}
// Destructor
virtual ~FunQuery() {}
// Perform a query
bool eval(Call *c);
// Return the URL for re-executing this query
string base_url() const;
// Return the query's parameters as a URL
string param_url() const;
//
// Container comparison functor
class specified_order : public binary_function {
private:
/*
* Can only be an instance variable (per C++ PL 17.1.4.5)
* only when the corresponding constructor is passed a
* compile-time constant.
* This hack works around the limitation.
*/
static int order;
static bool reverse;
public:
// Should be called exactly once before instantiating the set
static void set_order(int o, bool r) { order = o; reverse = r; }
bool operator()(const Call *a, const Call *b) const {
bool val;
if (order == -1)
// Order by name
val = Query::string_bi_compare(a->get_name(), b->get_name());
else
val = (a->const_metrics().get_metric(order) < b->const_metrics().get_metric(order));
return reverse ? !val : val;
}
};
int get_sort_order() const { return mquery.get_sort_order(); }
// Return true if the query's URL can be bookmarked across CScout invocations
bool bookmarkable() const { return id_ec == NULL; }
};
typedef multiset Sfuns;
#endif // FUNQUERY_