From bc226b74df1b99f8c2b67e39b737a050252ebd2b Mon Sep 17 00:00:00 2001 From: f0t1h Date: Sun, 15 Jun 2025 13:01:45 -0700 Subject: [PATCH 1/2] C++ compiler compat --- Makefile | 2 +- opt_parser.c | 8 ++++---- tpool.c | 6 +++--- utils.h | 8 +++++++- vg.c | 34 +++++++++++++++++----------------- 5 files changed, 32 insertions(+), 26 deletions(-) diff --git a/Makefile b/Makefile index 33fa13f..5d820be 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ OBJS := $(SRCS:.c=.o) # directories CURRENT_DIR := $(shell pwd) -GXX := gcc +GXX ?= gcc CXXFLAGS = -O3 -Wall -Wextra -Wpedantic # object files that need lcptools diff --git a/opt_parser.c b/opt_parser.c index 1d5170b..eb95072 100644 --- a/opt_parser.c +++ b/opt_parser.c @@ -207,7 +207,7 @@ void parse_opts(int argc, char* argv[], struct opt_arg *args) { validate_file(args->vcf_path, "vcf"); } - char *fai_path = malloc(strlen(args->fasta_path)+5); + char *fai_path = (char *) malloc(strlen(args->fasta_path)+5); if (fai_path == NULL) { fprintf(stderr, "[ERROR] Memory allocation failed\n"); exit(EXIT_FAILURE); @@ -225,14 +225,14 @@ void parse_opts(int argc, char* argv[], struct opt_arg *args) { } } else { if (args->is_rgfa) { - args->gfa_path = malloc(strlen(args->prefix)+6); + args->gfa_path = (char *) malloc(strlen(args->prefix)+6); if (!args->gfa_path) { fprintf(stderr, "[ERROR] malloc failed"); exit(EXIT_FAILURE); } snprintf(args->gfa_path, strlen(args->prefix)+6, "%s.rgfa", args->prefix); } else { - args->gfa_path = malloc(strlen(args->prefix)+5); + args->gfa_path = (char *) malloc(strlen(args->prefix)+5); if (!args->gfa_path) { fprintf(stderr, "[ERROR] malloc failed"); exit(EXIT_FAILURE); @@ -246,4 +246,4 @@ void parse_opts(int argc, char* argv[], struct opt_arg *args) { } (void)(args->verbose && summarize(args)); -} \ No newline at end of file +} diff --git a/tpool.c b/tpool.c index 4dabf4a..548628a 100644 --- a/tpool.c +++ b/tpool.c @@ -13,7 +13,7 @@ struct tpool_work *tpool_work_create(thread_func_t func, void *arg) { if (func == NULL) return NULL; - work = malloc(sizeof(struct tpool_work)); + work = (struct tpool_work *) malloc(sizeof(struct tpool_work)); work->func = func; work->arg = arg; work->next = NULL; @@ -63,7 +63,7 @@ struct tpool_work *tpool_work_get(struct tpool *tm) { * @param arg Pointer to the thread pool structure. */ void* tpool_worker(void *arg) { - struct tpool *tm = arg; + struct tpool *tm = (struct tpool *) arg; struct tpool_work *work; while (1) { @@ -106,7 +106,7 @@ struct tpool *tpool_create(size_t num) { if (num == 0) num = 1; - tm = calloc(1, sizeof(*tm)); + tm = (struct tpool *) calloc(1, sizeof(*tm)); tm->thread_cnt = num; pthread_mutex_init(&(tm->work_mutex), NULL); diff --git a/utils.h b/utils.h index 7bad911..e083965 100644 --- a/utils.h +++ b/utils.h @@ -8,6 +8,12 @@ #include #include +#if defined (__cplusplus) + #define COLITERAL(type) type +#else + #define COLITERAL(type) (struct type) +#endif + #define MIN(a,b) (((a)<(b))?(a):(b)) #define MAX(a,b) (((a)>(b))?(a):(b)) @@ -182,4 +188,4 @@ void refine_seq(struct lps *str, int no_overlap); */ void print_path(const struct ref_seq *seqs, FILE *out); -#endif \ No newline at end of file +#endif diff --git a/vg.c b/vg.c index caaac20..753cbf1 100644 --- a/vg.c +++ b/vg.c @@ -164,7 +164,7 @@ int add_elem_2_vgd(struct vg_data *vgd, uint64_t *arr, int size, uint64_t start, } while (i < size && (uint32_t)(arr[i]) < end) { check_vg_data(vgd); // check if there is a space to add element - vgd->data[vgd->size] = (struct vg_data_element){INCOMING, arr[i] >> 32, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF & arr[i], NULL, NULL, 0}; // order not matter here + vgd->data[vgd->size] = COLITERAL(vg_data_element){INCOMING, arr[i] >> 32, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF & arr[i], NULL, NULL, 0}; // order not matter here vgd->size++; i++; } @@ -302,13 +302,13 @@ void vg_read_vcf_thd(void *args) { uint64_t prev_segment_id = vgd->prev_id; for (int k=0; kcore_id_index)); - segments[k] = (struct simple_core){segment_id, split_points[k], split_points[k+1]}; + segments[k] = COLITERAL(simple_core){segment_id, split_points[k], split_points[k+1]}; print_seq(segment_id, seq+split_points[k], split_points[k+1]-split_points[k], seq_name, split_points[k], 0, t_args->is_rgfa, t_args->out1); print_link(prev_segment_id, '+', segment_id, '+', 0, t_args->out2); prev_segment_id = segment_id; t_args->seqs->chrs[vgd->chr_idx].ids[vgd->core_idx][k] = segment_id; } - segments[segment_count-1] = (struct simple_core){vgd->curr_id, split_points[segment_count-1], curr_core->end}; + segments[segment_count-1] = COLITERAL(simple_core){vgd->curr_id, split_points[segment_count-1], curr_core->end}; print_seq(vgd->curr_id, seq+split_points[segment_count-1], curr_core->end-split_points[segment_count-1], seq_name, split_points[segment_count-1], 0, t_args->is_rgfa, t_args->out1); print_link(prev_segment_id, '+', vgd->curr_id, '+', 0, t_args->out2); t_args->seqs->chrs[vgd->chr_idx].ids[vgd->core_idx][segment_count-1] = 0; @@ -316,7 +316,7 @@ void vg_read_vcf_thd(void *args) { const char *seq = t_args->seqs->chrs[vgd->chr_idx].seq; const char *seq_name = t_args->seqs->chrs[vgd->chr_idx].seq_name; const struct simple_core *curr_core = &(t_args->seqs->chrs[vgd->chr_idx].cores[vgd->core_idx]); - segments[0] = (struct simple_core){vgd->curr_id, curr_core->start, curr_core->end}; + segments[0] = COLITERAL(simple_core){vgd->curr_id, curr_core->start, curr_core->end}; print_seq(vgd->curr_id, seq+curr_core->start, curr_core->end-curr_core->start, seq_name, curr_core->start, 0, t_args->is_rgfa, t_args->out1); print_link(vgd->prev_id, '+', vgd->curr_id, '+', 0, t_args->out2); t_args->seqs->chrs[vgd->chr_idx].ids[vgd->core_idx] = NULL; @@ -665,12 +665,12 @@ void vg_read_vcf(struct opt_arg *args, struct ref_seq *seqs) { uint64_t ref_token_len = strlen(ref_token); if (check_vg_data(vgd)) { if (offset + ref_token_len < curr_chr->cores[core_idx].end) { // DEL inside - vgd->data[vgd->size] = (struct vg_data_element){IN_DEL, 0, offset+1, offset+ref_token_len, NULL, NULL, order}; + vgd->data[vgd->size] = COLITERAL(vg_data_element){IN_DEL, 0, offset+1, offset+ref_token_len, NULL, NULL, order}; vgd->size++; } else if (offset + 1 < curr_chr->cores[core_idx].end) { // it starts inside rem_vars_size = add_elem_2_rem_arr(&rem_vars, rem_vars_size, rem_vars_capacity, args->core_id_index, offset+ref_token_len); if (rem_vars_size > rem_vars_capacity) rem_vars_capacity *= 2; - vgd->data[vgd->size] = (struct vg_data_element){OUT_DEL, args->core_id_index, offset+1, 0xFFFFFFFFFFFFFFFF, NULL, NULL, order}; + vgd->data[vgd->size] = COLITERAL(vg_data_element){OUT_DEL, args->core_id_index, offset+1, 0xFFFFFFFFFFFFFFFF, NULL, NULL, order}; vgd->size++; args->core_id_index++; } else { @@ -691,12 +691,12 @@ void vg_read_vcf(struct opt_arg *args, struct ref_seq *seqs) { if (1 == ref_len && 1 == alt_token_len) { // SNP if (offset + 1 < curr_chr->cores[core_idx].end) { print_seq_vg(args->core_id_index, alt_token, 1, id, order, offset, 1, args->is_rgfa, out_segment); - vgd->data[vgd->size] = (struct vg_data_element){IN_SNP, args->core_id_index, offset, offset+1, NULL, NULL, order}; // id assigned for segment + vgd->data[vgd->size] = COLITERAL(vg_data_element){IN_SNP, args->core_id_index, offset, offset+1, NULL, NULL, order}; // id assigned for segment } else { rem_vars_size = add_elem_2_rem_arr(&rem_vars, rem_vars_size, rem_vars_capacity, args->core_id_index, offset+1); if (rem_vars_size > rem_vars_capacity) rem_vars_capacity *= 2; print_seq_vg(args->core_id_index, alt_token, 1, id, order, offset, 1, args->is_rgfa, out_segment); - vgd->data[vgd->size] = (struct vg_data_element){OUT_SNP, args->core_id_index, offset, 0xFFFFFFFFFFFFFFFF, NULL, NULL, order}; // id assigned for segment + vgd->data[vgd->size] = COLITERAL(vg_data_element){OUT_SNP, args->core_id_index, offset, 0xFFFFFFFFFFFFFFFF, NULL, NULL, order}; // id assigned for segment } vgd->size++; args->core_id_index++; @@ -705,11 +705,11 @@ void vg_read_vcf(struct opt_arg *args, struct ref_seq *seqs) { if (alt_token_len / 2 < curr_chr->cores[core_idx].end - curr_chr->cores[core_idx].start) { print_seq_vg(args->core_id_index, alt_token+1, alt_token_len-1, id, order, offset, 1, args->is_rgfa, out_segment); if (offset + 1 < curr_chr->cores[core_idx].end) { - vgd->data[vgd->size] = (struct vg_data_element){IN_INS, args->core_id_index, offset+1, offset+1, NULL, NULL, order}; // id assigned for segment + vgd->data[vgd->size] = COLITERAL(vg_data_element){IN_INS, args->core_id_index, offset+1, offset+1, NULL, NULL, order}; // id assigned for segment } else { rem_vars_size = add_elem_2_rem_arr(&rem_vars, rem_vars_size, rem_vars_capacity, args->core_id_index, offset+1); if (rem_vars_size > rem_vars_capacity) rem_vars_capacity *= 2; - vgd->data[vgd->size] = (struct vg_data_element){OUT_INS, args->core_id_index, offset+1, 0xFFFFFFFFFFFFFFFF, NULL, NULL, order}; // id assigned for segment + vgd->data[vgd->size] = COLITERAL(vg_data_element){OUT_INS, args->core_id_index, offset+1, 0xFFFFFFFFFFFFFFFF, NULL, NULL, order}; // id assigned for segment } vgd->size++; args->core_id_index++; @@ -717,11 +717,11 @@ void vg_read_vcf(struct opt_arg *args, struct ref_seq *seqs) { char *alt_token_copy = strdup(alt_token); char *seq_id = strdup(id); if (offset + 1 < curr_chr->cores[core_idx].end) { // if inside of the lcp core - vgd->data[vgd->size] = (struct vg_data_element){IN_INS_SV, args->core_id_index, offset+1, offset+1, alt_token_copy, seq_id, order}; + vgd->data[vgd->size] = COLITERAL(vg_data_element){IN_INS_SV, args->core_id_index, offset+1, offset+1, alt_token_copy, seq_id, order}; } else { // if in the edge of the end of the lcp core rem_vars_size = add_elem_2_rem_arr(&rem_vars, rem_vars_size, rem_vars_capacity, args->core_id_index, offset+1); if (rem_vars_size > rem_vars_capacity) rem_vars_capacity *= 2; - vgd->data[vgd->size] = (struct vg_data_element){OUT_INS_SV, args->core_id_index, offset+1, 0xFFFFFFFFFFFFFFFF, alt_token_copy, seq_id, order}; + vgd->data[vgd->size] = COLITERAL(vg_data_element){OUT_INS_SV, args->core_id_index, offset+1, 0xFFFFFFFFFFFFFFFF, alt_token_copy, seq_id, order}; } vgd->size++; args->core_id_index++; @@ -730,11 +730,11 @@ void vg_read_vcf(struct opt_arg *args, struct ref_seq *seqs) { if (alt_token_len / 2 < curr_chr->cores[core_idx].end - curr_chr->cores[core_idx].start) { // alteration, simply print the underling string print_seq_vg(args->core_id_index, alt_token, alt_token_len, id, order, offset, 1, args->is_rgfa, out_segment); if (offset + ref_len < curr_chr->cores[core_idx].end) { - vgd->data[vgd->size] = (struct vg_data_element){IN_ALT, args->core_id_index, offset, offset+ref_len, NULL, NULL, order}; + vgd->data[vgd->size] = COLITERAL(vg_data_element){IN_ALT, args->core_id_index, offset, offset+ref_len, NULL, NULL, order}; } else { rem_vars_size = add_elem_2_rem_arr(&rem_vars, rem_vars_size, rem_vars_capacity, args->core_id_index, offset+ref_len); if (rem_vars_size > rem_vars_capacity) rem_vars_capacity *= 2; - vgd->data[vgd->size] = (struct vg_data_element){OUT_ALT, args->core_id_index, offset, 0xFFFFFFFFFFFFFFFF, NULL, NULL, order}; + vgd->data[vgd->size] = COLITERAL(vg_data_element){OUT_ALT, args->core_id_index, offset, 0xFFFFFFFFFFFFFFFF, NULL, NULL, order}; } vgd->size++; args->core_id_index++; @@ -742,11 +742,11 @@ void vg_read_vcf(struct opt_arg *args, struct ref_seq *seqs) { char *alt_token_copy = strdup(alt_token); char *seq_id = strdup(id); if (offset + ref_len < curr_chr->cores[core_idx].end) { - vgd->data[vgd->size] = (struct vg_data_element){IN_ALT_SV, args->core_id_index, offset, offset+ref_len, alt_token_copy, seq_id, order}; + vgd->data[vgd->size] = COLITERAL(vg_data_element){IN_ALT_SV, args->core_id_index, offset, offset+ref_len, alt_token_copy, seq_id, order}; } else { rem_vars_size = add_elem_2_rem_arr(&rem_vars, rem_vars_size, rem_vars_capacity, args->core_id_index, offset+ref_len); if (rem_vars_size > rem_vars_capacity) rem_vars_capacity *= 2; - vgd->data[vgd->size] = (struct vg_data_element){OUT_ALT_SV, args->core_id_index, offset, 0xFFFFFFFFFFFFFFFF, alt_token_copy, seq_id, order}; + vgd->data[vgd->size] = COLITERAL(vg_data_element){OUT_ALT_SV, args->core_id_index, offset, 0xFFFFFFFFFFFFFFFF, alt_token_copy, seq_id, order}; } vgd->size++; args->core_id_index++; @@ -856,4 +856,4 @@ void vg_read_vcf(struct opt_arg *args, struct ref_seq *seqs) { fclose(out_path); fclose(out_segment); fclose(out_link); -} \ No newline at end of file +} From 6971bcee765cbe9de20b17e036a56a671fb12ec3 Mon Sep 17 00:00:00 2001 From: f0t1h Date: Sun, 15 Jun 2025 13:25:47 -0700 Subject: [PATCH 2/2] Fix some warnings --- Makefile | 2 +- fa_parser.c | 3 ++- fa_parser.h | 3 ++- lbdg.c | 3 ++- lbdg.h | 3 ++- lcpan.c | 3 ++- opt_parser.c | 4 ++-- struct_def.h | 3 ++- vg.c | 4 +--- vg.h | 3 ++- vgx.c | 3 ++- vgx.h | 3 ++- 12 files changed, 22 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index 5d820be..5c201f7 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ OBJS := $(SRCS:.c=.o) CURRENT_DIR := $(shell pwd) GXX ?= gcc -CXXFLAGS = -O3 -Wall -Wextra -Wpedantic +CXXFLAGS = -O3 -Wall -Wextra -Wpedantic -march=native # object files that need lcptools LCPTOOLS_CXXFLAGS := -I$(CURRENT_DIR)/lcptools/include diff --git a/fa_parser.c b/fa_parser.c index 4f7486b..f9c6ee7 100644 --- a/fa_parser.c +++ b/fa_parser.c @@ -399,4 +399,5 @@ void print_ref_seqs(const struct ref_seq *seqs, int is_rgfa, FILE *out) { fprintf(out, "\t*\n"); } } -} \ No newline at end of file +} + diff --git a/fa_parser.h b/fa_parser.h index c8ce33a..b1274d8 100644 --- a/fa_parser.h +++ b/fa_parser.h @@ -46,4 +46,5 @@ void read_fasta(struct opt_arg *args, struct ref_seq *seqs); */ void print_ref_seqs(const struct ref_seq *seqs, int is_rgfa, FILE *out); -#endif \ No newline at end of file +#endif + diff --git a/lbdg.c b/lbdg.c index c9f612c..5a3ac6e 100644 --- a/lbdg.c +++ b/lbdg.c @@ -86,4 +86,5 @@ void lbdg_print_ref_seq(struct ref_seq *seqs, FILE *out) { } free(bit_arr); -} \ No newline at end of file +} + diff --git a/lbdg.h b/lbdg.h index 1a84268..0f20640 100644 --- a/lbdg.h +++ b/lbdg.h @@ -21,4 +21,5 @@ */ void lbdg_print_ref_seq(struct ref_seq *seqs, FILE *out); -#endif \ No newline at end of file +#endif + diff --git a/lcpan.c b/lcpan.c index 219b39a..6eaacb4 100644 --- a/lcpan.c +++ b/lcpan.c @@ -72,4 +72,5 @@ int main(int argc, char* argv[]) { free_ref_seq(&seqs); return 0; -} \ No newline at end of file +} + diff --git a/opt_parser.c b/opt_parser.c index eb95072..e79e716 100644 --- a/opt_parser.c +++ b/opt_parser.c @@ -30,7 +30,7 @@ int summarize(struct opt_arg *args) { return 1; } -void printOptions() { +void printOptions(void) { fprintf(stderr, "[Options]:\n"); fprintf(stderr, "\t--ref | -r Reference FASTA File. (.fai should be present)\n"); fprintf(stderr, "\t--vcf | -v VCF File.\n"); @@ -44,7 +44,7 @@ void printOptions() { fprintf(stderr, "\t--verbose Verbose [Default: false]\n"); } -void printUsage() { +void printUsage(void) { fprintf(stderr, "Usage: ./lcpan [PROGRAM] [OPTIONS]\n\n"); fprintf(stderr, "[PROGRAM]: \n"); fprintf(stderr, "\t-vg: Uses a variation graph-based approach.\n"); diff --git a/struct_def.h b/struct_def.h index e2b96e5..abebefb 100644 --- a/struct_def.h +++ b/struct_def.h @@ -126,4 +126,5 @@ struct t_arg { int *exit_signal; }; -#endif \ No newline at end of file +#endif + diff --git a/vg.c b/vg.c index 753cbf1..d8360ea 100644 --- a/vg.c +++ b/vg.c @@ -499,8 +499,6 @@ void vg_read_vcf(struct opt_arg *args, struct ref_seq *seqs) { exit(EXIT_FAILURE); } - int line_count = 0; - int rem_vars_capacity = 256; int rem_vars_size = 0; uint64_t *rem_vars = (uint64_t *)malloc(rem_vars_capacity * sizeof(uint64_t)); // id+end @@ -532,7 +530,6 @@ void vg_read_vcf(struct opt_arg *args, struct ref_seq *seqs) { // validate `line` if (skip_line || len < 2 || line[0] == '#') continue; if (line[len - 1] == '\n') { line[len - 1] = '\0'; len--; } - line_count++; // parse the `line` char *chrom, *index, *id, *ref, *alt; @@ -857,3 +854,4 @@ void vg_read_vcf(struct opt_arg *args, struct ref_seq *seqs) { fclose(out_segment); fclose(out_link); } + diff --git a/vg.h b/vg.h index 33327dc..fc51c65 100644 --- a/vg.h +++ b/vg.h @@ -25,4 +25,5 @@ */ void vg_read_vcf(struct opt_arg *args, struct ref_seq *seqs); -#endif \ No newline at end of file +#endif + diff --git a/vgx.c b/vgx.c index 93c99b0..dbd92a8 100644 --- a/vgx.c +++ b/vgx.c @@ -414,4 +414,5 @@ void vgx_read_vcf(struct opt_arg *args, struct ref_seq *seqs) { fclose(out_log); printf("[INFO] Ended processing %d lines. \n", line_count); -} \ No newline at end of file +} + diff --git a/vgx.h b/vgx.h index bc172d7..deaa2c7 100644 --- a/vgx.h +++ b/vgx.h @@ -23,4 +23,5 @@ */ void vgx_read_vcf(struct opt_arg *args, struct ref_seq *seqs); -#endif \ No newline at end of file +#endif +