-
Notifications
You must be signed in to change notification settings - Fork 0
/
toolbox.h
157 lines (141 loc) · 3.69 KB
/
toolbox.h
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
/******************************************************************************\
toolbox.h
Copyright (C) Ian Korf
\******************************************************************************/
#ifndef GENOMIKON_TOOLBOX_H
#define GENOMIKON_TOOLBOX_H
#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <float.h>
#include <limits.h>
#include <math.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
// library and program info
char * gkn_get_version_number(void);
void gkn_set_program_name(const char *);
char * gkn_get_program_name(void);
// memory
void * gkn_malloc(size_t);
void * gkn_calloc(size_t, size_t);
void * gkn_realloc(void *, size_t);
// integer vector
struct gkn_IVEC {
int * elem;
int size;
int limit;
int last;
};
typedef struct gkn_IVEC * gkn_ivec;
void gkn_ivec_free(gkn_ivec);
gkn_ivec gkn_ivec_new(void);
void gkn_ivec_push(gkn_ivec, int);
int gkn_ivec_pop(gkn_ivec);
// float vector
struct gkn_FVEC {
double * elem;
int size;
int limit;
int last;
};
typedef struct gkn_FVEC * gkn_fvec;
void gkn_fvec_free(gkn_fvec);
gkn_fvec gkn_fvec_new(void);
void gkn_fvec_push(gkn_fvec, double);
double gkn_fvec_pop(gkn_fvec);
// text vector
struct gkn_TVEC {
char ** elem;
int size;
int limit;
char * last;
};
typedef struct gkn_TVEC * gkn_tvec;
void gkn_tvec_free(gkn_tvec);
gkn_tvec gkn_tvec_new(void);
void gkn_tvec_push(gkn_tvec, const char *);
char * gkn_tvec_pop(gkn_tvec);
// generic void * vector
struct gkn_VEC {
void ** elem;
int size;
int limit;
void * last;
};
typedef struct gkn_VEC * gkn_vec;
void gkn_vec_free(gkn_vec);
gkn_vec gkn_vec_new(void);
void gkn_vec_push(gkn_vec, void *);
void * gkn_vec_pop(gkn_vec);
// generic map (text key, void * value)
struct gkn_MAP {
int level;
int slots;
gkn_tvec keys;
gkn_vec vals;
gkn_vec * key;
gkn_vec * val;
};
typedef struct gkn_MAP * gkn_map;
void gkn_map_free(gkn_map);
gkn_map gkn_map_new(void);
void gkn_map_set(gkn_map, const char *, void *);
void * gkn_map_get(const gkn_map, const char *);
gkn_tvec gkn_map_keys(const gkn_map);
gkn_vec gkn_map_vals(const gkn_map);
void gkn_map_stat(const gkn_map);
// text map
struct gkn_TMAP {
gkn_map hash;
gkn_tvec tvec;
};
typedef struct gkn_TMAP * gkn_tmap;
void gkn_tmap_free(gkn_tmap);
gkn_tmap gkn_tmap_new(void);
void gkn_tmap_set(gkn_tmap, const char *, const char *);
char * gkn_tmap_get(const gkn_tmap, const char *);
int gkn_tmap_exists(const gkn_tmap, const char *);
gkn_tvec gkn_tmap_keys(const gkn_tmap);
/* generic suffix tree */
struct gkn_XNODE {
gkn_vec children;
void *data;
char c;
};
typedef struct gkn_XNODE * gkn_xnode;
void gkn_xnode_free(gkn_xnode);
gkn_xnode gkn_xnode_new(char);
gkn_xnode gkn_xnode_search(const gkn_xnode, char c);
struct gkn_xtree {
gkn_xnode head;
gkn_vec alloc;
};
typedef struct gkn_xtree * gkn_xtree;
void gkn_xtree_free(gkn_xtree);
gkn_xtree gkn_xtree_new(void);
void * gkn_xtree_get(const gkn_xtree, const char *);
int gkn_xtree_check(const gkn_xtree, const char *);
gkn_xnode gkn_xtree_node(const gkn_xtree, const char *);
void gkn_xtree_set(gkn_xtree, const char *, void *);
gkn_tvec gkn_xtree_keys(const gkn_xtree);
// command line processing
void gkn_register_option(const char *, int);
void gkn_parse_options(int *, char **);
char * gkn_option(const char *);
// pipe
struct gkn_PIPE {
int mode; // 0 = read, 1 = write, 2 = r+
char * name;
int gzip;
FILE * stream;
};
typedef struct gkn_PIPE * gkn_pipe;
gkn_pipe gkn_pipe_open(const char *, const char *);
void gkn_pipe_close(gkn_pipe);
// input/output
char * gkn_readline(gkn_pipe);
void gkn_exit(const char *, ...);
#endif