diff options
Diffstat (limited to 'src/pmdas/hotproc/src/gram_node.c')
-rw-r--r-- | src/pmdas/hotproc/src/gram_node.c | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/src/pmdas/hotproc/src/gram_node.c b/src/pmdas/hotproc/src/gram_node.c new file mode 100644 index 0000000..d2c36b5 --- /dev/null +++ b/src/pmdas/hotproc/src/gram_node.c @@ -0,0 +1,199 @@ +/* + * Copyright (c) 1995 Silicon Graphics, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include "./gram_node.h" + +/* functions */ +static void dump_comparison(FILE *, bool_node *); +static void dump_var(FILE *, bool_node *); + +static bool_node *node_list = NULL; + +void start_tree(void) +{ + node_list = NULL; +} + +void free_tree(bool_node *root) +{ + bool_node *n, *next; + + if (root == NULL) + root = node_list; /* use last tree */ + + /* free all nodes in list */ + for (n = root; n != NULL; ) { + next = n->next; + if (n->tag == N_pat || n->tag == N_str) + free(n->data.str_val); + free(n); + n = next; + } + + if (root == node_list) + node_list = NULL; +} + +bool_node * +create_tag_node(N_tag tag) +{ + bool_node *new_node; + + new_node = (bool_node*)malloc(sizeof(bool_node)); + if (new_node == NULL) { + fprintf(stderr, "hotproc: malloc failed in config: %s", osstrerror()); + exit(1); + } + new_node->tag = tag; + + /* add to front of node-list */ + new_node->next = node_list; + node_list = new_node; + + return new_node; +} + +bool_node * +create_tnode(N_tag tag, bool_node *lnode, bool_node *rnode) +{ + bool_node *n = create_tag_node(tag); + n->data.children.left = lnode; + n->data.children.right = rnode; + return n; +} + +bool_node * +create_number_node(double x) +{ + bool_node *n = create_tag_node(N_number); + n->data.num_val = x; + return n; +} + + +bool_node *create_str_node(char *str) +{ + bool_node *n = create_tag_node(N_str); + n->data.str_val = str; + return n; +} + +bool_node *create_pat_node(char *str) +{ + bool_node *n = create_tag_node(N_pat); + n->data.str_val = str; + return n; +} + +void +dump_bool_tree(FILE *f, bool_node *tree) +{ + (void)fprintf(f, "--- bool tree ---\n"); + dump_predicate(f, tree); + (void)fprintf(f, "\n--- end bool tree ---\n"); +} + +void +dump_predicate(FILE *f, bool_node *pred) +{ + bool_node *lhs, *rhs; + + switch(pred->tag) { + case N_and: + lhs = pred->data.children.left; + rhs = pred->data.children.right; + (void)fprintf(f, "("); + dump_predicate(f, lhs); + (void)fprintf(f, " && "); + dump_predicate(f, rhs); + (void)fprintf(f, ")"); + break; + case N_or: + lhs = pred->data.children.left; + rhs = pred->data.children.right; + (void)fprintf(f, "("); + dump_predicate(f, lhs); + (void)fprintf(f, " || "); + dump_predicate(f, rhs); + (void)fprintf(f, ")"); + break; + case N_not: + lhs = pred->data.children.left; + (void)fprintf(f, "(! "); + dump_predicate(f, lhs); + (void)fprintf(f, ")"); + break; + case N_true: + (void)fprintf(f, "(true)"); + break; + case N_false: + (void)fprintf(f, "(false)"); + break; + default: + dump_comparison(f, pred); + }/*switch*/ +} + +static void +dump_comparison(FILE *f, bool_node *comp) +{ + bool_node *lhs = comp->data.children.left; + bool_node *rhs = comp->data.children.right; + + (void)fprintf(f, "("); + dump_var(f, lhs); + switch(comp->tag) { + case N_lt: (void)fprintf(f, " < "); break; + case N_gt: (void)fprintf(f, " > "); break; + case N_le: (void)fprintf(f, " <= "); break; + case N_ge: (void)fprintf(f, " >= "); break; + case N_eq: (void)fprintf(f, " == "); break; + case N_seq: (void)fprintf(f, " == "); break; + case N_sneq: (void)fprintf(f, " != "); break; + case N_neq: (void)fprintf(f, " != "); break; + case N_match: (void)fprintf(f, " ~ "); break; + case N_nmatch: (void)fprintf(f, " !~ "); break; + default: (void)fprintf(f, "<ERROR>"); break; + }/*switch*/ + dump_var(f, rhs); + (void)fprintf(f, ")"); +} + +static void +dump_var(FILE *f, bool_node *var) +{ + switch(var->tag) { + case N_str: (void)fprintf(f, "\"%s\"", var->data.str_val); break; + case N_pat: (void)fprintf(f, "\"%s\"", var->data.str_val); break; + case N_number: (void)fprintf(f, "%f", var->data.num_val); break; + case N_uid: (void)fprintf(f, "uid"); break; + case N_gid: (void)fprintf(f, "gid"); break; + case N_uname: (void)fprintf(f, "uname"); break; + case N_gname: (void)fprintf(f, "gname"); break; + case N_fname: (void)fprintf(f, "fname"); break; + case N_psargs: (void)fprintf(f, "psargs"); break; + case N_cpuburn: (void)fprintf(f, "cpuburn"); break; + case N_syscalls: (void)fprintf(f, "syscalls"); break; + case N_ctxswitch: (void)fprintf(f, "ctxswitch"); break; + case N_virtualsize: (void)fprintf(f, "virtualsize"); break; + case N_residentsize: (void)fprintf(f, "residentsize"); break; + case N_iodemand: (void)fprintf(f, "iodemand"); break; + case N_iowait: (void)fprintf(f, "iowait"); break; + case N_schedwait: (void)fprintf(f, "schedwait"); break; + default: (void)fprintf(f, "<ERROR>"); break; + }/*switch*/ +} |