1 /* ----------------------------------------------------------------------------
2 @COPYRIGHT :
3 Copyright 1993,1994,1995 David MacDonald,
4 McConnell Brain Imaging Centre,
5 Montreal Neurological Institute, McGill University.
6 Permission to use, copy, modify, and distribute this
7 software and its documentation for any purpose and without
8 fee is hereby granted, provided that the above copyright
9 notice appear in all copies. The author and McGill University
10 make no representations about the suitability of this
11 software for any purpose. It is provided "as is" without
12 express or implied warranty.
13 ---------------------------------------------------------------------------- */
14
15 #include <internal_volume_io.h>
16
17 static const STRING empty_string = "";
18
alloc_string(int length)19 VIOAPI STRING alloc_string(
20 int length )
21 {
22 STRING str;
23
24 ALLOC( str, length+1 );
25
26 return( str );
27 }
28
create_string(STRING initial)29 VIOAPI STRING create_string(
30 STRING initial )
31 {
32 STRING str;
33
34 if( initial == NULL )
35 initial = empty_string;
36
37 str = alloc_string( string_length(initial) );
38
39 (void) strcpy( str, initial );
40
41 return( str );
42 }
43
delete_string(STRING string)44 VIOAPI void delete_string(
45 STRING string )
46 {
47 if( string != NULL )
48 FREE( string );
49 }
50
concat_strings(STRING str1,STRING str2)51 VIOAPI STRING concat_strings(
52 STRING str1,
53 STRING str2 )
54 {
55 STRING str;
56
57 if( str1 == NULL )
58 str1 = empty_string;
59
60 if( str2 == NULL )
61 str2 = empty_string;
62
63 ALLOC( str, string_length(str1) + string_length(str2) + 1 );
64
65 (void) strcpy( str, str1 );
66 (void) strcat( str, str2 );
67
68 return( str );
69 }
70
replace_string(STRING * string,STRING new_string)71 VIOAPI void replace_string(
72 STRING *string,
73 STRING new_string )
74 {
75 delete_string( *string );
76 *string = new_string;
77 }
78
concat_char_to_string(STRING * string,char ch)79 VIOAPI void concat_char_to_string(
80 STRING *string,
81 char ch )
82 {
83 int len;
84
85 len = string_length( *string );
86
87 if( *string == NULL )
88 *string = alloc_string( 1 );
89 else
90 SET_ARRAY_SIZE( *string, len+1, len+2, 1 );
91
92 (*string)[len] = ch;
93 (*string)[len+1] = END_OF_STRING;
94 }
95
concat_to_string(STRING * string,STRING str2)96 VIOAPI void concat_to_string(
97 STRING *string,
98 STRING str2 )
99 {
100 STRING new_string;
101
102 new_string = concat_strings( *string, str2 );
103 replace_string( string, new_string );
104 }
105
string_length(STRING string)106 VIOAPI int string_length(
107 STRING string )
108 {
109 if( string == NULL )
110 return( 0 );
111 else
112 return( (int) strlen( string ) );
113 }
114
equal_strings(STRING str1,STRING str2)115 VIOAPI BOOLEAN equal_strings(
116 STRING str1,
117 STRING str2 )
118 {
119 if( str1 == NULL )
120 str1 = empty_string;
121 if( str2 == NULL )
122 str2 = empty_string;
123
124 return( strcmp( str1, str2 ) == 0 );
125 }
126
is_lower_case(char ch)127 VIOAPI BOOLEAN is_lower_case(
128 char ch )
129 {
130 return( ch >= 'a' && ch <= 'z' );
131 }
132
is_upper_case(char ch)133 VIOAPI BOOLEAN is_upper_case(
134 char ch )
135 {
136 return( ch >= 'A' && ch <= 'Z' );
137 }
138
get_lower_case(char ch)139 VIOAPI char get_lower_case(
140 char ch )
141 {
142 if( is_upper_case( ch ) )
143 return( (char) ((ch)+'a'-'A') );
144 else
145 return( ch );
146 }
147
get_upper_case(char ch)148 VIOAPI char get_upper_case(
149 char ch )
150 {
151 if( is_lower_case( ch ) )
152 return( (char) ((ch)+'A'-'a') );
153 else
154 return( ch );
155 }
156
157 /* ----------------------------- MNI Header -----------------------------------
158 @NAME : string_ends_in
159 @INPUT : string
160 : ending
161 @OUTPUT :
162 @RETURNS : TRUE if string ends in "ending"
163 @DESCRIPTION: Checks if the string ends in ending, e.g.,
164 : string_ends_in( "main.c", ".c" ) returns true.
165 @METHOD :
166 @GLOBALS :
167 @CALLS :
168 @CREATED : David MacDonald
169 @MODIFIED :
170 ---------------------------------------------------------------------------- */
171
string_ends_in(STRING string,STRING ending)172 VIOAPI BOOLEAN string_ends_in(
173 STRING string,
174 STRING ending )
175 {
176 int len_string, len_ending;
177 BOOLEAN ending_present;
178
179 len_string = string_length( string );
180 len_ending = string_length( ending );
181
182 if( len_ending > len_string )
183 ending_present = FALSE;
184 else
185 ending_present = equal_strings( &string[len_string-len_ending], ending);
186
187 return( ending_present );
188 }
189
190 /* ----------------------------- MNI Header -----------------------------------
191 @NAME : strip_outer_blanks
192 @INPUT : str
193 @OUTPUT : stripped
194 @RETURNS :
195 @DESCRIPTION: Creates a new string which is the original str without any
196 : leading or trailing blanks. Output argument may be the same
197 pointer as input.
198 @METHOD :
199 @GLOBALS :
200 @CALLS :
201 @CREATED : David MacDonald
202 @MODIFIED :
203 ---------------------------------------------------------------------------- */
204
strip_outer_blanks(STRING str)205 VIOAPI STRING strip_outer_blanks(
206 STRING str )
207 {
208 STRING stripped;
209 int i, first_non_blank, last_non_blank, len;
210
211 len = string_length( str );
212
213 /* --- skip leading blanks */
214
215 first_non_blank = 0;
216 while( first_non_blank < len && str[first_non_blank] == ' ' )
217 {
218 ++first_non_blank;
219 }
220
221 /* --- skip trailing blanks */
222
223 last_non_blank = len-1;
224 while( last_non_blank >= 0 && str[last_non_blank] == ' ' )
225 {
226 --last_non_blank;
227 }
228
229 /* --- now copy string, without leading or trailing blanks */
230
231 if( first_non_blank > last_non_blank )
232 last_non_blank = first_non_blank - 1;
233
234 stripped = alloc_string( last_non_blank - first_non_blank + 1 );
235
236 for_inclusive( i, first_non_blank, last_non_blank )
237 stripped[i-first_non_blank] = str[i];
238
239 stripped[last_non_blank - first_non_blank + 1] = END_OF_STRING;
240
241 return( stripped );
242 }
243
244 /* ----------------------------- MNI Header -----------------------------------
245 @NAME : find_character
246 @INPUT : string
247 : ch
248 @OUTPUT :
249 @RETURNS : index of ch within string or -1
250 @DESCRIPTION: Finds the index of the given character within the string.
251 @METHOD :
252 @GLOBALS :
253 @CALLS :
254 @CREATED : David MacDonald
255 @MODIFIED :
256 ---------------------------------------------------------------------------- */
257
find_character(STRING string,char ch)258 VIOAPI int find_character(
259 STRING string,
260 char ch )
261 {
262 int i;
263
264 if( string == NULL )
265 return( -1 );
266
267 i = 0;
268 while( string[i] != END_OF_STRING )
269 {
270 if( string[i] == ch )
271 return( i );
272 ++i;
273 }
274
275 return( -1 );
276 }
277
278 /* ----------------------------- MNI Header -----------------------------------
279 @NAME : make_string_upper_case
280 @INPUT : string
281 @OUTPUT : string
282 @RETURNS :
283 @DESCRIPTION: Converts every lower case character in string to upper case.
284 @METHOD :
285 @GLOBALS :
286 @CALLS :
287 @CREATED : David MacDonald
288 @MODIFIED :
289 ---------------------------------------------------------------------------- */
290
make_string_upper_case(STRING string)291 VIOAPI void make_string_upper_case(
292 STRING string )
293 {
294 int i, len;
295
296 len = string_length( string );
297
298 for_less( i, 0, len )
299 {
300 string[i] = get_upper_case( string[i] );
301 }
302 }
303
304 /* ----------------------------- MNI Header -----------------------------------
305 @NAME : blank_string
306 @INPUT : string
307 @OUTPUT :
308 @RETURNS : TRUE if string is blank
309 @DESCRIPTION: Checks to see if the string is blank; only contains space,
310 tabs, and newlines.
311 @METHOD :
312 @GLOBALS :
313 @CALLS :
314 @CREATED : 1993 David MacDonald
315 @MODIFIED :
316 ---------------------------------------------------------------------------- */
317
blank_string(STRING string)318 VIOAPI BOOLEAN blank_string(
319 STRING string )
320 {
321 int i;
322 BOOLEAN blank;
323
324 if( string == NULL )
325 string = empty_string;
326
327 blank = TRUE;
328 i = 0;
329 while( string[i] != END_OF_STRING )
330 {
331 if( string[i] != ' ' && string[i] != '\t' && string[i] != '\n' )
332 {
333 blank = FALSE;
334 break;
335 }
336 ++i;
337 }
338
339 return( blank );
340 }
341