1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
/*********************************************************************
* bfs *
* Copyright (C) 2015 Tavian Barnes <tavianator@tavianator.com> *
* *
* This program is free software. It comes without any warranty, to *
* the extent permitted by applicable law. You can redistribute it *
* and/or modify it under the terms of the Do What The Fuck You Want *
* To Public License, Version 2, as published by Sam Hocevar. See *
* the COPYING file or http://www.wtfpl.net/ for more details. *
*********************************************************************/
#ifndef BFS_H
#define BFS_H
#include "color.h"
#include <stdbool.h>
#include <stddef.h>
/**
* The parsed command line.
*/
typedef struct cmdline cmdline;
/**
* A command line expression.
*/
typedef struct expression expression;
/**
* Ephemeral state for evaluating an expression.
*/
typedef struct eval_state eval_state;
/**
* Expression evaluation function.
*
* @param expr
* The current expression.
* @param state
* The current evaluation state.
* @return
* The result of the test.
*/
typedef bool eval_fn(const expression *expr, eval_state *state);
struct cmdline {
/** The array of paths to start from. */
const char **roots;
/** The number of root paths. */
size_t nroots;
/** Color data. */
color_table *colors;
/** -color option. */
bool color;
/** -mindepth option. */
int mindepth;
/** -maxdepth option. */
int maxdepth;
/** bftw() flags. */
int flags;
/** The command line expression. */
expression *expr;
};
struct expression {
/** The left hand side of the expression. */
expression *lhs;
/** The right hand side of the expression. */
expression *rhs;
/** The function that evaluates this expression. */
eval_fn *eval;
/** Optional integer data for this expression. */
int idata;
/** Optional string data for this expression. */
const char *sdata;
};
/**
* Parse the command line.
*/
cmdline *parse_cmdline(int argc, char *argv[]);
/**
* Evaluate the command line.
*/
int eval_cmdline(cmdline *cl);
/**
* Free the parsed command line.
*/
void free_cmdline(cmdline *cl);
// Predicate evaluation functions
bool eval_access(const expression *expr, eval_state *state);
bool eval_delete(const expression *expr, eval_state *state);
bool eval_empty(const expression *expr, eval_state *state);
bool eval_false(const expression *expr, eval_state *state);
bool eval_hidden(const expression *expr, eval_state *state);
bool eval_name(const expression *expr, eval_state *state);
bool eval_nohidden(const expression *expr, eval_state *state);
bool eval_path(const expression *expr, eval_state *state);
bool eval_print(const expression *expr, eval_state *state);
bool eval_print0(const expression *expr, eval_state *state);
bool eval_prune(const expression *expr, eval_state *state);
bool eval_quit(const expression *expr, eval_state *state);
bool eval_true(const expression *expr, eval_state *state);
bool eval_type(const expression *expr, eval_state *state);
// Operator evaluation functions
bool eval_not(const expression *expr, eval_state *state);
bool eval_and(const expression *expr, eval_state *state);
bool eval_or(const expression *expr, eval_state *state);
bool eval_comma(const expression *expr, eval_state *state);
#endif // BFS_H
|