191 lines
6.1 KiB
C
191 lines
6.1 KiB
C
/* The MIT License
|
|
|
|
Copyright (c) 2018- Dana-Farber Cancer Institute
|
|
2009-2018 Broad Institute, Inc.
|
|
2008-2009 Genome Research Ltd. (GRL)
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining
|
|
a copy of this software and associated documentation files (the
|
|
"Software"), to deal in the Software without restriction, including
|
|
without limitation the rights to use, copy, modify, merge, publish,
|
|
distribute, sublicense, and/or sell copies of the Software, and to
|
|
permit persons to whom the Software is furnished to do so, subject to
|
|
the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be
|
|
included in all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
SOFTWARE.
|
|
*/
|
|
#ifndef LH3_UTILS_H
|
|
#define LH3_UTILS_H
|
|
|
|
#include <getopt.h>
|
|
#include <pthread.h>
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <sys/stat.h>
|
|
#include <zlib.h>
|
|
|
|
#include "debug.h"
|
|
#include "profiling.h"
|
|
|
|
#ifdef __GNUC__
|
|
// Tell GCC to validate printf format string and args
|
|
#define ATTRIBUTE(list) __attribute__ (list)
|
|
#else
|
|
#define ATTRIBUTE(list)
|
|
#endif
|
|
|
|
#define err_fatal_simple(msg) _err_fatal_simple(__func__, msg)
|
|
#define err_fatal_simple_core(msg) _err_fatal_simple_core(__func__, msg)
|
|
|
|
#define xopen(fn, mode) err_xopen_core(__func__, fn, mode)
|
|
#define xreopen(fn, mode, fp) err_xreopen_core(__func__, fn, mode, fp)
|
|
#define xzopen(fn, mode) err_xzopen_core(__func__, fn, mode)
|
|
|
|
#define xassert(cond, msg) if ((cond) == 0) _err_fatal_simple_core(__func__, msg)
|
|
|
|
#define PROG_NAME "hybalign"
|
|
|
|
///////////// added for hyb-align /////////////
|
|
|
|
#undef MAX
|
|
#undef MIN
|
|
#define MAX(x, y) ((x) > (y) ? (x) : (y))
|
|
#define MIN(x, y) ((x) < (y) ? (x) : (y))
|
|
|
|
#undef MAX_PATH
|
|
#define MAX_PATH 2048
|
|
|
|
#ifdef __GNUC__
|
|
#ifndef LIKELY
|
|
#define LIKELY(x) __builtin_expect((x), 1)
|
|
#endif
|
|
#ifndef UNLIKELY
|
|
#define UNLIKELY(x) __builtin_expect((x), 0)
|
|
#endif
|
|
#else
|
|
#ifndef LIKELY
|
|
#define LIKELY(x) (x)
|
|
#endif
|
|
#ifndef UNLIKELY
|
|
#define UNLIKELY(x) (x)
|
|
#endif
|
|
#endif
|
|
|
|
#define err_check_true(ret_code, right_val) \
|
|
if ((ret_code) != (right_val)) \
|
|
err_fatal("err_check", "Value not right: True-Val %d\n", right_val)
|
|
|
|
#define err_check_false(ret_code, err_val) \
|
|
if ((ret_code) == (err_val)) \
|
|
err_fatal("err_check", "Value not right: False-Val %d\n", err_val)
|
|
|
|
#define _load_file_to_data(fn, data) \
|
|
do { \
|
|
FILE* fp = NULL; \
|
|
struct stat st; \
|
|
err_check_true(stat(fn, &st), 0); \
|
|
fp = xopen(fn, "r"); \
|
|
data = (uint8_t*)malloc(st.st_size); \
|
|
err_fread_noeof(data, 1, st.st_size, fp); \
|
|
err_fclose(fp); \
|
|
} while (0)
|
|
|
|
#define _load_file_to_data_ps(prefix, suffix, data) \
|
|
do { \
|
|
char fn[MAX_PATH]; \
|
|
sprintf(fn, "%s%s", prefix, suffix); \
|
|
_load_file_to_data(fn, data); \
|
|
} while (0)
|
|
|
|
#define _store_data_to_file(fn, data, ele_size, nums) \
|
|
do { \
|
|
FILE* fp; \
|
|
fp = xopen(fn, "wb"); \
|
|
err_fwrite(data, ele_size, nums, fp); \
|
|
err_fflush(fp); \
|
|
err_fclose(fp); \
|
|
} while (0)
|
|
|
|
///////////// end of added for hyb-align /////////////
|
|
|
|
typedef struct {
|
|
uint64_t x, y;
|
|
} pair64_t;
|
|
|
|
typedef struct { size_t n, m; uint64_t *a; } uint64_v;
|
|
typedef struct { size_t n, m; pair64_t *a; } pair64_v;
|
|
|
|
typedef struct {
|
|
size_t m;
|
|
uint8_t* addr;
|
|
} buf_t;
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
void err_fatal(const char *header, const char *fmt, ...) ATTRIBUTE((noreturn));
|
|
void err_fatal_core(const char *header, const char *fmt, ...) ATTRIBUTE((noreturn));
|
|
void _err_fatal_simple(const char *func, const char *msg) ATTRIBUTE((noreturn));
|
|
void _err_fatal_simple_core(const char *func, const char *msg) ATTRIBUTE((noreturn));
|
|
FILE *err_xopen_core(const char *func, const char *fn, const char *mode);
|
|
FILE *err_xreopen_core(const char *func, const char *fn, const char *mode, FILE *fp);
|
|
gzFile err_xzopen_core(const char *func, const char *fn, const char *mode);
|
|
size_t err_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
|
|
size_t err_fread_noeof(void *ptr, size_t size, size_t nmemb, FILE *stream);
|
|
|
|
int err_gzread(gzFile file, void *ptr, unsigned int len);
|
|
int err_fseek(FILE *stream, long offset, int whence);
|
|
#define err_rewind(FP) err_fseek((FP), 0, SEEK_SET)
|
|
long err_ftell(FILE *stream);
|
|
int err_fprintf(FILE *stream, const char *format, ...)
|
|
ATTRIBUTE((format(printf, 2, 3)));
|
|
int err_printf(const char *format, ...)
|
|
ATTRIBUTE((format(printf, 1, 2)));
|
|
int err_fputc(int c, FILE *stream);
|
|
#define err_putchar(C) err_fputc((C), stdout)
|
|
int err_fputs(const char *s, FILE *stream);
|
|
int err_puts(const char *s);
|
|
int err_fflush(FILE *stream);
|
|
int err_fclose(FILE *stream);
|
|
int err_gzclose(gzFile file);
|
|
|
|
double cputime(void);
|
|
double realtime(void);
|
|
long peakrss(void);
|
|
|
|
void ks_introsort_64 (size_t n, uint64_t *a);
|
|
void ks_introsort_128(size_t n, pair64_t *a);
|
|
|
|
int start_async_read(gzFile file);
|
|
int stop_async_read(gzFile file);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
static inline uint64_t hash_64(uint64_t key)
|
|
{
|
|
key += ~(key << 32);
|
|
key ^= (key >> 22);
|
|
key += ~(key << 13);
|
|
key ^= (key >> 8);
|
|
key += (key << 3);
|
|
key ^= (key >> 15);
|
|
key += ~(key << 27);
|
|
key ^= (key >> 31);
|
|
return key;
|
|
}
|
|
|
|
#endif
|