Skip to content

Commit cc4c259

Browse files
committed
Merge pull request #34 from tseemann/clean_compile
Major cleanup to use standard C string functions
2 parents 841da70 + 0a17fa5 commit cc4c259

File tree

9 files changed

+35
-67
lines changed

9 files changed

+35
-67
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ This program finds snp sites from a multi fasta alignment file.
1010
-p output a phylip file
1111
-o specify an output filename
1212
-h this help message
13+
-V print version and exit
1314
<file> input alignment file which can optionally be gzipped
1415
```
1516

snp-sites.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ OPTIONS
3434
*-h*::
3535
This document
3636

37+
*-V*::
38+
Show version and exit
39+
3740
EXAMPLES
3841
--------
3942
snp-sites my-alignment.aln

src/alignment-file.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -226,13 +226,13 @@ char * read_line(char sequence[], FILE * pFilePtr)
226226

227227

228228
while((pcRes = fgets(current_line_buffer, sizeof(current_line_buffer), pFilePtr)) != NULL){
229-
if(size_of_string(sequence) > 0)
229+
if(strlen(sequence) > 0)
230230
{
231-
sequence = realloc(sequence, sizeof(char)*(size_of_string(sequence) + size_of_string(current_line_buffer) + 2) );
231+
sequence = realloc(sequence, sizeof(char)*(strlen(sequence) + strlen(current_line_buffer) + 2) );
232232
}
233-
concat_strings_created_with_malloc(sequence,current_line_buffer);
233+
strcat(sequence,current_line_buffer);
234234
current_line_buffer[0] = '\0';
235-
lineLength = size_of_string(sequence);
235+
lineLength = strlen(sequence);
236236
//if end of line character is found then exit from loop
237237

238238
if((sequence)[lineLength] == '\n' || (sequence)[lineLength] == '\0'){
@@ -257,7 +257,7 @@ void get_sample_names_for_header(char filename[], char ** sequence_names, int nu
257257
seq = kseq_init(fp);
258258

259259
while ((l = kseq_read(seq)) >= 0) {
260-
memcpy(sequence_names[i], seq->name.s, size_of_string(seq->name.s)+1);
260+
strcpy(sequence_names[i], seq->name.s);
261261
i++;
262262
}
263263
kseq_destroy(seq);

src/fasta-of-snp-sites.c

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,21 +29,17 @@ void create_fasta_of_snp_sites(char filename[], int number_of_snps, char ** base
2929
FILE *fasta_file_pointer;
3030
int sample_counter;
3131
int snp_counter;
32-
char * base_filename;
33-
34-
base_filename = (char *) calloc(FILENAME_MAX,sizeof(char));
35-
memcpy(base_filename, filename, FILENAME_MAX*sizeof(char));
36-
fasta_file_pointer = fopen(base_filename, "w");
32+
33+
fasta_file_pointer = fopen(filename, "w");
3734

3835
for(sample_counter=0; sample_counter< number_of_samples; sample_counter++)
3936
{
4037
fprintf( fasta_file_pointer, ">%s\n", sequence_names[sample_counter]);
4138
for(snp_counter=0; snp_counter< number_of_snps; snp_counter++)
4239
{
43-
fprintf( fasta_file_pointer, "%c", bases_for_snps[snp_counter][sample_counter]);
40+
fputc( bases_for_snps[snp_counter][sample_counter], fasta_file_pointer );
4441
}
4542
fprintf( fasta_file_pointer, "\n");
4643
}
4744
fclose(fasta_file_pointer);
48-
free(base_filename);
4945
}

src/main.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ int main (int argc, char **argv) {
7373
output_phylip_file = 1;
7474
break;
7575
case 'o':
76-
memcpy(output_filename, optarg, size_of_string(optarg) +1);
76+
strncpy(output_filename, optarg, FILENAME_MAX);
7777
break;
7878
case 'h':
7979
print_usage();
@@ -84,8 +84,8 @@ int main (int argc, char **argv) {
8484

8585
if(optind < argc)
8686
{
87-
memcpy(multi_fasta_filename, argv[optind], size_of_string(argv[optind]) +1);
88-
generate_snp_sites(multi_fasta_filename, output_multi_fasta_file, output_vcf_file, output_phylip_file, output_filename);
87+
strncpy(multi_fasta_filename, argv[optind], FILENAME_MAX);
88+
generate_snp_sites(multi_fasta_filename, output_multi_fasta_file, output_vcf_file, output_phylip_file, output_filename);
8989
}
9090
else
9191
{

src/phylib-of-snp-sites.c

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,29 +27,25 @@
2727

2828
void create_phylib_of_snp_sites(char filename[], int number_of_snps, char ** bases_for_snps, char ** sequence_names, int number_of_samples)
2929
{
30-
FILE *fasta_file_pointer;
30+
FILE *phylip_file_pointer;
3131
int sample_counter;
3232
int snp_counter;
33-
char * base_filename;
34-
35-
base_filename = (char *) calloc(FILENAME_MAX,sizeof(char));
36-
memcpy(base_filename, filename, FILENAME_MAX*sizeof(char));
37-
fasta_file_pointer = fopen(base_filename, "w");
33+
34+
phylip_file_pointer = fopen(filename, "w");
3835

39-
fprintf( fasta_file_pointer, "%d %d\n", number_of_samples, number_of_snps);
36+
fprintf( phylip_file_pointer, "%d %d\n", number_of_samples, number_of_snps);
4037

4138
for(sample_counter=0; sample_counter< number_of_samples; sample_counter++)
4239
{
4340
// sequence_name can be more than 10 (relaxed phylib format) and contain [\w\s]
4441
//TODO check for illegal characters [^\w\s]
45-
fprintf( fasta_file_pointer, "%s\t", sequence_names[sample_counter]);
42+
fprintf( phylip_file_pointer, "%s\t", sequence_names[sample_counter]);
4643

4744
for(snp_counter=0; snp_counter< number_of_snps; snp_counter++)
4845
{
49-
fprintf( fasta_file_pointer, "%c", bases_for_snps[snp_counter][sample_counter]);
46+
fputc( bases_for_snps[snp_counter][sample_counter], phylip_file_pointer);
5047
}
51-
fprintf( fasta_file_pointer, "\n");
48+
fprintf( phylip_file_pointer, "\n");
5249
}
53-
fclose(fasta_file_pointer);
54-
free(base_filename);
50+
fclose(phylip_file_pointer);
5551
}

src/snp-sites.c

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
#include "phylib-of-snp-sites.h"
3030
#include "parse-phylip.h"
3131
#include "string-cat.h"
32-
32+
#include "fasta-of-snp-sites.h"
3333

3434
void build_snp_locations(int snp_locations[], char reference_sequence[])
3535
{
@@ -90,54 +90,45 @@ int generate_snp_sites(char filename[],int output_multi_fasta_file, int output_v
9090
char output_filename_base[FILENAME_MAX];
9191
char filename_without_directory[FILENAME_MAX];
9292
strip_directory_from_filename(filename, filename_without_directory);
93-
memcpy(output_filename_base,filename_without_directory, size_of_string(filename_without_directory)+1 );
93+
strncpy(output_filename_base, filename_without_directory, FILENAME_MAX);
9494

9595
if(output_filename != NULL && *output_filename != '\0')
9696
{
97-
memcpy(output_filename_base,output_filename, size_of_string(output_filename)+1 );
97+
strncpy(output_filename_base, output_filename, FILENAME_MAX);
9898
}
9999

100100
if(output_vcf_file)
101101
{
102-
char * vcf_output_filename;
103-
vcf_output_filename = calloc(FILENAME_MAX,sizeof(char));
104-
memcpy(vcf_output_filename, output_filename_base, (FILENAME_MAX)*sizeof(char));
102+
char vcf_output_filename[FILENAME_MAX];
103+
strncpy(vcf_output_filename, output_filename_base, FILENAME_MAX);
105104
if((output_vcf_file + output_phylip_file + output_multi_fasta_file) > 1 || (output_filename == NULL || *output_filename == '\0') )
106105
{
107-
char extension[5] = {".vcf"};
108-
concat_strings_created_with_malloc(vcf_output_filename,extension);
106+
strcat(vcf_output_filename, ".vcf");
109107
}
110108

111109
create_vcf_file(vcf_output_filename, snp_locations, number_of_snps, bases_for_snps, sequence_names, number_of_samples, length_of_genome);
112-
free(vcf_output_filename);
113110
}
114111

115112
if(output_phylip_file)
116113
{
117-
char *phylip_output_filename;
118-
phylip_output_filename = calloc(FILENAME_MAX,sizeof(char));
119-
memcpy(phylip_output_filename, output_filename_base, (FILENAME_MAX)*sizeof(char));
114+
char phylip_output_filename[FILENAME_MAX];
115+
strncpy(phylip_output_filename, output_filename_base, FILENAME_MAX);
120116
if((output_vcf_file + output_phylip_file + output_multi_fasta_file) > 1 || (output_filename == NULL || *output_filename == '\0') )
121117
{
122-
char extension[10] = {".phylip"};
123-
concat_strings_created_with_malloc(phylip_output_filename,extension);
118+
strcat(phylip_output_filename, ".phylip");
124119
}
125120
create_phylib_of_snp_sites(phylip_output_filename, number_of_snps, bases_for_snps, sequence_names, number_of_samples);
126-
free(phylip_output_filename);
127121
}
128122

129123
if((output_multi_fasta_file) || (output_vcf_file ==0 && output_phylip_file == 0 && output_multi_fasta_file == 0))
130124
{
131-
char *multi_fasta_output_filename;
132-
multi_fasta_output_filename = calloc(FILENAME_MAX,sizeof(char));
133-
memcpy(multi_fasta_output_filename, output_filename_base, (FILENAME_MAX)*sizeof(char));
125+
char multi_fasta_output_filename[FILENAME_MAX];
126+
strncpy(multi_fasta_output_filename, output_filename_base, FILENAME_MAX);
134127
if((output_vcf_file + output_phylip_file + output_multi_fasta_file) > 1 || (output_filename == NULL || *output_filename == '\0') )
135128
{
136-
char extension[20] = {".snp_sites.aln"};
137-
concat_strings_created_with_malloc(multi_fasta_output_filename,extension);
129+
strcat(multi_fasta_output_filename, ".snp_sites.aln");
138130
}
139131
create_fasta_of_snp_sites(multi_fasta_output_filename, number_of_snps, bases_for_snps, sequence_names, number_of_samples);
140-
free(multi_fasta_output_filename);
141132
}
142133

143134
// free memory

src/string-cat.c

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,3 @@
2222
#include <stdlib.h>
2323
#include <string.h>
2424

25-
26-
int size_of_string(char *input_string)
27-
{
28-
int i = 0;
29-
30-
while( input_string[i] != '\0')
31-
{
32-
i++;
33-
}
34-
return i;
35-
}
36-
37-
void concat_strings_created_with_malloc(char *input_string, char *string_to_concat)
38-
{
39-
int input_str_size = size_of_string(input_string);
40-
int to_concat_str_size = size_of_string(string_to_concat);
41-
memcpy(input_string + input_str_size, string_to_concat, (to_concat_str_size+1)*sizeof(char));
42-
}

src/string-cat.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
#define _STRING_CAT_H_
2323

2424
void concat_strings_created_with_malloc(char *input_string, char *string_to_concat);
25-
int size_of_string(char *input_string);
2625

2726
#endif
2827

0 commit comments

Comments
 (0)