xref: /petsc/src/sys/utils/str.c (revision d05ba7d21c6592208d6c32b4e8cdedc38dd52ce5)
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*/
96ce87071SSatish Balay #if defined(PETSC_HAVE_STRING_H)
106ce87071SSatish Balay #include <string.h>             /* strstr */
116ce87071SSatish Balay #endif
123964eb88SJed Brown #if defined(PETSC_HAVE_STRINGS_H)
133964eb88SJed Brown #  include <strings.h>          /* strcasecmp */
143964eb88SJed Brown #endif
153964eb88SJed Brown 
16e5c89e4eSSatish Balay #undef __FUNCT__
173c311c98SBarry Smith #define __FUNCT__ "PetscStrToArray"
183c311c98SBarry Smith /*@C
19d67fe73bSBarry Smith    PetscStrToArray - Seperates a string by a charactor (for example ' ' or '\n') and creates an array of strings
203c311c98SBarry Smith 
213c311c98SBarry Smith    Not Collective
223c311c98SBarry Smith 
233c311c98SBarry Smith    Input Parameters:
24d67fe73bSBarry Smith +  s - pointer to string
25a2ea699eSBarry Smith -  sp - separator charactor
263c311c98SBarry Smith 
273c311c98SBarry Smith    Output Parameter:
283c311c98SBarry Smith +   argc - the number of entries in the array
293c311c98SBarry Smith -   args - an array of the entries with a null at the end
303c311c98SBarry Smith 
313c311c98SBarry Smith    Level: intermediate
323c311c98SBarry Smith 
33301d30feSBarry Smith    Notes: this may be called before PetscInitialize() or after PetscFinalize()
343c311c98SBarry Smith 
356f013253SBarry Smith    Not for use in Fortran
366f013253SBarry Smith 
37b4cd4cebSBarry Smith    Developer Notes: Using raw malloc() and does not call error handlers since this may be used before PETSc is initialized. Used
38b4cd4cebSBarry Smith      to generate argc, args arguments passed to MPI_Init()
39301d30feSBarry Smith 
40b4cd4cebSBarry Smith .seealso: PetscStrToArrayDestroy(), PetscToken, PetscTokenCreate()
413c311c98SBarry Smith 
423c311c98SBarry Smith @*/
43d67fe73bSBarry Smith PetscErrorCode  PetscStrToArray(const char s[],char sp,int *argc,char ***args)
443c311c98SBarry Smith {
453c311c98SBarry Smith   int       i,n,*lens,cnt = 0;
46ace3abfcSBarry Smith   PetscBool flg = PETSC_FALSE;
473c311c98SBarry Smith 
4840a7e1efSBarry Smith   if (!s) n = 0;
4940a7e1efSBarry Smith   else    n = strlen(s);
503c311c98SBarry Smith   *argc = 0;
514996c5bdSBarry Smith   if (!n) {
524996c5bdSBarry Smith     *args = 0;
534996c5bdSBarry Smith     return(0);
544996c5bdSBarry Smith   }
553c311c98SBarry Smith   for (i=0; i<n; i++) {
56d67fe73bSBarry Smith     if (s[i] != sp) break;
573c311c98SBarry Smith   }
583c311c98SBarry Smith   for (;i<n+1; i++) {
59d67fe73bSBarry Smith     if ((s[i] == sp || s[i] == 0) && !flg) {flg = PETSC_TRUE; (*argc)++;}
60d67fe73bSBarry Smith     else if (s[i] != sp) {flg = PETSC_FALSE;}
613c311c98SBarry Smith   }
62a2ea699eSBarry Smith   (*args) = (char**) malloc(((*argc)+1)*sizeof(char*)); if (!*args) return PETSC_ERR_MEM;
6353e6e2c4SHong Zhang   lens    = (int*) malloc((*argc)*sizeof(int)); if (!lens) return PETSC_ERR_MEM;
643c311c98SBarry Smith   for (i=0; i<*argc; i++) lens[i] = 0;
653c311c98SBarry Smith 
663c311c98SBarry Smith   *argc = 0;
673c311c98SBarry Smith   for (i=0; i<n; i++) {
68d67fe73bSBarry Smith     if (s[i] != sp) break;
693c311c98SBarry Smith   }
703c311c98SBarry Smith   for (;i<n+1; i++) {
71d67fe73bSBarry Smith     if ((s[i] == sp || s[i] == 0) && !flg) {flg = PETSC_TRUE; (*argc)++;}
72d67fe73bSBarry Smith     else if (s[i] != sp) {lens[*argc]++;flg = PETSC_FALSE;}
733c311c98SBarry Smith   }
743c311c98SBarry Smith 
753c311c98SBarry Smith   for (i=0; i<*argc; i++) {
76675282fdSHong Zhang     (*args)[i] = (char*) malloc((lens[i]+1)*sizeof(char)); if (!(*args)[i]) return PETSC_ERR_MEM;
773c311c98SBarry Smith   }
78a2ea699eSBarry Smith   free(lens);
79301d30feSBarry Smith   (*args)[*argc] = 0;
803c311c98SBarry Smith 
813c311c98SBarry Smith   *argc = 0;
823c311c98SBarry Smith   for (i=0; i<n; i++) {
83d67fe73bSBarry Smith     if (s[i] != sp) break;
843c311c98SBarry Smith   }
853c311c98SBarry Smith   for (;i<n+1; i++) {
86d67fe73bSBarry Smith     if ((s[i] == sp || s[i] == 0) && !flg) {flg = PETSC_TRUE; (*args)[*argc][cnt++] = 0; (*argc)++; cnt = 0;}
87d67fe73bSBarry Smith     else if (s[i] != sp && s[i] != 0) {(*args)[*argc][cnt++] = s[i]; flg = PETSC_FALSE;}
883c311c98SBarry Smith   }
893c311c98SBarry Smith   return 0;
903c311c98SBarry Smith }
913c311c98SBarry Smith 
923c311c98SBarry Smith #undef __FUNCT__
93301d30feSBarry Smith #define __FUNCT__ "PetscStrToArrayDestroy"
94301d30feSBarry Smith /*@C
95301d30feSBarry Smith    PetscStrToArrayDestroy - Frees array created with PetscStrToArray().
96301d30feSBarry Smith 
97301d30feSBarry Smith    Not Collective
98301d30feSBarry Smith 
99301d30feSBarry Smith    Output Parameters:
100301d30feSBarry Smith +  argc - the number of arguments
101301d30feSBarry Smith -  args - the array of arguments
102301d30feSBarry Smith 
103301d30feSBarry Smith    Level: intermediate
104301d30feSBarry Smith 
105301d30feSBarry Smith    Concepts: command line arguments
106301d30feSBarry Smith 
107301d30feSBarry Smith    Notes: This may be called before PetscInitialize() or after PetscFinalize()
108301d30feSBarry Smith 
1096f013253SBarry Smith    Not for use in Fortran
1106f013253SBarry Smith 
111301d30feSBarry Smith .seealso: PetscStrToArray()
112301d30feSBarry Smith 
113301d30feSBarry Smith @*/
1147087cfbeSBarry Smith PetscErrorCode  PetscStrToArrayDestroy(int argc,char **args)
115301d30feSBarry Smith {
116301d30feSBarry Smith   PetscInt i;
117301d30feSBarry Smith 
118a297a907SKarl Rupp   for (i=0; i<argc; i++) free(args[i]);
119a297a907SKarl Rupp   if (args) free(args);
120301d30feSBarry Smith   return 0;
121301d30feSBarry Smith }
122301d30feSBarry Smith 
123301d30feSBarry Smith #undef __FUNCT__
124e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrlen"
125e5c89e4eSSatish Balay /*@C
126e5c89e4eSSatish Balay    PetscStrlen - Gets length of a string
127e5c89e4eSSatish Balay 
128e5c89e4eSSatish Balay    Not Collective
129e5c89e4eSSatish Balay 
130e5c89e4eSSatish Balay    Input Parameters:
131e5c89e4eSSatish Balay .  s - pointer to string
132e5c89e4eSSatish Balay 
133e5c89e4eSSatish Balay    Output Parameter:
134e5c89e4eSSatish Balay .  len - length in bytes
135e5c89e4eSSatish Balay 
136e5c89e4eSSatish Balay    Level: intermediate
137e5c89e4eSSatish Balay 
138e5c89e4eSSatish Balay    Note:
139e5c89e4eSSatish Balay    This routine is analogous to strlen().
140e5c89e4eSSatish Balay 
141e5c89e4eSSatish Balay    Null string returns a length of zero
142e5c89e4eSSatish Balay 
1436f013253SBarry Smith    Not for use in Fortran
1446f013253SBarry Smith 
145e5c89e4eSSatish Balay   Concepts: string length
146e5c89e4eSSatish Balay 
147e5c89e4eSSatish Balay @*/
1487087cfbeSBarry Smith PetscErrorCode  PetscStrlen(const char s[],size_t *len)
149e5c89e4eSSatish Balay {
150e5c89e4eSSatish Balay   PetscFunctionBegin;
151a297a907SKarl Rupp   if (!s) *len = 0;
152a297a907SKarl Rupp   else    *len = strlen(s);
153e5c89e4eSSatish Balay   PetscFunctionReturn(0);
154e5c89e4eSSatish Balay }
155e5c89e4eSSatish Balay 
156e5c89e4eSSatish Balay #undef __FUNCT__
157e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrallocpy"
158e5c89e4eSSatish Balay /*@C
159e5c89e4eSSatish Balay    PetscStrallocpy - Allocates space to hold a copy of a string then copies the string
160e5c89e4eSSatish Balay 
161e5c89e4eSSatish Balay    Not Collective
162e5c89e4eSSatish Balay 
163e5c89e4eSSatish Balay    Input Parameters:
164e5c89e4eSSatish Balay .  s - pointer to string
165e5c89e4eSSatish Balay 
166e5c89e4eSSatish Balay    Output Parameter:
167e5c89e4eSSatish Balay .  t - the copied string
168e5c89e4eSSatish Balay 
169e5c89e4eSSatish Balay    Level: intermediate
170e5c89e4eSSatish Balay 
171e5c89e4eSSatish Balay    Note:
172e5c89e4eSSatish Balay       Null string returns a new null string
173e5c89e4eSSatish Balay 
1746f013253SBarry Smith       Not for use in Fortran
1756f013253SBarry Smith 
176e5c89e4eSSatish Balay   Concepts: string copy
177e5c89e4eSSatish Balay 
178e5c89e4eSSatish Balay @*/
1797087cfbeSBarry Smith PetscErrorCode  PetscStrallocpy(const char s[],char *t[])
180e5c89e4eSSatish Balay {
181e5c89e4eSSatish Balay   PetscErrorCode ierr;
182e5c89e4eSSatish Balay   size_t         len;
18371573d7dSBarry Smith   char           *tmp = 0;
184e5c89e4eSSatish Balay 
185e5c89e4eSSatish Balay   PetscFunctionBegin;
186e5c89e4eSSatish Balay   if (s) {
187e5c89e4eSSatish Balay     ierr = PetscStrlen(s,&len);CHKERRQ(ierr);
188785e854fSJed Brown     ierr = PetscMalloc1((1+len),&tmp);CHKERRQ(ierr);
18971573d7dSBarry Smith     ierr = PetscStrcpy(tmp,s);CHKERRQ(ierr);
190e5c89e4eSSatish Balay   }
19171573d7dSBarry Smith   *t = tmp;
192e5c89e4eSSatish Balay   PetscFunctionReturn(0);
193e5c89e4eSSatish Balay }
194e5c89e4eSSatish Balay 
195e5c89e4eSSatish Balay #undef __FUNCT__
19647340559SBarry Smith #define __FUNCT__ "PetscStrArrayallocpy"
19747340559SBarry Smith /*@C
19847340559SBarry Smith    PetscStrArrayallocpy - Allocates space to hold a copy of an array of strings then copies the strings
19947340559SBarry Smith 
20047340559SBarry Smith    Not Collective
20147340559SBarry Smith 
20247340559SBarry Smith    Input Parameters:
20347340559SBarry Smith .  s - pointer to array of strings (final string is a null)
20447340559SBarry Smith 
20547340559SBarry Smith    Output Parameter:
20647340559SBarry Smith .  t - the copied array string
20747340559SBarry Smith 
20847340559SBarry Smith    Level: intermediate
20947340559SBarry Smith 
21047340559SBarry Smith    Note:
21147340559SBarry Smith       Not for use in Fortran
21247340559SBarry Smith 
21347340559SBarry Smith   Concepts: string copy
21447340559SBarry Smith 
21547340559SBarry Smith .seealso: PetscStrallocpy() PetscStrArrayDestroy()
21647340559SBarry Smith 
21747340559SBarry Smith @*/
21847340559SBarry Smith PetscErrorCode  PetscStrArrayallocpy(const char *const *list,char ***t)
21947340559SBarry Smith {
22047340559SBarry Smith   PetscErrorCode ierr;
22147340559SBarry Smith   PetscInt       i,n = 0;
22247340559SBarry Smith 
22347340559SBarry Smith   PetscFunctionBegin;
22447340559SBarry Smith   while (list[n++]) ;
225785e854fSJed Brown   ierr = PetscMalloc1((n+1),t);CHKERRQ(ierr);
22647340559SBarry Smith   for (i=0; i<n; i++) {
22747340559SBarry Smith     ierr = PetscStrallocpy(list[i],(*t)+i);CHKERRQ(ierr);
22847340559SBarry Smith   }
2290298fd71SBarry Smith   (*t)[n] = NULL;
23047340559SBarry Smith   PetscFunctionReturn(0);
23147340559SBarry Smith }
23247340559SBarry Smith 
23347340559SBarry Smith #undef __FUNCT__
23447340559SBarry Smith #define __FUNCT__ "PetscStrArrayDestroy"
23547340559SBarry Smith /*@C
23647340559SBarry Smith    PetscStrArrayDestroy - Frees array of strings created with PetscStrArrayallocpy().
23747340559SBarry Smith 
23847340559SBarry Smith    Not Collective
23947340559SBarry Smith 
24047340559SBarry Smith    Output Parameters:
24147340559SBarry Smith .   list - array of strings
24247340559SBarry Smith 
24347340559SBarry Smith    Level: intermediate
24447340559SBarry Smith 
24547340559SBarry Smith    Concepts: command line arguments
24647340559SBarry Smith 
24747340559SBarry Smith    Notes: Not for use in Fortran
24847340559SBarry Smith 
24947340559SBarry Smith .seealso: PetscStrArrayallocpy()
25047340559SBarry Smith 
25147340559SBarry Smith @*/
2526fed8037SJed Brown PetscErrorCode PetscStrArrayDestroy(char ***list)
25347340559SBarry Smith {
25447340559SBarry Smith   PetscInt       n = 0;
25547340559SBarry Smith   PetscErrorCode ierr;
25647340559SBarry Smith 
2576fed8037SJed Brown   PetscFunctionBegin;
2586fed8037SJed Brown   if (!*list) PetscFunctionReturn(0);
2596fed8037SJed Brown   while ((*list)[n]) {
2606fed8037SJed Brown     ierr = PetscFree((*list)[n]);CHKERRQ(ierr);
26147340559SBarry Smith     n++;
26247340559SBarry Smith   }
2636fed8037SJed Brown   ierr = PetscFree(*list);CHKERRQ(ierr);
2646fed8037SJed Brown   PetscFunctionReturn(0);
26547340559SBarry Smith }
26647340559SBarry Smith 
26747340559SBarry Smith #undef __FUNCT__
268e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcpy"
269e5c89e4eSSatish Balay /*@C
270e5c89e4eSSatish Balay    PetscStrcpy - Copies a string
271e5c89e4eSSatish Balay 
272e5c89e4eSSatish Balay    Not Collective
273e5c89e4eSSatish Balay 
274e5c89e4eSSatish Balay    Input Parameters:
275e5c89e4eSSatish Balay .  t - pointer to string
276e5c89e4eSSatish Balay 
277e5c89e4eSSatish Balay    Output Parameter:
278e5c89e4eSSatish Balay .  s - the copied string
279e5c89e4eSSatish Balay 
280e5c89e4eSSatish Balay    Level: intermediate
281e5c89e4eSSatish Balay 
2826f013253SBarry Smith    Notes:
283e5c89e4eSSatish Balay      Null string returns a string starting with zero
284e5c89e4eSSatish Balay 
2856f013253SBarry Smith      Not for use in Fortran
2866f013253SBarry Smith 
287e5c89e4eSSatish Balay   Concepts: string copy
288e5c89e4eSSatish Balay 
289e5c89e4eSSatish Balay .seealso: PetscStrncpy(), PetscStrcat(), PetscStrncat()
290e5c89e4eSSatish Balay 
291e5c89e4eSSatish Balay @*/
292acc6cc86SBarry Smith 
2937087cfbeSBarry Smith PetscErrorCode  PetscStrcpy(char s[],const char t[])
294e5c89e4eSSatish Balay {
295e5c89e4eSSatish Balay   PetscFunctionBegin;
29617186662SBarry Smith   if (t && !s) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy string into null pointer");
297a297a907SKarl Rupp   if (t) strcpy(s,t);
298a297a907SKarl Rupp   else if (s) s[0] = 0;
299e5c89e4eSSatish Balay   PetscFunctionReturn(0);
300e5c89e4eSSatish Balay }
301e5c89e4eSSatish Balay 
302e5c89e4eSSatish Balay #undef __FUNCT__
303e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncpy"
304e5c89e4eSSatish Balay /*@C
305e5c89e4eSSatish Balay    PetscStrncpy - Copies a string up to a certain length
306e5c89e4eSSatish Balay 
307e5c89e4eSSatish Balay    Not Collective
308e5c89e4eSSatish Balay 
309e5c89e4eSSatish Balay    Input Parameters:
310e5c89e4eSSatish Balay +  t - pointer to string
311e5c89e4eSSatish Balay -  n - the length to copy
312e5c89e4eSSatish Balay 
313e5c89e4eSSatish Balay    Output Parameter:
314e5c89e4eSSatish Balay .  s - the copied string
315e5c89e4eSSatish Balay 
316e5c89e4eSSatish Balay    Level: intermediate
317e5c89e4eSSatish Balay 
318e5c89e4eSSatish Balay    Note:
319e5c89e4eSSatish Balay      Null string returns a string starting with zero
320e5c89e4eSSatish Balay 
321ff32304bSBarry Smith      If the string that is being copied is of length n or larger then the entire string is not
322ff32304bSBarry Smith      copied and the file location of s is set to NULL. This is different then the behavior of
323ff32304bSBarry Smith      strncpy() which leaves s non-terminated.
324ff32304bSBarry Smith 
325e5c89e4eSSatish Balay   Concepts: string copy
326e5c89e4eSSatish Balay 
327e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrcat(), PetscStrncat()
328e5c89e4eSSatish Balay 
329e5c89e4eSSatish Balay @*/
3307087cfbeSBarry Smith PetscErrorCode  PetscStrncpy(char s[],const char t[],size_t n)
331e5c89e4eSSatish Balay {
332e5c89e4eSSatish Balay   PetscFunctionBegin;
33317186662SBarry Smith   if (t && !s) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy string into null pointer");
334ff32304bSBarry Smith   if (t) {
3358dc57659SBarry Smith     if (n > 1) {
3362c26941aSBarry Smith       strncpy(s,t,n-1);
337ff32304bSBarry Smith       s[n-1] = '\0';
3388dc57659SBarry Smith     } else {
3398dc57659SBarry Smith       s[0] = '\0';
3408dc57659SBarry Smith     }
341ff32304bSBarry Smith   } else if (s) s[0] = 0;
342e5c89e4eSSatish Balay   PetscFunctionReturn(0);
343e5c89e4eSSatish Balay }
344e5c89e4eSSatish Balay 
345e5c89e4eSSatish Balay #undef __FUNCT__
346e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcat"
347e5c89e4eSSatish Balay /*@C
348e5c89e4eSSatish Balay    PetscStrcat - Concatenates a string onto a given string
349e5c89e4eSSatish Balay 
350e5c89e4eSSatish Balay    Not Collective
351e5c89e4eSSatish Balay 
352e5c89e4eSSatish Balay    Input Parameters:
353e5e2177aSMatthew Knepley +  s - string to be added to
354e5e2177aSMatthew Knepley -  t - pointer to string to be added to end
355e5c89e4eSSatish Balay 
356e5c89e4eSSatish Balay    Level: intermediate
357e5c89e4eSSatish Balay 
3586f013253SBarry Smith    Notes: Not for use in Fortran
3596f013253SBarry Smith 
360e5c89e4eSSatish Balay   Concepts: string copy
361e5c89e4eSSatish Balay 
362e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrncpy(), PetscStrncat()
363e5c89e4eSSatish Balay 
364e5c89e4eSSatish Balay @*/
3657087cfbeSBarry Smith PetscErrorCode  PetscStrcat(char s[],const char t[])
366e5c89e4eSSatish Balay {
367e5c89e4eSSatish Balay   PetscFunctionBegin;
3689b754dc9SBarry Smith   if (!t) PetscFunctionReturn(0);
369e5c89e4eSSatish Balay   strcat(s,t);
370e5c89e4eSSatish Balay   PetscFunctionReturn(0);
371e5c89e4eSSatish Balay }
372e5c89e4eSSatish Balay 
373e5c89e4eSSatish Balay #undef __FUNCT__
374e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncat"
375e5c89e4eSSatish Balay /*@C
376e5c89e4eSSatish Balay    PetscStrncat - Concatenates a string onto a given string, up to a given length
377e5c89e4eSSatish Balay 
378e5c89e4eSSatish Balay    Not Collective
379e5c89e4eSSatish Balay 
380e5c89e4eSSatish Balay    Input Parameters:
381e5c89e4eSSatish Balay +  s - pointer to string to be added to end
382e5c89e4eSSatish Balay .  t - string to be added to
383e5c89e4eSSatish Balay .  n - maximum length to copy
384e5c89e4eSSatish Balay 
385e5c89e4eSSatish Balay    Level: intermediate
386e5c89e4eSSatish Balay 
3876f013253SBarry Smith   Notes:    Not for use in Fortran
3886f013253SBarry Smith 
389e5c89e4eSSatish Balay   Concepts: string copy
390e5c89e4eSSatish Balay 
391e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrncpy(), PetscStrcat()
392e5c89e4eSSatish Balay 
393e5c89e4eSSatish Balay @*/
3947087cfbeSBarry Smith PetscErrorCode  PetscStrncat(char s[],const char t[],size_t n)
395e5c89e4eSSatish Balay {
396e5c89e4eSSatish Balay   PetscFunctionBegin;
397e5c89e4eSSatish Balay   strncat(s,t,n);
398e5c89e4eSSatish Balay   PetscFunctionReturn(0);
399e5c89e4eSSatish Balay }
400e5c89e4eSSatish Balay 
401e5c89e4eSSatish Balay #undef __FUNCT__
402573b0fb4SBarry Smith #define __FUNCT__ "PetscStrcmpNoError"
403573b0fb4SBarry Smith /*
404573b0fb4SBarry Smith    Only to be used with PetscCheck__FUNCT__()!
405573b0fb4SBarry Smith 
406573b0fb4SBarry Smith    Will be removed once we eliminate the __FUNCT__ paradigm
407573b0fb4SBarry Smith */
408573b0fb4SBarry Smith void  PetscStrcmpNoError(const char a[],const char b[],PetscBool  *flg)
409573b0fb4SBarry Smith {
410573b0fb4SBarry Smith   int c;
411573b0fb4SBarry Smith 
412573b0fb4SBarry Smith   if (!a && !b)      *flg = PETSC_TRUE;
413573b0fb4SBarry Smith   else if (!a || !b) *flg = PETSC_FALSE;
414573b0fb4SBarry Smith   else {
415573b0fb4SBarry Smith     c = strcmp(a,b);
416573b0fb4SBarry Smith     if (c) *flg = PETSC_FALSE;
417573b0fb4SBarry Smith     else   *flg = PETSC_TRUE;
418573b0fb4SBarry Smith   }
419573b0fb4SBarry Smith }
420573b0fb4SBarry Smith 
421573b0fb4SBarry Smith #undef __FUNCT__
422e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcmp"
423e5c89e4eSSatish Balay /*@C
424e5c89e4eSSatish Balay    PetscStrcmp - Compares two strings,
425e5c89e4eSSatish Balay 
426e5c89e4eSSatish Balay    Not Collective
427e5c89e4eSSatish Balay 
428e5c89e4eSSatish Balay    Input Parameters:
429e5c89e4eSSatish Balay +  a - pointer to string first string
430e5c89e4eSSatish Balay -  b - pointer to second string
431e5c89e4eSSatish Balay 
432e5c89e4eSSatish Balay    Output Parameter:
4338c74ee41SBarry Smith .  flg - PETSC_TRUE if the two strings are equal
434e5c89e4eSSatish Balay 
435e5c89e4eSSatish Balay    Level: intermediate
436e5c89e4eSSatish Balay 
4376f013253SBarry Smith    Notes:    Not for use in Fortran
4386f013253SBarry Smith 
439e5c89e4eSSatish Balay .seealso: PetscStrgrt(), PetscStrncmp(), PetscStrcasecmp()
440e5c89e4eSSatish Balay 
441e5c89e4eSSatish Balay @*/
4427087cfbeSBarry Smith PetscErrorCode  PetscStrcmp(const char a[],const char b[],PetscBool  *flg)
443e5c89e4eSSatish Balay {
444e5c89e4eSSatish Balay   int c;
445e5c89e4eSSatish Balay 
446e5c89e4eSSatish Balay   PetscFunctionBegin;
447a297a907SKarl Rupp   if (!a && !b)      *flg = PETSC_TRUE;
448a297a907SKarl Rupp   else if (!a || !b) *flg = PETSC_FALSE;
449a297a907SKarl Rupp   else {
450e5c89e4eSSatish Balay     c = strcmp(a,b);
451e5c89e4eSSatish Balay     if (c) *flg = PETSC_FALSE;
452e5c89e4eSSatish Balay     else   *flg = PETSC_TRUE;
453e5c89e4eSSatish Balay   }
454e5c89e4eSSatish Balay   PetscFunctionReturn(0);
455e5c89e4eSSatish Balay }
456e5c89e4eSSatish Balay 
457e5c89e4eSSatish Balay #undef __FUNCT__
458e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrgrt"
459e5c89e4eSSatish Balay /*@C
460e5c89e4eSSatish Balay    PetscStrgrt - If first string is greater than the second
461e5c89e4eSSatish Balay 
462e5c89e4eSSatish Balay    Not Collective
463e5c89e4eSSatish Balay 
464e5c89e4eSSatish Balay    Input Parameters:
465e5c89e4eSSatish Balay +  a - pointer to first string
466e5c89e4eSSatish Balay -  b - pointer to second string
467e5c89e4eSSatish Balay 
468e5c89e4eSSatish Balay    Output Parameter:
469e5c89e4eSSatish Balay .  flg - if the first string is greater
470e5c89e4eSSatish Balay 
471e5c89e4eSSatish Balay    Notes:
472e5c89e4eSSatish Balay     Null arguments are ok, a null string is considered smaller than
473e5c89e4eSSatish Balay     all others
474e5c89e4eSSatish Balay 
4756f013253SBarry Smith    Not for use in Fortran
4766f013253SBarry Smith 
477e5c89e4eSSatish Balay    Level: intermediate
478e5c89e4eSSatish Balay 
479e5c89e4eSSatish Balay .seealso: PetscStrcmp(), PetscStrncmp(), PetscStrcasecmp()
480e5c89e4eSSatish Balay 
481e5c89e4eSSatish Balay @*/
4827087cfbeSBarry Smith PetscErrorCode  PetscStrgrt(const char a[],const char b[],PetscBool  *t)
483e5c89e4eSSatish Balay {
484e5c89e4eSSatish Balay   int c;
485e5c89e4eSSatish Balay 
486e5c89e4eSSatish Balay   PetscFunctionBegin;
487a297a907SKarl Rupp   if (!a && !b) *t = PETSC_FALSE;
488a297a907SKarl Rupp   else if (a && !b) *t = PETSC_TRUE;
489a297a907SKarl Rupp   else if (!a && b) *t = PETSC_FALSE;
490a297a907SKarl Rupp   else {
491e5c89e4eSSatish Balay     c = strcmp(a,b);
492e5c89e4eSSatish Balay     if (c > 0) *t = PETSC_TRUE;
493e5c89e4eSSatish Balay     else       *t = PETSC_FALSE;
494e5c89e4eSSatish Balay   }
495e5c89e4eSSatish Balay   PetscFunctionReturn(0);
496e5c89e4eSSatish Balay }
497e5c89e4eSSatish Balay 
498e5c89e4eSSatish Balay #undef __FUNCT__
499e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcasecmp"
500e5c89e4eSSatish Balay /*@C
501e5c89e4eSSatish Balay    PetscStrcasecmp - Returns true if the two strings are the same
502e5c89e4eSSatish Balay      except possibly for case.
503e5c89e4eSSatish Balay 
504e5c89e4eSSatish Balay    Not Collective
505e5c89e4eSSatish Balay 
506e5c89e4eSSatish Balay    Input Parameters:
507e5c89e4eSSatish Balay +  a - pointer to first string
508e5c89e4eSSatish Balay -  b - pointer to second string
509e5c89e4eSSatish Balay 
510e5c89e4eSSatish Balay    Output Parameter:
511e5c89e4eSSatish Balay .  flg - if the two strings are the same
512e5c89e4eSSatish Balay 
513e5c89e4eSSatish Balay    Notes:
514e5c89e4eSSatish Balay     Null arguments are ok
515e5c89e4eSSatish Balay 
5166f013253SBarry Smith    Not for use in Fortran
5176f013253SBarry Smith 
518e5c89e4eSSatish Balay    Level: intermediate
519e5c89e4eSSatish Balay 
520e5c89e4eSSatish Balay .seealso: PetscStrcmp(), PetscStrncmp(), PetscStrgrt()
521e5c89e4eSSatish Balay 
522e5c89e4eSSatish Balay @*/
5237087cfbeSBarry Smith PetscErrorCode  PetscStrcasecmp(const char a[],const char b[],PetscBool  *t)
524e5c89e4eSSatish Balay {
525e5c89e4eSSatish Balay   int c;
526e5c89e4eSSatish Balay 
527e5c89e4eSSatish Balay   PetscFunctionBegin;
528e5c89e4eSSatish Balay   if (!a && !b) c = 0;
529e5c89e4eSSatish Balay   else if (!a || !b) c = 1;
53032b366c8SSatish Balay #if defined(PETSC_HAVE_STRCASECMP)
53132b366c8SSatish Balay   else c = strcasecmp(a,b);
53232b366c8SSatish Balay #elif defined(PETSC_HAVE_STRICMP)
533e5c89e4eSSatish Balay   else c = stricmp(a,b);
534e5c89e4eSSatish Balay #else
53532b366c8SSatish Balay   else {
53632b366c8SSatish Balay     char           *aa,*bb;
53732b366c8SSatish Balay     PetscErrorCode ierr;
53832b366c8SSatish Balay     ierr = PetscStrallocpy(a,&aa);CHKERRQ(ierr);
53932b366c8SSatish Balay     ierr = PetscStrallocpy(b,&bb);CHKERRQ(ierr);
54032b366c8SSatish Balay     ierr = PetscStrtolower(aa);CHKERRQ(ierr);
54132b366c8SSatish Balay     ierr = PetscStrtolower(bb);CHKERRQ(ierr);
54232b366c8SSatish Balay     ierr = PetscStrcmp(aa,bb,t);CHKERRQ(ierr);
543503cfb0cSBarry Smith     ierr = PetscFree(aa);CHKERRQ(ierr);
544503cfb0cSBarry Smith     ierr = PetscFree(bb);CHKERRQ(ierr);
54532b366c8SSatish Balay     PetscFunctionReturn(0);
54632b366c8SSatish Balay   }
547e5c89e4eSSatish Balay #endif
548e5c89e4eSSatish Balay   if (!c) *t = PETSC_TRUE;
549e5c89e4eSSatish Balay   else    *t = PETSC_FALSE;
550e5c89e4eSSatish Balay   PetscFunctionReturn(0);
551e5c89e4eSSatish Balay }
552e5c89e4eSSatish Balay 
55332b366c8SSatish Balay 
55432b366c8SSatish Balay 
555e5c89e4eSSatish Balay #undef __FUNCT__
556e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncmp"
557e5c89e4eSSatish Balay /*@C
558e5c89e4eSSatish Balay    PetscStrncmp - Compares two strings, up to a certain length
559e5c89e4eSSatish Balay 
560e5c89e4eSSatish Balay    Not Collective
561e5c89e4eSSatish Balay 
562e5c89e4eSSatish Balay    Input Parameters:
563e5c89e4eSSatish Balay +  a - pointer to first string
564e5c89e4eSSatish Balay .  b - pointer to second string
565e5c89e4eSSatish Balay -  n - length to compare up to
566e5c89e4eSSatish Balay 
567e5c89e4eSSatish Balay    Output Parameter:
568e5c89e4eSSatish Balay .  t - if the two strings are equal
569e5c89e4eSSatish Balay 
570e5c89e4eSSatish Balay    Level: intermediate
571e5c89e4eSSatish Balay 
5726f013253SBarry Smith    Notes:    Not for use in Fortran
5736f013253SBarry Smith 
574e5c89e4eSSatish Balay .seealso: PetscStrgrt(), PetscStrcmp(), PetscStrcasecmp()
575e5c89e4eSSatish Balay 
576e5c89e4eSSatish Balay @*/
5777087cfbeSBarry Smith PetscErrorCode  PetscStrncmp(const char a[],const char b[],size_t n,PetscBool  *t)
578e5c89e4eSSatish Balay {
579e5c89e4eSSatish Balay   int c;
580e5c89e4eSSatish Balay 
581e5c89e4eSSatish Balay   PetscFunctionBegin;
582e5c89e4eSSatish Balay   c = strncmp(a,b,n);
583e5c89e4eSSatish Balay   if (!c) *t = PETSC_TRUE;
584e5c89e4eSSatish Balay   else    *t = PETSC_FALSE;
585e5c89e4eSSatish Balay   PetscFunctionReturn(0);
586e5c89e4eSSatish Balay }
587e5c89e4eSSatish Balay 
588e5c89e4eSSatish Balay #undef __FUNCT__
589e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrchr"
590e5c89e4eSSatish Balay /*@C
591e5c89e4eSSatish Balay    PetscStrchr - Locates first occurance of a character in a string
592e5c89e4eSSatish Balay 
593e5c89e4eSSatish Balay    Not Collective
594e5c89e4eSSatish Balay 
595e5c89e4eSSatish Balay    Input Parameters:
596e5c89e4eSSatish Balay +  a - pointer to string
597e5c89e4eSSatish Balay -  b - character
598e5c89e4eSSatish Balay 
599e5c89e4eSSatish Balay    Output Parameter:
6000298fd71SBarry Smith .  c - location of occurance, NULL if not found
601e5c89e4eSSatish Balay 
602e5c89e4eSSatish Balay    Level: intermediate
603e5c89e4eSSatish Balay 
6046f013253SBarry Smith    Notes:    Not for use in Fortran
6056f013253SBarry Smith 
606e5c89e4eSSatish Balay @*/
6077087cfbeSBarry Smith PetscErrorCode  PetscStrchr(const char a[],char b,char *c[])
608e5c89e4eSSatish Balay {
609e5c89e4eSSatish Balay   PetscFunctionBegin;
610e5c89e4eSSatish Balay   *c = (char*)strchr(a,b);
611e5c89e4eSSatish Balay   PetscFunctionReturn(0);
612e5c89e4eSSatish Balay }
613e5c89e4eSSatish Balay 
614e5c89e4eSSatish Balay #undef __FUNCT__
615e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrrchr"
616e5c89e4eSSatish Balay /*@C
617e5c89e4eSSatish Balay    PetscStrrchr - Locates one location past the last occurance of a character in a string,
618e5c89e4eSSatish Balay       if the character is not found then returns entire string
619e5c89e4eSSatish Balay 
620e5c89e4eSSatish Balay    Not Collective
621e5c89e4eSSatish Balay 
622e5c89e4eSSatish Balay    Input Parameters:
623e5c89e4eSSatish Balay +  a - pointer to string
624e5c89e4eSSatish Balay -  b - character
625e5c89e4eSSatish Balay 
626e5c89e4eSSatish Balay    Output Parameter:
627e5c89e4eSSatish Balay .  tmp - location of occurance, a if not found
628e5c89e4eSSatish Balay 
629e5c89e4eSSatish Balay    Level: intermediate
630e5c89e4eSSatish Balay 
6316f013253SBarry Smith    Notes:    Not for use in Fortran
6326f013253SBarry Smith 
633e5c89e4eSSatish Balay @*/
6347087cfbeSBarry Smith PetscErrorCode  PetscStrrchr(const char a[],char b,char *tmp[])
635e5c89e4eSSatish Balay {
636e5c89e4eSSatish Balay   PetscFunctionBegin;
637e5c89e4eSSatish Balay   *tmp = (char*)strrchr(a,b);
638a297a907SKarl Rupp   if (!*tmp) *tmp = (char*)a;
639a297a907SKarl Rupp   else *tmp = *tmp + 1;
640e5c89e4eSSatish Balay   PetscFunctionReturn(0);
641e5c89e4eSSatish Balay }
642e5c89e4eSSatish Balay 
643e5c89e4eSSatish Balay #undef __FUNCT__
644e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrtolower"
645e5c89e4eSSatish Balay /*@C
646e5c89e4eSSatish Balay    PetscStrtolower - Converts string to lower case
647e5c89e4eSSatish Balay 
648e5c89e4eSSatish Balay    Not Collective
649e5c89e4eSSatish Balay 
650e5c89e4eSSatish Balay    Input Parameters:
651e5c89e4eSSatish Balay .  a - pointer to string
652e5c89e4eSSatish Balay 
653e5c89e4eSSatish Balay    Level: intermediate
654e5c89e4eSSatish Balay 
6556f013253SBarry Smith    Notes:    Not for use in Fortran
6566f013253SBarry Smith 
657e5c89e4eSSatish Balay @*/
6587087cfbeSBarry Smith PetscErrorCode  PetscStrtolower(char a[])
659e5c89e4eSSatish Balay {
660e5c89e4eSSatish Balay   PetscFunctionBegin;
661e5c89e4eSSatish Balay   while (*a) {
662e5c89e4eSSatish Balay     if (*a >= 'A' && *a <= 'Z') *a += 'a' - 'A';
663e5c89e4eSSatish Balay     a++;
664e5c89e4eSSatish Balay   }
665e5c89e4eSSatish Balay   PetscFunctionReturn(0);
666e5c89e4eSSatish Balay }
667e5c89e4eSSatish Balay 
6687ba3a57cSBarry Smith #undef __FUNCT__
6692f234a98SBarry Smith #define __FUNCT__ "PetscStrtoupper"
6702f234a98SBarry Smith /*@C
6712f234a98SBarry Smith    PetscStrtolower - Converts string to upper case
6722f234a98SBarry Smith 
6732f234a98SBarry Smith    Not Collective
6742f234a98SBarry Smith 
6752f234a98SBarry Smith    Input Parameters:
6762f234a98SBarry Smith .  a - pointer to string
6772f234a98SBarry Smith 
6782f234a98SBarry Smith    Level: intermediate
6792f234a98SBarry Smith 
6802f234a98SBarry Smith    Notes:    Not for use in Fortran
6812f234a98SBarry Smith 
6822f234a98SBarry Smith @*/
6832f234a98SBarry Smith PetscErrorCode  PetscStrtoupper(char a[])
6842f234a98SBarry Smith {
6852f234a98SBarry Smith   PetscFunctionBegin;
6862f234a98SBarry Smith   while (*a) {
6872f234a98SBarry Smith     if (*a >= 'a' && *a <= 'z') *a += 'A' - 'a';
6882f234a98SBarry Smith     a++;
6892f234a98SBarry Smith   }
6902f234a98SBarry Smith   PetscFunctionReturn(0);
6912f234a98SBarry Smith }
6922f234a98SBarry Smith 
6932f234a98SBarry Smith #undef __FUNCT__
6947ba3a57cSBarry Smith #define __FUNCT__ "PetscStrendswith"
6957ba3a57cSBarry Smith /*@C
6967ba3a57cSBarry Smith    PetscStrendswith - Determines if a string ends with a certain string
6971d1a0024SBarry Smith 
6987ba3a57cSBarry Smith    Not Collective
6997ba3a57cSBarry Smith 
7007ba3a57cSBarry Smith    Input Parameters:
7017ba3a57cSBarry Smith +  a - pointer to string
7027ba3a57cSBarry Smith -  b - string to endwith
7037ba3a57cSBarry Smith 
7047ba3a57cSBarry Smith    Output Parameter:
7057ba3a57cSBarry Smith .  flg - PETSC_TRUE or PETSC_FALSE
7067ba3a57cSBarry Smith 
7077ba3a57cSBarry Smith    Notes:     Not for use in Fortran
7087ba3a57cSBarry Smith 
7097ba3a57cSBarry Smith    Level: intermediate
7107ba3a57cSBarry Smith 
7117ba3a57cSBarry Smith @*/
7127ba3a57cSBarry Smith PetscErrorCode  PetscStrendswith(const char a[],const char b[],PetscBool *flg)
7137ba3a57cSBarry Smith {
7147ba3a57cSBarry Smith   char           *test;
7157ba3a57cSBarry Smith   PetscErrorCode ierr;
7167ba3a57cSBarry Smith   size_t         na,nb;
7177ba3a57cSBarry Smith 
7187ba3a57cSBarry Smith   PetscFunctionBegin;
7197ba3a57cSBarry Smith   *flg = PETSC_FALSE;
7207ba3a57cSBarry Smith   ierr = PetscStrrstr(a,b,&test);CHKERRQ(ierr);
7217ba3a57cSBarry Smith   if (test) {
7227ba3a57cSBarry Smith     ierr = PetscStrlen(a,&na);CHKERRQ(ierr);
7237ba3a57cSBarry Smith     ierr = PetscStrlen(b,&nb);CHKERRQ(ierr);
7247ba3a57cSBarry Smith     if (a+na-nb == test) *flg = PETSC_TRUE;
7257ba3a57cSBarry Smith   }
7267ba3a57cSBarry Smith   PetscFunctionReturn(0);
7277ba3a57cSBarry Smith }
7287ba3a57cSBarry Smith 
7297ba3a57cSBarry Smith #undef __FUNCT__
7302c9581d2SBarry Smith #define __FUNCT__ "PetscStrbeginswith"
7312c9581d2SBarry Smith /*@C
7322c9581d2SBarry Smith    PetscStrbeginswith - Determines if a string begins with a certain string
7332c9581d2SBarry Smith 
7342c9581d2SBarry Smith    Not Collective
7352c9581d2SBarry Smith 
7362c9581d2SBarry Smith    Input Parameters:
7372c9581d2SBarry Smith +  a - pointer to string
7382c9581d2SBarry Smith -  b - string to beginwith
7392c9581d2SBarry Smith 
7402c9581d2SBarry Smith    Output Parameter:
7412c9581d2SBarry Smith .  flg - PETSC_TRUE or PETSC_FALSE
7422c9581d2SBarry Smith 
7432c9581d2SBarry Smith    Notes:     Not for use in Fortran
7442c9581d2SBarry Smith 
7452c9581d2SBarry Smith    Level: intermediate
7462c9581d2SBarry Smith 
7472c9581d2SBarry Smith @*/
7482c9581d2SBarry Smith PetscErrorCode  PetscStrbeginswith(const char a[],const char b[],PetscBool *flg)
7492c9581d2SBarry Smith {
7502c9581d2SBarry Smith   char           *test;
7512c9581d2SBarry Smith   PetscErrorCode ierr;
7522c9581d2SBarry Smith 
7532c9581d2SBarry Smith   PetscFunctionBegin;
7542c9581d2SBarry Smith   *flg = PETSC_FALSE;
7552c9581d2SBarry Smith   ierr = PetscStrrstr(a,b,&test);CHKERRQ(ierr);
756a297a907SKarl Rupp   if (test && (test == a)) *flg = PETSC_TRUE;
7572c9581d2SBarry Smith   PetscFunctionReturn(0);
7582c9581d2SBarry Smith }
7592c9581d2SBarry Smith 
7602c9581d2SBarry Smith 
7612c9581d2SBarry Smith #undef __FUNCT__
7627ba3a57cSBarry Smith #define __FUNCT__ "PetscStrendswithwhich"
7637ba3a57cSBarry Smith /*@C
7647ba3a57cSBarry Smith    PetscStrendswithwhich - Determines if a string ends with one of several possible strings
7657ba3a57cSBarry Smith 
7667ba3a57cSBarry Smith    Not Collective
7677ba3a57cSBarry Smith 
7687ba3a57cSBarry Smith    Input Parameters:
7697ba3a57cSBarry Smith +  a - pointer to string
7707ba3a57cSBarry Smith -  bs - strings to endwith (last entry must be null)
7717ba3a57cSBarry Smith 
7727ba3a57cSBarry Smith    Output Parameter:
7737ba3a57cSBarry Smith .  cnt - the index of the string it ends with or 1+the last possible index
7747ba3a57cSBarry Smith 
7757ba3a57cSBarry Smith    Notes:     Not for use in Fortran
7767ba3a57cSBarry Smith 
7777ba3a57cSBarry Smith    Level: intermediate
7787ba3a57cSBarry Smith 
7797ba3a57cSBarry Smith @*/
7807ba3a57cSBarry Smith PetscErrorCode  PetscStrendswithwhich(const char a[],const char *const *bs,PetscInt *cnt)
7817ba3a57cSBarry Smith {
7827ba3a57cSBarry Smith   PetscBool      flg;
7837ba3a57cSBarry Smith   PetscErrorCode ierr;
7847ba3a57cSBarry Smith 
7857ba3a57cSBarry Smith   PetscFunctionBegin;
7867ba3a57cSBarry Smith   *cnt = 0;
7877ba3a57cSBarry Smith   while (bs[*cnt]) {
7887ba3a57cSBarry Smith     ierr = PetscStrendswith(a,bs[*cnt],&flg);CHKERRQ(ierr);
7897ba3a57cSBarry Smith     if (flg) PetscFunctionReturn(0);
7907ba3a57cSBarry Smith     *cnt += 1;
7917ba3a57cSBarry Smith   }
7927ba3a57cSBarry Smith   PetscFunctionReturn(0);
7937ba3a57cSBarry Smith }
7947ba3a57cSBarry Smith 
7957ba3a57cSBarry Smith #undef __FUNCT__
7967ba3a57cSBarry Smith #define __FUNCT__ "PetscStrrstr"
7977ba3a57cSBarry Smith /*@C
7987ba3a57cSBarry Smith    PetscStrrstr - Locates last occurance of string in another string
7997ba3a57cSBarry Smith 
8007ba3a57cSBarry Smith    Not Collective
8017ba3a57cSBarry Smith 
8027ba3a57cSBarry Smith    Input Parameters:
8037ba3a57cSBarry Smith +  a - pointer to string
8047ba3a57cSBarry Smith -  b - string to find
8057ba3a57cSBarry Smith 
8067ba3a57cSBarry Smith    Output Parameter:
8077ba3a57cSBarry Smith .  tmp - location of occurance
8087ba3a57cSBarry Smith 
8097ba3a57cSBarry Smith    Notes:     Not for use in Fortran
8107ba3a57cSBarry Smith 
8117ba3a57cSBarry Smith    Level: intermediate
8127ba3a57cSBarry Smith 
8137ba3a57cSBarry Smith @*/
8147ba3a57cSBarry Smith PetscErrorCode  PetscStrrstr(const char a[],const char b[],char *tmp[])
8157ba3a57cSBarry Smith {
8167ba3a57cSBarry Smith   const char *stmp = a, *ltmp = 0;
8177ba3a57cSBarry Smith 
8187ba3a57cSBarry Smith   PetscFunctionBegin;
8197ba3a57cSBarry Smith   while (stmp) {
8207ba3a57cSBarry Smith     stmp = (char*)strstr(stmp,b);
8217ba3a57cSBarry Smith     if (stmp) {ltmp = stmp;stmp++;}
8227ba3a57cSBarry Smith   }
8237ba3a57cSBarry Smith   *tmp = (char*)ltmp;
8247ba3a57cSBarry Smith   PetscFunctionReturn(0);
8257ba3a57cSBarry Smith }
8267ba3a57cSBarry Smith 
8277ba3a57cSBarry Smith #undef __FUNCT__
8287ba3a57cSBarry Smith #define __FUNCT__ "PetscStrstr"
8297ba3a57cSBarry Smith /*@C
8307ba3a57cSBarry Smith    PetscStrstr - Locates first occurance of string in another string
8317ba3a57cSBarry Smith 
8327ba3a57cSBarry Smith    Not Collective
8337ba3a57cSBarry Smith 
8347ba3a57cSBarry Smith    Input Parameters:
835160f4796SJed Brown +  haystack - string to search
836160f4796SJed Brown -  needle - string to find
8377ba3a57cSBarry Smith 
8387ba3a57cSBarry Smith    Output Parameter:
8390298fd71SBarry Smith .  tmp - location of occurance, is a NULL if the string is not found
8407ba3a57cSBarry Smith 
8417ba3a57cSBarry Smith    Notes: Not for use in Fortran
8427ba3a57cSBarry Smith 
8437ba3a57cSBarry Smith    Level: intermediate
8447ba3a57cSBarry Smith 
8457ba3a57cSBarry Smith @*/
846160f4796SJed Brown PetscErrorCode  PetscStrstr(const char haystack[],const char needle[],char *tmp[])
8477ba3a57cSBarry Smith {
8487ba3a57cSBarry Smith   PetscFunctionBegin;
849160f4796SJed Brown   *tmp = (char*)strstr(haystack,needle);
8507ba3a57cSBarry Smith   PetscFunctionReturn(0);
8517ba3a57cSBarry Smith }
8527ba3a57cSBarry Smith 
8537ba3a57cSBarry Smith struct _p_PetscToken {char token;char *array;char *current;};
8541d1a0024SBarry Smith 
855e5c89e4eSSatish Balay #undef __FUNCT__
856e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenFind"
857e5c89e4eSSatish Balay /*@C
858e5c89e4eSSatish Balay    PetscTokenFind - Locates next "token" in a string
859e5c89e4eSSatish Balay 
860e5c89e4eSSatish Balay    Not Collective
861e5c89e4eSSatish Balay 
862e5c89e4eSSatish Balay    Input Parameters:
863e5c89e4eSSatish Balay .  a - pointer to token
864e5c89e4eSSatish Balay 
865e5c89e4eSSatish Balay    Output Parameter:
8660298fd71SBarry Smith .  result - location of occurance, NULL if not found
867e5c89e4eSSatish Balay 
868e5c89e4eSSatish Balay    Notes:
869e5c89e4eSSatish Balay 
870e5c89e4eSSatish Balay      This version is different from the system version in that
871e5c89e4eSSatish Balay   it allows you to pass a read-only string into the function.
872e5c89e4eSSatish Balay 
8734704e885SBarry Smith      This version also treats all characters etc. inside a double quote "
8744704e885SBarry Smith    as a single token.
8754704e885SBarry Smith 
8766f013253SBarry Smith     Not for use in Fortran
8776f013253SBarry Smith 
878e5c89e4eSSatish Balay    Level: intermediate
879e5c89e4eSSatish Balay 
8806f013253SBarry Smith 
881e5c89e4eSSatish Balay .seealso: PetscTokenCreate(), PetscTokenDestroy()
882e5c89e4eSSatish Balay @*/
8837087cfbeSBarry Smith PetscErrorCode  PetscTokenFind(PetscToken a,char *result[])
884e5c89e4eSSatish Balay {
8854704e885SBarry Smith   char *ptr = a->current,token;
886e5c89e4eSSatish Balay 
887e5c89e4eSSatish Balay   PetscFunctionBegin;
888e5c89e4eSSatish Balay   *result = a->current;
8894704e885SBarry Smith   if (ptr && !*ptr) {*result = 0;PetscFunctionReturn(0);}
8904704e885SBarry Smith   token = a->token;
89190fdf44cSMatthew Knepley   if (ptr && (*ptr == '"')) {token = '"';(*result)++;ptr++;}
892e5c89e4eSSatish Balay   while (ptr) {
8934704e885SBarry Smith     if (*ptr == token) {
894e5c89e4eSSatish Balay       *ptr++ = 0;
895e5c89e4eSSatish Balay       while (*ptr == a->token) ptr++;
896e5c89e4eSSatish Balay       a->current = ptr;
897e5c89e4eSSatish Balay       break;
898e5c89e4eSSatish Balay     }
899e5c89e4eSSatish Balay     if (!*ptr) {
900e5c89e4eSSatish Balay       a->current = 0;
901e5c89e4eSSatish Balay       break;
902e5c89e4eSSatish Balay     }
903e5c89e4eSSatish Balay     ptr++;
904e5c89e4eSSatish Balay   }
905e5c89e4eSSatish Balay   PetscFunctionReturn(0);
906e5c89e4eSSatish Balay }
907e5c89e4eSSatish Balay 
908e5c89e4eSSatish Balay #undef __FUNCT__
909e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenCreate"
910e5c89e4eSSatish Balay /*@C
911e5c89e4eSSatish Balay    PetscTokenCreate - Creates a PetscToken used to find tokens in a string
912e5c89e4eSSatish Balay 
913e5c89e4eSSatish Balay    Not Collective
914e5c89e4eSSatish Balay 
915e5c89e4eSSatish Balay    Input Parameters:
916e5c89e4eSSatish Balay +  string - the string to look in
917e5c89e4eSSatish Balay -  token - the character to look for
918e5c89e4eSSatish Balay 
919e5c89e4eSSatish Balay    Output Parameter:
920e5c89e4eSSatish Balay .  a - pointer to token
921e5c89e4eSSatish Balay 
922e5c89e4eSSatish Balay    Notes:
923e5c89e4eSSatish Balay 
924e5c89e4eSSatish Balay      This version is different from the system version in that
925e5c89e4eSSatish Balay   it allows you to pass a read-only string into the function.
926e5c89e4eSSatish Balay 
9276f013253SBarry Smith     Not for use in Fortran
9286f013253SBarry Smith 
929e5c89e4eSSatish Balay    Level: intermediate
930e5c89e4eSSatish Balay 
931e5c89e4eSSatish Balay .seealso: PetscTokenFind(), PetscTokenDestroy()
932e5c89e4eSSatish Balay @*/
9337087cfbeSBarry Smith PetscErrorCode  PetscTokenCreate(const char a[],const char b,PetscToken *t)
934e5c89e4eSSatish Balay {
935e5c89e4eSSatish Balay   PetscErrorCode ierr;
936e5c89e4eSSatish Balay 
937e5c89e4eSSatish Balay   PetscFunctionBegin;
938b00a9115SJed Brown   ierr = PetscNew(t);CHKERRQ(ierr);
939e5c89e4eSSatish Balay   ierr = PetscStrallocpy(a,&(*t)->array);CHKERRQ(ierr);
940a297a907SKarl Rupp 
941e5c89e4eSSatish Balay   (*t)->current = (*t)->array;
942e5c89e4eSSatish Balay   (*t)->token   = b;
943e5c89e4eSSatish Balay   PetscFunctionReturn(0);
944e5c89e4eSSatish Balay }
945e5c89e4eSSatish Balay 
946e5c89e4eSSatish Balay #undef __FUNCT__
947e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenDestroy"
948e5c89e4eSSatish Balay /*@C
949e5c89e4eSSatish Balay    PetscTokenDestroy - Destroys a PetscToken
950e5c89e4eSSatish Balay 
951e5c89e4eSSatish Balay    Not Collective
952e5c89e4eSSatish Balay 
953e5c89e4eSSatish Balay    Input Parameters:
954e5c89e4eSSatish Balay .  a - pointer to token
955e5c89e4eSSatish Balay 
956e5c89e4eSSatish Balay    Level: intermediate
957e5c89e4eSSatish Balay 
9586f013253SBarry Smith    Notes:     Not for use in Fortran
9596f013253SBarry Smith 
960e5c89e4eSSatish Balay .seealso: PetscTokenCreate(), PetscTokenFind()
961e5c89e4eSSatish Balay @*/
9628c74ee41SBarry Smith PetscErrorCode  PetscTokenDestroy(PetscToken *a)
963e5c89e4eSSatish Balay {
964e5c89e4eSSatish Balay   PetscErrorCode ierr;
965e5c89e4eSSatish Balay 
966e5c89e4eSSatish Balay   PetscFunctionBegin;
9678c74ee41SBarry Smith   if (!*a) PetscFunctionReturn(0);
9688c74ee41SBarry Smith   ierr = PetscFree((*a)->array);CHKERRQ(ierr);
9698c74ee41SBarry Smith   ierr = PetscFree(*a);CHKERRQ(ierr);
970e5c89e4eSSatish Balay   PetscFunctionReturn(0);
971e5c89e4eSSatish Balay }
972e5c89e4eSSatish Balay 
973e5c89e4eSSatish Balay 
974e5c89e4eSSatish Balay #undef __FUNCT__
975e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetPetscDir"
976e5c89e4eSSatish Balay /*@C
977e5c89e4eSSatish Balay    PetscGetPetscDir - Gets the directory PETSc is installed in
978e5c89e4eSSatish Balay 
979e5c89e4eSSatish Balay    Not Collective
980e5c89e4eSSatish Balay 
981e5c89e4eSSatish Balay    Output Parameter:
982e5c89e4eSSatish Balay .  dir - the directory
983e5c89e4eSSatish Balay 
984e5c89e4eSSatish Balay    Level: developer
985e5c89e4eSSatish Balay 
9866f013253SBarry Smith    Notes: Not for use in Fortran
9876f013253SBarry Smith 
988e5c89e4eSSatish Balay @*/
9897087cfbeSBarry Smith PetscErrorCode  PetscGetPetscDir(const char *dir[])
990e5c89e4eSSatish Balay {
991e5c89e4eSSatish Balay   PetscFunctionBegin;
992e5c89e4eSSatish Balay   *dir = PETSC_DIR;
993e5c89e4eSSatish Balay   PetscFunctionReturn(0);
994e5c89e4eSSatish Balay }
995e5c89e4eSSatish Balay 
996e5c89e4eSSatish Balay #undef __FUNCT__
997e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrreplace"
998e5c89e4eSSatish Balay /*@C
999e5c89e4eSSatish Balay    PetscStrreplace - Replaces substrings in string with other substrings
1000e5c89e4eSSatish Balay 
1001e5c89e4eSSatish Balay    Not Collective
1002e5c89e4eSSatish Balay 
1003e5c89e4eSSatish Balay    Input Parameters:
1004e5c89e4eSSatish Balay +   comm - MPI_Comm of processors that are processing the string
100571573d7dSBarry Smith .   aa - the string to look in
1006d8ccf1fbSBarry Smith .   b - the resulting copy of a with replaced strings (b can be the same as a)
1007e5c89e4eSSatish Balay -   len - the length of b
1008e5c89e4eSSatish Balay 
1009e5c89e4eSSatish Balay    Notes:
1010e5c89e4eSSatish Balay       Replaces   ${PETSC_ARCH},${PETSC_DIR},${PETSC_LIB_DIR},${DISPLAY},
1011d5649816SBarry Smith       ${HOMEDIRECTORY},${WORKINGDIRECTORY},${USERNAME}, ${HOSTNAME} with appropriate values
1012e5c89e4eSSatish Balay       as well as any environmental variables.
1013e5c89e4eSSatish Balay 
10146f013253SBarry Smith       PETSC_LIB_DIR uses the environmental variable if it exists. PETSC_ARCH and PETSC_DIR use what
1015acc6cc86SBarry Smith       PETSc was built with and do not use environmental variables.
1016acc6cc86SBarry Smith 
10176f013253SBarry Smith       Not for use in Fortran
10186f013253SBarry Smith 
1019e5c89e4eSSatish Balay    Level: intermediate
1020e5c89e4eSSatish Balay 
1021e5c89e4eSSatish Balay @*/
10227087cfbeSBarry Smith PetscErrorCode  PetscStrreplace(MPI_Comm comm,const char aa[],char b[],size_t len)
1023e5c89e4eSSatish Balay {
1024e5c89e4eSSatish Balay   PetscErrorCode ierr;
1025e5c89e4eSSatish Balay   int            i = 0;
1026e5c89e4eSSatish Balay   size_t         l,l1,l2,l3;
102771573d7dSBarry Smith   char           *work,*par,*epar,env[1024],*tfree,*a = (char*)aa;
1028d5649816SBarry Smith   const char     *s[] = {"${PETSC_ARCH}","${PETSC_DIR}","${PETSC_LIB_DIR}","${DISPLAY}","${HOMEDIRECTORY}","${WORKINGDIRECTORY}","${USERNAME}","${HOSTNAME}",0};
1029d5649816SBarry Smith   const char     *r[] = {0,0,0,0,0,0,0,0,0};
1030ace3abfcSBarry Smith   PetscBool      flag;
1031e5c89e4eSSatish Balay 
1032e5c89e4eSSatish Balay   PetscFunctionBegin;
1033e32f2f54SBarry Smith   if (!a || !b) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"a and b strings must be nonnull");
103471573d7dSBarry Smith   if (aa == b) {
103522982a5fSBarry Smith     ierr = PetscStrallocpy(aa,(char**)&a);CHKERRQ(ierr);
103671573d7dSBarry Smith   }
1037785e854fSJed Brown   ierr = PetscMalloc1(len,&work);CHKERRQ(ierr);
1038e5c89e4eSSatish Balay 
1039e5c89e4eSSatish Balay   /* get values for replaced variables */
1040487e5849SBarry Smith   ierr = PetscStrallocpy(PETSC_ARCH,(char**)&r[0]);CHKERRQ(ierr);
1041487e5849SBarry Smith   ierr = PetscStrallocpy(PETSC_DIR,(char**)&r[1]);CHKERRQ(ierr);
1042487e5849SBarry Smith   ierr = PetscStrallocpy(PETSC_LIB_DIR,(char**)&r[2]);CHKERRQ(ierr);
1043785e854fSJed Brown   ierr = PetscMalloc1(256,&r[3]);CHKERRQ(ierr);
1044785e854fSJed Brown   ierr = PetscMalloc1(PETSC_MAX_PATH_LEN,&r[4]);CHKERRQ(ierr);
1045785e854fSJed Brown   ierr = PetscMalloc1(PETSC_MAX_PATH_LEN,&r[5]);CHKERRQ(ierr);
1046785e854fSJed Brown   ierr = PetscMalloc1(256,&r[6]);CHKERRQ(ierr);
1047785e854fSJed Brown   ierr = PetscMalloc1(256,&r[7]);CHKERRQ(ierr);
1048487e5849SBarry Smith   ierr = PetscGetDisplay((char*)r[3],256);CHKERRQ(ierr);
1049487e5849SBarry Smith   ierr = PetscGetHomeDirectory((char*)r[4],PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
1050487e5849SBarry Smith   ierr = PetscGetWorkingDirectory((char*)r[5],PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
1051487e5849SBarry Smith   ierr = PetscGetUserName((char*)r[6],256);CHKERRQ(ierr);
1052d5649816SBarry Smith   ierr = PetscGetHostName((char*)r[7],256);CHKERRQ(ierr);
1053487e5849SBarry Smith 
1054487e5849SBarry Smith   /* replace that are in environment */
1055487e5849SBarry Smith   ierr = PetscOptionsGetenv(comm,"PETSC_LIB_DIR",env,1024,&flag);CHKERRQ(ierr);
1056487e5849SBarry Smith   if (flag) {
105731936d58SMatthew G. Knepley     ierr = PetscFree(r[2]);CHKERRQ(ierr);
1058487e5849SBarry Smith     ierr = PetscStrallocpy(env,(char**)&r[2]);CHKERRQ(ierr);
1059487e5849SBarry Smith   }
1060e5c89e4eSSatish Balay 
1061e5c89e4eSSatish Balay   /* replace the requested strings */
1062e5c89e4eSSatish Balay   ierr = PetscStrncpy(b,a,len);CHKERRQ(ierr);
1063e5c89e4eSSatish Balay   while (s[i]) {
1064e5c89e4eSSatish Balay     ierr = PetscStrlen(s[i],&l);CHKERRQ(ierr);
1065e5c89e4eSSatish Balay     ierr = PetscStrstr(b,s[i],&par);CHKERRQ(ierr);
1066e5c89e4eSSatish Balay     while (par) {
1067e5c89e4eSSatish Balay       *par =  0;
1068e5c89e4eSSatish Balay       par += l;
1069e5c89e4eSSatish Balay 
1070e5c89e4eSSatish Balay       ierr = PetscStrlen(b,&l1);CHKERRQ(ierr);
1071e5c89e4eSSatish Balay       ierr = PetscStrlen(r[i],&l2);CHKERRQ(ierr);
1072e5c89e4eSSatish Balay       ierr = PetscStrlen(par,&l3);CHKERRQ(ierr);
107317186662SBarry Smith       if (l1 + l2 + l3 >= len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"b len is not long enough to hold new values");
1074e5c89e4eSSatish Balay       ierr = PetscStrcpy(work,b);CHKERRQ(ierr);
1075e5c89e4eSSatish Balay       ierr = PetscStrcat(work,r[i]);CHKERRQ(ierr);
1076e5c89e4eSSatish Balay       ierr = PetscStrcat(work,par);CHKERRQ(ierr);
1077e5c89e4eSSatish Balay       ierr = PetscStrncpy(b,work,len);CHKERRQ(ierr);
1078e5c89e4eSSatish Balay       ierr = PetscStrstr(b,s[i],&par);CHKERRQ(ierr);
1079e5c89e4eSSatish Balay     }
1080e5c89e4eSSatish Balay     i++;
1081e5c89e4eSSatish Balay   }
1082487e5849SBarry Smith   i = 0;
1083487e5849SBarry Smith   while (r[i]) {
1084e5c89e4eSSatish Balay     tfree = (char*)r[i];
1085e5c89e4eSSatish Balay     ierr  = PetscFree(tfree);CHKERRQ(ierr);
1086487e5849SBarry Smith     i++;
1087e5c89e4eSSatish Balay   }
1088e5c89e4eSSatish Balay 
1089e5c89e4eSSatish Balay   /* look for any other ${xxx} strings to replace from environmental variables */
1090e5c89e4eSSatish Balay   ierr = PetscStrstr(b,"${",&par);CHKERRQ(ierr);
1091e5c89e4eSSatish Balay   while (par) {
1092e5c89e4eSSatish Balay     *par  = 0;
1093e5c89e4eSSatish Balay     par  += 2;
1094e5c89e4eSSatish Balay     ierr  = PetscStrcpy(work,b);CHKERRQ(ierr);
1095e5c89e4eSSatish Balay     ierr  = PetscStrstr(par,"}",&epar);CHKERRQ(ierr);
1096e5c89e4eSSatish Balay     *epar = 0;
1097e5c89e4eSSatish Balay     epar += 1;
1098e5c89e4eSSatish Balay     ierr  = PetscOptionsGetenv(comm,par,env,256,&flag);CHKERRQ(ierr);
10997ba3a57cSBarry Smith     if (!flag) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Substitution string ${%s} not found as environmental variable",par);
1100e5c89e4eSSatish Balay     ierr = PetscStrcat(work,env);CHKERRQ(ierr);
1101e5c89e4eSSatish Balay     ierr = PetscStrcat(work,epar);CHKERRQ(ierr);
1102e5c89e4eSSatish Balay     ierr = PetscStrcpy(b,work);CHKERRQ(ierr);
1103e5c89e4eSSatish Balay     ierr = PetscStrstr(b,"${",&par);CHKERRQ(ierr);
1104e5c89e4eSSatish Balay   }
1105e5c89e4eSSatish Balay   ierr = PetscFree(work);CHKERRQ(ierr);
110671573d7dSBarry Smith   if (aa == b) {
110771573d7dSBarry Smith     ierr = PetscFree(a);CHKERRQ(ierr);
110871573d7dSBarry Smith   }
1109e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1110e5c89e4eSSatish Balay }
1111e5c89e4eSSatish Balay 
1112a53986e1SJed Brown #undef __FUNCT__
1113a53986e1SJed Brown #define __FUNCT__ "PetscEListFind"
1114a53986e1SJed Brown /*@C
1115a53986e1SJed Brown    PetscEListFind - searches list of strings for given string, using case insensitive matching
1116e5c89e4eSSatish Balay 
1117a53986e1SJed Brown    Not Collective
1118a53986e1SJed Brown 
1119a53986e1SJed Brown    Input Parameters:
1120a53986e1SJed Brown +  n - number of strings in
1121a53986e1SJed Brown .  list - list of strings to search
1122a53986e1SJed Brown -  str - string to look for, empty string "" accepts default (first entry in list)
1123a53986e1SJed Brown 
1124a53986e1SJed Brown    Output Parameters:
1125a53986e1SJed Brown +  value - index of matching string (if found)
1126a53986e1SJed Brown -  found - boolean indicating whether string was found (can be NULL)
1127a53986e1SJed Brown 
1128a53986e1SJed Brown    Notes:
1129a53986e1SJed Brown    Not for use in Fortran
1130a53986e1SJed Brown 
1131a53986e1SJed Brown    Level: advanced
1132a53986e1SJed Brown @*/
1133a53986e1SJed Brown PetscErrorCode PetscEListFind(PetscInt n,const char *const *list,const char *str,PetscInt *value,PetscBool *found)
1134a53986e1SJed Brown {
1135a53986e1SJed Brown   PetscErrorCode ierr;
1136a53986e1SJed Brown   PetscBool matched;
1137a53986e1SJed Brown   PetscInt i;
1138a53986e1SJed Brown 
1139a53986e1SJed Brown   PetscFunctionBegin;
1140a53986e1SJed Brown   if (found) *found = PETSC_FALSE;
1141a53986e1SJed Brown   for (i=0; i<n; i++) {
1142a53986e1SJed Brown     ierr = PetscStrcasecmp(str,list[i],&matched);CHKERRQ(ierr);
1143a53986e1SJed Brown     if (matched || !str[0]) {
1144a53986e1SJed Brown       if (found) *found = PETSC_TRUE;
1145a53986e1SJed Brown       *value = i;
1146a53986e1SJed Brown       break;
1147a53986e1SJed Brown     }
1148a53986e1SJed Brown   }
1149a53986e1SJed Brown   PetscFunctionReturn(0);
1150a53986e1SJed Brown }
1151a53986e1SJed Brown 
1152a53986e1SJed Brown #undef __FUNCT__
1153a53986e1SJed Brown #define __FUNCT__ "PetscEnumFind"
1154a53986e1SJed Brown /*@C
1155a53986e1SJed Brown    PetscEListFind - searches enum list of strings for given string, using case insensitive matching
1156a53986e1SJed Brown 
1157a53986e1SJed Brown    Not Collective
1158a53986e1SJed Brown 
1159a53986e1SJed Brown    Input Parameters:
1160a53986e1SJed Brown +  enumlist - list of strings to search, followed by enum name, then enum prefix, then NUL
1161a53986e1SJed Brown -  str - string to look for
1162a53986e1SJed Brown 
1163a53986e1SJed Brown    Output Parameters:
1164a53986e1SJed Brown +  value - index of matching string (if found)
1165a53986e1SJed Brown -  found - boolean indicating whether string was found (can be NULL)
1166a53986e1SJed Brown 
1167a53986e1SJed Brown    Notes:
1168a53986e1SJed Brown    Not for use in Fortran
1169a53986e1SJed Brown 
1170a53986e1SJed Brown    Level: advanced
1171a53986e1SJed Brown @*/
1172a53986e1SJed Brown PetscErrorCode PetscEnumFind(const char *const *enumlist,const char *str,PetscEnum *value,PetscBool *found)
1173a53986e1SJed Brown {
1174a53986e1SJed Brown   PetscErrorCode ierr;
1175*d05ba7d2SLisandro Dalcin   PetscInt n = 0,evalue;
1176a53986e1SJed Brown   PetscBool efound;
1177a53986e1SJed Brown 
1178a53986e1SJed Brown   PetscFunctionBegin;
1179*d05ba7d2SLisandro Dalcin   while (enumlist[n++]) if (n > 50) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries");
1180a53986e1SJed Brown   if (n < 3) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix");
1181a53986e1SJed Brown   n -= 3; /* drop enum name, prefix, and null termination */
1182a53986e1SJed Brown   ierr = PetscEListFind(n,enumlist,str,&evalue,&efound);CHKERRQ(ierr);
1183cfb463b1SJed Brown   if (efound) *value = (PetscEnum)evalue;
1184a53986e1SJed Brown   if (found) *found = efound;
1185a53986e1SJed Brown   PetscFunctionReturn(0);
1186a53986e1SJed Brown }
1187