xref: /petsc/src/sys/utils/str.c (revision 53e6e2c4d86369fbc5d628a13f594352e2eb12f5)
1e5c89e4eSSatish Balay #define PETSC_DLL
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 */
8d382aafbSBarry Smith #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
193c311c98SBarry Smith    PetscStrToArray - Seperates a string by its spaces and creates and 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 
34301d30feSBarry Smith    Developer Notes: Using raw malloc() since this may be used before PETSc is initialized
35301d30feSBarry Smith 
36301d30feSBarry Smith .seealso: PetscStrToArrayDestroy()
373c311c98SBarry Smith 
383c311c98SBarry Smith @*/
393c311c98SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscStrToArray(const char s[],int *argc,char ***args)
403c311c98SBarry Smith {
413c311c98SBarry Smith   int        i,n,*lens,cnt = 0;
423c311c98SBarry Smith   PetscTruth flg = PETSC_FALSE;
433c311c98SBarry Smith 
443c311c98SBarry Smith   n = strlen(s);
453c311c98SBarry Smith   *argc = 0;
463c311c98SBarry Smith   for (i=0; i<n; i++) {
473c311c98SBarry Smith     if (s[i] != ' ') break;
483c311c98SBarry Smith   }
493c311c98SBarry Smith   for (;i<n+1; i++) {
503c311c98SBarry Smith     if ((s[i] == ' ' || s[i] == 0) && !flg) {flg = PETSC_TRUE; (*argc)++;}
513c311c98SBarry Smith     else if (s[i] != ' ') {flg = PETSC_FALSE;}
523c311c98SBarry Smith   }
53301d30feSBarry Smith   (*args) = (char **) malloc(((*argc)+1)*sizeof(char**)); if (!*args) return PETSC_ERR_MEM;
54*53e6e2c4SHong Zhang   lens    = (int*) malloc((*argc)*sizeof(int)); if (!lens) return PETSC_ERR_MEM;
553c311c98SBarry Smith   for (i=0; i<*argc; i++) lens[i] = 0;
563c311c98SBarry Smith 
573c311c98SBarry Smith   *argc = 0;
583c311c98SBarry Smith   for (i=0; i<n; i++) {
593c311c98SBarry Smith     if (s[i] != ' ') break;
603c311c98SBarry Smith   }
613c311c98SBarry Smith   for (;i<n+1; i++) {
623c311c98SBarry Smith     if ((s[i] == ' ' || s[i] == 0) && !flg) {flg = PETSC_TRUE; (*argc)++;}
633c311c98SBarry Smith     else if (s[i] != ' ') {lens[*argc]++;flg = PETSC_FALSE;}
643c311c98SBarry Smith   }
653c311c98SBarry Smith 
663c311c98SBarry Smith   for (i=0; i<*argc; i++) {
67675282fdSHong Zhang     (*args)[i] = (char*) malloc((lens[i]+1)*sizeof(char)); if (!(*args)[i]) return PETSC_ERR_MEM;
683c311c98SBarry Smith   }
69301d30feSBarry Smith   (*args)[*argc] = 0;
703c311c98SBarry Smith 
713c311c98SBarry Smith   *argc = 0;
723c311c98SBarry Smith   for (i=0; i<n; i++) {
733c311c98SBarry Smith     if (s[i] != ' ') break;
743c311c98SBarry Smith   }
753c311c98SBarry Smith   for (;i<n+1; i++) {
763c311c98SBarry Smith     if ((s[i] == ' ' || s[i] == 0) && !flg) {flg = PETSC_TRUE; (*args)[*argc][cnt++] = 0; (*argc)++; cnt = 0;}
77301d30feSBarry Smith     else if (s[i] != ' ' && s[i] != 0) {(*args)[*argc][cnt++] = s[i]; flg = PETSC_FALSE;}
783c311c98SBarry Smith   }
793c311c98SBarry Smith   return 0;
803c311c98SBarry Smith }
813c311c98SBarry Smith 
823c311c98SBarry Smith #undef __FUNCT__
83301d30feSBarry Smith #define __FUNCT__ "PetscStrToArrayDestroy"
84301d30feSBarry Smith /*@C
85301d30feSBarry Smith    PetscStrToArrayDestroy - Frees array created with PetscStrToArray().
86301d30feSBarry Smith 
87301d30feSBarry Smith    Not Collective
88301d30feSBarry Smith 
89301d30feSBarry Smith    Output Parameters:
90301d30feSBarry Smith +  argc - the number of arguments
91301d30feSBarry Smith -  args - the array of arguments
92301d30feSBarry Smith 
93301d30feSBarry Smith    Level: intermediate
94301d30feSBarry Smith 
95301d30feSBarry Smith    Concepts: command line arguments
96301d30feSBarry Smith 
97301d30feSBarry Smith    Notes: This may be called before PetscInitialize() or after PetscFinalize()
98301d30feSBarry Smith 
99301d30feSBarry Smith .seealso: PetscStrToArray()
100301d30feSBarry Smith 
101301d30feSBarry Smith @*/
102301d30feSBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscStrToArrayDestroy(int argc,char **args)
103301d30feSBarry Smith {
104301d30feSBarry Smith   PetscInt i;
105301d30feSBarry Smith 
106301d30feSBarry Smith   for (i=0; i<argc; i++) {
107301d30feSBarry Smith     free(args[i]);
108301d30feSBarry Smith   }
109301d30feSBarry Smith   free(args);
110301d30feSBarry Smith   return 0;
111301d30feSBarry Smith }
112301d30feSBarry Smith 
113301d30feSBarry Smith #undef __FUNCT__
114e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrlen"
115e5c89e4eSSatish Balay /*@C
116e5c89e4eSSatish Balay    PetscStrlen - Gets length of a string
117e5c89e4eSSatish Balay 
118e5c89e4eSSatish Balay    Not Collective
119e5c89e4eSSatish Balay 
120e5c89e4eSSatish Balay    Input Parameters:
121e5c89e4eSSatish Balay .  s - pointer to string
122e5c89e4eSSatish Balay 
123e5c89e4eSSatish Balay    Output Parameter:
124e5c89e4eSSatish Balay .  len - length in bytes
125e5c89e4eSSatish Balay 
126e5c89e4eSSatish Balay    Level: intermediate
127e5c89e4eSSatish Balay 
128e5c89e4eSSatish Balay    Note:
129e5c89e4eSSatish Balay    This routine is analogous to strlen().
130e5c89e4eSSatish Balay 
131e5c89e4eSSatish Balay    Null string returns a length of zero
132e5c89e4eSSatish Balay 
133e5c89e4eSSatish Balay   Concepts: string length
134e5c89e4eSSatish Balay 
135e5c89e4eSSatish Balay @*/
136e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscStrlen(const char s[],size_t *len)
137e5c89e4eSSatish Balay {
138e5c89e4eSSatish Balay   PetscFunctionBegin;
139e5c89e4eSSatish Balay   if (!s) {
140e5c89e4eSSatish Balay     *len = 0;
141e5c89e4eSSatish Balay   } else {
142e5c89e4eSSatish Balay     *len = strlen(s);
143e5c89e4eSSatish Balay   }
144e5c89e4eSSatish Balay   PetscFunctionReturn(0);
145e5c89e4eSSatish Balay }
146e5c89e4eSSatish Balay 
147e5c89e4eSSatish Balay #undef __FUNCT__
148e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrallocpy"
149e5c89e4eSSatish Balay /*@C
150e5c89e4eSSatish Balay    PetscStrallocpy - Allocates space to hold a copy of a string then copies the string
151e5c89e4eSSatish Balay 
152e5c89e4eSSatish Balay    Not Collective
153e5c89e4eSSatish Balay 
154e5c89e4eSSatish Balay    Input Parameters:
155e5c89e4eSSatish Balay .  s - pointer to string
156e5c89e4eSSatish Balay 
157e5c89e4eSSatish Balay    Output Parameter:
158e5c89e4eSSatish Balay .  t - the copied string
159e5c89e4eSSatish Balay 
160e5c89e4eSSatish Balay    Level: intermediate
161e5c89e4eSSatish Balay 
162e5c89e4eSSatish Balay    Note:
163e5c89e4eSSatish Balay       Null string returns a new null string
164e5c89e4eSSatish Balay 
165e5c89e4eSSatish Balay   Concepts: string copy
166e5c89e4eSSatish Balay 
167e5c89e4eSSatish Balay @*/
168e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscStrallocpy(const char s[],char *t[])
169e5c89e4eSSatish Balay {
170e5c89e4eSSatish Balay   PetscErrorCode ierr;
171e5c89e4eSSatish Balay   size_t         len;
17271573d7dSBarry Smith   char           *tmp = 0;
173e5c89e4eSSatish Balay 
174e5c89e4eSSatish Balay   PetscFunctionBegin;
175e5c89e4eSSatish Balay   if (s) {
176e5c89e4eSSatish Balay     ierr = PetscStrlen(s,&len);CHKERRQ(ierr);
17771573d7dSBarry Smith     ierr = PetscMalloc((1+len)*sizeof(char),&tmp);CHKERRQ(ierr);
17871573d7dSBarry Smith     ierr = PetscStrcpy(tmp,s);CHKERRQ(ierr);
179e5c89e4eSSatish Balay   }
18071573d7dSBarry Smith   *t = tmp;
181e5c89e4eSSatish Balay   PetscFunctionReturn(0);
182e5c89e4eSSatish Balay }
183e5c89e4eSSatish Balay 
184e5c89e4eSSatish Balay #undef __FUNCT__
185e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcpy"
186e5c89e4eSSatish Balay /*@C
187e5c89e4eSSatish Balay    PetscStrcpy - Copies a string
188e5c89e4eSSatish Balay 
189e5c89e4eSSatish Balay    Not Collective
190e5c89e4eSSatish Balay 
191e5c89e4eSSatish Balay    Input Parameters:
192e5c89e4eSSatish Balay .  t - pointer to string
193e5c89e4eSSatish Balay 
194e5c89e4eSSatish Balay    Output Parameter:
195e5c89e4eSSatish Balay .  s - the copied string
196e5c89e4eSSatish Balay 
197e5c89e4eSSatish Balay    Level: intermediate
198e5c89e4eSSatish Balay 
199e5c89e4eSSatish Balay    Note:
200e5c89e4eSSatish Balay      Null string returns a string starting with zero
201e5c89e4eSSatish Balay 
202e5c89e4eSSatish Balay   Concepts: string copy
203e5c89e4eSSatish Balay 
204e5c89e4eSSatish Balay .seealso: PetscStrncpy(), PetscStrcat(), PetscStrncat()
205e5c89e4eSSatish Balay 
206e5c89e4eSSatish Balay @*/
207acc6cc86SBarry Smith 
208e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscStrcpy(char s[],const char t[])
209e5c89e4eSSatish Balay {
210e5c89e4eSSatish Balay   PetscFunctionBegin;
21117186662SBarry Smith   if (t && !s) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy string into null pointer");
212e5c89e4eSSatish Balay   if (t) {strcpy(s,t);}
213e5c89e4eSSatish Balay   else if (s) {s[0] = 0;}
214e5c89e4eSSatish Balay   PetscFunctionReturn(0);
215e5c89e4eSSatish Balay }
216e5c89e4eSSatish Balay 
217e5c89e4eSSatish Balay #undef __FUNCT__
218e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncpy"
219e5c89e4eSSatish Balay /*@C
220e5c89e4eSSatish Balay    PetscStrncpy - Copies a string up to a certain length
221e5c89e4eSSatish Balay 
222e5c89e4eSSatish Balay    Not Collective
223e5c89e4eSSatish Balay 
224e5c89e4eSSatish Balay    Input Parameters:
225e5c89e4eSSatish Balay +  t - pointer to string
226e5c89e4eSSatish Balay -  n - the length to copy
227e5c89e4eSSatish Balay 
228e5c89e4eSSatish Balay    Output Parameter:
229e5c89e4eSSatish Balay .  s - the copied string
230e5c89e4eSSatish Balay 
231e5c89e4eSSatish Balay    Level: intermediate
232e5c89e4eSSatish Balay 
233e5c89e4eSSatish Balay    Note:
234e5c89e4eSSatish Balay      Null string returns a string starting with zero
235e5c89e4eSSatish Balay 
236e5c89e4eSSatish Balay   Concepts: string copy
237e5c89e4eSSatish Balay 
238e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrcat(), PetscStrncat()
239e5c89e4eSSatish Balay 
240e5c89e4eSSatish Balay @*/
241e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscStrncpy(char s[],const char t[],size_t n)
242e5c89e4eSSatish Balay {
243e5c89e4eSSatish Balay   PetscFunctionBegin;
24417186662SBarry Smith   if (t && !s) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy string into null pointer");
245e5c89e4eSSatish Balay   if (t) {strncpy(s,t,n);}
246e5c89e4eSSatish Balay   else if (s) {s[0] = 0;}
247e5c89e4eSSatish Balay   PetscFunctionReturn(0);
248e5c89e4eSSatish Balay }
249e5c89e4eSSatish Balay 
250e5c89e4eSSatish Balay #undef __FUNCT__
251e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcat"
252e5c89e4eSSatish Balay /*@C
253e5c89e4eSSatish Balay    PetscStrcat - Concatenates a string onto a given string
254e5c89e4eSSatish Balay 
255e5c89e4eSSatish Balay    Not Collective
256e5c89e4eSSatish Balay 
257e5c89e4eSSatish Balay    Input Parameters:
258e5e2177aSMatthew Knepley +  s - string to be added to
259e5e2177aSMatthew Knepley -  t - pointer to string to be added to end
260e5c89e4eSSatish Balay 
261e5c89e4eSSatish Balay    Level: intermediate
262e5c89e4eSSatish Balay 
263e5c89e4eSSatish Balay   Concepts: string copy
264e5c89e4eSSatish Balay 
265e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrncpy(), PetscStrncat()
266e5c89e4eSSatish Balay 
267e5c89e4eSSatish Balay @*/
268e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscStrcat(char s[],const char t[])
269e5c89e4eSSatish Balay {
270e5c89e4eSSatish Balay   PetscFunctionBegin;
2719b754dc9SBarry Smith   if (!t) PetscFunctionReturn(0);
272e5c89e4eSSatish Balay   strcat(s,t);
273e5c89e4eSSatish Balay   PetscFunctionReturn(0);
274e5c89e4eSSatish Balay }
275e5c89e4eSSatish Balay 
276e5c89e4eSSatish Balay #undef __FUNCT__
277e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncat"
278e5c89e4eSSatish Balay /*@C
279e5c89e4eSSatish Balay    PetscStrncat - Concatenates a string onto a given string, up to a given length
280e5c89e4eSSatish Balay 
281e5c89e4eSSatish Balay    Not Collective
282e5c89e4eSSatish Balay 
283e5c89e4eSSatish Balay    Input Parameters:
284e5c89e4eSSatish Balay +  s - pointer to string to be added to end
285e5c89e4eSSatish Balay .  t - string to be added to
286e5c89e4eSSatish Balay .  n - maximum length to copy
287e5c89e4eSSatish Balay 
288e5c89e4eSSatish Balay    Level: intermediate
289e5c89e4eSSatish Balay 
290e5c89e4eSSatish Balay   Concepts: string copy
291e5c89e4eSSatish Balay 
292e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrncpy(), PetscStrcat()
293e5c89e4eSSatish Balay 
294e5c89e4eSSatish Balay @*/
295e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscStrncat(char s[],const char t[],size_t n)
296e5c89e4eSSatish Balay {
297e5c89e4eSSatish Balay   PetscFunctionBegin;
298e5c89e4eSSatish Balay   strncat(s,t,n);
299e5c89e4eSSatish Balay   PetscFunctionReturn(0);
300e5c89e4eSSatish Balay }
301e5c89e4eSSatish Balay 
302e5c89e4eSSatish Balay #undef __FUNCT__
303e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcmp"
304e5c89e4eSSatish Balay /*@C
305e5c89e4eSSatish Balay    PetscStrcmp - Compares two strings,
306e5c89e4eSSatish Balay 
307e5c89e4eSSatish Balay    Not Collective
308e5c89e4eSSatish Balay 
309e5c89e4eSSatish Balay    Input Parameters:
310e5c89e4eSSatish Balay +  a - pointer to string first string
311e5c89e4eSSatish Balay -  b - pointer to second string
312e5c89e4eSSatish Balay 
313e5c89e4eSSatish Balay    Output Parameter:
314e5c89e4eSSatish Balay .  flg - if the two strings are equal
315e5c89e4eSSatish Balay 
316e5c89e4eSSatish Balay    Level: intermediate
317e5c89e4eSSatish Balay 
318e5c89e4eSSatish Balay .seealso: PetscStrgrt(), PetscStrncmp(), PetscStrcasecmp()
319e5c89e4eSSatish Balay 
320e5c89e4eSSatish Balay @*/
321e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscStrcmp(const char a[],const char b[],PetscTruth *flg)
322e5c89e4eSSatish Balay {
323e5c89e4eSSatish Balay   int c;
324e5c89e4eSSatish Balay 
325e5c89e4eSSatish Balay   PetscFunctionBegin;
326e5c89e4eSSatish Balay   if (!a && !b) {
327e5c89e4eSSatish Balay     *flg = PETSC_TRUE;
328e5c89e4eSSatish Balay   } else if (!a || !b) {
329e5c89e4eSSatish Balay     *flg = PETSC_FALSE;
330e5c89e4eSSatish Balay   } else {
331e5c89e4eSSatish Balay     c = strcmp(a,b);
332e5c89e4eSSatish Balay     if (c) *flg = PETSC_FALSE;
333e5c89e4eSSatish Balay     else   *flg = PETSC_TRUE;
334e5c89e4eSSatish Balay   }
335e5c89e4eSSatish Balay   PetscFunctionReturn(0);
336e5c89e4eSSatish Balay }
337e5c89e4eSSatish Balay 
338e5c89e4eSSatish Balay #undef __FUNCT__
339e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrgrt"
340e5c89e4eSSatish Balay /*@C
341e5c89e4eSSatish Balay    PetscStrgrt - If first string is greater than the second
342e5c89e4eSSatish Balay 
343e5c89e4eSSatish Balay    Not Collective
344e5c89e4eSSatish Balay 
345e5c89e4eSSatish Balay    Input Parameters:
346e5c89e4eSSatish Balay +  a - pointer to first string
347e5c89e4eSSatish Balay -  b - pointer to second string
348e5c89e4eSSatish Balay 
349e5c89e4eSSatish Balay    Output Parameter:
350e5c89e4eSSatish Balay .  flg - if the first string is greater
351e5c89e4eSSatish Balay 
352e5c89e4eSSatish Balay    Notes:
353e5c89e4eSSatish Balay     Null arguments are ok, a null string is considered smaller than
354e5c89e4eSSatish Balay     all others
355e5c89e4eSSatish Balay 
356e5c89e4eSSatish Balay    Level: intermediate
357e5c89e4eSSatish Balay 
358e5c89e4eSSatish Balay .seealso: PetscStrcmp(), PetscStrncmp(), PetscStrcasecmp()
359e5c89e4eSSatish Balay 
360e5c89e4eSSatish Balay @*/
361e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscStrgrt(const char a[],const char b[],PetscTruth *t)
362e5c89e4eSSatish Balay {
363e5c89e4eSSatish Balay   int c;
364e5c89e4eSSatish Balay 
365e5c89e4eSSatish Balay   PetscFunctionBegin;
366e5c89e4eSSatish Balay   if (!a && !b) {
367e5c89e4eSSatish Balay     *t = PETSC_FALSE;
368e5c89e4eSSatish Balay   } else if (a && !b) {
369e5c89e4eSSatish Balay     *t = PETSC_TRUE;
370e5c89e4eSSatish Balay   } else if (!a && b) {
371e5c89e4eSSatish Balay     *t = PETSC_FALSE;
372e5c89e4eSSatish Balay   } else {
373e5c89e4eSSatish Balay     c = strcmp(a,b);
374e5c89e4eSSatish Balay     if (c > 0) *t = PETSC_TRUE;
375e5c89e4eSSatish Balay     else       *t = PETSC_FALSE;
376e5c89e4eSSatish Balay   }
377e5c89e4eSSatish Balay   PetscFunctionReturn(0);
378e5c89e4eSSatish Balay }
379e5c89e4eSSatish Balay 
380e5c89e4eSSatish Balay #undef __FUNCT__
381e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcasecmp"
382e5c89e4eSSatish Balay /*@C
383e5c89e4eSSatish Balay    PetscStrcasecmp - Returns true if the two strings are the same
384e5c89e4eSSatish Balay      except possibly for case.
385e5c89e4eSSatish Balay 
386e5c89e4eSSatish Balay    Not Collective
387e5c89e4eSSatish Balay 
388e5c89e4eSSatish Balay    Input Parameters:
389e5c89e4eSSatish Balay +  a - pointer to first string
390e5c89e4eSSatish Balay -  b - pointer to second string
391e5c89e4eSSatish Balay 
392e5c89e4eSSatish Balay    Output Parameter:
393e5c89e4eSSatish Balay .  flg - if the two strings are the same
394e5c89e4eSSatish Balay 
395e5c89e4eSSatish Balay    Notes:
396e5c89e4eSSatish Balay     Null arguments are ok
397e5c89e4eSSatish Balay 
398e5c89e4eSSatish Balay    Level: intermediate
399e5c89e4eSSatish Balay 
400e5c89e4eSSatish Balay .seealso: PetscStrcmp(), PetscStrncmp(), PetscStrgrt()
401e5c89e4eSSatish Balay 
402e5c89e4eSSatish Balay @*/
403fbb3e65fSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscStrcasecmp(const char a[],const char b[],PetscTruth *t)
404e5c89e4eSSatish Balay {
405e5c89e4eSSatish Balay   int c;
406e5c89e4eSSatish Balay 
407e5c89e4eSSatish Balay   PetscFunctionBegin;
408e5c89e4eSSatish Balay   if (!a && !b) c = 0;
409e5c89e4eSSatish Balay   else if (!a || !b) c = 1;
41032b366c8SSatish Balay #if defined(PETSC_HAVE_STRCASECMP)
41132b366c8SSatish Balay   else c = strcasecmp(a,b);
41232b366c8SSatish Balay #elif defined(PETSC_HAVE_STRICMP)
413e5c89e4eSSatish Balay   else c = stricmp(a,b);
414e5c89e4eSSatish Balay #else
41532b366c8SSatish Balay   else {
41632b366c8SSatish Balay     char *aa,*bb;
41732b366c8SSatish Balay     PetscErrorCode ierr;
41832b366c8SSatish Balay     ierr = PetscStrallocpy(a,&aa);CHKERRQ(ierr);
41932b366c8SSatish Balay     ierr = PetscStrallocpy(b,&bb);CHKERRQ(ierr);
42032b366c8SSatish Balay     ierr = PetscStrtolower(aa);CHKERRQ(ierr);
42132b366c8SSatish Balay     ierr = PetscStrtolower(bb);CHKERRQ(ierr);
42232b366c8SSatish Balay     ierr = PetscStrcmp(aa,bb,t);CHKERRQ(ierr);
423503cfb0cSBarry Smith     ierr = PetscFree(aa);CHKERRQ(ierr);
424503cfb0cSBarry Smith     ierr = PetscFree(bb);CHKERRQ(ierr);
42532b366c8SSatish Balay     PetscFunctionReturn(0);
42632b366c8SSatish Balay   }
427e5c89e4eSSatish Balay #endif
428e5c89e4eSSatish Balay   if (!c) *t = PETSC_TRUE;
429e5c89e4eSSatish Balay   else    *t = PETSC_FALSE;
430e5c89e4eSSatish Balay   PetscFunctionReturn(0);
431e5c89e4eSSatish Balay }
432e5c89e4eSSatish Balay 
43332b366c8SSatish Balay 
43432b366c8SSatish Balay 
435e5c89e4eSSatish Balay #undef __FUNCT__
436e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncmp"
437e5c89e4eSSatish Balay /*@C
438e5c89e4eSSatish Balay    PetscStrncmp - Compares two strings, up to a certain length
439e5c89e4eSSatish Balay 
440e5c89e4eSSatish Balay    Not Collective
441e5c89e4eSSatish Balay 
442e5c89e4eSSatish Balay    Input Parameters:
443e5c89e4eSSatish Balay +  a - pointer to first string
444e5c89e4eSSatish Balay .  b - pointer to second string
445e5c89e4eSSatish Balay -  n - length to compare up to
446e5c89e4eSSatish Balay 
447e5c89e4eSSatish Balay    Output Parameter:
448e5c89e4eSSatish Balay .  t - if the two strings are equal
449e5c89e4eSSatish Balay 
450e5c89e4eSSatish Balay    Level: intermediate
451e5c89e4eSSatish Balay 
452e5c89e4eSSatish Balay .seealso: PetscStrgrt(), PetscStrcmp(), PetscStrcasecmp()
453e5c89e4eSSatish Balay 
454e5c89e4eSSatish Balay @*/
455e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscStrncmp(const char a[],const char b[],size_t n,PetscTruth *t)
456e5c89e4eSSatish Balay {
457e5c89e4eSSatish Balay   int c;
458e5c89e4eSSatish Balay 
459e5c89e4eSSatish Balay   PetscFunctionBegin;
460e5c89e4eSSatish Balay   c = strncmp(a,b,n);
461e5c89e4eSSatish Balay   if (!c) *t = PETSC_TRUE;
462e5c89e4eSSatish Balay   else    *t = PETSC_FALSE;
463e5c89e4eSSatish Balay   PetscFunctionReturn(0);
464e5c89e4eSSatish Balay }
465e5c89e4eSSatish Balay 
466e5c89e4eSSatish Balay #undef __FUNCT__
467e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrchr"
468e5c89e4eSSatish Balay /*@C
469e5c89e4eSSatish Balay    PetscStrchr - Locates first occurance of a character in a string
470e5c89e4eSSatish Balay 
471e5c89e4eSSatish Balay    Not Collective
472e5c89e4eSSatish Balay 
473e5c89e4eSSatish Balay    Input Parameters:
474e5c89e4eSSatish Balay +  a - pointer to string
475e5c89e4eSSatish Balay -  b - character
476e5c89e4eSSatish Balay 
477e5c89e4eSSatish Balay    Output Parameter:
478e5c89e4eSSatish Balay .  c - location of occurance, PETSC_NULL if not found
479e5c89e4eSSatish Balay 
480e5c89e4eSSatish Balay    Level: intermediate
481e5c89e4eSSatish Balay 
482e5c89e4eSSatish Balay @*/
483e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscStrchr(const char a[],char b,char *c[])
484e5c89e4eSSatish Balay {
485e5c89e4eSSatish Balay   PetscFunctionBegin;
486e5c89e4eSSatish Balay   *c = (char *)strchr(a,b);
487e5c89e4eSSatish Balay   PetscFunctionReturn(0);
488e5c89e4eSSatish Balay }
489e5c89e4eSSatish Balay 
490e5c89e4eSSatish Balay #undef __FUNCT__
491e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrrchr"
492e5c89e4eSSatish Balay /*@C
493e5c89e4eSSatish Balay    PetscStrrchr - Locates one location past the last occurance of a character in a string,
494e5c89e4eSSatish Balay       if the character is not found then returns entire string
495e5c89e4eSSatish Balay 
496e5c89e4eSSatish Balay    Not Collective
497e5c89e4eSSatish Balay 
498e5c89e4eSSatish Balay    Input Parameters:
499e5c89e4eSSatish Balay +  a - pointer to string
500e5c89e4eSSatish Balay -  b - character
501e5c89e4eSSatish Balay 
502e5c89e4eSSatish Balay    Output Parameter:
503e5c89e4eSSatish Balay .  tmp - location of occurance, a if not found
504e5c89e4eSSatish Balay 
505e5c89e4eSSatish Balay    Level: intermediate
506e5c89e4eSSatish Balay 
507e5c89e4eSSatish Balay @*/
508e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscStrrchr(const char a[],char b,char *tmp[])
509e5c89e4eSSatish Balay {
510e5c89e4eSSatish Balay   PetscFunctionBegin;
511e5c89e4eSSatish Balay   *tmp = (char *)strrchr(a,b);
512e5c89e4eSSatish Balay   if (!*tmp) *tmp = (char*)a; else *tmp = *tmp + 1;
513e5c89e4eSSatish Balay   PetscFunctionReturn(0);
514e5c89e4eSSatish Balay }
515e5c89e4eSSatish Balay 
516e5c89e4eSSatish Balay #undef __FUNCT__
517e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrtolower"
518e5c89e4eSSatish Balay /*@C
519e5c89e4eSSatish Balay    PetscStrtolower - Converts string to lower case
520e5c89e4eSSatish Balay 
521e5c89e4eSSatish Balay    Not Collective
522e5c89e4eSSatish Balay 
523e5c89e4eSSatish Balay    Input Parameters:
524e5c89e4eSSatish Balay .  a - pointer to string
525e5c89e4eSSatish Balay 
526e5c89e4eSSatish Balay    Level: intermediate
527e5c89e4eSSatish Balay 
528e5c89e4eSSatish Balay @*/
529e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscStrtolower(char a[])
530e5c89e4eSSatish Balay {
531e5c89e4eSSatish Balay   PetscFunctionBegin;
532e5c89e4eSSatish Balay   while (*a) {
533e5c89e4eSSatish Balay     if (*a >= 'A' && *a <= 'Z') *a += 'a' - 'A';
534e5c89e4eSSatish Balay     a++;
535e5c89e4eSSatish Balay   }
536e5c89e4eSSatish Balay   PetscFunctionReturn(0);
537e5c89e4eSSatish Balay }
538e5c89e4eSSatish Balay 
5391d1a0024SBarry Smith struct _p_PetscToken {char token;char *array;char *current;};
5401d1a0024SBarry Smith 
5411d1a0024SBarry Smith 
542e5c89e4eSSatish Balay #undef __FUNCT__
543e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenFind"
544e5c89e4eSSatish Balay /*@C
545e5c89e4eSSatish Balay    PetscTokenFind - Locates next "token" in a string
546e5c89e4eSSatish Balay 
547e5c89e4eSSatish Balay    Not Collective
548e5c89e4eSSatish Balay 
549e5c89e4eSSatish Balay    Input Parameters:
550e5c89e4eSSatish Balay .  a - pointer to token
551e5c89e4eSSatish Balay 
552e5c89e4eSSatish Balay    Output Parameter:
553e5c89e4eSSatish Balay .  result - location of occurance, PETSC_NULL if not found
554e5c89e4eSSatish Balay 
555e5c89e4eSSatish Balay    Notes:
556e5c89e4eSSatish Balay 
557e5c89e4eSSatish Balay      This version is different from the system version in that
558e5c89e4eSSatish Balay   it allows you to pass a read-only string into the function.
559e5c89e4eSSatish Balay 
5604704e885SBarry Smith      This version also treats all characters etc. inside a double quote "
5614704e885SBarry Smith    as a single token.
5624704e885SBarry Smith 
563e5c89e4eSSatish Balay    Level: intermediate
564e5c89e4eSSatish Balay 
565e5c89e4eSSatish Balay .seealso: PetscTokenCreate(), PetscTokenDestroy()
566e5c89e4eSSatish Balay @*/
5671d1a0024SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscTokenFind(PetscToken a,char *result[])
568e5c89e4eSSatish Balay {
5694704e885SBarry Smith   char *ptr = a->current,token;
570e5c89e4eSSatish Balay 
571e5c89e4eSSatish Balay   PetscFunctionBegin;
572e5c89e4eSSatish Balay   *result = a->current;
5734704e885SBarry Smith   if (ptr && !*ptr) {*result = 0;PetscFunctionReturn(0);}
5744704e885SBarry Smith   token = a->token;
57590fdf44cSMatthew Knepley   if (ptr && (*ptr == '"')) {token = '"';(*result)++;ptr++;}
576e5c89e4eSSatish Balay   while (ptr) {
5774704e885SBarry Smith     if (*ptr == token) {
578e5c89e4eSSatish Balay       *ptr++ = 0;
579e5c89e4eSSatish Balay       while (*ptr == a->token) ptr++;
580e5c89e4eSSatish Balay       a->current = ptr;
581e5c89e4eSSatish Balay       break;
582e5c89e4eSSatish Balay     }
583e5c89e4eSSatish Balay     if (!*ptr) {
584e5c89e4eSSatish Balay       a->current = 0;
585e5c89e4eSSatish Balay       break;
586e5c89e4eSSatish Balay     }
587e5c89e4eSSatish Balay     ptr++;
588e5c89e4eSSatish Balay   }
589e5c89e4eSSatish Balay   PetscFunctionReturn(0);
590e5c89e4eSSatish Balay }
591e5c89e4eSSatish Balay 
592e5c89e4eSSatish Balay #undef __FUNCT__
593e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenCreate"
594e5c89e4eSSatish Balay /*@C
595e5c89e4eSSatish Balay    PetscTokenCreate - Creates a PetscToken used to find tokens in a string
596e5c89e4eSSatish Balay 
597e5c89e4eSSatish Balay    Not Collective
598e5c89e4eSSatish Balay 
599e5c89e4eSSatish Balay    Input Parameters:
600e5c89e4eSSatish Balay +  string - the string to look in
601e5c89e4eSSatish Balay -  token - the character to look for
602e5c89e4eSSatish Balay 
603e5c89e4eSSatish Balay    Output Parameter:
604e5c89e4eSSatish Balay .  a - pointer to token
605e5c89e4eSSatish Balay 
606e5c89e4eSSatish Balay    Notes:
607e5c89e4eSSatish Balay 
608e5c89e4eSSatish Balay      This version is different from the system version in that
609e5c89e4eSSatish Balay   it allows you to pass a read-only string into the function.
610e5c89e4eSSatish Balay 
611e5c89e4eSSatish Balay    Level: intermediate
612e5c89e4eSSatish Balay 
613e5c89e4eSSatish Balay .seealso: PetscTokenFind(), PetscTokenDestroy()
614e5c89e4eSSatish Balay @*/
6151d1a0024SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscTokenCreate(const char a[],const char b,PetscToken *t)
616e5c89e4eSSatish Balay {
617e5c89e4eSSatish Balay   PetscErrorCode ierr;
618e5c89e4eSSatish Balay 
619e5c89e4eSSatish Balay   PetscFunctionBegin;
6201d1a0024SBarry Smith   ierr = PetscNew(struct _p_PetscToken,t);CHKERRQ(ierr);
621e5c89e4eSSatish Balay   ierr = PetscStrallocpy(a,&(*t)->array);CHKERRQ(ierr);
622e5c89e4eSSatish Balay   (*t)->current = (*t)->array;
623e5c89e4eSSatish Balay   (*t)->token   = b;
624e5c89e4eSSatish Balay   PetscFunctionReturn(0);
625e5c89e4eSSatish Balay }
626e5c89e4eSSatish Balay 
627e5c89e4eSSatish Balay #undef __FUNCT__
628e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenDestroy"
629e5c89e4eSSatish Balay /*@C
630e5c89e4eSSatish Balay    PetscTokenDestroy - Destroys a PetscToken
631e5c89e4eSSatish Balay 
632e5c89e4eSSatish Balay    Not Collective
633e5c89e4eSSatish Balay 
634e5c89e4eSSatish Balay    Input Parameters:
635e5c89e4eSSatish Balay .  a - pointer to token
636e5c89e4eSSatish Balay 
637e5c89e4eSSatish Balay    Level: intermediate
638e5c89e4eSSatish Balay 
639e5c89e4eSSatish Balay .seealso: PetscTokenCreate(), PetscTokenFind()
640e5c89e4eSSatish Balay @*/
6411d1a0024SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscTokenDestroy(PetscToken a)
642e5c89e4eSSatish Balay {
643e5c89e4eSSatish Balay   PetscErrorCode ierr;
644e5c89e4eSSatish Balay 
645e5c89e4eSSatish Balay   PetscFunctionBegin;
646e5c89e4eSSatish Balay   ierr = PetscFree(a->array);CHKERRQ(ierr);
647e5c89e4eSSatish Balay   ierr = PetscFree(a);CHKERRQ(ierr);
648e5c89e4eSSatish Balay   PetscFunctionReturn(0);
649e5c89e4eSSatish Balay }
650e5c89e4eSSatish Balay 
651e5c89e4eSSatish Balay #undef __FUNCT__
652e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrrstr"
653e5c89e4eSSatish Balay /*@C
654e5c89e4eSSatish Balay    PetscStrrstr - Locates last occurance of string in another string
655e5c89e4eSSatish Balay 
656e5c89e4eSSatish Balay    Not Collective
657e5c89e4eSSatish Balay 
658e5c89e4eSSatish Balay    Input Parameters:
659e5c89e4eSSatish Balay +  a - pointer to string
660e5c89e4eSSatish Balay -  b - string to find
661e5c89e4eSSatish Balay 
662e5c89e4eSSatish Balay    Output Parameter:
663e5c89e4eSSatish Balay .  tmp - location of occurance
664e5c89e4eSSatish Balay 
665e5c89e4eSSatish Balay    Level: intermediate
666e5c89e4eSSatish Balay 
667e5c89e4eSSatish Balay @*/
668e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscStrrstr(const char a[],const char b[],char *tmp[])
669e5c89e4eSSatish Balay {
670e5c89e4eSSatish Balay   const char *stmp = a, *ltmp = 0;
671e5c89e4eSSatish Balay 
672e5c89e4eSSatish Balay   PetscFunctionBegin;
673e5c89e4eSSatish Balay   while (stmp) {
674e5c89e4eSSatish Balay     stmp = (char *)strstr(stmp,b);
675e5c89e4eSSatish Balay     if (stmp) {ltmp = stmp;stmp++;}
676e5c89e4eSSatish Balay   }
677e5c89e4eSSatish Balay   *tmp = (char *)ltmp;
678e5c89e4eSSatish Balay   PetscFunctionReturn(0);
679e5c89e4eSSatish Balay }
680e5c89e4eSSatish Balay 
681e5c89e4eSSatish Balay #undef __FUNCT__
682e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrstr"
683e5c89e4eSSatish Balay /*@C
684e5c89e4eSSatish Balay    PetscStrstr - Locates first occurance of string in another string
685e5c89e4eSSatish Balay 
686e5c89e4eSSatish Balay    Not Collective
687e5c89e4eSSatish Balay 
688e5c89e4eSSatish Balay    Input Parameters:
689e5c89e4eSSatish Balay +  a - pointer to string
690e5c89e4eSSatish Balay -  b - string to find
691e5c89e4eSSatish Balay 
692e5c89e4eSSatish Balay    Output Parameter:
693e5c89e4eSSatish Balay .  tmp - location of occurance
694e5c89e4eSSatish Balay 
695e5c89e4eSSatish Balay    Level: intermediate
696e5c89e4eSSatish Balay 
697e5c89e4eSSatish Balay @*/
698e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscStrstr(const char a[],const char b[],char *tmp[])
699e5c89e4eSSatish Balay {
700e5c89e4eSSatish Balay   PetscFunctionBegin;
701e5c89e4eSSatish Balay   *tmp = (char *)strstr(a,b);
702e5c89e4eSSatish Balay   PetscFunctionReturn(0);
703e5c89e4eSSatish Balay }
704e5c89e4eSSatish Balay 
705e5c89e4eSSatish Balay #undef __FUNCT__
706e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetPetscDir"
707e5c89e4eSSatish Balay /*@C
708e5c89e4eSSatish Balay    PetscGetPetscDir - Gets the directory PETSc is installed in
709e5c89e4eSSatish Balay 
710e5c89e4eSSatish Balay    Not Collective
711e5c89e4eSSatish Balay 
712e5c89e4eSSatish Balay    Output Parameter:
713e5c89e4eSSatish Balay .  dir - the directory
714e5c89e4eSSatish Balay 
715e5c89e4eSSatish Balay    Level: developer
716e5c89e4eSSatish Balay 
717e5c89e4eSSatish Balay @*/
718e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscGetPetscDir(const char *dir[])
719e5c89e4eSSatish Balay {
720e5c89e4eSSatish Balay   PetscFunctionBegin;
721e5c89e4eSSatish Balay   *dir = PETSC_DIR;
722e5c89e4eSSatish Balay   PetscFunctionReturn(0);
723e5c89e4eSSatish Balay }
724e5c89e4eSSatish Balay 
725e5c89e4eSSatish Balay #undef __FUNCT__
726e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrreplace"
727e5c89e4eSSatish Balay /*@C
728e5c89e4eSSatish Balay    PetscStrreplace - Replaces substrings in string with other substrings
729e5c89e4eSSatish Balay 
730e5c89e4eSSatish Balay    Not Collective
731e5c89e4eSSatish Balay 
732e5c89e4eSSatish Balay    Input Parameters:
733e5c89e4eSSatish Balay +   comm - MPI_Comm of processors that are processing the string
73471573d7dSBarry Smith .   aa - the string to look in
735d8ccf1fbSBarry Smith .   b - the resulting copy of a with replaced strings (b can be the same as a)
736e5c89e4eSSatish Balay -   len - the length of b
737e5c89e4eSSatish Balay 
738e5c89e4eSSatish Balay    Notes:
739e5c89e4eSSatish Balay       Replaces   ${PETSC_ARCH},${PETSC_DIR},${PETSC_LIB_DIR},${DISPLAY},
740e5c89e4eSSatish Balay       ${HOMEDIRECTORY},${WORKINGDIRECTORY},${USERNAME} with appropriate values
741e5c89e4eSSatish Balay       as well as any environmental variables.
742e5c89e4eSSatish Balay 
743acc6cc86SBarry Smith       Note: PETSC_LIB_DIR uses the environmental variable if it exists. PETSC_ARCH and PETSC_DIR use what
744acc6cc86SBarry Smith       PETSc was built with and do not use environmental variables.
745acc6cc86SBarry Smith 
746e5c89e4eSSatish Balay    Level: intermediate
747e5c89e4eSSatish Balay 
748e5c89e4eSSatish Balay @*/
74971573d7dSBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscStrreplace(MPI_Comm comm,const char aa[],char b[],size_t len)
750e5c89e4eSSatish Balay {
751e5c89e4eSSatish Balay   PetscErrorCode ierr;
752e5c89e4eSSatish Balay   int            i = 0;
753e5c89e4eSSatish Balay   size_t         l,l1,l2,l3;
75471573d7dSBarry Smith   char           *work,*par,*epar,env[1024],*tfree,*a = (char*)aa;
755e5c89e4eSSatish Balay   const char     *s[] = {"${PETSC_ARCH}","${PETSC_DIR}","${PETSC_LIB_DIR}","${DISPLAY}","${HOMEDIRECTORY}","${WORKINGDIRECTORY}","${USERNAME}",0};
756487e5849SBarry Smith   const char     *r[] = {0,0,0,0,0,0,0,0};
757e5c89e4eSSatish Balay   PetscTruth     flag;
758e5c89e4eSSatish Balay 
759e5c89e4eSSatish Balay   PetscFunctionBegin;
760e32f2f54SBarry Smith   if (!a || !b) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"a and b strings must be nonnull");
76171573d7dSBarry Smith   if (aa == b) {
76222982a5fSBarry Smith     ierr    = PetscStrallocpy(aa,(char **)&a);CHKERRQ(ierr);
76371573d7dSBarry Smith   }
764e5c89e4eSSatish Balay   ierr = PetscMalloc(len*sizeof(char*),&work);CHKERRQ(ierr);
765e5c89e4eSSatish Balay 
766e5c89e4eSSatish Balay   /* get values for replaced variables */
767487e5849SBarry Smith   ierr = PetscStrallocpy(PETSC_ARCH,(char**)&r[0]);CHKERRQ(ierr);
768487e5849SBarry Smith   ierr = PetscStrallocpy(PETSC_DIR,(char**)&r[1]);CHKERRQ(ierr);
769487e5849SBarry Smith   ierr = PetscStrallocpy(PETSC_LIB_DIR,(char**)&r[2]);CHKERRQ(ierr);
770487e5849SBarry Smith   ierr = PetscMalloc(256*sizeof(char),&r[3]);CHKERRQ(ierr);
771487e5849SBarry Smith   ierr = PetscMalloc(PETSC_MAX_PATH_LEN*sizeof(char),&r[4]);CHKERRQ(ierr);
772e5c89e4eSSatish Balay   ierr = PetscMalloc(PETSC_MAX_PATH_LEN*sizeof(char),&r[5]);CHKERRQ(ierr);
773487e5849SBarry Smith   ierr = PetscMalloc(256*sizeof(char),&r[6]);CHKERRQ(ierr);
774487e5849SBarry Smith   ierr = PetscGetDisplay((char*)r[3],256);CHKERRQ(ierr);
775487e5849SBarry Smith   ierr = PetscGetHomeDirectory((char*)r[4],PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
776487e5849SBarry Smith   ierr = PetscGetWorkingDirectory((char*)r[5],PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
777487e5849SBarry Smith   ierr = PetscGetUserName((char*)r[6],256);CHKERRQ(ierr);
778487e5849SBarry Smith 
779487e5849SBarry Smith   /* replace that are in environment */
780487e5849SBarry Smith   ierr = PetscOptionsGetenv(comm,"PETSC_LIB_DIR",env,1024,&flag);CHKERRQ(ierr);
781487e5849SBarry Smith   if (flag) {
782487e5849SBarry Smith     ierr = PetscStrallocpy(env,(char**)&r[2]);CHKERRQ(ierr);
783487e5849SBarry Smith   }
784e5c89e4eSSatish Balay 
785e5c89e4eSSatish Balay   /* replace the requested strings */
786e5c89e4eSSatish Balay   ierr = PetscStrncpy(b,a,len);CHKERRQ(ierr);
787e5c89e4eSSatish Balay   while (s[i]) {
788e5c89e4eSSatish Balay     ierr = PetscStrlen(s[i],&l);CHKERRQ(ierr);
789e5c89e4eSSatish Balay     ierr = PetscStrstr(b,s[i],&par);CHKERRQ(ierr);
790e5c89e4eSSatish Balay     while (par) {
791e5c89e4eSSatish Balay       *par  =  0;
792e5c89e4eSSatish Balay       par  += l;
793e5c89e4eSSatish Balay 
794e5c89e4eSSatish Balay       ierr = PetscStrlen(b,&l1);CHKERRQ(ierr);
795e5c89e4eSSatish Balay       ierr = PetscStrlen(r[i],&l2);CHKERRQ(ierr);
796e5c89e4eSSatish Balay       ierr = PetscStrlen(par,&l3);CHKERRQ(ierr);
79717186662SBarry Smith       if (l1 + l2 + l3 >= len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"b len is not long enough to hold new values");
798e5c89e4eSSatish Balay       ierr  = PetscStrcpy(work,b);CHKERRQ(ierr);
799e5c89e4eSSatish Balay       ierr  = PetscStrcat(work,r[i]);CHKERRQ(ierr);
800e5c89e4eSSatish Balay       ierr  = PetscStrcat(work,par);CHKERRQ(ierr);
801e5c89e4eSSatish Balay       ierr  = PetscStrncpy(b,work,len);CHKERRQ(ierr);
802e5c89e4eSSatish Balay       ierr  = PetscStrstr(b,s[i],&par);CHKERRQ(ierr);
803e5c89e4eSSatish Balay     }
804e5c89e4eSSatish Balay     i++;
805e5c89e4eSSatish Balay   }
806487e5849SBarry Smith   i = 0;
807487e5849SBarry Smith   while (r[i]) {
808e5c89e4eSSatish Balay     tfree = (char*)r[i];
809e5c89e4eSSatish Balay     ierr = PetscFree(tfree);CHKERRQ(ierr);
810487e5849SBarry Smith     i++;
811e5c89e4eSSatish Balay   }
812e5c89e4eSSatish Balay 
813e5c89e4eSSatish Balay   /* look for any other ${xxx} strings to replace from environmental variables */
814e5c89e4eSSatish Balay   ierr = PetscStrstr(b,"${",&par);CHKERRQ(ierr);
815e5c89e4eSSatish Balay   while (par) {
816e5c89e4eSSatish Balay     *par = 0;
817e5c89e4eSSatish Balay     par += 2;
818e5c89e4eSSatish Balay     ierr  = PetscStrcpy(work,b);CHKERRQ(ierr);
819e5c89e4eSSatish Balay     ierr = PetscStrstr(par,"}",&epar);CHKERRQ(ierr);
820e5c89e4eSSatish Balay     *epar = 0;
821e5c89e4eSSatish Balay     epar += 1;
822e5c89e4eSSatish Balay     ierr = PetscOptionsGetenv(comm,par,env,256,&flag);CHKERRQ(ierr);
823e5c89e4eSSatish Balay     if (!flag) {
824e32f2f54SBarry Smith       SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Substitution string ${%s} not found as environmental variable",par);
825e5c89e4eSSatish Balay     }
826e5c89e4eSSatish Balay     ierr = PetscStrcat(work,env);CHKERRQ(ierr);
827e5c89e4eSSatish Balay     ierr = PetscStrcat(work,epar);CHKERRQ(ierr);
828e5c89e4eSSatish Balay     ierr = PetscStrcpy(b,work);CHKERRQ(ierr);
829e5c89e4eSSatish Balay     ierr = PetscStrstr(b,"${",&par);CHKERRQ(ierr);
830e5c89e4eSSatish Balay   }
831e5c89e4eSSatish Balay   ierr = PetscFree(work);CHKERRQ(ierr);
83271573d7dSBarry Smith   if (aa == b) {
83371573d7dSBarry Smith     ierr = PetscFree(a);CHKERRQ(ierr);
83471573d7dSBarry Smith   }
835e5c89e4eSSatish Balay   PetscFunctionReturn(0);
836e5c89e4eSSatish Balay }
837e5c89e4eSSatish Balay 
838e5c89e4eSSatish Balay 
839