#include <gmputil.h>
#include <utils.h>
-#define TRACE 0
-
static int expr_evaluate(struct eval_ctx *ctx, struct expr **expr);
static int stmt_evaluate(struct eval_ctx *ctx, struct stmt *stmt);
static int expr_evaluate(struct eval_ctx *ctx, struct expr **expr)
{
-#if TRACE
- struct error_record *erec;
- erec = erec_create(EREC_INFORMATIONAL, &(*expr)->location, "Evaluate");
- erec_print(stdout, erec); expr_print(*expr); printf("\n\n");
+#ifdef DEBUG
+ if (debug_level & DEBUG_EVALUATION) {
+ struct error_record *erec;
+ erec = erec_create(EREC_INFORMATIONAL, &(*expr)->location, "Evaluate");
+ erec_print(stdout, erec); expr_print(*expr); printf("\n\n");
+ }
#endif
switch ((*expr)->ops->type) {
static int stmt_evaluate(struct eval_ctx *ctx, struct stmt *stmt)
{
-#if TRACE
- struct error_record *erec;
- erec = erec_create(EREC_INFORMATIONAL, &stmt->location, "Evaluate");
- erec_print(stdout, erec); stmt_print(stmt); printf("\n\n");
+#ifdef DEBUG
+ if (debug_level & DEBUG_EVALUATION) {
+ struct error_record *erec;
+ erec = erec_create(EREC_INFORMATIONAL, &stmt->location, "Evaluate");
+ erec_print(stdout, erec); stmt_print(stmt); printf("\n\n");
+ }
#endif
switch (stmt->ops->type) {
static int cmd_evaluate(struct eval_ctx *ctx, struct cmd *cmd)
{
-#if TRACE
- struct error_record *erec;
- erec = erec_create(EREC_INFORMATIONAL, &cmd->location, "Evaluate");
- erec_print(stdout, erec); printf("\n\n");
+#ifdef DEBUG
+ if (debug_level & DEBUG_EVALUATION) {
+ struct error_record *erec;
+ erec = erec_create(EREC_INFORMATIONAL, &cmd->location, "Evaluate");
+ erec_print(stdout, erec); printf("\n\n");
+ }
#endif
ctx->cmd = cmd;
" Internet services, user IDs and group IDs numerically.\n"
" -i/--includepath <directory> Add <directory> to the paths searched for include files.\n"
#ifdef DEBUG
-" --debug <level> Specify debugging level\n"
+" --debug <level [,level...]> Specify debugging level (scanner, parser, eval, netlink, all)\n"
#endif
"\n",
name);
}
+#ifdef DEBUG
+static const struct {
+ const char *name;
+ enum debug_level level;
+} debug_param[] = {
+ {
+ .name = "scanner",
+ .level = DEBUG_SCANNER,
+ },
+ {
+ .name = "parser",
+ .level = DEBUG_PARSER,
+ },
+ {
+ .name = "eval",
+ .level = DEBUG_EVALUATION,
+ },
+ {
+ .name = "netlink",
+ .level = DEBUG_NETLINK,
+ },
+ {
+ .name = "all",
+ .level = ~0,
+ },
+};
+#endif
+
static const struct input_descriptor indesc_cmdline = {
.type = INDESC_BUFFER,
.name = "<cmdline>",
break;
#ifdef DEBUG
case OPT_DEBUG:
- debug_level |= DEBUG_NETLINK;
+ for (;;) {
+ unsigned int i;
+ char *end;
+
+ end = strchr(optarg, ',');
+ if (end)
+ *end = '\0';
+
+ for (i = 0; i < array_size(debug_param); i++) {
+ if (strcmp(debug_param[i].name, optarg))
+ continue;
+ debug_level |= debug_param[i].level;
+ break;
+ }
+
+ if (i == array_size(debug_param)) {
+ fprintf(stderr, "invalid debug parameter `%s'\n",
+ optarg);
+ exit(NFT_EXIT_FAILURE);
+ }
+
+ if (end == NULL)
+ break;
+ optarg = end + 1;
+ }
break;
#endif
case OPT_INVALID: