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 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
|
#include "list.h"
typedef enum { /* type of object */
tr_tree,
tr_node,
tr_branch
} data_type;
typedef struct TREEBRANCH *treebranch;
typedef struct TREE *tree;
typedef struct TREENODE *treenode;
typedef struct {
data_type type; /* type of object */
tree t; /* tree it's in */
void *intdata; /* internal data */
void *data; /* user data */
} treegend, *treegen;
typedef struct TREEBRANCH {
treegend gen;
int specified; /* 1 if this distance was specified */
double distance; /* distance of branch */
treenode up; /* node up in tree */
treenode down; /* node down in tree */
} treebranchd;
typedef struct TREE {
treegend gen;
char *name; /* name */
int rooted; /* 1 if this should be a rooted tree */
treenode root; /* root node */
list branches; /* list of all branches */
list nodes; /* list of all nodes */
double unspecdist; /* distance to use when unspecified */
} treed;
typedef struct TREENODE {
treegend gen;
char *name; /* name */
list branches; /* list of branches */
/* parent is the one that doesn't have this node as 'up' */
list currentbranch; /* the current one, for first/nextsubtree */
list bn; /* list of comments before node */
list al; /* list of comments after node list */
list an; /* list of comments after name */
list bd; /* list of comments before distance */
list ad; /* list of comments after distance */
treenode duped; /* for duplicating subtrees, temp data */
} treenoded;
typedef enum {
BEFORE_NODE,
AFTER_LIST,
AFTER_NAME,
BEFORE_DISTANCE,
AFTER_DISTANCE,
NOWHERE
} where_in_tree;
extern int (*tdup)(); /* data duplication routine */
extern int (*tinit)(); /* data initialization routine */
extern int (*tfree)(); /* data freeing routine */
extern tree tree_get_tree();
extern void *tree_get_data();
extern treenode parent();
extern treebranch getparentandbranch();
extern treebranch branchtonode();
#define QUOTE '\'' /* constants for files */
#define INDENT " "
#define Comments 1 /* for whether to use comments or functions */
#define Functions 2
#define tree_get_type(i) ((i)==NULL?0:((treegen)(i))->type)
#define tree_get_intdata(i) ((i)==NULL?NULL:((treegen)(i))->intdata)
#define tree_set_type(i, d) ((i)==NULL?0:(((treegen)(i))->type=(d)))
#define tree_set_intdata(i, d) ((i)==NULL?NULL:(((treegen)(i))->intdata=(d)))
#define t_data(i) ((treegen)(i))->data
#define tree_get_data(i) ((i)==NULL?NULL:(((treegen)(i))->data))
#define tree_set_data(i, d) ((i)==NULL?NULL:(((treegen)(i))->data=(d)))
#define tree_set_dup(d) (tdup=d)
#define tree_set_init(d) (tinit=d)
#define tree_set_free(d) (tfree=d)
#define notbranch(i) ((i)==NULL?0:((treegen)(i))->type!=tr_branch)
#define notnode(i) ((i)==NULL?0:((treegen)(i))->type!=tr_node)
#define nottree(i) ((i)==NULL?0:((treegen)(i))->type!=tr_tree)
#define subtree(i) (((treebranch)nodeobj(i))->down)
#define tforsubtree(n, c) for(firstsubtree(n, &c);c!=NULL;nextsubtree(n, &c))
#define othernode(n, i) ((i)->up==(n)?(i)->down:(i)->up)
extern int findnodebyname();
extern treegen newspace();
extern tree tree_get_tree();
extern void *tree_get_tree_data();
extern int tree_set_tree();
extern char *tree_get_name();
extern tree readrootedtree();
extern list newlist();
extern list addnode();
extern list findnode();
extern list rmnode();
extern list rmcurr();
extern int setcurr();
extern void freelist();
extern list listnode();
extern list setnode();
extern list endlist();
extern list startlist();
extern list listgonext();
extern list lastnode();
extern list listgoprev();
extern void *listnext();
extern void *listprev();
extern void *listcurr();
extern int listlastp();
extern int listfirstp();
extern int listemptyp();
extern printlist();
extern error();
extern tree maketree();
extern treenode makenode();
extern node_set_name();
extern addsubtreetotree();
extern treebranch addsubtree();
extern treebranch replacesubtree();
extern removesubtreefromtree();
extern int removesubtree();
extern list dupcommentlist();
extern treenode dupnode();
extern treenode duplicatenode();
extern treebranch dupbranch();
extern treebranch duplicatebranch();
extern treenode duplicatesubtree1();
extern treenode duplicatesubtree();
extern freecommentlist();
extern freenode();
extern freebranch();
extern freesubtree1();
extern int freesubtree();
extern int freetree();
extern tree duplicatetree();
extern int treereroot();
extern int fliplist();
extern treenode break_branch();
extern treenode merge_branch();
extern treenode change_outgroup();
extern char *new_string();
extern char *dstring();
extern int dlength();
extern int del_string();
extern int ins_string();
extern int ins_char();
extern int add_string();
extern int add_char();
extern char *dup_string();
extern char *freeze_string();
extern t_memory();
extern writecommentlist();
extern writeshift();
extern writetreenode();
extern writetree();
extern writetree_prolog();
extern wtdo();
extern treenode treeroot();
extern firstsubtree();
extern lastsubtree();
extern nextsubtree();
extern prevsubtree();
extern treenode parent();
extern int treeleaf();
extern int treechildren();
extern int treeleaves();
extern treebranch getparentandbranch();
extern treebranch branchtonode1();
extern treebranch branchtonode();
extern int ascendant();
extern int descendant();
extern int parentdistance();
extern int branchdistance();
extern int setparentdistance();
extern double searchdistance();
extern int nodedistance();
|