annotate clustalomega/clustal-omega-1.0.2/src/squid/sre_string.c @ 1:bc707542e5de

Uploaded
author clustalomega
date Thu, 21 Jul 2011 13:35:08 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
1 /*****************************************************************
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
2 * SQUID - a library of functions for biological sequence analysis
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
3 * Copyright (C) 1992-2002 Washington University School of Medicine
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
4 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
5 * This source code is freely distributed under the terms of the
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
6 * GNU General Public License. See the files COPYRIGHT and LICENSE
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
7 * for details.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
8 *****************************************************************/
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
9
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
10 /* sre_string.c
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
11 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
12 * my library of extra string functions. Some for portability
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
13 * across UNIXes
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
14 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
15 * RCS $Id: sre_string.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: sre_string.c,v 1.11 2001/06/07 16:59:37 eddy Exp)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
16 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
17
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
18 #include <stdio.h>
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
19 #include <stdlib.h>
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
20 #include <string.h>
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
21 #include <stdarg.h>
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
22 #include <ctype.h>
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
23 #include "squid.h"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
24
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
25 /* Function: Strdup()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
26 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
27 * Purpose: Implementation of the common (but non-ANSI) function
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
28 * strdup(). Robust against being passed a NULL pointer.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
29 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
30 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
31 char *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
32 Strdup(char *s)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
33 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
34 char *new;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
35 if (s == NULL) return NULL;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
36 if ((new = (char *) malloc (strlen(s) +1)) == NULL) return NULL;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
37 strcpy(new, s);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
38 return new;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
39 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
40
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
41 /* Function: StringChop()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
42 * Date: SRE, Wed Oct 29 12:10:02 1997 [TWA 721]
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
43 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
44 * Purpose: Chop trailing whitespace off of a string.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
45 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
46 void
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
47 StringChop(char *s)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
48 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
49 int i;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
50
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
51 i = strlen(s) - 1; /* set i at last char in string */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
52 while (i >= 0 && isspace((int) s[i])) i--; /* i now at last non-whitespace char, or -1 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
53 s[i+1] = '\0';
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
54 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
55
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
56 int
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
57 Strinsert(char *s1, /* string to insert a char into */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
58 char c, /* char to insert */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
59 int pos) /* position in s1 to insert c at */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
60 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
61 char oldc;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
62 char *s;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
63
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
64 for (s = s1 + pos; c; s++)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
65 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
66 /* swap current char for inserted one */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
67 oldc = *s; /* pick up current */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
68 *s = c; /* put down inserted one */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
69 c = oldc; /* old becomes next to insert */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
70 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
71 *s = '\0';
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
72
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
73 return 1;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
74 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
75
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
76
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
77 int
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
78 Strdelete(char *s1, /* string to delete a char from */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
79 int pos) /* position of char to delete 0..n-1 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
80 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
81 char *s;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
82
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
83 for (s = s1 + pos; *s; s++)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
84 *s = *(s + 1);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
85
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
86 return 1;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
87 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
88
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
89 void
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
90 s2lower(char *s)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
91 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
92 for (; *s != '\0'; s++)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
93 *s = sre_tolower((int) *s);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
94 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
95
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
96 void
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
97 s2upper(char *s)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
98 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
99 for (; *s != '\0'; s++)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
100 *s = sre_toupper((int) *s);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
101 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
102
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
103
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
104 void *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
105 sre_malloc(char *file, int line, size_t size)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
106 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
107 void *ptr;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
108
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
109 SQD_DPRINTF3(("MALLOC: %d bytes (file %s line %d)\n", size, file, line));
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
110 if ((ptr = malloc (size)) == NULL)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
111 Die("malloc of %ld bytes failed: file %s line %d", size, file, line);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
112 return ptr;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
113 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
114
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
115 void *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
116 sre_realloc(char *file, int line, void *p, size_t size)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
117 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
118 void *ptr;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
119
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
120 if ((ptr = realloc(p, size)) == NULL)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
121 Die("realloc of %ld bytes failed: file %s line %d", size, file, line);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
122 return ptr;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
123 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
124
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
125
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
126
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
127 /* Function: Free2DArray(), Free3DArray()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
128 * Date: SRE, Tue Jun 1 14:47:14 1999 [St. Louis]
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
129 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
130 * Purpose: Convenience functions for free'ing 2D
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
131 * and 3D pointer arrays. Tolerates any of the
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
132 * pointers being NULL, to allow "sparse"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
133 * arrays.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
134 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
135 * Args: p - array to be freed
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
136 * dim1 - n for first dimension
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
137 * dim2 - n for second dimension
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
138 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
139 * e.g. a 2d array is indexed p[0..dim1-1][]
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
140 * a 3D array is indexed p[0..dim1-1][0..dim2-1][]
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
141 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
142 * Returns: void
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
143 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
144 * Diagnostics: (void)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
145 * "never fails"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
146 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
147 void
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
148 Free2DArray(void **p, int dim1)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
149 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
150 int i;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
151
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
152 if (p != NULL) {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
153 for (i = 0; i < dim1; i++)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
154 if (p[i] != NULL) free(p[i]);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
155 free(p);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
156 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
157 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
158 void
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
159 Free3DArray(void ***p, int dim1, int dim2)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
160 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
161 int i, j;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
162
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
163 if (p != NULL) {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
164 for (i = 0; i < dim1; i++)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
165 if (p[i] != NULL) {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
166 for (j = 0; j < dim2; j++)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
167 if (p[i][j] != NULL) free(p[i][j]);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
168 free(p[i]);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
169 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
170 free(p);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
171 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
172 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
173
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
174
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
175 /* Function: RandomSequence()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
176 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
177 * Purpose: Generate an iid symbol sequence according
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
178 * to some alphabet, alphabet_size, probability
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
179 * distribution, and length. Return the
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
180 * sequence.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
181 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
182 * Args: alphabet - e.g. "ACGT"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
183 * p - probability distribution [0..n-1]
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
184 * n - number of symbols in alphabet
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
185 * len - length of generated sequence
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
186 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
187 * Return: ptr to random sequence, or NULL on failure.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
188 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
189 char *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
190 RandomSequence(char *alphabet, float *p, int n, int len)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
191 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
192 char *s;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
193 int x;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
194
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
195 s = (char *) MallocOrDie (sizeof(char) * (len+1));
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
196 for (x = 0; x < len; x++)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
197 s[x] = alphabet[FChoose(p,n)];
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
198 s[x] = '\0';
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
199 return s;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
200 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
201
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
202 /* Function: sre_fgets()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
203 * Date: SRE, Thu May 13 10:56:28 1999 [St. Louis]
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
204 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
205 * Purpose: Dynamic allocation version of fgets(),
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
206 * capable of reading unlimited line lengths.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
207 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
208 * Args: buf - ptr to a string (may be reallocated)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
209 * n - ptr to current allocated length of buf,
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
210 * (may be changed)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
211 * fp - open file ptr for reading
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
212 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
213 * Before the first call to sre_fgets(),
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
214 * buf should be initialized to NULL and n to 0.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
215 * They're a linked pair, so don't muck with the
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
216 * allocation of buf or the value of n while
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
217 * you're still doing sre_fgets() calls with them.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
218 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
219 * Returns: ptr to the buffer on success.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
220 * NULL on EOF (buf isn't to be used in this case)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
221 * sre_fgets() *always* results in an allocation
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
222 * in buf.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
223 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
224 * The reason to have it return a ptr to buf
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
225 * is that it makes wrapper macros easy; see
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
226 * MSAFileGetLine() for an example.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
227 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
228 * Example: char *buf;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
229 * int n;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
230 * FILE *fp;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
231 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
232 * fp = fopen("my_file", "r");
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
233 * buf = NULL;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
234 * n = 0;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
235 * while (sre_fgets(&buf, &n, fp) != NULL)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
236 * {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
237 * do stuff with buf;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
238 * }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
239 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
240 char *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
241 sre_fgets(char **buf, int *n, FILE *fp)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
242 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
243 char *s;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
244 int len;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
245 int pos;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
246
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
247 if (*n == 0)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
248 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
249 *buf = MallocOrDie(sizeof(char) * 128);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
250 *n = 128;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
251 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
252
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
253 /* Simple case 1. We're sitting at EOF, or there's an error.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
254 * fgets() returns NULL, so we return NULL.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
255 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
256 if (fgets(*buf, *n, fp) == NULL) return NULL;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
257
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
258 /* Simple case 2. fgets() got a string, and it reached EOF.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
259 * return success status, so caller can use
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
260 * the last line; on the next call we'll
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
261 * return the 0 for the EOF.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
262 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
263 if (feof(fp)) return *buf;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
264
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
265 /* Simple case 3. We got a complete string, with \n,
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
266 * and don't need to extend the buffer.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
267 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
268 len = strlen(*buf);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
269 if ((*buf)[len-1] == '\n') return *buf;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
270
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
271 /* The case we're waiting for. We have an incomplete string,
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
272 * and we have to extend the buffer one or more times. Make
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
273 * sure we overwrite the previous fgets's \0 (hence +(n-1)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
274 * in first step, rather than 128, and reads of 129, not 128).
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
275 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
276 pos = (*n)-1;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
277 while (1) {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
278 *n += 128;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
279 *buf = ReallocOrDie(*buf, sizeof(char) * (*n));
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
280 s = *buf + pos;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
281 if (fgets(s, 129, fp) == NULL) return *buf;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
282 len = strlen(s);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
283 if (s[len-1] == '\n') return *buf;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
284 pos += 128;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
285 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
286 /*NOTREACHED*/
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
287 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
288
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
289 /* Function: sre_strcat()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
290 * Date: SRE, Thu May 13 09:36:32 1999 [St. Louis]
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
291 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
292 * Purpose: Dynamic memory version of strcat().
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
293 * appends src to the string that dest points to,
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
294 * extending allocation for dest if necessary.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
295 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
296 * One timing experiment (100 successive appends of
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
297 * 1-255 char) shows sre_strcat() has about a 20%
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
298 * overhead relative to strcat(). However, if optional
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
299 * length info is passed, sre_strcat() is about 30%
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
300 * faster than strcat().
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
301 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
302 * Args: dest - ptr to string (char **), '\0' terminated
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
303 * ldest - length of dest, if known; or -1 if length unknown.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
304 * src - string to append to dest, '\0' terminated
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
305 * lsrc - length of src, if known; or -1 if length unknown.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
306 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
307 * dest may be NULL, in which case this is
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
308 * the equivalent of dest = Strdup(src).
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
309 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
310 * src may also be NULL, in which case
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
311 * dest is unmodified (but why would you want to pass
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
312 * a NULL src?)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
313 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
314 * if both dest and src are NULL, dest is
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
315 * unmodified; it stays NULL.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
316 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
317 * the length parameters are optional. If a -1
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
318 * is passed, sre_strcat() will call strlen() to
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
319 * determine the length itself. Passing length
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
320 * info saves the strlen() calls and can speed things
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
321 * up if lots of successive appends need to be done.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
322 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
323 * Returns: new length of dest (>=0 on success);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
324 * dest is (probably) reallocated, and modified
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
325 * to a longer string, '\0' terminated.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
326 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
327 int
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
328 sre_strcat(char **dest, int ldest, char *src, int lsrc)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
329 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
330 int len1, len2;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
331
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
332 if (ldest < 0) len1 = ((*dest == NULL) ? 0 : strlen(*dest));
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
333 else len1 = ldest;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
334
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
335 if (lsrc < 0) len2 = (( src == NULL) ? 0 : strlen(src));
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
336 else len2 = lsrc;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
337
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
338 if (len2 == 0) return len1;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
339
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
340 if (*dest == NULL) *dest = MallocOrDie(sizeof(char) * (len2+1));
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
341 else *dest = ReallocOrDie(*dest, sizeof(char) * (len1+len2+1));
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
342
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
343 memcpy((*dest)+len1, src, len2+1);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
344 return len1+len2;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
345 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
346
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
347 /* Function: sre_strtok()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
348 * Date: SRE, Wed May 19 16:30:20 1999 [St. Louis]
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
349 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
350 * Purpose: Thread-safe version of strtok().
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
351 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
352 * Returns ptr to next token in a string: skips
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
353 * until it reaches a character that is not in the delim
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
354 * string, and sets beginning of token. Skips to
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
355 * next delim character (or '\0') to set the end; replaces that
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
356 * character with '\0'.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
357 * If there's still more string left, sets s to point to next
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
358 * character after the '\0' that was written, so successive
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
359 * calls extract tokens in succession. If there was no string
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
360 * left, s points at the terminal '\0'.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
361 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
362 * If no token is found, returns NULL.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
363 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
364 * Also returns the length of the token, which
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
365 * may save us a strlen() call in some applications.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
366 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
367 * Limitations:
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
368 * *s can't be a constant string, since we write to it.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
369 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
370 * Example:
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
371 * char *tok;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
372 * int len;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
373 * char *s;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
374 * char buf[50] = "This is a sentence.";
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
375 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
376 * s = buf;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
377 * tok = sre_strtok(&s, " ", &len);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
378 * tok is "This"; s is "is a sentence."; len is 4.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
379 * tok = sre_strtok(&s, " ", &len);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
380 * tok is "is"; s is " a sentence."; len is 2.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
381 * tok = sre_strtok(&s, " ", &len);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
382 * tok is "a"; s is "sentence."; len is 1.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
383 * tok = sre_strtok(&s, " ", &len);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
384 * tok is "sentence."; s is "\0"; len is 9.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
385 * tok = sre_strtok(&s, " ", &len);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
386 * tok is NULL; s is "\0", len is undefined.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
387 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
388 * Args: s - a tmp, modifiable ptr to string
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
389 * delim - characters that delimits tokens
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
390 * len - RETURN: length of token; pass NULL if not wanted
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
391 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
392 * Returns: ptr to next token, or NULL if there aren't any.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
393 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
394 char *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
395 sre_strtok(char **s, char *delim, int *len)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
396 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
397 char *begin, *end;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
398 int n;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
399
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
400 begin = *s;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
401 begin += strspn(begin, delim);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
402 if (! *begin) return NULL;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
403
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
404 n = strcspn(begin, delim);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
405 end = begin + n;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
406 if (*end == '\0') { *s = end;}
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
407 else {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
408 *end = '\0';
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
409 *s = end+1;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
410 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
411
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
412 if (len != NULL) *len = n;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
413 return begin;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
414 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
415
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
416
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
417
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
418 /* Function: sre_strdup()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
419 * Date: SRE, Wed May 19 17:57:28 1999 [St. Louis]
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
420 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
421 * Purpose: A version of the common but non-ANSI strdup()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
422 * function. Can pass len, if known, to save a
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
423 * strlen() call.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
424 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
425 * Args: s - string to duplicate
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
426 * n - length of string, if known; -1 if unknown.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
427 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
428 * Returns: allocated copy of string.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
429 * NULL on failure.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
430 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
431 char *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
432 sre_strdup(char *s, int n)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
433 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
434 char *new;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
435
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
436 if (s == NULL) return NULL;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
437 if (n < 0) n = strlen(s);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
438 new = MallocOrDie (sizeof(char) * (n+1));
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
439 strcpy(new, s);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
440 return new;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
441 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
442
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
443
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
444 /* Function: sre_strncpy()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
445 * Date: SRE, Tue Jun 22 10:10:46 1999 [Sanger Centre]
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
446 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
447 * Purpose: a strncpy() that makes sure it adds a trailing \0.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
448 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
449 * Args: s1 - string to copy to (allocated n+1 or larger)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
450 * s2 - string to copy from
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
451 * n - number of chars to copy
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
452 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
453 * Returns: s1.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
454 * Done only for consistency with strncpy(). Not clear
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
455 * why it's useful for a strncpy() to return s1.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
456 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
457 char *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
458 sre_strncpy(char *s1, char *s2, int n)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
459 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
460 strncpy(s1,s2,n);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
461 s1[n] = '\0';
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
462 return s1;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
463 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
464
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
465 /* Function: IsBlankline()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
466 * Date: SRE, Fri Jun 18 14:36:08 1999 [St. Louis]
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
467 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
468 * Purpose: Returns TRUE if string consists solely of whitespace.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
469 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
470 * Args: s - string to check
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
471 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
472 int
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
473 IsBlankline(char *s)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
474 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
475 for (; *s != '\0'; s++)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
476 if (! isspace(*s)) return FALSE;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
477 return TRUE;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
478 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
479
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
480
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
481
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
482 #ifdef CUBS_WIN
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
483 /* A timing test for sre_strcat()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
484 * cc -O2 -g sre_string.c sre_ctype.c sqerror.c sre_math.c hsregex.c -lm
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
485 * 15.200u - 5.360u = 9.84u if sre_strcat() with no length info passed
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
486 * 13.660u - 5.360u = 8.30u if strcat(), with a single malloc().
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
487 * 11.370u - 5.360u = 6.01u if sre_strcat() with length info passed.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
488 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
489 int main(void)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
490 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
491 float p[4] = {0.25, 0.25, 0.25, 0.25};
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
492 int buflen;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
493 int len;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
494 int nappends;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
495 int nstrings;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
496 char *s1 = NULL;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
497 char *s2;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
498 int i;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
499
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
500 nappends = 100;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
501 nstrings = 1000;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
502 while (nstrings--)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
503 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
504 /* s1 = malloc(sizeof(char) * (255*nappends+1));
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
505 s1[0] = '\0';
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
506 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
507
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
508 s1 = NULL;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
509 len = 0;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
510 for (i = 0; i < nappends; i++)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
511 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
512 buflen = CHOOSE(255) + 1;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
513 s2 = RandomSequence("ACGT", p, 4, buflen);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
514
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
515 /* strcat(s1,s2); */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
516 if ((len = sre_strcat(&s1, len, s2, buflen)) < 0) exit(1);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
517 free(s2);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
518 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
519 free(s1);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
520 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
521 exit(0);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
522 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
523 #endif /*CUBS_WIN*/