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