summaryrefslogtreecommitdiffstats
path: root/bfs.h
blob: 441993b671a4a3e099341553e1ebd311e143f6a6 (plain)
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