xref: /petsc/src/sys/utils/str.c (revision 7ba3a57c1a41d0d4ac9568ddc4edec2fa54aa2cd)
17d0a6c19SBarry Smith 
2e5c89e4eSSatish Balay /*
3e5c89e4eSSatish Balay     We define the string operations here. The reason we just do not use
4e5c89e4eSSatish Balay   the standard string routines in the PETSc code is that on some machines
5e5c89e4eSSatish Balay   they are broken or have the wrong prototypes.
6e5c89e4eSSatish Balay 
7e5c89e4eSSatish Balay */
8c6db04a5SJed Brown #include <petscsys.h>                   /*I  "petscsys.h"   I*/
9e5c89e4eSSatish Balay #if defined(PETSC_HAVE_STRING_H)
10e5c89e4eSSatish Balay #include <string.h>
11e5c89e4eSSatish Balay #endif
12e5c89e4eSSatish Balay #if defined(PETSC_HAVE_STRINGS_H)
13e5c89e4eSSatish Balay #include <strings.h>
14e5c89e4eSSatish Balay #endif
15e5c89e4eSSatish Balay 
16e5c89e4eSSatish Balay #undef __FUNCT__
173c311c98SBarry Smith #define __FUNCT__ "PetscStrToArray"
183c311c98SBarry Smith /*@C
19b4cd4cebSBarry Smith    PetscStrToArray - Seperates a string by its spaces and creates an array of strings
203c311c98SBarry Smith 
213c311c98SBarry Smith    Not Collective
223c311c98SBarry Smith 
233c311c98SBarry Smith    Input Parameters:
243c311c98SBarry Smith .  s - pointer to string
253c311c98SBarry Smith 
263c311c98SBarry Smith    Output Parameter:
273c311c98SBarry Smith +   argc - the number of entries in the array
283c311c98SBarry Smith -   args - an array of the entries with a null at the end
293c311c98SBarry Smith 
303c311c98SBarry Smith    Level: intermediate
313c311c98SBarry Smith 
32301d30feSBarry Smith    Notes: this may be called before PetscInitialize() or after PetscFinalize()
333c311c98SBarry Smith 
346f013253SBarry Smith    Not for use in Fortran
356f013253SBarry Smith 
36b4cd4cebSBarry Smith    Developer Notes: Using raw malloc() and does not call error handlers since this may be used before PETSc is initialized. Used
37b4cd4cebSBarry Smith      to generate argc, args arguments passed to MPI_Init()
38301d30feSBarry Smith 
39b4cd4cebSBarry Smith .seealso: PetscStrToArrayDestroy(), PetscToken, PetscTokenCreate()
403c311c98SBarry Smith 
413c311c98SBarry Smith @*/
427087cfbeSBarry Smith PetscErrorCode  PetscStrToArray(const char s[],int *argc,char ***args)
433c311c98SBarry Smith {
443c311c98SBarry Smith   int        i,n,*lens,cnt = 0;
45ace3abfcSBarry Smith   PetscBool  flg = PETSC_FALSE;
463c311c98SBarry Smith 
473c311c98SBarry Smith   n = strlen(s);
483c311c98SBarry Smith   *argc = 0;
493c311c98SBarry Smith   for (i=0; i<n; i++) {
503c311c98SBarry Smith     if (s[i] != ' ') break;
513c311c98SBarry Smith   }
523c311c98SBarry Smith   for (;i<n+1; i++) {
533c311c98SBarry Smith     if ((s[i] == ' ' || s[i] == 0) && !flg) {flg = PETSC_TRUE; (*argc)++;}
543c311c98SBarry Smith     else if (s[i] != ' ') {flg = PETSC_FALSE;}
553c311c98SBarry Smith   }
56301d30feSBarry Smith   (*args) = (char **) malloc(((*argc)+1)*sizeof(char**)); if (!*args) return PETSC_ERR_MEM;
5753e6e2c4SHong Zhang   lens    = (int*) malloc((*argc)*sizeof(int)); if (!lens) return PETSC_ERR_MEM;
583c311c98SBarry Smith   for (i=0; i<*argc; i++) lens[i] = 0;
593c311c98SBarry Smith 
603c311c98SBarry Smith   *argc = 0;
613c311c98SBarry Smith   for (i=0; i<n; i++) {
623c311c98SBarry Smith     if (s[i] != ' ') break;
633c311c98SBarry Smith   }
643c311c98SBarry Smith   for (;i<n+1; i++) {
653c311c98SBarry Smith     if ((s[i] == ' ' || s[i] == 0) && !flg) {flg = PETSC_TRUE; (*argc)++;}
663c311c98SBarry Smith     else if (s[i] != ' ') {lens[*argc]++;flg = PETSC_FALSE;}
673c311c98SBarry Smith   }
683c311c98SBarry Smith 
693c311c98SBarry Smith   for (i=0; i<*argc; i++) {
70675282fdSHong Zhang     (*args)[i] = (char*) malloc((lens[i]+1)*sizeof(char)); if (!(*args)[i]) return PETSC_ERR_MEM;
713c311c98SBarry Smith   }
72301d30feSBarry Smith   (*args)[*argc] = 0;
733c311c98SBarry Smith 
743c311c98SBarry Smith   *argc = 0;
753c311c98SBarry Smith   for (i=0; i<n; i++) {
763c311c98SBarry Smith     if (s[i] != ' ') break;
773c311c98SBarry Smith   }
783c311c98SBarry Smith   for (;i<n+1; i++) {
793c311c98SBarry Smith     if ((s[i] == ' ' || s[i] == 0) && !flg) {flg = PETSC_TRUE; (*args)[*argc][cnt++] = 0; (*argc)++; cnt = 0;}
80301d30feSBarry Smith     else if (s[i] != ' ' && s[i] != 0) {(*args)[*argc][cnt++] = s[i]; flg = PETSC_FALSE;}
813c311c98SBarry Smith   }
823c311c98SBarry Smith   return 0;
833c311c98SBarry Smith }
843c311c98SBarry Smith 
853c311c98SBarry Smith #undef __FUNCT__
86301d30feSBarry Smith #define __FUNCT__ "PetscStrToArrayDestroy"
87301d30feSBarry Smith /*@C
88301d30feSBarry Smith    PetscStrToArrayDestroy - Frees array created with PetscStrToArray().
89301d30feSBarry Smith 
90301d30feSBarry Smith    Not Collective
91301d30feSBarry Smith 
92301d30feSBarry Smith    Output Parameters:
93301d30feSBarry Smith +  argc - the number of arguments
94301d30feSBarry Smith -  args - the array of arguments
95301d30feSBarry Smith 
96301d30feSBarry Smith    Level: intermediate
97301d30feSBarry Smith 
98301d30feSBarry Smith    Concepts: command line arguments
99301d30feSBarry Smith 
100301d30feSBarry Smith    Notes: This may be called before PetscInitialize() or after PetscFinalize()
101301d30feSBarry Smith 
1026f013253SBarry Smith    Not for use in Fortran
1036f013253SBarry Smith 
104301d30feSBarry Smith .seealso: PetscStrToArray()
105301d30feSBarry Smith 
106301d30feSBarry Smith @*/
1077087cfbeSBarry Smith PetscErrorCode  PetscStrToArrayDestroy(int argc,char **args)
108301d30feSBarry Smith {
109301d30feSBarry Smith   PetscInt i;
110301d30feSBarry Smith 
111301d30feSBarry Smith   for (i=0; i<argc; i++) {
112301d30feSBarry Smith     free(args[i]);
113301d30feSBarry Smith   }
114301d30feSBarry Smith   free(args);
115301d30feSBarry Smith   return 0;
116301d30feSBarry Smith }
117301d30feSBarry Smith 
118301d30feSBarry Smith #undef __FUNCT__
119e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrlen"
120e5c89e4eSSatish Balay /*@C
121e5c89e4eSSatish Balay    PetscStrlen - Gets length of a string
122e5c89e4eSSatish Balay 
123e5c89e4eSSatish Balay    Not Collective
124e5c89e4eSSatish Balay 
125e5c89e4eSSatish Balay    Input Parameters:
126e5c89e4eSSatish Balay .  s - pointer to string
127e5c89e4eSSatish Balay 
128e5c89e4eSSatish Balay    Output Parameter:
129e5c89e4eSSatish Balay .  len - length in bytes
130e5c89e4eSSatish Balay 
131e5c89e4eSSatish Balay    Level: intermediate
132e5c89e4eSSatish Balay 
133e5c89e4eSSatish Balay    Note:
134e5c89e4eSSatish Balay    This routine is analogous to strlen().
135e5c89e4eSSatish Balay 
136e5c89e4eSSatish Balay    Null string returns a length of zero
137e5c89e4eSSatish Balay 
1386f013253SBarry Smith    Not for use in Fortran
1396f013253SBarry Smith 
140e5c89e4eSSatish Balay   Concepts: string length
141e5c89e4eSSatish Balay 
142e5c89e4eSSatish Balay @*/
1437087cfbeSBarry Smith PetscErrorCode  PetscStrlen(const char s[],size_t *len)
144e5c89e4eSSatish Balay {
145e5c89e4eSSatish Balay   PetscFunctionBegin;
146e5c89e4eSSatish Balay   if (!s) {
147e5c89e4eSSatish Balay     *len = 0;
148e5c89e4eSSatish Balay   } else {
149e5c89e4eSSatish Balay     *len = strlen(s);
150e5c89e4eSSatish Balay   }
151e5c89e4eSSatish Balay   PetscFunctionReturn(0);
152e5c89e4eSSatish Balay }
153e5c89e4eSSatish Balay 
154e5c89e4eSSatish Balay #undef __FUNCT__
155e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrallocpy"
156e5c89e4eSSatish Balay /*@C
157e5c89e4eSSatish Balay    PetscStrallocpy - Allocates space to hold a copy of a string then copies the string
158e5c89e4eSSatish Balay 
159e5c89e4eSSatish Balay    Not Collective
160e5c89e4eSSatish Balay 
161e5c89e4eSSatish Balay    Input Parameters:
162e5c89e4eSSatish Balay .  s - pointer to string
163e5c89e4eSSatish Balay 
164e5c89e4eSSatish Balay    Output Parameter:
165e5c89e4eSSatish Balay .  t - the copied string
166e5c89e4eSSatish Balay 
167e5c89e4eSSatish Balay    Level: intermediate
168e5c89e4eSSatish Balay 
169e5c89e4eSSatish Balay    Note:
170e5c89e4eSSatish Balay       Null string returns a new null string
171e5c89e4eSSatish Balay 
1726f013253SBarry Smith       Not for use in Fortran
1736f013253SBarry Smith 
174e5c89e4eSSatish Balay   Concepts: string copy
175e5c89e4eSSatish Balay 
176e5c89e4eSSatish Balay @*/
1777087cfbeSBarry Smith PetscErrorCode  PetscStrallocpy(const char s[],char *t[])
178e5c89e4eSSatish Balay {
179e5c89e4eSSatish Balay   PetscErrorCode ierr;
180e5c89e4eSSatish Balay   size_t         len;
18171573d7dSBarry Smith   char           *tmp = 0;
182e5c89e4eSSatish Balay 
183e5c89e4eSSatish Balay   PetscFunctionBegin;
184e5c89e4eSSatish Balay   if (s) {
185e5c89e4eSSatish Balay     ierr = PetscStrlen(s,&len);CHKERRQ(ierr);
18671573d7dSBarry Smith     ierr = PetscMalloc((1+len)*sizeof(char),&tmp);CHKERRQ(ierr);
18771573d7dSBarry Smith     ierr = PetscStrcpy(tmp,s);CHKERRQ(ierr);
188e5c89e4eSSatish Balay   }
18971573d7dSBarry Smith   *t = tmp;
190e5c89e4eSSatish Balay   PetscFunctionReturn(0);
191e5c89e4eSSatish Balay }
192e5c89e4eSSatish Balay 
193e5c89e4eSSatish Balay #undef __FUNCT__
194e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcpy"
195e5c89e4eSSatish Balay /*@C
196e5c89e4eSSatish Balay    PetscStrcpy - Copies a string
197e5c89e4eSSatish Balay 
198e5c89e4eSSatish Balay    Not Collective
199e5c89e4eSSatish Balay 
200e5c89e4eSSatish Balay    Input Parameters:
201e5c89e4eSSatish Balay .  t - pointer to string
202e5c89e4eSSatish Balay 
203e5c89e4eSSatish Balay    Output Parameter:
204e5c89e4eSSatish Balay .  s - the copied string
205e5c89e4eSSatish Balay 
206e5c89e4eSSatish Balay    Level: intermediate
207e5c89e4eSSatish Balay 
2086f013253SBarry Smith    Notes:
209e5c89e4eSSatish Balay      Null string returns a string starting with zero
210e5c89e4eSSatish Balay 
2116f013253SBarry Smith      Not for use in Fortran
2126f013253SBarry Smith 
213e5c89e4eSSatish Balay   Concepts: string copy
214e5c89e4eSSatish Balay 
215e5c89e4eSSatish Balay .seealso: PetscStrncpy(), PetscStrcat(), PetscStrncat()
216e5c89e4eSSatish Balay 
217e5c89e4eSSatish Balay @*/
218acc6cc86SBarry Smith 
2197087cfbeSBarry Smith PetscErrorCode  PetscStrcpy(char s[],const char t[])
220e5c89e4eSSatish Balay {
221e5c89e4eSSatish Balay   PetscFunctionBegin;
22217186662SBarry Smith   if (t && !s) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy string into null pointer");
223e5c89e4eSSatish Balay   if (t) {strcpy(s,t);}
224e5c89e4eSSatish Balay   else if (s) {s[0] = 0;}
225e5c89e4eSSatish Balay   PetscFunctionReturn(0);
226e5c89e4eSSatish Balay }
227e5c89e4eSSatish Balay 
228e5c89e4eSSatish Balay #undef __FUNCT__
229e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncpy"
230e5c89e4eSSatish Balay /*@C
231e5c89e4eSSatish Balay    PetscStrncpy - Copies a string up to a certain length
232e5c89e4eSSatish Balay 
233e5c89e4eSSatish Balay    Not Collective
234e5c89e4eSSatish Balay 
235e5c89e4eSSatish Balay    Input Parameters:
236e5c89e4eSSatish Balay +  t - pointer to string
237e5c89e4eSSatish Balay -  n - the length to copy
238e5c89e4eSSatish Balay 
239e5c89e4eSSatish Balay    Output Parameter:
240e5c89e4eSSatish Balay .  s - the copied string
241e5c89e4eSSatish Balay 
242e5c89e4eSSatish Balay    Level: intermediate
243e5c89e4eSSatish Balay 
244e5c89e4eSSatish Balay    Note:
245e5c89e4eSSatish Balay      Null string returns a string starting with zero
246e5c89e4eSSatish Balay 
247e5c89e4eSSatish Balay   Concepts: string copy
248e5c89e4eSSatish Balay 
249e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrcat(), PetscStrncat()
250e5c89e4eSSatish Balay 
251e5c89e4eSSatish Balay @*/
2527087cfbeSBarry Smith PetscErrorCode  PetscStrncpy(char s[],const char t[],size_t n)
253e5c89e4eSSatish Balay {
254e5c89e4eSSatish Balay   PetscFunctionBegin;
25517186662SBarry Smith   if (t && !s) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy string into null pointer");
256e5c89e4eSSatish Balay   if (t) {strncpy(s,t,n);}
257e5c89e4eSSatish Balay   else if (s) {s[0] = 0;}
258e5c89e4eSSatish Balay   PetscFunctionReturn(0);
259e5c89e4eSSatish Balay }
260e5c89e4eSSatish Balay 
261e5c89e4eSSatish Balay #undef __FUNCT__
262e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcat"
263e5c89e4eSSatish Balay /*@C
264e5c89e4eSSatish Balay    PetscStrcat - Concatenates a string onto a given string
265e5c89e4eSSatish Balay 
266e5c89e4eSSatish Balay    Not Collective
267e5c89e4eSSatish Balay 
268e5c89e4eSSatish Balay    Input Parameters:
269e5e2177aSMatthew Knepley +  s - string to be added to
270e5e2177aSMatthew Knepley -  t - pointer to string to be added to end
271e5c89e4eSSatish Balay 
272e5c89e4eSSatish Balay    Level: intermediate
273e5c89e4eSSatish Balay 
2746f013253SBarry Smith    Notes: Not for use in Fortran
2756f013253SBarry Smith 
276e5c89e4eSSatish Balay   Concepts: string copy
277e5c89e4eSSatish Balay 
278e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrncpy(), PetscStrncat()
279e5c89e4eSSatish Balay 
280e5c89e4eSSatish Balay @*/
2817087cfbeSBarry Smith PetscErrorCode  PetscStrcat(char s[],const char t[])
282e5c89e4eSSatish Balay {
283e5c89e4eSSatish Balay   PetscFunctionBegin;
2849b754dc9SBarry Smith   if (!t) PetscFunctionReturn(0);
285e5c89e4eSSatish Balay   strcat(s,t);
286e5c89e4eSSatish Balay   PetscFunctionReturn(0);
287e5c89e4eSSatish Balay }
288e5c89e4eSSatish Balay 
289e5c89e4eSSatish Balay #undef __FUNCT__
290e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncat"
291e5c89e4eSSatish Balay /*@C
292e5c89e4eSSatish Balay    PetscStrncat - Concatenates a string onto a given string, up to a given length
293e5c89e4eSSatish Balay 
294e5c89e4eSSatish Balay    Not Collective
295e5c89e4eSSatish Balay 
296e5c89e4eSSatish Balay    Input Parameters:
297e5c89e4eSSatish Balay +  s - pointer to string to be added to end
298e5c89e4eSSatish Balay .  t - string to be added to
299e5c89e4eSSatish Balay .  n - maximum length to copy
300e5c89e4eSSatish Balay 
301e5c89e4eSSatish Balay    Level: intermediate
302e5c89e4eSSatish Balay 
3036f013253SBarry Smith   Notes:    Not for use in Fortran
3046f013253SBarry Smith 
305e5c89e4eSSatish Balay   Concepts: string copy
306e5c89e4eSSatish Balay 
307e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrncpy(), PetscStrcat()
308e5c89e4eSSatish Balay 
309e5c89e4eSSatish Balay @*/
3107087cfbeSBarry Smith PetscErrorCode  PetscStrncat(char s[],const char t[],size_t n)
311e5c89e4eSSatish Balay {
312e5c89e4eSSatish Balay   PetscFunctionBegin;
313e5c89e4eSSatish Balay   strncat(s,t,n);
314e5c89e4eSSatish Balay   PetscFunctionReturn(0);
315e5c89e4eSSatish Balay }
316e5c89e4eSSatish Balay 
317e5c89e4eSSatish Balay #undef __FUNCT__
318e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcmp"
319e5c89e4eSSatish Balay /*@C
320e5c89e4eSSatish Balay    PetscStrcmp - Compares two strings,
321e5c89e4eSSatish Balay 
322e5c89e4eSSatish Balay    Not Collective
323e5c89e4eSSatish Balay 
324e5c89e4eSSatish Balay    Input Parameters:
325e5c89e4eSSatish Balay +  a - pointer to string first string
326e5c89e4eSSatish Balay -  b - pointer to second string
327e5c89e4eSSatish Balay 
328e5c89e4eSSatish Balay    Output Parameter:
329e5c89e4eSSatish Balay .  flg - if the two strings are equal
330e5c89e4eSSatish Balay 
331e5c89e4eSSatish Balay    Level: intermediate
332e5c89e4eSSatish Balay 
3336f013253SBarry Smith    Notes:    Not for use in Fortran
3346f013253SBarry Smith 
335e5c89e4eSSatish Balay .seealso: PetscStrgrt(), PetscStrncmp(), PetscStrcasecmp()
336e5c89e4eSSatish Balay 
337e5c89e4eSSatish Balay @*/
3387087cfbeSBarry Smith PetscErrorCode  PetscStrcmp(const char a[],const char b[],PetscBool  *flg)
339e5c89e4eSSatish Balay {
340e5c89e4eSSatish Balay   int c;
341e5c89e4eSSatish Balay 
342e5c89e4eSSatish Balay   PetscFunctionBegin;
343e5c89e4eSSatish Balay   if (!a && !b) {
344e5c89e4eSSatish Balay     *flg = PETSC_TRUE;
345e5c89e4eSSatish Balay   } else if (!a || !b) {
346e5c89e4eSSatish Balay     *flg = PETSC_FALSE;
347e5c89e4eSSatish Balay   } else {
348e5c89e4eSSatish Balay     c = strcmp(a,b);
349e5c89e4eSSatish Balay     if (c) *flg = PETSC_FALSE;
350e5c89e4eSSatish Balay     else   *flg = PETSC_TRUE;
351e5c89e4eSSatish Balay   }
352e5c89e4eSSatish Balay   PetscFunctionReturn(0);
353e5c89e4eSSatish Balay }
354e5c89e4eSSatish Balay 
355e5c89e4eSSatish Balay #undef __FUNCT__
356e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrgrt"
357e5c89e4eSSatish Balay /*@C
358e5c89e4eSSatish Balay    PetscStrgrt - If first string is greater than the second
359e5c89e4eSSatish Balay 
360e5c89e4eSSatish Balay    Not Collective
361e5c89e4eSSatish Balay 
362e5c89e4eSSatish Balay    Input Parameters:
363e5c89e4eSSatish Balay +  a - pointer to first string
364e5c89e4eSSatish Balay -  b - pointer to second string
365e5c89e4eSSatish Balay 
366e5c89e4eSSatish Balay    Output Parameter:
367e5c89e4eSSatish Balay .  flg - if the first string is greater
368e5c89e4eSSatish Balay 
369e5c89e4eSSatish Balay    Notes:
370e5c89e4eSSatish Balay     Null arguments are ok, a null string is considered smaller than
371e5c89e4eSSatish Balay     all others
372e5c89e4eSSatish Balay 
3736f013253SBarry Smith    Not for use in Fortran
3746f013253SBarry Smith 
375e5c89e4eSSatish Balay    Level: intermediate
376e5c89e4eSSatish Balay 
377e5c89e4eSSatish Balay .seealso: PetscStrcmp(), PetscStrncmp(), PetscStrcasecmp()
378e5c89e4eSSatish Balay 
379e5c89e4eSSatish Balay @*/
3807087cfbeSBarry Smith PetscErrorCode  PetscStrgrt(const char a[],const char b[],PetscBool  *t)
381e5c89e4eSSatish Balay {
382e5c89e4eSSatish Balay   int c;
383e5c89e4eSSatish Balay 
384e5c89e4eSSatish Balay   PetscFunctionBegin;
385e5c89e4eSSatish Balay   if (!a && !b) {
386e5c89e4eSSatish Balay     *t = PETSC_FALSE;
387e5c89e4eSSatish Balay   } else if (a && !b) {
388e5c89e4eSSatish Balay     *t = PETSC_TRUE;
389e5c89e4eSSatish Balay   } else if (!a && b) {
390e5c89e4eSSatish Balay     *t = PETSC_FALSE;
391e5c89e4eSSatish Balay   } else {
392e5c89e4eSSatish Balay     c = strcmp(a,b);
393e5c89e4eSSatish Balay     if (c > 0) *t = PETSC_TRUE;
394e5c89e4eSSatish Balay     else       *t = PETSC_FALSE;
395e5c89e4eSSatish Balay   }
396e5c89e4eSSatish Balay   PetscFunctionReturn(0);
397e5c89e4eSSatish Balay }
398e5c89e4eSSatish Balay 
399e5c89e4eSSatish Balay #undef __FUNCT__
400e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcasecmp"
401e5c89e4eSSatish Balay /*@C
402e5c89e4eSSatish Balay    PetscStrcasecmp - Returns true if the two strings are the same
403e5c89e4eSSatish Balay      except possibly for case.
404e5c89e4eSSatish Balay 
405e5c89e4eSSatish Balay    Not Collective
406e5c89e4eSSatish Balay 
407e5c89e4eSSatish Balay    Input Parameters:
408e5c89e4eSSatish Balay +  a - pointer to first string
409e5c89e4eSSatish Balay -  b - pointer to second string
410e5c89e4eSSatish Balay 
411e5c89e4eSSatish Balay    Output Parameter:
412e5c89e4eSSatish Balay .  flg - if the two strings are the same
413e5c89e4eSSatish Balay 
414e5c89e4eSSatish Balay    Notes:
415e5c89e4eSSatish Balay     Null arguments are ok
416e5c89e4eSSatish Balay 
4176f013253SBarry Smith    Not for use in Fortran
4186f013253SBarry Smith 
419e5c89e4eSSatish Balay    Level: intermediate
420e5c89e4eSSatish Balay 
421e5c89e4eSSatish Balay .seealso: PetscStrcmp(), PetscStrncmp(), PetscStrgrt()
422e5c89e4eSSatish Balay 
423e5c89e4eSSatish Balay @*/
4247087cfbeSBarry Smith PetscErrorCode  PetscStrcasecmp(const char a[],const char b[],PetscBool  *t)
425e5c89e4eSSatish Balay {
426e5c89e4eSSatish Balay   int c;
427e5c89e4eSSatish Balay 
428e5c89e4eSSatish Balay   PetscFunctionBegin;
429e5c89e4eSSatish Balay   if (!a && !b) c = 0;
430e5c89e4eSSatish Balay   else if (!a || !b) c = 1;
43132b366c8SSatish Balay #if defined(PETSC_HAVE_STRCASECMP)
43232b366c8SSatish Balay   else c = strcasecmp(a,b);
43332b366c8SSatish Balay #elif defined(PETSC_HAVE_STRICMP)
434e5c89e4eSSatish Balay   else c = stricmp(a,b);
435e5c89e4eSSatish Balay #else
43632b366c8SSatish Balay   else {
43732b366c8SSatish Balay     char           *aa,*bb;
43832b366c8SSatish Balay     PetscErrorCode ierr;
43932b366c8SSatish Balay     ierr = PetscStrallocpy(a,&aa);CHKERRQ(ierr);
44032b366c8SSatish Balay     ierr = PetscStrallocpy(b,&bb);CHKERRQ(ierr);
44132b366c8SSatish Balay     ierr = PetscStrtolower(aa);CHKERRQ(ierr);
44232b366c8SSatish Balay     ierr = PetscStrtolower(bb);CHKERRQ(ierr);
44332b366c8SSatish Balay     ierr = PetscStrcmp(aa,bb,t);CHKERRQ(ierr);
444503cfb0cSBarry Smith     ierr = PetscFree(aa);CHKERRQ(ierr);
445503cfb0cSBarry Smith     ierr = PetscFree(bb);CHKERRQ(ierr);
44632b366c8SSatish Balay     PetscFunctionReturn(0);
44732b366c8SSatish Balay   }
448e5c89e4eSSatish Balay #endif
449e5c89e4eSSatish Balay   if (!c) *t = PETSC_TRUE;
450e5c89e4eSSatish Balay   else    *t = PETSC_FALSE;
451e5c89e4eSSatish Balay   PetscFunctionReturn(0);
452e5c89e4eSSatish Balay }
453e5c89e4eSSatish Balay 
45432b366c8SSatish Balay 
45532b366c8SSatish Balay 
456e5c89e4eSSatish Balay #undef __FUNCT__
457e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncmp"
458e5c89e4eSSatish Balay /*@C
459e5c89e4eSSatish Balay    PetscStrncmp - Compares two strings, up to a certain length
460e5c89e4eSSatish Balay 
461e5c89e4eSSatish Balay    Not Collective
462e5c89e4eSSatish Balay 
463e5c89e4eSSatish Balay    Input Parameters:
464e5c89e4eSSatish Balay +  a - pointer to first string
465e5c89e4eSSatish Balay .  b - pointer to second string
466e5c89e4eSSatish Balay -  n - length to compare up to
467e5c89e4eSSatish Balay 
468e5c89e4eSSatish Balay    Output Parameter:
469e5c89e4eSSatish Balay .  t - if the two strings are equal
470e5c89e4eSSatish Balay 
471e5c89e4eSSatish Balay    Level: intermediate
472e5c89e4eSSatish Balay 
4736f013253SBarry Smith    Notes:    Not for use in Fortran
4746f013253SBarry Smith 
475e5c89e4eSSatish Balay .seealso: PetscStrgrt(), PetscStrcmp(), PetscStrcasecmp()
476e5c89e4eSSatish Balay 
477e5c89e4eSSatish Balay @*/
4787087cfbeSBarry Smith PetscErrorCode  PetscStrncmp(const char a[],const char b[],size_t n,PetscBool  *t)
479e5c89e4eSSatish Balay {
480e5c89e4eSSatish Balay   int c;
481e5c89e4eSSatish Balay 
482e5c89e4eSSatish Balay   PetscFunctionBegin;
483e5c89e4eSSatish Balay   c = strncmp(a,b,n);
484e5c89e4eSSatish Balay   if (!c) *t = PETSC_TRUE;
485e5c89e4eSSatish Balay   else    *t = PETSC_FALSE;
486e5c89e4eSSatish Balay   PetscFunctionReturn(0);
487e5c89e4eSSatish Balay }
488e5c89e4eSSatish Balay 
489e5c89e4eSSatish Balay #undef __FUNCT__
490e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrchr"
491e5c89e4eSSatish Balay /*@C
492e5c89e4eSSatish Balay    PetscStrchr - Locates first occurance of a character in a string
493e5c89e4eSSatish Balay 
494e5c89e4eSSatish Balay    Not Collective
495e5c89e4eSSatish Balay 
496e5c89e4eSSatish Balay    Input Parameters:
497e5c89e4eSSatish Balay +  a - pointer to string
498e5c89e4eSSatish Balay -  b - character
499e5c89e4eSSatish Balay 
500e5c89e4eSSatish Balay    Output Parameter:
501e5c89e4eSSatish Balay .  c - location of occurance, PETSC_NULL if not found
502e5c89e4eSSatish Balay 
503e5c89e4eSSatish Balay    Level: intermediate
504e5c89e4eSSatish Balay 
5056f013253SBarry Smith    Notes:    Not for use in Fortran
5066f013253SBarry Smith 
507e5c89e4eSSatish Balay @*/
5087087cfbeSBarry Smith PetscErrorCode  PetscStrchr(const char a[],char b,char *c[])
509e5c89e4eSSatish Balay {
510e5c89e4eSSatish Balay   PetscFunctionBegin;
511e5c89e4eSSatish Balay   *c = (char *)strchr(a,b);
512e5c89e4eSSatish Balay   PetscFunctionReturn(0);
513e5c89e4eSSatish Balay }
514e5c89e4eSSatish Balay 
515e5c89e4eSSatish Balay #undef __FUNCT__
516e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrrchr"
517e5c89e4eSSatish Balay /*@C
518e5c89e4eSSatish Balay    PetscStrrchr - Locates one location past the last occurance of a character in a string,
519e5c89e4eSSatish Balay       if the character is not found then returns entire string
520e5c89e4eSSatish Balay 
521e5c89e4eSSatish Balay    Not Collective
522e5c89e4eSSatish Balay 
523e5c89e4eSSatish Balay    Input Parameters:
524e5c89e4eSSatish Balay +  a - pointer to string
525e5c89e4eSSatish Balay -  b - character
526e5c89e4eSSatish Balay 
527e5c89e4eSSatish Balay    Output Parameter:
528e5c89e4eSSatish Balay .  tmp - location of occurance, a if not found
529e5c89e4eSSatish Balay 
530e5c89e4eSSatish Balay    Level: intermediate
531e5c89e4eSSatish Balay 
5326f013253SBarry Smith    Notes:    Not for use in Fortran
5336f013253SBarry Smith 
534e5c89e4eSSatish Balay @*/
5357087cfbeSBarry Smith PetscErrorCode  PetscStrrchr(const char a[],char b,char *tmp[])
536e5c89e4eSSatish Balay {
537e5c89e4eSSatish Balay   PetscFunctionBegin;
538e5c89e4eSSatish Balay   *tmp = (char *)strrchr(a,b);
539e5c89e4eSSatish Balay   if (!*tmp) *tmp = (char*)a; else *tmp = *tmp + 1;
540e5c89e4eSSatish Balay   PetscFunctionReturn(0);
541e5c89e4eSSatish Balay }
542e5c89e4eSSatish Balay 
543e5c89e4eSSatish Balay #undef __FUNCT__
544e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrtolower"
545e5c89e4eSSatish Balay /*@C
546e5c89e4eSSatish Balay    PetscStrtolower - Converts string to lower case
547e5c89e4eSSatish Balay 
548e5c89e4eSSatish Balay    Not Collective
549e5c89e4eSSatish Balay 
550e5c89e4eSSatish Balay    Input Parameters:
551e5c89e4eSSatish Balay .  a - pointer to string
552e5c89e4eSSatish Balay 
553e5c89e4eSSatish Balay    Level: intermediate
554e5c89e4eSSatish Balay 
5556f013253SBarry Smith    Notes:    Not for use in Fortran
5566f013253SBarry Smith 
557e5c89e4eSSatish Balay @*/
5587087cfbeSBarry Smith PetscErrorCode  PetscStrtolower(char a[])
559e5c89e4eSSatish Balay {
560e5c89e4eSSatish Balay   PetscFunctionBegin;
561e5c89e4eSSatish Balay   while (*a) {
562e5c89e4eSSatish Balay     if (*a >= 'A' && *a <= 'Z') *a += 'a' - 'A';
563e5c89e4eSSatish Balay     a++;
564e5c89e4eSSatish Balay   }
565e5c89e4eSSatish Balay   PetscFunctionReturn(0);
566e5c89e4eSSatish Balay }
567e5c89e4eSSatish Balay 
568*7ba3a57cSBarry Smith #undef __FUNCT__
569*7ba3a57cSBarry Smith #define __FUNCT__ "PetscStrendswith"
570*7ba3a57cSBarry Smith /*@C
571*7ba3a57cSBarry Smith    PetscStrendswith - Determines if a string ends with a certain string
5721d1a0024SBarry Smith 
573*7ba3a57cSBarry Smith    Not Collective
574*7ba3a57cSBarry Smith 
575*7ba3a57cSBarry Smith    Input Parameters:
576*7ba3a57cSBarry Smith +  a - pointer to string
577*7ba3a57cSBarry Smith -  b - string to endwith
578*7ba3a57cSBarry Smith 
579*7ba3a57cSBarry Smith    Output Parameter:
580*7ba3a57cSBarry Smith .  flg - PETSC_TRUE or PETSC_FALSE
581*7ba3a57cSBarry Smith 
582*7ba3a57cSBarry Smith    Notes:     Not for use in Fortran
583*7ba3a57cSBarry Smith 
584*7ba3a57cSBarry Smith    Level: intermediate
585*7ba3a57cSBarry Smith 
586*7ba3a57cSBarry Smith @*/
587*7ba3a57cSBarry Smith PetscErrorCode  PetscStrendswith(const char a[],const char b[],PetscBool *flg)
588*7ba3a57cSBarry Smith {
589*7ba3a57cSBarry Smith   char           *test;
590*7ba3a57cSBarry Smith   PetscErrorCode ierr;
591*7ba3a57cSBarry Smith   size_t         na,nb;
592*7ba3a57cSBarry Smith 
593*7ba3a57cSBarry Smith   PetscFunctionBegin;
594*7ba3a57cSBarry Smith   *flg = PETSC_FALSE;
595*7ba3a57cSBarry Smith   ierr = PetscStrrstr(a,b,&test);CHKERRQ(ierr);
596*7ba3a57cSBarry Smith   if (test) {
597*7ba3a57cSBarry Smith     ierr = PetscStrlen(a,&na);CHKERRQ(ierr);
598*7ba3a57cSBarry Smith     ierr = PetscStrlen(b,&nb);CHKERRQ(ierr);
599*7ba3a57cSBarry Smith     if (a+na-nb == test) *flg = PETSC_TRUE;
600*7ba3a57cSBarry Smith   }
601*7ba3a57cSBarry Smith   PetscFunctionReturn(0);
602*7ba3a57cSBarry Smith }
603*7ba3a57cSBarry Smith 
604*7ba3a57cSBarry Smith #undef __FUNCT__
605*7ba3a57cSBarry Smith #define __FUNCT__ "PetscStrendswithwhich"
606*7ba3a57cSBarry Smith /*@C
607*7ba3a57cSBarry Smith    PetscStrendswithwhich - Determines if a string ends with one of several possible strings
608*7ba3a57cSBarry Smith 
609*7ba3a57cSBarry Smith    Not Collective
610*7ba3a57cSBarry Smith 
611*7ba3a57cSBarry Smith    Input Parameters:
612*7ba3a57cSBarry Smith +  a - pointer to string
613*7ba3a57cSBarry Smith -  bs - strings to endwith (last entry must be null)
614*7ba3a57cSBarry Smith 
615*7ba3a57cSBarry Smith    Output Parameter:
616*7ba3a57cSBarry Smith .  cnt - the index of the string it ends with or 1+the last possible index
617*7ba3a57cSBarry Smith 
618*7ba3a57cSBarry Smith    Notes:     Not for use in Fortran
619*7ba3a57cSBarry Smith 
620*7ba3a57cSBarry Smith    Level: intermediate
621*7ba3a57cSBarry Smith 
622*7ba3a57cSBarry Smith @*/
623*7ba3a57cSBarry Smith PetscErrorCode  PetscStrendswithwhich(const char a[],const char *const *bs,PetscInt *cnt)
624*7ba3a57cSBarry Smith {
625*7ba3a57cSBarry Smith   PetscBool      flg;
626*7ba3a57cSBarry Smith   PetscErrorCode ierr;
627*7ba3a57cSBarry Smith 
628*7ba3a57cSBarry Smith   PetscFunctionBegin;
629*7ba3a57cSBarry Smith   *cnt = 0;
630*7ba3a57cSBarry Smith   while (bs[*cnt]) {
631*7ba3a57cSBarry Smith     ierr = PetscStrendswith(a,bs[*cnt],&flg);CHKERRQ(ierr);
632*7ba3a57cSBarry Smith     if (flg) PetscFunctionReturn(0);
633*7ba3a57cSBarry Smith     *cnt += 1;
634*7ba3a57cSBarry Smith   }
635*7ba3a57cSBarry Smith   PetscFunctionReturn(0);
636*7ba3a57cSBarry Smith }
637*7ba3a57cSBarry Smith 
638*7ba3a57cSBarry Smith #undef __FUNCT__
639*7ba3a57cSBarry Smith #define __FUNCT__ "PetscStrrstr"
640*7ba3a57cSBarry Smith /*@C
641*7ba3a57cSBarry Smith    PetscStrrstr - Locates last occurance of string in another string
642*7ba3a57cSBarry Smith 
643*7ba3a57cSBarry Smith    Not Collective
644*7ba3a57cSBarry Smith 
645*7ba3a57cSBarry Smith    Input Parameters:
646*7ba3a57cSBarry Smith +  a - pointer to string
647*7ba3a57cSBarry Smith -  b - string to find
648*7ba3a57cSBarry Smith 
649*7ba3a57cSBarry Smith    Output Parameter:
650*7ba3a57cSBarry Smith .  tmp - location of occurance
651*7ba3a57cSBarry Smith 
652*7ba3a57cSBarry Smith    Notes:     Not for use in Fortran
653*7ba3a57cSBarry Smith 
654*7ba3a57cSBarry Smith    Level: intermediate
655*7ba3a57cSBarry Smith 
656*7ba3a57cSBarry Smith @*/
657*7ba3a57cSBarry Smith PetscErrorCode  PetscStrrstr(const char a[],const char b[],char *tmp[])
658*7ba3a57cSBarry Smith {
659*7ba3a57cSBarry Smith   const char *stmp = a, *ltmp = 0;
660*7ba3a57cSBarry Smith 
661*7ba3a57cSBarry Smith   PetscFunctionBegin;
662*7ba3a57cSBarry Smith   while (stmp) {
663*7ba3a57cSBarry Smith     stmp = (char *)strstr(stmp,b);
664*7ba3a57cSBarry Smith     if (stmp) {ltmp = stmp;stmp++;}
665*7ba3a57cSBarry Smith   }
666*7ba3a57cSBarry Smith   *tmp = (char *)ltmp;
667*7ba3a57cSBarry Smith   PetscFunctionReturn(0);
668*7ba3a57cSBarry Smith }
669*7ba3a57cSBarry Smith 
670*7ba3a57cSBarry Smith #undef __FUNCT__
671*7ba3a57cSBarry Smith #define __FUNCT__ "PetscStrstr"
672*7ba3a57cSBarry Smith /*@C
673*7ba3a57cSBarry Smith    PetscStrstr - Locates first occurance of string in another string
674*7ba3a57cSBarry Smith 
675*7ba3a57cSBarry Smith    Not Collective
676*7ba3a57cSBarry Smith 
677*7ba3a57cSBarry Smith    Input Parameters:
678*7ba3a57cSBarry Smith +  a - pointer to string
679*7ba3a57cSBarry Smith -  b - string to find
680*7ba3a57cSBarry Smith 
681*7ba3a57cSBarry Smith    Output Parameter:
682*7ba3a57cSBarry Smith .  tmp - location of occurance, is a PETSC_NULL if the string is not found
683*7ba3a57cSBarry Smith 
684*7ba3a57cSBarry Smith    Notes: Not for use in Fortran
685*7ba3a57cSBarry Smith 
686*7ba3a57cSBarry Smith    Level: intermediate
687*7ba3a57cSBarry Smith 
688*7ba3a57cSBarry Smith @*/
689*7ba3a57cSBarry Smith PetscErrorCode  PetscStrstr(const char a[],const char b[],char *tmp[])
690*7ba3a57cSBarry Smith {
691*7ba3a57cSBarry Smith   PetscFunctionBegin;
692*7ba3a57cSBarry Smith   *tmp = (char *)strstr(a,b);
693*7ba3a57cSBarry Smith   PetscFunctionReturn(0);
694*7ba3a57cSBarry Smith }
695*7ba3a57cSBarry Smith 
696*7ba3a57cSBarry Smith struct _p_PetscToken {char token;char *array;char *current;};
6971d1a0024SBarry Smith 
698e5c89e4eSSatish Balay #undef __FUNCT__
699e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenFind"
700e5c89e4eSSatish Balay /*@C
701e5c89e4eSSatish Balay    PetscTokenFind - Locates next "token" in a string
702e5c89e4eSSatish Balay 
703e5c89e4eSSatish Balay    Not Collective
704e5c89e4eSSatish Balay 
705e5c89e4eSSatish Balay    Input Parameters:
706e5c89e4eSSatish Balay .  a - pointer to token
707e5c89e4eSSatish Balay 
708e5c89e4eSSatish Balay    Output Parameter:
709e5c89e4eSSatish Balay .  result - location of occurance, PETSC_NULL if not found
710e5c89e4eSSatish Balay 
711e5c89e4eSSatish Balay    Notes:
712e5c89e4eSSatish Balay 
713e5c89e4eSSatish Balay      This version is different from the system version in that
714e5c89e4eSSatish Balay   it allows you to pass a read-only string into the function.
715e5c89e4eSSatish Balay 
7164704e885SBarry Smith      This version also treats all characters etc. inside a double quote "
7174704e885SBarry Smith    as a single token.
7184704e885SBarry Smith 
7196f013253SBarry Smith     Not for use in Fortran
7206f013253SBarry Smith 
721e5c89e4eSSatish Balay    Level: intermediate
722e5c89e4eSSatish Balay 
7236f013253SBarry Smith 
724e5c89e4eSSatish Balay .seealso: PetscTokenCreate(), PetscTokenDestroy()
725e5c89e4eSSatish Balay @*/
7267087cfbeSBarry Smith PetscErrorCode  PetscTokenFind(PetscToken a,char *result[])
727e5c89e4eSSatish Balay {
7284704e885SBarry Smith   char *ptr = a->current,token;
729e5c89e4eSSatish Balay 
730e5c89e4eSSatish Balay   PetscFunctionBegin;
731e5c89e4eSSatish Balay   *result = a->current;
7324704e885SBarry Smith   if (ptr && !*ptr) {*result = 0;PetscFunctionReturn(0);}
7334704e885SBarry Smith   token = a->token;
73490fdf44cSMatthew Knepley   if (ptr && (*ptr == '"')) {token = '"';(*result)++;ptr++;}
735e5c89e4eSSatish Balay   while (ptr) {
7364704e885SBarry Smith     if (*ptr == token) {
737e5c89e4eSSatish Balay       *ptr++ = 0;
738e5c89e4eSSatish Balay       while (*ptr == a->token) ptr++;
739e5c89e4eSSatish Balay       a->current = ptr;
740e5c89e4eSSatish Balay       break;
741e5c89e4eSSatish Balay     }
742e5c89e4eSSatish Balay     if (!*ptr) {
743e5c89e4eSSatish Balay       a->current = 0;
744e5c89e4eSSatish Balay       break;
745e5c89e4eSSatish Balay     }
746e5c89e4eSSatish Balay     ptr++;
747e5c89e4eSSatish Balay   }
748e5c89e4eSSatish Balay   PetscFunctionReturn(0);
749e5c89e4eSSatish Balay }
750e5c89e4eSSatish Balay 
751e5c89e4eSSatish Balay #undef __FUNCT__
752e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenCreate"
753e5c89e4eSSatish Balay /*@C
754e5c89e4eSSatish Balay    PetscTokenCreate - Creates a PetscToken used to find tokens in a string
755e5c89e4eSSatish Balay 
756e5c89e4eSSatish Balay    Not Collective
757e5c89e4eSSatish Balay 
758e5c89e4eSSatish Balay    Input Parameters:
759e5c89e4eSSatish Balay +  string - the string to look in
760e5c89e4eSSatish Balay -  token - the character to look for
761e5c89e4eSSatish Balay 
762e5c89e4eSSatish Balay    Output Parameter:
763e5c89e4eSSatish Balay .  a - pointer to token
764e5c89e4eSSatish Balay 
765e5c89e4eSSatish Balay    Notes:
766e5c89e4eSSatish Balay 
767e5c89e4eSSatish Balay      This version is different from the system version in that
768e5c89e4eSSatish Balay   it allows you to pass a read-only string into the function.
769e5c89e4eSSatish Balay 
7706f013253SBarry Smith     Not for use in Fortran
7716f013253SBarry Smith 
772e5c89e4eSSatish Balay    Level: intermediate
773e5c89e4eSSatish Balay 
774e5c89e4eSSatish Balay .seealso: PetscTokenFind(), PetscTokenDestroy()
775e5c89e4eSSatish Balay @*/
7767087cfbeSBarry Smith PetscErrorCode  PetscTokenCreate(const char a[],const char b,PetscToken *t)
777e5c89e4eSSatish Balay {
778e5c89e4eSSatish Balay   PetscErrorCode ierr;
779e5c89e4eSSatish Balay 
780e5c89e4eSSatish Balay   PetscFunctionBegin;
7811d1a0024SBarry Smith   ierr = PetscNew(struct _p_PetscToken,t);CHKERRQ(ierr);
782e5c89e4eSSatish Balay   ierr = PetscStrallocpy(a,&(*t)->array);CHKERRQ(ierr);
783e5c89e4eSSatish Balay   (*t)->current = (*t)->array;
784e5c89e4eSSatish Balay   (*t)->token   = b;
785e5c89e4eSSatish Balay   PetscFunctionReturn(0);
786e5c89e4eSSatish Balay }
787e5c89e4eSSatish Balay 
788e5c89e4eSSatish Balay #undef __FUNCT__
789e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenDestroy"
790e5c89e4eSSatish Balay /*@C
791e5c89e4eSSatish Balay    PetscTokenDestroy - Destroys a PetscToken
792e5c89e4eSSatish Balay 
793e5c89e4eSSatish Balay    Not Collective
794e5c89e4eSSatish Balay 
795e5c89e4eSSatish Balay    Input Parameters:
796e5c89e4eSSatish Balay .  a - pointer to token
797e5c89e4eSSatish Balay 
798e5c89e4eSSatish Balay    Level: intermediate
799e5c89e4eSSatish Balay 
8006f013253SBarry Smith    Notes:     Not for use in Fortran
8016f013253SBarry Smith 
802e5c89e4eSSatish Balay .seealso: PetscTokenCreate(), PetscTokenFind()
803e5c89e4eSSatish Balay @*/
8047087cfbeSBarry Smith PetscErrorCode  PetscTokenDestroy(PetscToken a)
805e5c89e4eSSatish Balay {
806e5c89e4eSSatish Balay   PetscErrorCode ierr;
807e5c89e4eSSatish Balay 
808e5c89e4eSSatish Balay   PetscFunctionBegin;
809e5c89e4eSSatish Balay   ierr = PetscFree(a->array);CHKERRQ(ierr);
810e5c89e4eSSatish Balay   ierr = PetscFree(a);CHKERRQ(ierr);
811e5c89e4eSSatish Balay   PetscFunctionReturn(0);
812e5c89e4eSSatish Balay }
813e5c89e4eSSatish Balay 
814e5c89e4eSSatish Balay 
815e5c89e4eSSatish Balay #undef __FUNCT__
816e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetPetscDir"
817e5c89e4eSSatish Balay /*@C
818e5c89e4eSSatish Balay    PetscGetPetscDir - Gets the directory PETSc is installed in
819e5c89e4eSSatish Balay 
820e5c89e4eSSatish Balay    Not Collective
821e5c89e4eSSatish Balay 
822e5c89e4eSSatish Balay    Output Parameter:
823e5c89e4eSSatish Balay .  dir - the directory
824e5c89e4eSSatish Balay 
825e5c89e4eSSatish Balay    Level: developer
826e5c89e4eSSatish Balay 
8276f013253SBarry Smith    Notes: Not for use in Fortran
8286f013253SBarry Smith 
829e5c89e4eSSatish Balay @*/
8307087cfbeSBarry Smith PetscErrorCode  PetscGetPetscDir(const char *dir[])
831e5c89e4eSSatish Balay {
832e5c89e4eSSatish Balay   PetscFunctionBegin;
833e5c89e4eSSatish Balay   *dir = PETSC_DIR;
834e5c89e4eSSatish Balay   PetscFunctionReturn(0);
835e5c89e4eSSatish Balay }
836e5c89e4eSSatish Balay 
837e5c89e4eSSatish Balay #undef __FUNCT__
838e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrreplace"
839e5c89e4eSSatish Balay /*@C
840e5c89e4eSSatish Balay    PetscStrreplace - Replaces substrings in string with other substrings
841e5c89e4eSSatish Balay 
842e5c89e4eSSatish Balay    Not Collective
843e5c89e4eSSatish Balay 
844e5c89e4eSSatish Balay    Input Parameters:
845e5c89e4eSSatish Balay +   comm - MPI_Comm of processors that are processing the string
84671573d7dSBarry Smith .   aa - the string to look in
847d8ccf1fbSBarry Smith .   b - the resulting copy of a with replaced strings (b can be the same as a)
848e5c89e4eSSatish Balay -   len - the length of b
849e5c89e4eSSatish Balay 
850e5c89e4eSSatish Balay    Notes:
851e5c89e4eSSatish Balay       Replaces   ${PETSC_ARCH},${PETSC_DIR},${PETSC_LIB_DIR},${DISPLAY},
852d5649816SBarry Smith       ${HOMEDIRECTORY},${WORKINGDIRECTORY},${USERNAME}, ${HOSTNAME} with appropriate values
853e5c89e4eSSatish Balay       as well as any environmental variables.
854e5c89e4eSSatish Balay 
8556f013253SBarry Smith       PETSC_LIB_DIR uses the environmental variable if it exists. PETSC_ARCH and PETSC_DIR use what
856acc6cc86SBarry Smith       PETSc was built with and do not use environmental variables.
857acc6cc86SBarry Smith 
8586f013253SBarry Smith       Not for use in Fortran
8596f013253SBarry Smith 
860e5c89e4eSSatish Balay    Level: intermediate
861e5c89e4eSSatish Balay 
862e5c89e4eSSatish Balay @*/
8637087cfbeSBarry Smith PetscErrorCode  PetscStrreplace(MPI_Comm comm,const char aa[],char b[],size_t len)
864e5c89e4eSSatish Balay {
865e5c89e4eSSatish Balay   PetscErrorCode ierr;
866e5c89e4eSSatish Balay   int            i = 0;
867e5c89e4eSSatish Balay   size_t         l,l1,l2,l3;
86871573d7dSBarry Smith   char           *work,*par,*epar,env[1024],*tfree,*a = (char*)aa;
869d5649816SBarry Smith   const char     *s[] = {"${PETSC_ARCH}","${PETSC_DIR}","${PETSC_LIB_DIR}","${DISPLAY}","${HOMEDIRECTORY}","${WORKINGDIRECTORY}","${USERNAME}","${HOSTNAME}",0};
870d5649816SBarry Smith   const char     *r[] = {0,0,0,0,0,0,0,0,0};
871ace3abfcSBarry Smith   PetscBool      flag;
872e5c89e4eSSatish Balay 
873e5c89e4eSSatish Balay   PetscFunctionBegin;
874e32f2f54SBarry Smith   if (!a || !b) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"a and b strings must be nonnull");
87571573d7dSBarry Smith   if (aa == b) {
87622982a5fSBarry Smith     ierr    = PetscStrallocpy(aa,(char **)&a);CHKERRQ(ierr);
87771573d7dSBarry Smith   }
878e5c89e4eSSatish Balay   ierr = PetscMalloc(len*sizeof(char*),&work);CHKERRQ(ierr);
879e5c89e4eSSatish Balay 
880e5c89e4eSSatish Balay   /* get values for replaced variables */
881487e5849SBarry Smith   ierr = PetscStrallocpy(PETSC_ARCH,(char**)&r[0]);CHKERRQ(ierr);
882487e5849SBarry Smith   ierr = PetscStrallocpy(PETSC_DIR,(char**)&r[1]);CHKERRQ(ierr);
883487e5849SBarry Smith   ierr = PetscStrallocpy(PETSC_LIB_DIR,(char**)&r[2]);CHKERRQ(ierr);
884487e5849SBarry Smith   ierr = PetscMalloc(256*sizeof(char),&r[3]);CHKERRQ(ierr);
885487e5849SBarry Smith   ierr = PetscMalloc(PETSC_MAX_PATH_LEN*sizeof(char),&r[4]);CHKERRQ(ierr);
886e5c89e4eSSatish Balay   ierr = PetscMalloc(PETSC_MAX_PATH_LEN*sizeof(char),&r[5]);CHKERRQ(ierr);
887487e5849SBarry Smith   ierr = PetscMalloc(256*sizeof(char),&r[6]);CHKERRQ(ierr);
888d5649816SBarry Smith   ierr = PetscMalloc(256*sizeof(char),&r[7]);CHKERRQ(ierr);
889487e5849SBarry Smith   ierr = PetscGetDisplay((char*)r[3],256);CHKERRQ(ierr);
890487e5849SBarry Smith   ierr = PetscGetHomeDirectory((char*)r[4],PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
891487e5849SBarry Smith   ierr = PetscGetWorkingDirectory((char*)r[5],PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
892487e5849SBarry Smith   ierr = PetscGetUserName((char*)r[6],256);CHKERRQ(ierr);
893d5649816SBarry Smith   ierr = PetscGetHostName((char*)r[7],256);CHKERRQ(ierr);
894487e5849SBarry Smith 
895487e5849SBarry Smith   /* replace that are in environment */
896487e5849SBarry Smith   ierr = PetscOptionsGetenv(comm,"PETSC_LIB_DIR",env,1024,&flag);CHKERRQ(ierr);
897487e5849SBarry Smith   if (flag) {
898487e5849SBarry Smith     ierr = PetscStrallocpy(env,(char**)&r[2]);CHKERRQ(ierr);
899487e5849SBarry Smith   }
900e5c89e4eSSatish Balay 
901e5c89e4eSSatish Balay   /* replace the requested strings */
902e5c89e4eSSatish Balay   ierr = PetscStrncpy(b,a,len);CHKERRQ(ierr);
903e5c89e4eSSatish Balay   while (s[i]) {
904e5c89e4eSSatish Balay     ierr = PetscStrlen(s[i],&l);CHKERRQ(ierr);
905e5c89e4eSSatish Balay     ierr = PetscStrstr(b,s[i],&par);CHKERRQ(ierr);
906e5c89e4eSSatish Balay     while (par) {
907e5c89e4eSSatish Balay       *par  =  0;
908e5c89e4eSSatish Balay       par  += l;
909e5c89e4eSSatish Balay 
910e5c89e4eSSatish Balay       ierr = PetscStrlen(b,&l1);CHKERRQ(ierr);
911e5c89e4eSSatish Balay       ierr = PetscStrlen(r[i],&l2);CHKERRQ(ierr);
912e5c89e4eSSatish Balay       ierr = PetscStrlen(par,&l3);CHKERRQ(ierr);
91317186662SBarry Smith       if (l1 + l2 + l3 >= len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"b len is not long enough to hold new values");
914e5c89e4eSSatish Balay       ierr  = PetscStrcpy(work,b);CHKERRQ(ierr);
915e5c89e4eSSatish Balay       ierr  = PetscStrcat(work,r[i]);CHKERRQ(ierr);
916e5c89e4eSSatish Balay       ierr  = PetscStrcat(work,par);CHKERRQ(ierr);
917e5c89e4eSSatish Balay       ierr  = PetscStrncpy(b,work,len);CHKERRQ(ierr);
918e5c89e4eSSatish Balay       ierr  = PetscStrstr(b,s[i],&par);CHKERRQ(ierr);
919e5c89e4eSSatish Balay     }
920e5c89e4eSSatish Balay     i++;
921e5c89e4eSSatish Balay   }
922487e5849SBarry Smith   i = 0;
923487e5849SBarry Smith   while (r[i]) {
924e5c89e4eSSatish Balay     tfree = (char*)r[i];
925e5c89e4eSSatish Balay     ierr = PetscFree(tfree);CHKERRQ(ierr);
926487e5849SBarry Smith     i++;
927e5c89e4eSSatish Balay   }
928e5c89e4eSSatish Balay 
929e5c89e4eSSatish Balay   /* look for any other ${xxx} strings to replace from environmental variables */
930e5c89e4eSSatish Balay   ierr = PetscStrstr(b,"${",&par);CHKERRQ(ierr);
931e5c89e4eSSatish Balay   while (par) {
932e5c89e4eSSatish Balay     *par = 0;
933e5c89e4eSSatish Balay     par += 2;
934e5c89e4eSSatish Balay     ierr  = PetscStrcpy(work,b);CHKERRQ(ierr);
935e5c89e4eSSatish Balay     ierr = PetscStrstr(par,"}",&epar);CHKERRQ(ierr);
936e5c89e4eSSatish Balay     *epar = 0;
937e5c89e4eSSatish Balay     epar += 1;
938e5c89e4eSSatish Balay     ierr = PetscOptionsGetenv(comm,par,env,256,&flag);CHKERRQ(ierr);
939*7ba3a57cSBarry Smith     if (!flag) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Substitution string ${%s} not found as environmental variable",par);
940e5c89e4eSSatish Balay     ierr = PetscStrcat(work,env);CHKERRQ(ierr);
941e5c89e4eSSatish Balay     ierr = PetscStrcat(work,epar);CHKERRQ(ierr);
942e5c89e4eSSatish Balay     ierr = PetscStrcpy(b,work);CHKERRQ(ierr);
943e5c89e4eSSatish Balay     ierr = PetscStrstr(b,"${",&par);CHKERRQ(ierr);
944e5c89e4eSSatish Balay   }
945e5c89e4eSSatish Balay   ierr = PetscFree(work);CHKERRQ(ierr);
94671573d7dSBarry Smith   if (aa == b) {
94771573d7dSBarry Smith     ierr = PetscFree(a);CHKERRQ(ierr);
94871573d7dSBarry Smith   }
949e5c89e4eSSatish Balay   PetscFunctionReturn(0);
950e5c89e4eSSatish Balay }
951e5c89e4eSSatish Balay 
952e5c89e4eSSatish Balay 
953