From da51ac27f1849ad94753277650435ae482a0423f Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Sun, 29 Nov 2015 12:00:05 -0500 Subject: Split out parsing code. --- bfs.h | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 bfs.h (limited to 'bfs.h') diff --git a/bfs.h b/bfs.h new file mode 100644 index 0000000..aedd2c0 --- /dev/null +++ b/bfs.h @@ -0,0 +1,118 @@ +/********************************************************************* + * bfs * + * Copyright (C) 2015 Tavian Barnes * + * * + * 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 +#include + +/** + * 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_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 -- cgit v1.2.3