summaryrefslogtreecommitdiffstats
path: root/bfs.h
blob: a8efffb32a341a8f9728e9b7758d86a282f75d4a (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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/*********************************************************************
 * 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>
#include <time.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;

	/** The current time. */
	struct timespec now;
};

/**
 * Possible types of numeric comparison.
 */
typedef enum {
	/** Exactly n. */
	CMP_EXACT,
	/** Less than n. */
	CMP_LESS,
	/** Greater than n. */
	CMP_GREATER,
} cmpflag;

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;
	/** The comparison flag. */
	cmpflag cmp;
	/** 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_true(const expression *expr, eval_state *state);
bool eval_false(const expression *expr, eval_state *state);

bool eval_access(const expression *expr, eval_state *state);

bool eval_amin(const expression *expr, eval_state *state);
bool eval_atime(const expression *expr, eval_state *state);
bool eval_cmin(const expression *expr, eval_state *state);
bool eval_ctime(const expression *expr, eval_state *state);
bool eval_mmin(const expression *expr, eval_state *state);
bool eval_mtime(const expression *expr, eval_state *state);

bool eval_gid(const expression *expr, eval_state *state);
bool eval_uid(const expression *expr, eval_state *state);

bool eval_empty(const expression *expr, eval_state *state);
bool eval_hidden(const expression *expr, eval_state *state);
bool eval_type(const expression *expr, eval_state *state);

bool eval_name(const expression *expr, eval_state *state);
bool eval_path(const expression *expr, eval_state *state);

bool eval_delete(const expression *expr, eval_state *state);
bool eval_nohidden(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);

// 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