xref: /petsc/src/sys/utils/str.c (revision cfb463b15b0c1a12376a702f005a9980651bed0e)
17d0a6c19SBarry Smith 
2e5c89e4eSSatish Balay /*
3e5c89e4eSSatish Balay     We define the string operations here. The reason we just do not use
4e5c89e4eSSatish Balay   the standard string routines in the PETSc code is that on some machines
5e5c89e4eSSatish Balay   they are broken or have the wrong prototypes.
6e5c89e4eSSatish Balay 
7e5c89e4eSSatish Balay */
8c6db04a5SJed Brown #include <petscsys.h>                   /*I  "petscsys.h"   I*/
9e5c89e4eSSatish Balay 
103964eb88SJed Brown #if defined(PETSC_HAVE_STRINGS_H)
113964eb88SJed Brown #  include <strings.h>          /* strcasecmp */
123964eb88SJed Brown #endif
133964eb88SJed Brown 
14e5c89e4eSSatish Balay #undef __FUNCT__
153c311c98SBarry Smith #define __FUNCT__ "PetscStrToArray"
163c311c98SBarry Smith /*@C
17d67fe73bSBarry Smith    PetscStrToArray - Seperates a string by a charactor (for example ' ' or '\n') and creates an array of strings
183c311c98SBarry Smith 
193c311c98SBarry Smith    Not Collective
203c311c98SBarry Smith 
213c311c98SBarry Smith    Input Parameters:
22d67fe73bSBarry Smith +  s - pointer to string
23a2ea699eSBarry Smith -  sp - separator charactor
243c311c98SBarry Smith 
253c311c98SBarry Smith    Output Parameter:
263c311c98SBarry Smith +   argc - the number of entries in the array
273c311c98SBarry Smith -   args - an array of the entries with a null at the end
283c311c98SBarry Smith 
293c311c98SBarry Smith    Level: intermediate
303c311c98SBarry Smith 
31301d30feSBarry Smith    Notes: this may be called before PetscInitialize() or after PetscFinalize()
323c311c98SBarry Smith 
336f013253SBarry Smith    Not for use in Fortran
346f013253SBarry Smith 
35b4cd4cebSBarry Smith    Developer Notes: Using raw malloc() and does not call error handlers since this may be used before PETSc is initialized. Used
36b4cd4cebSBarry Smith      to generate argc, args arguments passed to MPI_Init()
37301d30feSBarry Smith 
38b4cd4cebSBarry Smith .seealso: PetscStrToArrayDestroy(), PetscToken, PetscTokenCreate()
393c311c98SBarry Smith 
403c311c98SBarry Smith @*/
41d67fe73bSBarry Smith PetscErrorCode  PetscStrToArray(const char s[],char sp,int *argc,char ***args)
423c311c98SBarry Smith {
433c311c98SBarry Smith   int       i,n,*lens,cnt = 0;
44ace3abfcSBarry Smith   PetscBool flg = PETSC_FALSE;
453c311c98SBarry Smith 
4640a7e1efSBarry Smith   if (!s) n = 0;
4740a7e1efSBarry Smith   else    n = strlen(s);
483c311c98SBarry Smith   *argc = 0;
494996c5bdSBarry Smith   if (!n) {
504996c5bdSBarry Smith     *args = 0;
514996c5bdSBarry Smith     return(0);
524996c5bdSBarry Smith   }
533c311c98SBarry Smith   for (i=0; i<n; i++) {
54d67fe73bSBarry Smith     if (s[i] != sp) break;
553c311c98SBarry Smith   }
563c311c98SBarry Smith   for (;i<n+1; i++) {
57d67fe73bSBarry Smith     if ((s[i] == sp || s[i] == 0) && !flg) {flg = PETSC_TRUE; (*argc)++;}
58d67fe73bSBarry Smith     else if (s[i] != sp) {flg = PETSC_FALSE;}
593c311c98SBarry Smith   }
60a2ea699eSBarry Smith   (*args) = (char**) malloc(((*argc)+1)*sizeof(char*)); if (!*args) return PETSC_ERR_MEM;
6153e6e2c4SHong Zhang   lens    = (int*) malloc((*argc)*sizeof(int)); if (!lens) return PETSC_ERR_MEM;
623c311c98SBarry Smith   for (i=0; i<*argc; i++) lens[i] = 0;
633c311c98SBarry Smith 
643c311c98SBarry Smith   *argc = 0;
653c311c98SBarry Smith   for (i=0; i<n; i++) {
66d67fe73bSBarry Smith     if (s[i] != sp) break;
673c311c98SBarry Smith   }
683c311c98SBarry Smith   for (;i<n+1; i++) {
69d67fe73bSBarry Smith     if ((s[i] == sp || s[i] == 0) && !flg) {flg = PETSC_TRUE; (*argc)++;}
70d67fe73bSBarry Smith     else if (s[i] != sp) {lens[*argc]++;flg = PETSC_FALSE;}
713c311c98SBarry Smith   }
723c311c98SBarry Smith 
733c311c98SBarry Smith   for (i=0; i<*argc; i++) {
74675282fdSHong Zhang     (*args)[i] = (char*) malloc((lens[i]+1)*sizeof(char)); if (!(*args)[i]) return PETSC_ERR_MEM;
753c311c98SBarry Smith   }
76a2ea699eSBarry Smith   free(lens);
77301d30feSBarry Smith   (*args)[*argc] = 0;
783c311c98SBarry Smith 
793c311c98SBarry Smith   *argc = 0;
803c311c98SBarry Smith   for (i=0; i<n; i++) {
81d67fe73bSBarry Smith     if (s[i] != sp) break;
823c311c98SBarry Smith   }
833c311c98SBarry Smith   for (;i<n+1; i++) {
84d67fe73bSBarry Smith     if ((s[i] == sp || s[i] == 0) && !flg) {flg = PETSC_TRUE; (*args)[*argc][cnt++] = 0; (*argc)++; cnt = 0;}
85d67fe73bSBarry Smith     else if (s[i] != sp && s[i] != 0) {(*args)[*argc][cnt++] = s[i]; flg = PETSC_FALSE;}
863c311c98SBarry Smith   }
873c311c98SBarry Smith   return 0;
883c311c98SBarry Smith }
893c311c98SBarry Smith 
903c311c98SBarry Smith #undef __FUNCT__
91301d30feSBarry Smith #define __FUNCT__ "PetscStrToArrayDestroy"
92301d30feSBarry Smith /*@C
93301d30feSBarry Smith    PetscStrToArrayDestroy - Frees array created with PetscStrToArray().
94301d30feSBarry Smith 
95301d30feSBarry Smith    Not Collective
96301d30feSBarry Smith 
97301d30feSBarry Smith    Output Parameters:
98301d30feSBarry Smith +  argc - the number of arguments
99301d30feSBarry Smith -  args - the array of arguments
100301d30feSBarry Smith 
101301d30feSBarry Smith    Level: intermediate
102301d30feSBarry Smith 
103301d30feSBarry Smith    Concepts: command line arguments
104301d30feSBarry Smith 
105301d30feSBarry Smith    Notes: This may be called before PetscInitialize() or after PetscFinalize()
106301d30feSBarry Smith 
1076f013253SBarry Smith    Not for use in Fortran
1086f013253SBarry Smith 
109301d30feSBarry Smith .seealso: PetscStrToArray()
110301d30feSBarry Smith 
111301d30feSBarry Smith @*/
1127087cfbeSBarry Smith PetscErrorCode  PetscStrToArrayDestroy(int argc,char **args)
113301d30feSBarry Smith {
114301d30feSBarry Smith   PetscInt i;
115301d30feSBarry Smith 
116a297a907SKarl Rupp   for (i=0; i<argc; i++) free(args[i]);
117a297a907SKarl Rupp   if (args) free(args);
118301d30feSBarry Smith   return 0;
119301d30feSBarry Smith }
120301d30feSBarry Smith 
121301d30feSBarry Smith #undef __FUNCT__
122e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrlen"
123e5c89e4eSSatish Balay /*@C
124e5c89e4eSSatish Balay    PetscStrlen - Gets length of a string
125e5c89e4eSSatish Balay 
126e5c89e4eSSatish Balay    Not Collective
127e5c89e4eSSatish Balay 
128e5c89e4eSSatish Balay    Input Parameters:
129e5c89e4eSSatish Balay .  s - pointer to string
130e5c89e4eSSatish Balay 
131e5c89e4eSSatish Balay    Output Parameter:
132e5c89e4eSSatish Balay .  len - length in bytes
133e5c89e4eSSatish Balay 
134e5c89e4eSSatish Balay    Level: intermediate
135e5c89e4eSSatish Balay 
136e5c89e4eSSatish Balay    Note:
137e5c89e4eSSatish Balay    This routine is analogous to strlen().
138e5c89e4eSSatish Balay 
139e5c89e4eSSatish Balay    Null string returns a length of zero
140e5c89e4eSSatish Balay 
1416f013253SBarry Smith    Not for use in Fortran
1426f013253SBarry Smith 
143e5c89e4eSSatish Balay   Concepts: string length
144e5c89e4eSSatish Balay 
145e5c89e4eSSatish Balay @*/
1467087cfbeSBarry Smith PetscErrorCode  PetscStrlen(const char s[],size_t *len)
147e5c89e4eSSatish Balay {
148e5c89e4eSSatish Balay   PetscFunctionBegin;
149a297a907SKarl Rupp   if (!s) *len = 0;
150a297a907SKarl Rupp   else    *len = strlen(s);
151e5c89e4eSSatish Balay   PetscFunctionReturn(0);
152e5c89e4eSSatish Balay }
153e5c89e4eSSatish Balay 
154e5c89e4eSSatish Balay #undef __FUNCT__
155e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrallocpy"
156e5c89e4eSSatish Balay /*@C
157e5c89e4eSSatish Balay    PetscStrallocpy - Allocates space to hold a copy of a string then copies the string
158e5c89e4eSSatish Balay 
159e5c89e4eSSatish Balay    Not Collective
160e5c89e4eSSatish Balay 
161e5c89e4eSSatish Balay    Input Parameters:
162e5c89e4eSSatish Balay .  s - pointer to string
163e5c89e4eSSatish Balay 
164e5c89e4eSSatish Balay    Output Parameter:
165e5c89e4eSSatish Balay .  t - the copied string
166e5c89e4eSSatish Balay 
167e5c89e4eSSatish Balay    Level: intermediate
168e5c89e4eSSatish Balay 
169e5c89e4eSSatish Balay    Note:
170e5c89e4eSSatish Balay       Null string returns a new null string
171e5c89e4eSSatish Balay 
1726f013253SBarry Smith       Not for use in Fortran
1736f013253SBarry Smith 
174e5c89e4eSSatish Balay   Concepts: string copy
175e5c89e4eSSatish Balay 
176e5c89e4eSSatish Balay @*/
1777087cfbeSBarry Smith PetscErrorCode  PetscStrallocpy(const char s[],char *t[])
178e5c89e4eSSatish Balay {
179e5c89e4eSSatish Balay   PetscErrorCode ierr;
180e5c89e4eSSatish Balay   size_t         len;
18171573d7dSBarry Smith   char           *tmp = 0;
182e5c89e4eSSatish Balay 
183e5c89e4eSSatish Balay   PetscFunctionBegin;
184e5c89e4eSSatish Balay   if (s) {
185e5c89e4eSSatish Balay     ierr = PetscStrlen(s,&len);CHKERRQ(ierr);
18671573d7dSBarry Smith     ierr = PetscMalloc((1+len)*sizeof(char),&tmp);CHKERRQ(ierr);
18771573d7dSBarry Smith     ierr = PetscStrcpy(tmp,s);CHKERRQ(ierr);
188e5c89e4eSSatish Balay   }
18971573d7dSBarry Smith   *t = tmp;
190e5c89e4eSSatish Balay   PetscFunctionReturn(0);
191e5c89e4eSSatish Balay }
192e5c89e4eSSatish Balay 
193e5c89e4eSSatish Balay #undef __FUNCT__
19447340559SBarry Smith #define __FUNCT__ "PetscStrArrayallocpy"
19547340559SBarry Smith /*@C
19647340559SBarry Smith    PetscStrArrayallocpy - Allocates space to hold a copy of an array of strings then copies the strings
19747340559SBarry Smith 
19847340559SBarry Smith    Not Collective
19947340559SBarry Smith 
20047340559SBarry Smith    Input Parameters:
20147340559SBarry Smith .  s - pointer to array of strings (final string is a null)
20247340559SBarry Smith 
20347340559SBarry Smith    Output Parameter:
20447340559SBarry Smith .  t - the copied array string
20547340559SBarry Smith 
20647340559SBarry Smith    Level: intermediate
20747340559SBarry Smith 
20847340559SBarry Smith    Note:
20947340559SBarry Smith       Not for use in Fortran
21047340559SBarry Smith 
21147340559SBarry Smith   Concepts: string copy
21247340559SBarry Smith 
21347340559SBarry Smith .seealso: PetscStrallocpy() PetscStrArrayDestroy()
21447340559SBarry Smith 
21547340559SBarry Smith @*/
21647340559SBarry Smith PetscErrorCode  PetscStrArrayallocpy(const char *const *list,char ***t)
21747340559SBarry Smith {
21847340559SBarry Smith   PetscErrorCode ierr;
21947340559SBarry Smith   PetscInt       i,n = 0;
22047340559SBarry Smith 
22147340559SBarry Smith   PetscFunctionBegin;
22247340559SBarry Smith   while (list[n++]) ;
22347340559SBarry Smith   ierr = PetscMalloc((n+1)*sizeof(char**),t);CHKERRQ(ierr);
22447340559SBarry Smith   for (i=0; i<n; i++) {
22547340559SBarry Smith     ierr = PetscStrallocpy(list[i],(*t)+i);CHKERRQ(ierr);
22647340559SBarry Smith   }
2270298fd71SBarry Smith   (*t)[n] = NULL;
22847340559SBarry Smith   PetscFunctionReturn(0);
22947340559SBarry Smith }
23047340559SBarry Smith 
23147340559SBarry Smith #undef __FUNCT__
23247340559SBarry Smith #define __FUNCT__ "PetscStrArrayDestroy"
23347340559SBarry Smith /*@C
23447340559SBarry Smith    PetscStrArrayDestroy - Frees array of strings created with PetscStrArrayallocpy().
23547340559SBarry Smith 
23647340559SBarry Smith    Not Collective
23747340559SBarry Smith 
23847340559SBarry Smith    Output Parameters:
23947340559SBarry Smith .   list - array of strings
24047340559SBarry Smith 
24147340559SBarry Smith    Level: intermediate
24247340559SBarry Smith 
24347340559SBarry Smith    Concepts: command line arguments
24447340559SBarry Smith 
24547340559SBarry Smith    Notes: Not for use in Fortran
24647340559SBarry Smith 
24747340559SBarry Smith .seealso: PetscStrArrayallocpy()
24847340559SBarry Smith 
24947340559SBarry Smith @*/
2506fed8037SJed Brown PetscErrorCode PetscStrArrayDestroy(char ***list)
25147340559SBarry Smith {
25247340559SBarry Smith   PetscInt       n = 0;
25347340559SBarry Smith   PetscErrorCode ierr;
25447340559SBarry Smith 
2556fed8037SJed Brown   PetscFunctionBegin;
2566fed8037SJed Brown   if (!*list) PetscFunctionReturn(0);
2576fed8037SJed Brown   while ((*list)[n]) {
2586fed8037SJed Brown     ierr = PetscFree((*list)[n]);CHKERRQ(ierr);
25947340559SBarry Smith     n++;
26047340559SBarry Smith   }
2616fed8037SJed Brown   ierr = PetscFree(*list);CHKERRQ(ierr);
2626fed8037SJed Brown   PetscFunctionReturn(0);
26347340559SBarry Smith }
26447340559SBarry Smith 
26547340559SBarry Smith #undef __FUNCT__
266e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcpy"
267e5c89e4eSSatish Balay /*@C
268e5c89e4eSSatish Balay    PetscStrcpy - Copies a string
269e5c89e4eSSatish Balay 
270e5c89e4eSSatish Balay    Not Collective
271e5c89e4eSSatish Balay 
272e5c89e4eSSatish Balay    Input Parameters:
273e5c89e4eSSatish Balay .  t - pointer to string
274e5c89e4eSSatish Balay 
275e5c89e4eSSatish Balay    Output Parameter:
276e5c89e4eSSatish Balay .  s - the copied string
277e5c89e4eSSatish Balay 
278e5c89e4eSSatish Balay    Level: intermediate
279e5c89e4eSSatish Balay 
2806f013253SBarry Smith    Notes:
281e5c89e4eSSatish Balay      Null string returns a string starting with zero
282e5c89e4eSSatish Balay 
2836f013253SBarry Smith      Not for use in Fortran
2846f013253SBarry Smith 
285e5c89e4eSSatish Balay   Concepts: string copy
286e5c89e4eSSatish Balay 
287e5c89e4eSSatish Balay .seealso: PetscStrncpy(), PetscStrcat(), PetscStrncat()
288e5c89e4eSSatish Balay 
289e5c89e4eSSatish Balay @*/
290acc6cc86SBarry Smith 
2917087cfbeSBarry Smith PetscErrorCode  PetscStrcpy(char s[],const char t[])
292e5c89e4eSSatish Balay {
293e5c89e4eSSatish Balay   PetscFunctionBegin;
29417186662SBarry Smith   if (t && !s) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy string into null pointer");
295a297a907SKarl Rupp   if (t) strcpy(s,t);
296a297a907SKarl Rupp   else if (s) s[0] = 0;
297e5c89e4eSSatish Balay   PetscFunctionReturn(0);
298e5c89e4eSSatish Balay }
299e5c89e4eSSatish Balay 
300e5c89e4eSSatish Balay #undef __FUNCT__
301e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncpy"
302e5c89e4eSSatish Balay /*@C
303e5c89e4eSSatish Balay    PetscStrncpy - Copies a string up to a certain length
304e5c89e4eSSatish Balay 
305e5c89e4eSSatish Balay    Not Collective
306e5c89e4eSSatish Balay 
307e5c89e4eSSatish Balay    Input Parameters:
308e5c89e4eSSatish Balay +  t - pointer to string
309e5c89e4eSSatish Balay -  n - the length to copy
310e5c89e4eSSatish Balay 
311e5c89e4eSSatish Balay    Output Parameter:
312e5c89e4eSSatish Balay .  s - the copied string
313e5c89e4eSSatish Balay 
314e5c89e4eSSatish Balay    Level: intermediate
315e5c89e4eSSatish Balay 
316e5c89e4eSSatish Balay    Note:
317e5c89e4eSSatish Balay      Null string returns a string starting with zero
318e5c89e4eSSatish Balay 
319e5c89e4eSSatish Balay   Concepts: string copy
320e5c89e4eSSatish Balay 
321e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrcat(), PetscStrncat()
322e5c89e4eSSatish Balay 
323e5c89e4eSSatish Balay @*/
3247087cfbeSBarry Smith PetscErrorCode  PetscStrncpy(char s[],const char t[],size_t n)
325e5c89e4eSSatish Balay {
326e5c89e4eSSatish Balay   PetscFunctionBegin;
32717186662SBarry Smith   if (t && !s) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy string into null pointer");
328a297a907SKarl Rupp   if (t) strncpy(s,t,n);
329a297a907SKarl Rupp   else if (s) s[0] = 0;
330e5c89e4eSSatish Balay   PetscFunctionReturn(0);
331e5c89e4eSSatish Balay }
332e5c89e4eSSatish Balay 
333e5c89e4eSSatish Balay #undef __FUNCT__
334e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcat"
335e5c89e4eSSatish Balay /*@C
336e5c89e4eSSatish Balay    PetscStrcat - Concatenates a string onto a given string
337e5c89e4eSSatish Balay 
338e5c89e4eSSatish Balay    Not Collective
339e5c89e4eSSatish Balay 
340e5c89e4eSSatish Balay    Input Parameters:
341e5e2177aSMatthew Knepley +  s - string to be added to
342e5e2177aSMatthew Knepley -  t - pointer to string to be added to end
343e5c89e4eSSatish Balay 
344e5c89e4eSSatish Balay    Level: intermediate
345e5c89e4eSSatish Balay 
3466f013253SBarry Smith    Notes: Not for use in Fortran
3476f013253SBarry Smith 
348e5c89e4eSSatish Balay   Concepts: string copy
349e5c89e4eSSatish Balay 
350e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrncpy(), PetscStrncat()
351e5c89e4eSSatish Balay 
352e5c89e4eSSatish Balay @*/
3537087cfbeSBarry Smith PetscErrorCode  PetscStrcat(char s[],const char t[])
354e5c89e4eSSatish Balay {
355e5c89e4eSSatish Balay   PetscFunctionBegin;
3569b754dc9SBarry Smith   if (!t) PetscFunctionReturn(0);
357e5c89e4eSSatish Balay   strcat(s,t);
358e5c89e4eSSatish Balay   PetscFunctionReturn(0);
359e5c89e4eSSatish Balay }
360e5c89e4eSSatish Balay 
361e5c89e4eSSatish Balay #undef __FUNCT__
362e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncat"
363e5c89e4eSSatish Balay /*@C
364e5c89e4eSSatish Balay    PetscStrncat - Concatenates a string onto a given string, up to a given length
365e5c89e4eSSatish Balay 
366e5c89e4eSSatish Balay    Not Collective
367e5c89e4eSSatish Balay 
368e5c89e4eSSatish Balay    Input Parameters:
369e5c89e4eSSatish Balay +  s - pointer to string to be added to end
370e5c89e4eSSatish Balay .  t - string to be added to
371e5c89e4eSSatish Balay .  n - maximum length to copy
372e5c89e4eSSatish Balay 
373e5c89e4eSSatish Balay    Level: intermediate
374e5c89e4eSSatish Balay 
3756f013253SBarry Smith   Notes:    Not for use in Fortran
3766f013253SBarry Smith 
377e5c89e4eSSatish Balay   Concepts: string copy
378e5c89e4eSSatish Balay 
379e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrncpy(), PetscStrcat()
380e5c89e4eSSatish Balay 
381e5c89e4eSSatish Balay @*/
3827087cfbeSBarry Smith PetscErrorCode  PetscStrncat(char s[],const char t[],size_t n)
383e5c89e4eSSatish Balay {
384e5c89e4eSSatish Balay   PetscFunctionBegin;
385e5c89e4eSSatish Balay   strncat(s,t,n);
386e5c89e4eSSatish Balay   PetscFunctionReturn(0);
387e5c89e4eSSatish Balay }
388e5c89e4eSSatish Balay 
389e5c89e4eSSatish Balay #undef __FUNCT__
390573b0fb4SBarry Smith #define __FUNCT__ "PetscStrcmpNoError"
391573b0fb4SBarry Smith /*
392573b0fb4SBarry Smith    Only to be used with PetscCheck__FUNCT__()!
393573b0fb4SBarry Smith 
394573b0fb4SBarry Smith    Will be removed once we eliminate the __FUNCT__ paradigm
395573b0fb4SBarry Smith */
396573b0fb4SBarry Smith void  PetscStrcmpNoError(const char a[],const char b[],PetscBool  *flg)
397573b0fb4SBarry Smith {
398573b0fb4SBarry Smith   int c;
399573b0fb4SBarry Smith 
400573b0fb4SBarry Smith   if (!a && !b)      *flg = PETSC_TRUE;
401573b0fb4SBarry Smith   else if (!a || !b) *flg = PETSC_FALSE;
402573b0fb4SBarry Smith   else {
403573b0fb4SBarry Smith     c = strcmp(a,b);
404573b0fb4SBarry Smith     if (c) *flg = PETSC_FALSE;
405573b0fb4SBarry Smith     else   *flg = PETSC_TRUE;
406573b0fb4SBarry Smith   }
407573b0fb4SBarry Smith }
408573b0fb4SBarry Smith 
409573b0fb4SBarry Smith #undef __FUNCT__
410e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcmp"
411e5c89e4eSSatish Balay /*@C
412e5c89e4eSSatish Balay    PetscStrcmp - Compares two strings,
413e5c89e4eSSatish Balay 
414e5c89e4eSSatish Balay    Not Collective
415e5c89e4eSSatish Balay 
416e5c89e4eSSatish Balay    Input Parameters:
417e5c89e4eSSatish Balay +  a - pointer to string first string
418e5c89e4eSSatish Balay -  b - pointer to second string
419e5c89e4eSSatish Balay 
420e5c89e4eSSatish Balay    Output Parameter:
4218c74ee41SBarry Smith .  flg - PETSC_TRUE if the two strings are equal
422e5c89e4eSSatish Balay 
423e5c89e4eSSatish Balay    Level: intermediate
424e5c89e4eSSatish Balay 
4256f013253SBarry Smith    Notes:    Not for use in Fortran
4266f013253SBarry Smith 
427e5c89e4eSSatish Balay .seealso: PetscStrgrt(), PetscStrncmp(), PetscStrcasecmp()
428e5c89e4eSSatish Balay 
429e5c89e4eSSatish Balay @*/
4307087cfbeSBarry Smith PetscErrorCode  PetscStrcmp(const char a[],const char b[],PetscBool  *flg)
431e5c89e4eSSatish Balay {
432e5c89e4eSSatish Balay   int c;
433e5c89e4eSSatish Balay 
434e5c89e4eSSatish Balay   PetscFunctionBegin;
435a297a907SKarl Rupp   if (!a && !b)      *flg = PETSC_TRUE;
436a297a907SKarl Rupp   else if (!a || !b) *flg = PETSC_FALSE;
437a297a907SKarl Rupp   else {
438e5c89e4eSSatish Balay     c = strcmp(a,b);
439e5c89e4eSSatish Balay     if (c) *flg = PETSC_FALSE;
440e5c89e4eSSatish Balay     else   *flg = PETSC_TRUE;
441e5c89e4eSSatish Balay   }
442e5c89e4eSSatish Balay   PetscFunctionReturn(0);
443e5c89e4eSSatish Balay }
444e5c89e4eSSatish Balay 
445e5c89e4eSSatish Balay #undef __FUNCT__
446e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrgrt"
447e5c89e4eSSatish Balay /*@C
448e5c89e4eSSatish Balay    PetscStrgrt - If first string is greater than the second
449e5c89e4eSSatish Balay 
450e5c89e4eSSatish Balay    Not Collective
451e5c89e4eSSatish Balay 
452e5c89e4eSSatish Balay    Input Parameters:
453e5c89e4eSSatish Balay +  a - pointer to first string
454e5c89e4eSSatish Balay -  b - pointer to second string
455e5c89e4eSSatish Balay 
456e5c89e4eSSatish Balay    Output Parameter:
457e5c89e4eSSatish Balay .  flg - if the first string is greater
458e5c89e4eSSatish Balay 
459e5c89e4eSSatish Balay    Notes:
460e5c89e4eSSatish Balay     Null arguments are ok, a null string is considered smaller than
461e5c89e4eSSatish Balay     all others
462e5c89e4eSSatish Balay 
4636f013253SBarry Smith    Not for use in Fortran
4646f013253SBarry Smith 
465e5c89e4eSSatish Balay    Level: intermediate
466e5c89e4eSSatish Balay 
467e5c89e4eSSatish Balay .seealso: PetscStrcmp(), PetscStrncmp(), PetscStrcasecmp()
468e5c89e4eSSatish Balay 
469e5c89e4eSSatish Balay @*/
4707087cfbeSBarry Smith PetscErrorCode  PetscStrgrt(const char a[],const char b[],PetscBool  *t)
471e5c89e4eSSatish Balay {
472e5c89e4eSSatish Balay   int c;
473e5c89e4eSSatish Balay 
474e5c89e4eSSatish Balay   PetscFunctionBegin;
475a297a907SKarl Rupp   if (!a && !b) *t = PETSC_FALSE;
476a297a907SKarl Rupp   else if (a && !b) *t = PETSC_TRUE;
477a297a907SKarl Rupp   else if (!a && b) *t = PETSC_FALSE;
478a297a907SKarl Rupp   else {
479e5c89e4eSSatish Balay     c = strcmp(a,b);
480e5c89e4eSSatish Balay     if (c > 0) *t = PETSC_TRUE;
481e5c89e4eSSatish Balay     else       *t = PETSC_FALSE;
482e5c89e4eSSatish Balay   }
483e5c89e4eSSatish Balay   PetscFunctionReturn(0);
484e5c89e4eSSatish Balay }
485e5c89e4eSSatish Balay 
486e5c89e4eSSatish Balay #undef __FUNCT__
487e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcasecmp"
488e5c89e4eSSatish Balay /*@C
489e5c89e4eSSatish Balay    PetscStrcasecmp - Returns true if the two strings are the same
490e5c89e4eSSatish Balay      except possibly for case.
491e5c89e4eSSatish Balay 
492e5c89e4eSSatish Balay    Not Collective
493e5c89e4eSSatish Balay 
494e5c89e4eSSatish Balay    Input Parameters:
495e5c89e4eSSatish Balay +  a - pointer to first string
496e5c89e4eSSatish Balay -  b - pointer to second string
497e5c89e4eSSatish Balay 
498e5c89e4eSSatish Balay    Output Parameter:
499e5c89e4eSSatish Balay .  flg - if the two strings are the same
500e5c89e4eSSatish Balay 
501e5c89e4eSSatish Balay    Notes:
502e5c89e4eSSatish Balay     Null arguments are ok
503e5c89e4eSSatish Balay 
5046f013253SBarry Smith    Not for use in Fortran
5056f013253SBarry Smith 
506e5c89e4eSSatish Balay    Level: intermediate
507e5c89e4eSSatish Balay 
508e5c89e4eSSatish Balay .seealso: PetscStrcmp(), PetscStrncmp(), PetscStrgrt()
509e5c89e4eSSatish Balay 
510e5c89e4eSSatish Balay @*/
5117087cfbeSBarry Smith PetscErrorCode  PetscStrcasecmp(const char a[],const char b[],PetscBool  *t)
512e5c89e4eSSatish Balay {
513e5c89e4eSSatish Balay   int c;
514e5c89e4eSSatish Balay 
515e5c89e4eSSatish Balay   PetscFunctionBegin;
516e5c89e4eSSatish Balay   if (!a && !b) c = 0;
517e5c89e4eSSatish Balay   else if (!a || !b) c = 1;
51832b366c8SSatish Balay #if defined(PETSC_HAVE_STRCASECMP)
51932b366c8SSatish Balay   else c = strcasecmp(a,b);
52032b366c8SSatish Balay #elif defined(PETSC_HAVE_STRICMP)
521e5c89e4eSSatish Balay   else c = stricmp(a,b);
522e5c89e4eSSatish Balay #else
52332b366c8SSatish Balay   else {
52432b366c8SSatish Balay     char           *aa,*bb;
52532b366c8SSatish Balay     PetscErrorCode ierr;
52632b366c8SSatish Balay     ierr = PetscStrallocpy(a,&aa);CHKERRQ(ierr);
52732b366c8SSatish Balay     ierr = PetscStrallocpy(b,&bb);CHKERRQ(ierr);
52832b366c8SSatish Balay     ierr = PetscStrtolower(aa);CHKERRQ(ierr);
52932b366c8SSatish Balay     ierr = PetscStrtolower(bb);CHKERRQ(ierr);
53032b366c8SSatish Balay     ierr = PetscStrcmp(aa,bb,t);CHKERRQ(ierr);
531503cfb0cSBarry Smith     ierr = PetscFree(aa);CHKERRQ(ierr);
532503cfb0cSBarry Smith     ierr = PetscFree(bb);CHKERRQ(ierr);
53332b366c8SSatish Balay     PetscFunctionReturn(0);
53432b366c8SSatish Balay   }
535e5c89e4eSSatish Balay #endif
536e5c89e4eSSatish Balay   if (!c) *t = PETSC_TRUE;
537e5c89e4eSSatish Balay   else    *t = PETSC_FALSE;
538e5c89e4eSSatish Balay   PetscFunctionReturn(0);
539e5c89e4eSSatish Balay }
540e5c89e4eSSatish Balay 
54132b366c8SSatish Balay 
54232b366c8SSatish Balay 
543e5c89e4eSSatish Balay #undef __FUNCT__
544e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncmp"
545e5c89e4eSSatish Balay /*@C
546e5c89e4eSSatish Balay    PetscStrncmp - Compares two strings, up to a certain length
547e5c89e4eSSatish Balay 
548e5c89e4eSSatish Balay    Not Collective
549e5c89e4eSSatish Balay 
550e5c89e4eSSatish Balay    Input Parameters:
551e5c89e4eSSatish Balay +  a - pointer to first string
552e5c89e4eSSatish Balay .  b - pointer to second string
553e5c89e4eSSatish Balay -  n - length to compare up to
554e5c89e4eSSatish Balay 
555e5c89e4eSSatish Balay    Output Parameter:
556e5c89e4eSSatish Balay .  t - if the two strings are equal
557e5c89e4eSSatish Balay 
558e5c89e4eSSatish Balay    Level: intermediate
559e5c89e4eSSatish Balay 
5606f013253SBarry Smith    Notes:    Not for use in Fortran
5616f013253SBarry Smith 
562e5c89e4eSSatish Balay .seealso: PetscStrgrt(), PetscStrcmp(), PetscStrcasecmp()
563e5c89e4eSSatish Balay 
564e5c89e4eSSatish Balay @*/
5657087cfbeSBarry Smith PetscErrorCode  PetscStrncmp(const char a[],const char b[],size_t n,PetscBool  *t)
566e5c89e4eSSatish Balay {
567e5c89e4eSSatish Balay   int c;
568e5c89e4eSSatish Balay 
569e5c89e4eSSatish Balay   PetscFunctionBegin;
570e5c89e4eSSatish Balay   c = strncmp(a,b,n);
571e5c89e4eSSatish Balay   if (!c) *t = PETSC_TRUE;
572e5c89e4eSSatish Balay   else    *t = PETSC_FALSE;
573e5c89e4eSSatish Balay   PetscFunctionReturn(0);
574e5c89e4eSSatish Balay }
575e5c89e4eSSatish Balay 
576e5c89e4eSSatish Balay #undef __FUNCT__
577e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrchr"
578e5c89e4eSSatish Balay /*@C
579e5c89e4eSSatish Balay    PetscStrchr - Locates first occurance of a character in a string
580e5c89e4eSSatish Balay 
581e5c89e4eSSatish Balay    Not Collective
582e5c89e4eSSatish Balay 
583e5c89e4eSSatish Balay    Input Parameters:
584e5c89e4eSSatish Balay +  a - pointer to string
585e5c89e4eSSatish Balay -  b - character
586e5c89e4eSSatish Balay 
587e5c89e4eSSatish Balay    Output Parameter:
5880298fd71SBarry Smith .  c - location of occurance, NULL if not found
589e5c89e4eSSatish Balay 
590e5c89e4eSSatish Balay    Level: intermediate
591e5c89e4eSSatish Balay 
5926f013253SBarry Smith    Notes:    Not for use in Fortran
5936f013253SBarry Smith 
594e5c89e4eSSatish Balay @*/
5957087cfbeSBarry Smith PetscErrorCode  PetscStrchr(const char a[],char b,char *c[])
596e5c89e4eSSatish Balay {
597e5c89e4eSSatish Balay   PetscFunctionBegin;
598e5c89e4eSSatish Balay   *c = (char*)strchr(a,b);
599e5c89e4eSSatish Balay   PetscFunctionReturn(0);
600e5c89e4eSSatish Balay }
601e5c89e4eSSatish Balay 
602e5c89e4eSSatish Balay #undef __FUNCT__
603e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrrchr"
604e5c89e4eSSatish Balay /*@C
605e5c89e4eSSatish Balay    PetscStrrchr - Locates one location past the last occurance of a character in a string,
606e5c89e4eSSatish Balay       if the character is not found then returns entire string
607e5c89e4eSSatish Balay 
608e5c89e4eSSatish Balay    Not Collective
609e5c89e4eSSatish Balay 
610e5c89e4eSSatish Balay    Input Parameters:
611e5c89e4eSSatish Balay +  a - pointer to string
612e5c89e4eSSatish Balay -  b - character
613e5c89e4eSSatish Balay 
614e5c89e4eSSatish Balay    Output Parameter:
615e5c89e4eSSatish Balay .  tmp - location of occurance, a if not found
616e5c89e4eSSatish Balay 
617e5c89e4eSSatish Balay    Level: intermediate
618e5c89e4eSSatish Balay 
6196f013253SBarry Smith    Notes:    Not for use in Fortran
6206f013253SBarry Smith 
621e5c89e4eSSatish Balay @*/
6227087cfbeSBarry Smith PetscErrorCode  PetscStrrchr(const char a[],char b,char *tmp[])
623e5c89e4eSSatish Balay {
624e5c89e4eSSatish Balay   PetscFunctionBegin;
625e5c89e4eSSatish Balay   *tmp = (char*)strrchr(a,b);
626a297a907SKarl Rupp   if (!*tmp) *tmp = (char*)a;
627a297a907SKarl Rupp   else *tmp = *tmp + 1;
628e5c89e4eSSatish Balay   PetscFunctionReturn(0);
629e5c89e4eSSatish Balay }
630e5c89e4eSSatish Balay 
631e5c89e4eSSatish Balay #undef __FUNCT__
632e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrtolower"
633e5c89e4eSSatish Balay /*@C
634e5c89e4eSSatish Balay    PetscStrtolower - Converts string to lower case
635e5c89e4eSSatish Balay 
636e5c89e4eSSatish Balay    Not Collective
637e5c89e4eSSatish Balay 
638e5c89e4eSSatish Balay    Input Parameters:
639e5c89e4eSSatish Balay .  a - pointer to string
640e5c89e4eSSatish Balay 
641e5c89e4eSSatish Balay    Level: intermediate
642e5c89e4eSSatish Balay 
6436f013253SBarry Smith    Notes:    Not for use in Fortran
6446f013253SBarry Smith 
645e5c89e4eSSatish Balay @*/
6467087cfbeSBarry Smith PetscErrorCode  PetscStrtolower(char a[])
647e5c89e4eSSatish Balay {
648e5c89e4eSSatish Balay   PetscFunctionBegin;
649e5c89e4eSSatish Balay   while (*a) {
650e5c89e4eSSatish Balay     if (*a >= 'A' && *a <= 'Z') *a += 'a' - 'A';
651e5c89e4eSSatish Balay     a++;
652e5c89e4eSSatish Balay   }
653e5c89e4eSSatish Balay   PetscFunctionReturn(0);
654e5c89e4eSSatish Balay }
655e5c89e4eSSatish Balay 
6567ba3a57cSBarry Smith #undef __FUNCT__
6572f234a98SBarry Smith #define __FUNCT__ "PetscStrtoupper"
6582f234a98SBarry Smith /*@C
6592f234a98SBarry Smith    PetscStrtolower - Converts string to upper case
6602f234a98SBarry Smith 
6612f234a98SBarry Smith    Not Collective
6622f234a98SBarry Smith 
6632f234a98SBarry Smith    Input Parameters:
6642f234a98SBarry Smith .  a - pointer to string
6652f234a98SBarry Smith 
6662f234a98SBarry Smith    Level: intermediate
6672f234a98SBarry Smith 
6682f234a98SBarry Smith    Notes:    Not for use in Fortran
6692f234a98SBarry Smith 
6702f234a98SBarry Smith @*/
6712f234a98SBarry Smith PetscErrorCode  PetscStrtoupper(char a[])
6722f234a98SBarry Smith {
6732f234a98SBarry Smith   PetscFunctionBegin;
6742f234a98SBarry Smith   while (*a) {
6752f234a98SBarry Smith     if (*a >= 'a' && *a <= 'z') *a += 'A' - 'a';
6762f234a98SBarry Smith     a++;
6772f234a98SBarry Smith   }
6782f234a98SBarry Smith   PetscFunctionReturn(0);
6792f234a98SBarry Smith }
6802f234a98SBarry Smith 
6812f234a98SBarry Smith #undef __FUNCT__
6827ba3a57cSBarry Smith #define __FUNCT__ "PetscStrendswith"
6837ba3a57cSBarry Smith /*@C
6847ba3a57cSBarry Smith    PetscStrendswith - Determines if a string ends with a certain string
6851d1a0024SBarry Smith 
6867ba3a57cSBarry Smith    Not Collective
6877ba3a57cSBarry Smith 
6887ba3a57cSBarry Smith    Input Parameters:
6897ba3a57cSBarry Smith +  a - pointer to string
6907ba3a57cSBarry Smith -  b - string to endwith
6917ba3a57cSBarry Smith 
6927ba3a57cSBarry Smith    Output Parameter:
6937ba3a57cSBarry Smith .  flg - PETSC_TRUE or PETSC_FALSE
6947ba3a57cSBarry Smith 
6957ba3a57cSBarry Smith    Notes:     Not for use in Fortran
6967ba3a57cSBarry Smith 
6977ba3a57cSBarry Smith    Level: intermediate
6987ba3a57cSBarry Smith 
6997ba3a57cSBarry Smith @*/
7007ba3a57cSBarry Smith PetscErrorCode  PetscStrendswith(const char a[],const char b[],PetscBool *flg)
7017ba3a57cSBarry Smith {
7027ba3a57cSBarry Smith   char           *test;
7037ba3a57cSBarry Smith   PetscErrorCode ierr;
7047ba3a57cSBarry Smith   size_t         na,nb;
7057ba3a57cSBarry Smith 
7067ba3a57cSBarry Smith   PetscFunctionBegin;
7077ba3a57cSBarry Smith   *flg = PETSC_FALSE;
7087ba3a57cSBarry Smith   ierr = PetscStrrstr(a,b,&test);CHKERRQ(ierr);
7097ba3a57cSBarry Smith   if (test) {
7107ba3a57cSBarry Smith     ierr = PetscStrlen(a,&na);CHKERRQ(ierr);
7117ba3a57cSBarry Smith     ierr = PetscStrlen(b,&nb);CHKERRQ(ierr);
7127ba3a57cSBarry Smith     if (a+na-nb == test) *flg = PETSC_TRUE;
7137ba3a57cSBarry Smith   }
7147ba3a57cSBarry Smith   PetscFunctionReturn(0);
7157ba3a57cSBarry Smith }
7167ba3a57cSBarry Smith 
7177ba3a57cSBarry Smith #undef __FUNCT__
7182c9581d2SBarry Smith #define __FUNCT__ "PetscStrbeginswith"
7192c9581d2SBarry Smith /*@C
7202c9581d2SBarry Smith    PetscStrbeginswith - Determines if a string begins with a certain string
7212c9581d2SBarry Smith 
7222c9581d2SBarry Smith    Not Collective
7232c9581d2SBarry Smith 
7242c9581d2SBarry Smith    Input Parameters:
7252c9581d2SBarry Smith +  a - pointer to string
7262c9581d2SBarry Smith -  b - string to beginwith
7272c9581d2SBarry Smith 
7282c9581d2SBarry Smith    Output Parameter:
7292c9581d2SBarry Smith .  flg - PETSC_TRUE or PETSC_FALSE
7302c9581d2SBarry Smith 
7312c9581d2SBarry Smith    Notes:     Not for use in Fortran
7322c9581d2SBarry Smith 
7332c9581d2SBarry Smith    Level: intermediate
7342c9581d2SBarry Smith 
7352c9581d2SBarry Smith @*/
7362c9581d2SBarry Smith PetscErrorCode  PetscStrbeginswith(const char a[],const char b[],PetscBool *flg)
7372c9581d2SBarry Smith {
7382c9581d2SBarry Smith   char           *test;
7392c9581d2SBarry Smith   PetscErrorCode ierr;
7402c9581d2SBarry Smith 
7412c9581d2SBarry Smith   PetscFunctionBegin;
7422c9581d2SBarry Smith   *flg = PETSC_FALSE;
7432c9581d2SBarry Smith   ierr = PetscStrrstr(a,b,&test);CHKERRQ(ierr);
744a297a907SKarl Rupp   if (test && (test == a)) *flg = PETSC_TRUE;
7452c9581d2SBarry Smith   PetscFunctionReturn(0);
7462c9581d2SBarry Smith }
7472c9581d2SBarry Smith 
7482c9581d2SBarry Smith 
7492c9581d2SBarry Smith #undef __FUNCT__
7507ba3a57cSBarry Smith #define __FUNCT__ "PetscStrendswithwhich"
7517ba3a57cSBarry Smith /*@C
7527ba3a57cSBarry Smith    PetscStrendswithwhich - Determines if a string ends with one of several possible strings
7537ba3a57cSBarry Smith 
7547ba3a57cSBarry Smith    Not Collective
7557ba3a57cSBarry Smith 
7567ba3a57cSBarry Smith    Input Parameters:
7577ba3a57cSBarry Smith +  a - pointer to string
7587ba3a57cSBarry Smith -  bs - strings to endwith (last entry must be null)
7597ba3a57cSBarry Smith 
7607ba3a57cSBarry Smith    Output Parameter:
7617ba3a57cSBarry Smith .  cnt - the index of the string it ends with or 1+the last possible index
7627ba3a57cSBarry Smith 
7637ba3a57cSBarry Smith    Notes:     Not for use in Fortran
7647ba3a57cSBarry Smith 
7657ba3a57cSBarry Smith    Level: intermediate
7667ba3a57cSBarry Smith 
7677ba3a57cSBarry Smith @*/
7687ba3a57cSBarry Smith PetscErrorCode  PetscStrendswithwhich(const char a[],const char *const *bs,PetscInt *cnt)
7697ba3a57cSBarry Smith {
7707ba3a57cSBarry Smith   PetscBool      flg;
7717ba3a57cSBarry Smith   PetscErrorCode ierr;
7727ba3a57cSBarry Smith 
7737ba3a57cSBarry Smith   PetscFunctionBegin;
7747ba3a57cSBarry Smith   *cnt = 0;
7757ba3a57cSBarry Smith   while (bs[*cnt]) {
7767ba3a57cSBarry Smith     ierr = PetscStrendswith(a,bs[*cnt],&flg);CHKERRQ(ierr);
7777ba3a57cSBarry Smith     if (flg) PetscFunctionReturn(0);
7787ba3a57cSBarry Smith     *cnt += 1;
7797ba3a57cSBarry Smith   }
7807ba3a57cSBarry Smith   PetscFunctionReturn(0);
7817ba3a57cSBarry Smith }
7827ba3a57cSBarry Smith 
7837ba3a57cSBarry Smith #undef __FUNCT__
7847ba3a57cSBarry Smith #define __FUNCT__ "PetscStrrstr"
7857ba3a57cSBarry Smith /*@C
7867ba3a57cSBarry Smith    PetscStrrstr - Locates last occurance of string in another string
7877ba3a57cSBarry Smith 
7887ba3a57cSBarry Smith    Not Collective
7897ba3a57cSBarry Smith 
7907ba3a57cSBarry Smith    Input Parameters:
7917ba3a57cSBarry Smith +  a - pointer to string
7927ba3a57cSBarry Smith -  b - string to find
7937ba3a57cSBarry Smith 
7947ba3a57cSBarry Smith    Output Parameter:
7957ba3a57cSBarry Smith .  tmp - location of occurance
7967ba3a57cSBarry Smith 
7977ba3a57cSBarry Smith    Notes:     Not for use in Fortran
7987ba3a57cSBarry Smith 
7997ba3a57cSBarry Smith    Level: intermediate
8007ba3a57cSBarry Smith 
8017ba3a57cSBarry Smith @*/
8027ba3a57cSBarry Smith PetscErrorCode  PetscStrrstr(const char a[],const char b[],char *tmp[])
8037ba3a57cSBarry Smith {
8047ba3a57cSBarry Smith   const char *stmp = a, *ltmp = 0;
8057ba3a57cSBarry Smith 
8067ba3a57cSBarry Smith   PetscFunctionBegin;
8077ba3a57cSBarry Smith   while (stmp) {
8087ba3a57cSBarry Smith     stmp = (char*)strstr(stmp,b);
8097ba3a57cSBarry Smith     if (stmp) {ltmp = stmp;stmp++;}
8107ba3a57cSBarry Smith   }
8117ba3a57cSBarry Smith   *tmp = (char*)ltmp;
8127ba3a57cSBarry Smith   PetscFunctionReturn(0);
8137ba3a57cSBarry Smith }
8147ba3a57cSBarry Smith 
8157ba3a57cSBarry Smith #undef __FUNCT__
8167ba3a57cSBarry Smith #define __FUNCT__ "PetscStrstr"
8177ba3a57cSBarry Smith /*@C
8187ba3a57cSBarry Smith    PetscStrstr - Locates first occurance of string in another string
8197ba3a57cSBarry Smith 
8207ba3a57cSBarry Smith    Not Collective
8217ba3a57cSBarry Smith 
8227ba3a57cSBarry Smith    Input Parameters:
823160f4796SJed Brown +  haystack - string to search
824160f4796SJed Brown -  needle - string to find
8257ba3a57cSBarry Smith 
8267ba3a57cSBarry Smith    Output Parameter:
8270298fd71SBarry Smith .  tmp - location of occurance, is a NULL if the string is not found
8287ba3a57cSBarry Smith 
8297ba3a57cSBarry Smith    Notes: Not for use in Fortran
8307ba3a57cSBarry Smith 
8317ba3a57cSBarry Smith    Level: intermediate
8327ba3a57cSBarry Smith 
8337ba3a57cSBarry Smith @*/
834160f4796SJed Brown PetscErrorCode  PetscStrstr(const char haystack[],const char needle[],char *tmp[])
8357ba3a57cSBarry Smith {
8367ba3a57cSBarry Smith   PetscFunctionBegin;
837160f4796SJed Brown   *tmp = (char*)strstr(haystack,needle);
8387ba3a57cSBarry Smith   PetscFunctionReturn(0);
8397ba3a57cSBarry Smith }
8407ba3a57cSBarry Smith 
8417ba3a57cSBarry Smith struct _p_PetscToken {char token;char *array;char *current;};
8421d1a0024SBarry Smith 
843e5c89e4eSSatish Balay #undef __FUNCT__
844e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenFind"
845e5c89e4eSSatish Balay /*@C
846e5c89e4eSSatish Balay    PetscTokenFind - Locates next "token" in a string
847e5c89e4eSSatish Balay 
848e5c89e4eSSatish Balay    Not Collective
849e5c89e4eSSatish Balay 
850e5c89e4eSSatish Balay    Input Parameters:
851e5c89e4eSSatish Balay .  a - pointer to token
852e5c89e4eSSatish Balay 
853e5c89e4eSSatish Balay    Output Parameter:
8540298fd71SBarry Smith .  result - location of occurance, NULL if not found
855e5c89e4eSSatish Balay 
856e5c89e4eSSatish Balay    Notes:
857e5c89e4eSSatish Balay 
858e5c89e4eSSatish Balay      This version is different from the system version in that
859e5c89e4eSSatish Balay   it allows you to pass a read-only string into the function.
860e5c89e4eSSatish Balay 
8614704e885SBarry Smith      This version also treats all characters etc. inside a double quote "
8624704e885SBarry Smith    as a single token.
8634704e885SBarry Smith 
8646f013253SBarry Smith     Not for use in Fortran
8656f013253SBarry Smith 
866e5c89e4eSSatish Balay    Level: intermediate
867e5c89e4eSSatish Balay 
8686f013253SBarry Smith 
869e5c89e4eSSatish Balay .seealso: PetscTokenCreate(), PetscTokenDestroy()
870e5c89e4eSSatish Balay @*/
8717087cfbeSBarry Smith PetscErrorCode  PetscTokenFind(PetscToken a,char *result[])
872e5c89e4eSSatish Balay {
8734704e885SBarry Smith   char *ptr = a->current,token;
874e5c89e4eSSatish Balay 
875e5c89e4eSSatish Balay   PetscFunctionBegin;
876e5c89e4eSSatish Balay   *result = a->current;
8774704e885SBarry Smith   if (ptr && !*ptr) {*result = 0;PetscFunctionReturn(0);}
8784704e885SBarry Smith   token = a->token;
87990fdf44cSMatthew Knepley   if (ptr && (*ptr == '"')) {token = '"';(*result)++;ptr++;}
880e5c89e4eSSatish Balay   while (ptr) {
8814704e885SBarry Smith     if (*ptr == token) {
882e5c89e4eSSatish Balay       *ptr++ = 0;
883e5c89e4eSSatish Balay       while (*ptr == a->token) ptr++;
884e5c89e4eSSatish Balay       a->current = ptr;
885e5c89e4eSSatish Balay       break;
886e5c89e4eSSatish Balay     }
887e5c89e4eSSatish Balay     if (!*ptr) {
888e5c89e4eSSatish Balay       a->current = 0;
889e5c89e4eSSatish Balay       break;
890e5c89e4eSSatish Balay     }
891e5c89e4eSSatish Balay     ptr++;
892e5c89e4eSSatish Balay   }
893e5c89e4eSSatish Balay   PetscFunctionReturn(0);
894e5c89e4eSSatish Balay }
895e5c89e4eSSatish Balay 
896e5c89e4eSSatish Balay #undef __FUNCT__
897e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenCreate"
898e5c89e4eSSatish Balay /*@C
899e5c89e4eSSatish Balay    PetscTokenCreate - Creates a PetscToken used to find tokens in a string
900e5c89e4eSSatish Balay 
901e5c89e4eSSatish Balay    Not Collective
902e5c89e4eSSatish Balay 
903e5c89e4eSSatish Balay    Input Parameters:
904e5c89e4eSSatish Balay +  string - the string to look in
905e5c89e4eSSatish Balay -  token - the character to look for
906e5c89e4eSSatish Balay 
907e5c89e4eSSatish Balay    Output Parameter:
908e5c89e4eSSatish Balay .  a - pointer to token
909e5c89e4eSSatish Balay 
910e5c89e4eSSatish Balay    Notes:
911e5c89e4eSSatish Balay 
912e5c89e4eSSatish Balay      This version is different from the system version in that
913e5c89e4eSSatish Balay   it allows you to pass a read-only string into the function.
914e5c89e4eSSatish Balay 
9156f013253SBarry Smith     Not for use in Fortran
9166f013253SBarry Smith 
917e5c89e4eSSatish Balay    Level: intermediate
918e5c89e4eSSatish Balay 
919e5c89e4eSSatish Balay .seealso: PetscTokenFind(), PetscTokenDestroy()
920e5c89e4eSSatish Balay @*/
9217087cfbeSBarry Smith PetscErrorCode  PetscTokenCreate(const char a[],const char b,PetscToken *t)
922e5c89e4eSSatish Balay {
923e5c89e4eSSatish Balay   PetscErrorCode ierr;
924e5c89e4eSSatish Balay 
925e5c89e4eSSatish Balay   PetscFunctionBegin;
9261d1a0024SBarry Smith   ierr = PetscNew(struct _p_PetscToken,t);CHKERRQ(ierr);
927e5c89e4eSSatish Balay   ierr = PetscStrallocpy(a,&(*t)->array);CHKERRQ(ierr);
928a297a907SKarl Rupp 
929e5c89e4eSSatish Balay   (*t)->current = (*t)->array;
930e5c89e4eSSatish Balay   (*t)->token   = b;
931e5c89e4eSSatish Balay   PetscFunctionReturn(0);
932e5c89e4eSSatish Balay }
933e5c89e4eSSatish Balay 
934e5c89e4eSSatish Balay #undef __FUNCT__
935e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenDestroy"
936e5c89e4eSSatish Balay /*@C
937e5c89e4eSSatish Balay    PetscTokenDestroy - Destroys a PetscToken
938e5c89e4eSSatish Balay 
939e5c89e4eSSatish Balay    Not Collective
940e5c89e4eSSatish Balay 
941e5c89e4eSSatish Balay    Input Parameters:
942e5c89e4eSSatish Balay .  a - pointer to token
943e5c89e4eSSatish Balay 
944e5c89e4eSSatish Balay    Level: intermediate
945e5c89e4eSSatish Balay 
9466f013253SBarry Smith    Notes:     Not for use in Fortran
9476f013253SBarry Smith 
948e5c89e4eSSatish Balay .seealso: PetscTokenCreate(), PetscTokenFind()
949e5c89e4eSSatish Balay @*/
9508c74ee41SBarry Smith PetscErrorCode  PetscTokenDestroy(PetscToken *a)
951e5c89e4eSSatish Balay {
952e5c89e4eSSatish Balay   PetscErrorCode ierr;
953e5c89e4eSSatish Balay 
954e5c89e4eSSatish Balay   PetscFunctionBegin;
9558c74ee41SBarry Smith   if (!*a) PetscFunctionReturn(0);
9568c74ee41SBarry Smith   ierr = PetscFree((*a)->array);CHKERRQ(ierr);
9578c74ee41SBarry Smith   ierr = PetscFree(*a);CHKERRQ(ierr);
958e5c89e4eSSatish Balay   PetscFunctionReturn(0);
959e5c89e4eSSatish Balay }
960e5c89e4eSSatish Balay 
961e5c89e4eSSatish Balay 
962e5c89e4eSSatish Balay #undef __FUNCT__
963e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetPetscDir"
964e5c89e4eSSatish Balay /*@C
965e5c89e4eSSatish Balay    PetscGetPetscDir - Gets the directory PETSc is installed in
966e5c89e4eSSatish Balay 
967e5c89e4eSSatish Balay    Not Collective
968e5c89e4eSSatish Balay 
969e5c89e4eSSatish Balay    Output Parameter:
970e5c89e4eSSatish Balay .  dir - the directory
971e5c89e4eSSatish Balay 
972e5c89e4eSSatish Balay    Level: developer
973e5c89e4eSSatish Balay 
9746f013253SBarry Smith    Notes: Not for use in Fortran
9756f013253SBarry Smith 
976e5c89e4eSSatish Balay @*/
9777087cfbeSBarry Smith PetscErrorCode  PetscGetPetscDir(const char *dir[])
978e5c89e4eSSatish Balay {
979e5c89e4eSSatish Balay   PetscFunctionBegin;
980e5c89e4eSSatish Balay   *dir = PETSC_DIR;
981e5c89e4eSSatish Balay   PetscFunctionReturn(0);
982e5c89e4eSSatish Balay }
983e5c89e4eSSatish Balay 
984e5c89e4eSSatish Balay #undef __FUNCT__
985e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrreplace"
986e5c89e4eSSatish Balay /*@C
987e5c89e4eSSatish Balay    PetscStrreplace - Replaces substrings in string with other substrings
988e5c89e4eSSatish Balay 
989e5c89e4eSSatish Balay    Not Collective
990e5c89e4eSSatish Balay 
991e5c89e4eSSatish Balay    Input Parameters:
992e5c89e4eSSatish Balay +   comm - MPI_Comm of processors that are processing the string
99371573d7dSBarry Smith .   aa - the string to look in
994d8ccf1fbSBarry Smith .   b - the resulting copy of a with replaced strings (b can be the same as a)
995e5c89e4eSSatish Balay -   len - the length of b
996e5c89e4eSSatish Balay 
997e5c89e4eSSatish Balay    Notes:
998e5c89e4eSSatish Balay       Replaces   ${PETSC_ARCH},${PETSC_DIR},${PETSC_LIB_DIR},${DISPLAY},
999d5649816SBarry Smith       ${HOMEDIRECTORY},${WORKINGDIRECTORY},${USERNAME}, ${HOSTNAME} with appropriate values
1000e5c89e4eSSatish Balay       as well as any environmental variables.
1001e5c89e4eSSatish Balay 
10026f013253SBarry Smith       PETSC_LIB_DIR uses the environmental variable if it exists. PETSC_ARCH and PETSC_DIR use what
1003acc6cc86SBarry Smith       PETSc was built with and do not use environmental variables.
1004acc6cc86SBarry Smith 
10056f013253SBarry Smith       Not for use in Fortran
10066f013253SBarry Smith 
1007e5c89e4eSSatish Balay    Level: intermediate
1008e5c89e4eSSatish Balay 
1009e5c89e4eSSatish Balay @*/
10107087cfbeSBarry Smith PetscErrorCode  PetscStrreplace(MPI_Comm comm,const char aa[],char b[],size_t len)
1011e5c89e4eSSatish Balay {
1012e5c89e4eSSatish Balay   PetscErrorCode ierr;
1013e5c89e4eSSatish Balay   int            i = 0;
1014e5c89e4eSSatish Balay   size_t         l,l1,l2,l3;
101571573d7dSBarry Smith   char           *work,*par,*epar,env[1024],*tfree,*a = (char*)aa;
1016d5649816SBarry Smith   const char     *s[] = {"${PETSC_ARCH}","${PETSC_DIR}","${PETSC_LIB_DIR}","${DISPLAY}","${HOMEDIRECTORY}","${WORKINGDIRECTORY}","${USERNAME}","${HOSTNAME}",0};
1017d5649816SBarry Smith   const char     *r[] = {0,0,0,0,0,0,0,0,0};
1018ace3abfcSBarry Smith   PetscBool      flag;
1019e5c89e4eSSatish Balay 
1020e5c89e4eSSatish Balay   PetscFunctionBegin;
1021e32f2f54SBarry Smith   if (!a || !b) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"a and b strings must be nonnull");
102271573d7dSBarry Smith   if (aa == b) {
102322982a5fSBarry Smith     ierr = PetscStrallocpy(aa,(char**)&a);CHKERRQ(ierr);
102471573d7dSBarry Smith   }
1025e5c89e4eSSatish Balay   ierr = PetscMalloc(len*sizeof(char*),&work);CHKERRQ(ierr);
1026e5c89e4eSSatish Balay 
1027e5c89e4eSSatish Balay   /* get values for replaced variables */
1028487e5849SBarry Smith   ierr = PetscStrallocpy(PETSC_ARCH,(char**)&r[0]);CHKERRQ(ierr);
1029487e5849SBarry Smith   ierr = PetscStrallocpy(PETSC_DIR,(char**)&r[1]);CHKERRQ(ierr);
1030487e5849SBarry Smith   ierr = PetscStrallocpy(PETSC_LIB_DIR,(char**)&r[2]);CHKERRQ(ierr);
1031487e5849SBarry Smith   ierr = PetscMalloc(256*sizeof(char),&r[3]);CHKERRQ(ierr);
1032487e5849SBarry Smith   ierr = PetscMalloc(PETSC_MAX_PATH_LEN*sizeof(char),&r[4]);CHKERRQ(ierr);
1033e5c89e4eSSatish Balay   ierr = PetscMalloc(PETSC_MAX_PATH_LEN*sizeof(char),&r[5]);CHKERRQ(ierr);
1034487e5849SBarry Smith   ierr = PetscMalloc(256*sizeof(char),&r[6]);CHKERRQ(ierr);
1035d5649816SBarry Smith   ierr = PetscMalloc(256*sizeof(char),&r[7]);CHKERRQ(ierr);
1036487e5849SBarry Smith   ierr = PetscGetDisplay((char*)r[3],256);CHKERRQ(ierr);
1037487e5849SBarry Smith   ierr = PetscGetHomeDirectory((char*)r[4],PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
1038487e5849SBarry Smith   ierr = PetscGetWorkingDirectory((char*)r[5],PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
1039487e5849SBarry Smith   ierr = PetscGetUserName((char*)r[6],256);CHKERRQ(ierr);
1040d5649816SBarry Smith   ierr = PetscGetHostName((char*)r[7],256);CHKERRQ(ierr);
1041487e5849SBarry Smith 
1042487e5849SBarry Smith   /* replace that are in environment */
1043487e5849SBarry Smith   ierr = PetscOptionsGetenv(comm,"PETSC_LIB_DIR",env,1024,&flag);CHKERRQ(ierr);
1044487e5849SBarry Smith   if (flag) {
1045487e5849SBarry Smith     ierr = PetscStrallocpy(env,(char**)&r[2]);CHKERRQ(ierr);
1046487e5849SBarry Smith   }
1047e5c89e4eSSatish Balay 
1048e5c89e4eSSatish Balay   /* replace the requested strings */
1049e5c89e4eSSatish Balay   ierr = PetscStrncpy(b,a,len);CHKERRQ(ierr);
1050e5c89e4eSSatish Balay   while (s[i]) {
1051e5c89e4eSSatish Balay     ierr = PetscStrlen(s[i],&l);CHKERRQ(ierr);
1052e5c89e4eSSatish Balay     ierr = PetscStrstr(b,s[i],&par);CHKERRQ(ierr);
1053e5c89e4eSSatish Balay     while (par) {
1054e5c89e4eSSatish Balay       *par =  0;
1055e5c89e4eSSatish Balay       par += l;
1056e5c89e4eSSatish Balay 
1057e5c89e4eSSatish Balay       ierr = PetscStrlen(b,&l1);CHKERRQ(ierr);
1058e5c89e4eSSatish Balay       ierr = PetscStrlen(r[i],&l2);CHKERRQ(ierr);
1059e5c89e4eSSatish Balay       ierr = PetscStrlen(par,&l3);CHKERRQ(ierr);
106017186662SBarry Smith       if (l1 + l2 + l3 >= len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"b len is not long enough to hold new values");
1061e5c89e4eSSatish Balay       ierr = PetscStrcpy(work,b);CHKERRQ(ierr);
1062e5c89e4eSSatish Balay       ierr = PetscStrcat(work,r[i]);CHKERRQ(ierr);
1063e5c89e4eSSatish Balay       ierr = PetscStrcat(work,par);CHKERRQ(ierr);
1064e5c89e4eSSatish Balay       ierr = PetscStrncpy(b,work,len);CHKERRQ(ierr);
1065e5c89e4eSSatish Balay       ierr = PetscStrstr(b,s[i],&par);CHKERRQ(ierr);
1066e5c89e4eSSatish Balay     }
1067e5c89e4eSSatish Balay     i++;
1068e5c89e4eSSatish Balay   }
1069487e5849SBarry Smith   i = 0;
1070487e5849SBarry Smith   while (r[i]) {
1071e5c89e4eSSatish Balay     tfree = (char*)r[i];
1072e5c89e4eSSatish Balay     ierr  = PetscFree(tfree);CHKERRQ(ierr);
1073487e5849SBarry Smith     i++;
1074e5c89e4eSSatish Balay   }
1075e5c89e4eSSatish Balay 
1076e5c89e4eSSatish Balay   /* look for any other ${xxx} strings to replace from environmental variables */
1077e5c89e4eSSatish Balay   ierr = PetscStrstr(b,"${",&par);CHKERRQ(ierr);
1078e5c89e4eSSatish Balay   while (par) {
1079e5c89e4eSSatish Balay     *par  = 0;
1080e5c89e4eSSatish Balay     par  += 2;
1081e5c89e4eSSatish Balay     ierr  = PetscStrcpy(work,b);CHKERRQ(ierr);
1082e5c89e4eSSatish Balay     ierr  = PetscStrstr(par,"}",&epar);CHKERRQ(ierr);
1083e5c89e4eSSatish Balay     *epar = 0;
1084e5c89e4eSSatish Balay     epar += 1;
1085e5c89e4eSSatish Balay     ierr  = PetscOptionsGetenv(comm,par,env,256,&flag);CHKERRQ(ierr);
10867ba3a57cSBarry Smith     if (!flag) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Substitution string ${%s} not found as environmental variable",par);
1087e5c89e4eSSatish Balay     ierr = PetscStrcat(work,env);CHKERRQ(ierr);
1088e5c89e4eSSatish Balay     ierr = PetscStrcat(work,epar);CHKERRQ(ierr);
1089e5c89e4eSSatish Balay     ierr = PetscStrcpy(b,work);CHKERRQ(ierr);
1090e5c89e4eSSatish Balay     ierr = PetscStrstr(b,"${",&par);CHKERRQ(ierr);
1091e5c89e4eSSatish Balay   }
1092e5c89e4eSSatish Balay   ierr = PetscFree(work);CHKERRQ(ierr);
109371573d7dSBarry Smith   if (aa == b) {
109471573d7dSBarry Smith     ierr = PetscFree(a);CHKERRQ(ierr);
109571573d7dSBarry Smith   }
1096e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1097e5c89e4eSSatish Balay }
1098e5c89e4eSSatish Balay 
1099a53986e1SJed Brown #undef __FUNCT__
1100a53986e1SJed Brown #define __FUNCT__ "PetscEListFind"
1101a53986e1SJed Brown /*@C
1102a53986e1SJed Brown    PetscEListFind - searches list of strings for given string, using case insensitive matching
1103e5c89e4eSSatish Balay 
1104a53986e1SJed Brown    Not Collective
1105a53986e1SJed Brown 
1106a53986e1SJed Brown    Input Parameters:
1107a53986e1SJed Brown +  n - number of strings in
1108a53986e1SJed Brown .  list - list of strings to search
1109a53986e1SJed Brown -  str - string to look for, empty string "" accepts default (first entry in list)
1110a53986e1SJed Brown 
1111a53986e1SJed Brown    Output Parameters:
1112a53986e1SJed Brown +  value - index of matching string (if found)
1113a53986e1SJed Brown -  found - boolean indicating whether string was found (can be NULL)
1114a53986e1SJed Brown 
1115a53986e1SJed Brown    Notes:
1116a53986e1SJed Brown    Not for use in Fortran
1117a53986e1SJed Brown 
1118a53986e1SJed Brown    Level: advanced
1119a53986e1SJed Brown @*/
1120a53986e1SJed Brown PetscErrorCode PetscEListFind(PetscInt n,const char *const *list,const char *str,PetscInt *value,PetscBool *found)
1121a53986e1SJed Brown {
1122a53986e1SJed Brown   PetscErrorCode ierr;
1123a53986e1SJed Brown   PetscBool matched;
1124a53986e1SJed Brown   PetscInt i;
1125a53986e1SJed Brown 
1126a53986e1SJed Brown   PetscFunctionBegin;
1127a53986e1SJed Brown   if (found) *found = PETSC_FALSE;
1128a53986e1SJed Brown   for (i=0; i<n; i++) {
1129a53986e1SJed Brown     ierr = PetscStrcasecmp(str,list[i],&matched);CHKERRQ(ierr);
1130a53986e1SJed Brown     if (matched || !str[0]) {
1131a53986e1SJed Brown       if (found) *found = PETSC_TRUE;
1132a53986e1SJed Brown       *value = i;
1133a53986e1SJed Brown       break;
1134a53986e1SJed Brown     }
1135a53986e1SJed Brown   }
1136a53986e1SJed Brown   PetscFunctionReturn(0);
1137a53986e1SJed Brown }
1138a53986e1SJed Brown 
1139a53986e1SJed Brown #undef __FUNCT__
1140a53986e1SJed Brown #define __FUNCT__ "PetscEnumFind"
1141a53986e1SJed Brown /*@C
1142a53986e1SJed Brown    PetscEListFind - searches enum list of strings for given string, using case insensitive matching
1143a53986e1SJed Brown 
1144a53986e1SJed Brown    Not Collective
1145a53986e1SJed Brown 
1146a53986e1SJed Brown    Input Parameters:
1147a53986e1SJed Brown +  enumlist - list of strings to search, followed by enum name, then enum prefix, then NUL
1148a53986e1SJed Brown -  str - string to look for
1149a53986e1SJed Brown 
1150a53986e1SJed Brown    Output Parameters:
1151a53986e1SJed Brown +  value - index of matching string (if found)
1152a53986e1SJed Brown -  found - boolean indicating whether string was found (can be NULL)
1153a53986e1SJed Brown 
1154a53986e1SJed Brown    Notes:
1155a53986e1SJed Brown    Not for use in Fortran
1156a53986e1SJed Brown 
1157a53986e1SJed Brown    Level: advanced
1158a53986e1SJed Brown @*/
1159a53986e1SJed Brown PetscErrorCode PetscEnumFind(const char *const *enumlist,const char *str,PetscEnum *value,PetscBool *found)
1160a53986e1SJed Brown {
1161a53986e1SJed Brown   PetscErrorCode ierr;
1162a53986e1SJed Brown   PetscInt n,evalue;
1163a53986e1SJed Brown   PetscBool efound;
1164a53986e1SJed Brown 
1165a53986e1SJed Brown   PetscFunctionBegin;
1166a53986e1SJed Brown   for (n = 0; enumlist[n]; n++) {
1167a53986e1SJed Brown     if (n > 50) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries");
1168a53986e1SJed Brown   }
1169a53986e1SJed Brown   if (n < 3) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix");
1170a53986e1SJed Brown   n -= 3;                       /* drop enum name, prefix, and null termination */
1171a53986e1SJed Brown   ierr = PetscEListFind(n,enumlist,str,&evalue,&efound);CHKERRQ(ierr);
1172*cfb463b1SJed Brown   if (efound) *value = (PetscEnum)evalue;
1173a53986e1SJed Brown   if (found) *found = efound;
1174a53986e1SJed Brown   PetscFunctionReturn(0);
1175a53986e1SJed Brown }
1176