xref: /petsc/src/sys/utils/str.c (revision a2ea699e38724ba84d6b53e25662d438e2ddc065)
17d0a6c19SBarry Smith 
2e5c89e4eSSatish Balay /*
3e5c89e4eSSatish Balay     We define the string operations here. The reason we just do not use
4e5c89e4eSSatish Balay   the standard string routines in the PETSc code is that on some machines
5e5c89e4eSSatish Balay   they are broken or have the wrong prototypes.
6e5c89e4eSSatish Balay 
7e5c89e4eSSatish Balay */
8c6db04a5SJed Brown #include <petscsys.h>                   /*I  "petscsys.h"   I*/
9e5c89e4eSSatish Balay #if defined(PETSC_HAVE_STRING_H)
10e5c89e4eSSatish Balay #include <string.h>
11e5c89e4eSSatish Balay #endif
12e5c89e4eSSatish Balay #if defined(PETSC_HAVE_STRINGS_H)
13e5c89e4eSSatish Balay #include <strings.h>
14e5c89e4eSSatish Balay #endif
15e5c89e4eSSatish Balay 
16e5c89e4eSSatish Balay #undef __FUNCT__
173c311c98SBarry Smith #define __FUNCT__ "PetscStrToArray"
183c311c98SBarry Smith /*@C
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
25*a2ea699eSBarry 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   }
62*a2ea699eSBarry 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   }
78*a2ea699eSBarry 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 
118301d30feSBarry Smith   for (i=0; i<argc; i++) {
119301d30feSBarry Smith     free(args[i]);
120301d30feSBarry Smith   }
1214996c5bdSBarry Smith   if (args) {
122301d30feSBarry Smith     free(args);
1234996c5bdSBarry Smith   }
124301d30feSBarry Smith   return 0;
125301d30feSBarry Smith }
126301d30feSBarry Smith 
127301d30feSBarry Smith #undef __FUNCT__
128e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrlen"
129e5c89e4eSSatish Balay /*@C
130e5c89e4eSSatish Balay    PetscStrlen - Gets length of a string
131e5c89e4eSSatish Balay 
132e5c89e4eSSatish Balay    Not Collective
133e5c89e4eSSatish Balay 
134e5c89e4eSSatish Balay    Input Parameters:
135e5c89e4eSSatish Balay .  s - pointer to string
136e5c89e4eSSatish Balay 
137e5c89e4eSSatish Balay    Output Parameter:
138e5c89e4eSSatish Balay .  len - length in bytes
139e5c89e4eSSatish Balay 
140e5c89e4eSSatish Balay    Level: intermediate
141e5c89e4eSSatish Balay 
142e5c89e4eSSatish Balay    Note:
143e5c89e4eSSatish Balay    This routine is analogous to strlen().
144e5c89e4eSSatish Balay 
145e5c89e4eSSatish Balay    Null string returns a length of zero
146e5c89e4eSSatish Balay 
1476f013253SBarry Smith    Not for use in Fortran
1486f013253SBarry Smith 
149e5c89e4eSSatish Balay   Concepts: string length
150e5c89e4eSSatish Balay 
151e5c89e4eSSatish Balay @*/
1527087cfbeSBarry Smith PetscErrorCode  PetscStrlen(const char s[],size_t *len)
153e5c89e4eSSatish Balay {
154e5c89e4eSSatish Balay   PetscFunctionBegin;
155e5c89e4eSSatish Balay   if (!s) {
156e5c89e4eSSatish Balay     *len = 0;
157e5c89e4eSSatish Balay   } else {
158e5c89e4eSSatish Balay     *len = strlen(s);
159e5c89e4eSSatish Balay   }
160e5c89e4eSSatish Balay   PetscFunctionReturn(0);
161e5c89e4eSSatish Balay }
162e5c89e4eSSatish Balay 
163e5c89e4eSSatish Balay #undef __FUNCT__
164e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrallocpy"
165e5c89e4eSSatish Balay /*@C
166e5c89e4eSSatish Balay    PetscStrallocpy - Allocates space to hold a copy of a string then copies the string
167e5c89e4eSSatish Balay 
168e5c89e4eSSatish Balay    Not Collective
169e5c89e4eSSatish Balay 
170e5c89e4eSSatish Balay    Input Parameters:
171e5c89e4eSSatish Balay .  s - pointer to string
172e5c89e4eSSatish Balay 
173e5c89e4eSSatish Balay    Output Parameter:
174e5c89e4eSSatish Balay .  t - the copied string
175e5c89e4eSSatish Balay 
176e5c89e4eSSatish Balay    Level: intermediate
177e5c89e4eSSatish Balay 
178e5c89e4eSSatish Balay    Note:
179e5c89e4eSSatish Balay       Null string returns a new null string
180e5c89e4eSSatish Balay 
1816f013253SBarry Smith       Not for use in Fortran
1826f013253SBarry Smith 
183e5c89e4eSSatish Balay   Concepts: string copy
184e5c89e4eSSatish Balay 
185e5c89e4eSSatish Balay @*/
1867087cfbeSBarry Smith PetscErrorCode  PetscStrallocpy(const char s[],char *t[])
187e5c89e4eSSatish Balay {
188e5c89e4eSSatish Balay   PetscErrorCode ierr;
189e5c89e4eSSatish Balay   size_t         len;
19071573d7dSBarry Smith   char           *tmp = 0;
191e5c89e4eSSatish Balay 
192e5c89e4eSSatish Balay   PetscFunctionBegin;
193e5c89e4eSSatish Balay   if (s) {
194e5c89e4eSSatish Balay     ierr = PetscStrlen(s,&len);CHKERRQ(ierr);
19571573d7dSBarry Smith     ierr = PetscMalloc((1+len)*sizeof(char),&tmp);CHKERRQ(ierr);
19671573d7dSBarry Smith     ierr = PetscStrcpy(tmp,s);CHKERRQ(ierr);
197e5c89e4eSSatish Balay   }
19871573d7dSBarry Smith   *t = tmp;
199e5c89e4eSSatish Balay   PetscFunctionReturn(0);
200e5c89e4eSSatish Balay }
201e5c89e4eSSatish Balay 
202e5c89e4eSSatish Balay #undef __FUNCT__
20347340559SBarry Smith #define __FUNCT__ "PetscStrArrayallocpy"
20447340559SBarry Smith /*@C
20547340559SBarry Smith    PetscStrArrayallocpy - Allocates space to hold a copy of an array of strings then copies the strings
20647340559SBarry Smith 
20747340559SBarry Smith    Not Collective
20847340559SBarry Smith 
20947340559SBarry Smith    Input Parameters:
21047340559SBarry Smith .  s - pointer to array of strings (final string is a null)
21147340559SBarry Smith 
21247340559SBarry Smith    Output Parameter:
21347340559SBarry Smith .  t - the copied array string
21447340559SBarry Smith 
21547340559SBarry Smith    Level: intermediate
21647340559SBarry Smith 
21747340559SBarry Smith    Note:
21847340559SBarry Smith       Not for use in Fortran
21947340559SBarry Smith 
22047340559SBarry Smith   Concepts: string copy
22147340559SBarry Smith 
22247340559SBarry Smith .seealso: PetscStrallocpy() PetscStrArrayDestroy()
22347340559SBarry Smith 
22447340559SBarry Smith @*/
22547340559SBarry Smith PetscErrorCode  PetscStrArrayallocpy(const char *const*list,char ***t)
22647340559SBarry Smith {
22747340559SBarry Smith   PetscErrorCode ierr;
22847340559SBarry Smith   PetscInt       i,n = 0;
22947340559SBarry Smith 
23047340559SBarry Smith   PetscFunctionBegin;
23147340559SBarry Smith   while (list[n++]) ;
23247340559SBarry Smith   ierr = PetscMalloc((n+1)*sizeof(char**),t);CHKERRQ(ierr);
23347340559SBarry Smith   for (i=0; i<n; i++) {
23447340559SBarry Smith     ierr = PetscStrallocpy(list[i],(*t)+i);CHKERRQ(ierr);
23547340559SBarry Smith   }
23647340559SBarry Smith   (*t)[n] = PETSC_NULL;
23747340559SBarry Smith   PetscFunctionReturn(0);
23847340559SBarry Smith }
23947340559SBarry Smith 
24047340559SBarry Smith #undef __FUNCT__
24147340559SBarry Smith #define __FUNCT__ "PetscStrArrayDestroy"
24247340559SBarry Smith /*@C
24347340559SBarry Smith    PetscStrArrayDestroy - Frees array of strings created with PetscStrArrayallocpy().
24447340559SBarry Smith 
24547340559SBarry Smith    Not Collective
24647340559SBarry Smith 
24747340559SBarry Smith    Output Parameters:
24847340559SBarry Smith .   list - array of strings
24947340559SBarry Smith 
25047340559SBarry Smith    Level: intermediate
25147340559SBarry Smith 
25247340559SBarry Smith    Concepts: command line arguments
25347340559SBarry Smith 
25447340559SBarry Smith    Notes: Not for use in Fortran
25547340559SBarry Smith 
25647340559SBarry Smith .seealso: PetscStrArrayallocpy()
25747340559SBarry Smith 
25847340559SBarry Smith @*/
2596fed8037SJed Brown PetscErrorCode PetscStrArrayDestroy(char ***list)
26047340559SBarry Smith {
26147340559SBarry Smith   PetscInt       n = 0;
26247340559SBarry Smith   PetscErrorCode ierr;
26347340559SBarry Smith 
2646fed8037SJed Brown   PetscFunctionBegin;
2656fed8037SJed Brown   if (!*list) PetscFunctionReturn(0);
2666fed8037SJed Brown   while ((*list)[n]) {
2676fed8037SJed Brown     ierr = PetscFree((*list)[n]);CHKERRQ(ierr);
26847340559SBarry Smith     n++;
26947340559SBarry Smith   }
2706fed8037SJed Brown   ierr = PetscFree(*list);CHKERRQ(ierr);
2716fed8037SJed Brown   PetscFunctionReturn(0);
27247340559SBarry Smith }
27347340559SBarry Smith 
27447340559SBarry Smith #undef __FUNCT__
275e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcpy"
276e5c89e4eSSatish Balay /*@C
277e5c89e4eSSatish Balay    PetscStrcpy - Copies a string
278e5c89e4eSSatish Balay 
279e5c89e4eSSatish Balay    Not Collective
280e5c89e4eSSatish Balay 
281e5c89e4eSSatish Balay    Input Parameters:
282e5c89e4eSSatish Balay .  t - pointer to string
283e5c89e4eSSatish Balay 
284e5c89e4eSSatish Balay    Output Parameter:
285e5c89e4eSSatish Balay .  s - the copied string
286e5c89e4eSSatish Balay 
287e5c89e4eSSatish Balay    Level: intermediate
288e5c89e4eSSatish Balay 
2896f013253SBarry Smith    Notes:
290e5c89e4eSSatish Balay      Null string returns a string starting with zero
291e5c89e4eSSatish Balay 
2926f013253SBarry Smith      Not for use in Fortran
2936f013253SBarry Smith 
294e5c89e4eSSatish Balay   Concepts: string copy
295e5c89e4eSSatish Balay 
296e5c89e4eSSatish Balay .seealso: PetscStrncpy(), PetscStrcat(), PetscStrncat()
297e5c89e4eSSatish Balay 
298e5c89e4eSSatish Balay @*/
299acc6cc86SBarry Smith 
3007087cfbeSBarry Smith PetscErrorCode  PetscStrcpy(char s[],const char t[])
301e5c89e4eSSatish Balay {
302e5c89e4eSSatish Balay   PetscFunctionBegin;
30317186662SBarry Smith   if (t && !s) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy string into null pointer");
304e5c89e4eSSatish Balay   if (t) {strcpy(s,t);}
305e5c89e4eSSatish Balay   else if (s) {s[0] = 0;}
306e5c89e4eSSatish Balay   PetscFunctionReturn(0);
307e5c89e4eSSatish Balay }
308e5c89e4eSSatish Balay 
309e5c89e4eSSatish Balay #undef __FUNCT__
310e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncpy"
311e5c89e4eSSatish Balay /*@C
312e5c89e4eSSatish Balay    PetscStrncpy - Copies a string up to a certain length
313e5c89e4eSSatish Balay 
314e5c89e4eSSatish Balay    Not Collective
315e5c89e4eSSatish Balay 
316e5c89e4eSSatish Balay    Input Parameters:
317e5c89e4eSSatish Balay +  t - pointer to string
318e5c89e4eSSatish Balay -  n - the length to copy
319e5c89e4eSSatish Balay 
320e5c89e4eSSatish Balay    Output Parameter:
321e5c89e4eSSatish Balay .  s - the copied string
322e5c89e4eSSatish Balay 
323e5c89e4eSSatish Balay    Level: intermediate
324e5c89e4eSSatish Balay 
325e5c89e4eSSatish Balay    Note:
326e5c89e4eSSatish Balay      Null string returns a string starting with zero
327e5c89e4eSSatish Balay 
328e5c89e4eSSatish Balay   Concepts: string copy
329e5c89e4eSSatish Balay 
330e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrcat(), PetscStrncat()
331e5c89e4eSSatish Balay 
332e5c89e4eSSatish Balay @*/
3337087cfbeSBarry Smith PetscErrorCode  PetscStrncpy(char s[],const char t[],size_t n)
334e5c89e4eSSatish Balay {
335e5c89e4eSSatish Balay   PetscFunctionBegin;
33617186662SBarry Smith   if (t && !s) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy string into null pointer");
337e5c89e4eSSatish Balay   if (t) {strncpy(s,t,n);}
338e5c89e4eSSatish Balay   else if (s) {s[0] = 0;}
339e5c89e4eSSatish Balay   PetscFunctionReturn(0);
340e5c89e4eSSatish Balay }
341e5c89e4eSSatish Balay 
342e5c89e4eSSatish Balay #undef __FUNCT__
343e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcat"
344e5c89e4eSSatish Balay /*@C
345e5c89e4eSSatish Balay    PetscStrcat - Concatenates a string onto a given string
346e5c89e4eSSatish Balay 
347e5c89e4eSSatish Balay    Not Collective
348e5c89e4eSSatish Balay 
349e5c89e4eSSatish Balay    Input Parameters:
350e5e2177aSMatthew Knepley +  s - string to be added to
351e5e2177aSMatthew Knepley -  t - pointer to string to be added to end
352e5c89e4eSSatish Balay 
353e5c89e4eSSatish Balay    Level: intermediate
354e5c89e4eSSatish Balay 
3556f013253SBarry Smith    Notes: Not for use in Fortran
3566f013253SBarry Smith 
357e5c89e4eSSatish Balay   Concepts: string copy
358e5c89e4eSSatish Balay 
359e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrncpy(), PetscStrncat()
360e5c89e4eSSatish Balay 
361e5c89e4eSSatish Balay @*/
3627087cfbeSBarry Smith PetscErrorCode  PetscStrcat(char s[],const char t[])
363e5c89e4eSSatish Balay {
364e5c89e4eSSatish Balay   PetscFunctionBegin;
3659b754dc9SBarry Smith   if (!t) PetscFunctionReturn(0);
366e5c89e4eSSatish Balay   strcat(s,t);
367e5c89e4eSSatish Balay   PetscFunctionReturn(0);
368e5c89e4eSSatish Balay }
369e5c89e4eSSatish Balay 
370e5c89e4eSSatish Balay #undef __FUNCT__
371e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncat"
372e5c89e4eSSatish Balay /*@C
373e5c89e4eSSatish Balay    PetscStrncat - Concatenates a string onto a given string, up to a given length
374e5c89e4eSSatish Balay 
375e5c89e4eSSatish Balay    Not Collective
376e5c89e4eSSatish Balay 
377e5c89e4eSSatish Balay    Input Parameters:
378e5c89e4eSSatish Balay +  s - pointer to string to be added to end
379e5c89e4eSSatish Balay .  t - string to be added to
380e5c89e4eSSatish Balay .  n - maximum length to copy
381e5c89e4eSSatish Balay 
382e5c89e4eSSatish Balay    Level: intermediate
383e5c89e4eSSatish Balay 
3846f013253SBarry Smith   Notes:    Not for use in Fortran
3856f013253SBarry Smith 
386e5c89e4eSSatish Balay   Concepts: string copy
387e5c89e4eSSatish Balay 
388e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrncpy(), PetscStrcat()
389e5c89e4eSSatish Balay 
390e5c89e4eSSatish Balay @*/
3917087cfbeSBarry Smith PetscErrorCode  PetscStrncat(char s[],const char t[],size_t n)
392e5c89e4eSSatish Balay {
393e5c89e4eSSatish Balay   PetscFunctionBegin;
394e5c89e4eSSatish Balay   strncat(s,t,n);
395e5c89e4eSSatish Balay   PetscFunctionReturn(0);
396e5c89e4eSSatish Balay }
397e5c89e4eSSatish Balay 
398e5c89e4eSSatish Balay #undef __FUNCT__
399e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcmp"
400e5c89e4eSSatish Balay /*@C
401e5c89e4eSSatish Balay    PetscStrcmp - Compares two strings,
402e5c89e4eSSatish Balay 
403e5c89e4eSSatish Balay    Not Collective
404e5c89e4eSSatish Balay 
405e5c89e4eSSatish Balay    Input Parameters:
406e5c89e4eSSatish Balay +  a - pointer to string first string
407e5c89e4eSSatish Balay -  b - pointer to second string
408e5c89e4eSSatish Balay 
409e5c89e4eSSatish Balay    Output Parameter:
4108c74ee41SBarry Smith .  flg - PETSC_TRUE if the two strings are equal
411e5c89e4eSSatish Balay 
412e5c89e4eSSatish Balay    Level: intermediate
413e5c89e4eSSatish Balay 
4146f013253SBarry Smith    Notes:    Not for use in Fortran
4156f013253SBarry Smith 
416e5c89e4eSSatish Balay .seealso: PetscStrgrt(), PetscStrncmp(), PetscStrcasecmp()
417e5c89e4eSSatish Balay 
418e5c89e4eSSatish Balay @*/
4197087cfbeSBarry Smith PetscErrorCode  PetscStrcmp(const char a[],const char b[],PetscBool  *flg)
420e5c89e4eSSatish Balay {
421e5c89e4eSSatish Balay   int c;
422e5c89e4eSSatish Balay 
423e5c89e4eSSatish Balay   PetscFunctionBegin;
424e5c89e4eSSatish Balay   if (!a && !b) {
425e5c89e4eSSatish Balay     *flg = PETSC_TRUE;
426e5c89e4eSSatish Balay   } else if (!a || !b) {
427e5c89e4eSSatish Balay     *flg = PETSC_FALSE;
428e5c89e4eSSatish Balay   } else {
429e5c89e4eSSatish Balay     c = strcmp(a,b);
430e5c89e4eSSatish Balay     if (c) *flg = PETSC_FALSE;
431e5c89e4eSSatish Balay     else   *flg = PETSC_TRUE;
432e5c89e4eSSatish Balay   }
433e5c89e4eSSatish Balay   PetscFunctionReturn(0);
434e5c89e4eSSatish Balay }
435e5c89e4eSSatish Balay 
436e5c89e4eSSatish Balay #undef __FUNCT__
437e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrgrt"
438e5c89e4eSSatish Balay /*@C
439e5c89e4eSSatish Balay    PetscStrgrt - If first string is greater than the second
440e5c89e4eSSatish Balay 
441e5c89e4eSSatish Balay    Not Collective
442e5c89e4eSSatish Balay 
443e5c89e4eSSatish Balay    Input Parameters:
444e5c89e4eSSatish Balay +  a - pointer to first string
445e5c89e4eSSatish Balay -  b - pointer to second string
446e5c89e4eSSatish Balay 
447e5c89e4eSSatish Balay    Output Parameter:
448e5c89e4eSSatish Balay .  flg - if the first string is greater
449e5c89e4eSSatish Balay 
450e5c89e4eSSatish Balay    Notes:
451e5c89e4eSSatish Balay     Null arguments are ok, a null string is considered smaller than
452e5c89e4eSSatish Balay     all others
453e5c89e4eSSatish Balay 
4546f013253SBarry Smith    Not for use in Fortran
4556f013253SBarry Smith 
456e5c89e4eSSatish Balay    Level: intermediate
457e5c89e4eSSatish Balay 
458e5c89e4eSSatish Balay .seealso: PetscStrcmp(), PetscStrncmp(), PetscStrcasecmp()
459e5c89e4eSSatish Balay 
460e5c89e4eSSatish Balay @*/
4617087cfbeSBarry Smith PetscErrorCode  PetscStrgrt(const char a[],const char b[],PetscBool  *t)
462e5c89e4eSSatish Balay {
463e5c89e4eSSatish Balay   int c;
464e5c89e4eSSatish Balay 
465e5c89e4eSSatish Balay   PetscFunctionBegin;
466e5c89e4eSSatish Balay   if (!a && !b) {
467e5c89e4eSSatish Balay     *t = PETSC_FALSE;
468e5c89e4eSSatish Balay   } else if (a && !b) {
469e5c89e4eSSatish Balay     *t = PETSC_TRUE;
470e5c89e4eSSatish Balay   } else if (!a && b) {
471e5c89e4eSSatish Balay     *t = PETSC_FALSE;
472e5c89e4eSSatish Balay   } else {
473e5c89e4eSSatish Balay     c = strcmp(a,b);
474e5c89e4eSSatish Balay     if (c > 0) *t = PETSC_TRUE;
475e5c89e4eSSatish Balay     else       *t = PETSC_FALSE;
476e5c89e4eSSatish Balay   }
477e5c89e4eSSatish Balay   PetscFunctionReturn(0);
478e5c89e4eSSatish Balay }
479e5c89e4eSSatish Balay 
480e5c89e4eSSatish Balay #undef __FUNCT__
481e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcasecmp"
482e5c89e4eSSatish Balay /*@C
483e5c89e4eSSatish Balay    PetscStrcasecmp - Returns true if the two strings are the same
484e5c89e4eSSatish Balay      except possibly for case.
485e5c89e4eSSatish Balay 
486e5c89e4eSSatish Balay    Not Collective
487e5c89e4eSSatish Balay 
488e5c89e4eSSatish Balay    Input Parameters:
489e5c89e4eSSatish Balay +  a - pointer to first string
490e5c89e4eSSatish Balay -  b - pointer to second string
491e5c89e4eSSatish Balay 
492e5c89e4eSSatish Balay    Output Parameter:
493e5c89e4eSSatish Balay .  flg - if the two strings are the same
494e5c89e4eSSatish Balay 
495e5c89e4eSSatish Balay    Notes:
496e5c89e4eSSatish Balay     Null arguments are ok
497e5c89e4eSSatish Balay 
4986f013253SBarry Smith    Not for use in Fortran
4996f013253SBarry Smith 
500e5c89e4eSSatish Balay    Level: intermediate
501e5c89e4eSSatish Balay 
502e5c89e4eSSatish Balay .seealso: PetscStrcmp(), PetscStrncmp(), PetscStrgrt()
503e5c89e4eSSatish Balay 
504e5c89e4eSSatish Balay @*/
5057087cfbeSBarry Smith PetscErrorCode  PetscStrcasecmp(const char a[],const char b[],PetscBool  *t)
506e5c89e4eSSatish Balay {
507e5c89e4eSSatish Balay   int c;
508e5c89e4eSSatish Balay 
509e5c89e4eSSatish Balay   PetscFunctionBegin;
510e5c89e4eSSatish Balay   if (!a && !b) c = 0;
511e5c89e4eSSatish Balay   else if (!a || !b) c = 1;
51232b366c8SSatish Balay #if defined(PETSC_HAVE_STRCASECMP)
51332b366c8SSatish Balay   else c = strcasecmp(a,b);
51432b366c8SSatish Balay #elif defined(PETSC_HAVE_STRICMP)
515e5c89e4eSSatish Balay   else c = stricmp(a,b);
516e5c89e4eSSatish Balay #else
51732b366c8SSatish Balay   else {
51832b366c8SSatish Balay     char           *aa,*bb;
51932b366c8SSatish Balay     PetscErrorCode ierr;
52032b366c8SSatish Balay     ierr = PetscStrallocpy(a,&aa);CHKERRQ(ierr);
52132b366c8SSatish Balay     ierr = PetscStrallocpy(b,&bb);CHKERRQ(ierr);
52232b366c8SSatish Balay     ierr = PetscStrtolower(aa);CHKERRQ(ierr);
52332b366c8SSatish Balay     ierr = PetscStrtolower(bb);CHKERRQ(ierr);
52432b366c8SSatish Balay     ierr = PetscStrcmp(aa,bb,t);CHKERRQ(ierr);
525503cfb0cSBarry Smith     ierr = PetscFree(aa);CHKERRQ(ierr);
526503cfb0cSBarry Smith     ierr = PetscFree(bb);CHKERRQ(ierr);
52732b366c8SSatish Balay     PetscFunctionReturn(0);
52832b366c8SSatish Balay   }
529e5c89e4eSSatish Balay #endif
530e5c89e4eSSatish Balay   if (!c) *t = PETSC_TRUE;
531e5c89e4eSSatish Balay   else    *t = PETSC_FALSE;
532e5c89e4eSSatish Balay   PetscFunctionReturn(0);
533e5c89e4eSSatish Balay }
534e5c89e4eSSatish Balay 
53532b366c8SSatish Balay 
53632b366c8SSatish Balay 
537e5c89e4eSSatish Balay #undef __FUNCT__
538e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncmp"
539e5c89e4eSSatish Balay /*@C
540e5c89e4eSSatish Balay    PetscStrncmp - Compares two strings, up to a certain length
541e5c89e4eSSatish Balay 
542e5c89e4eSSatish Balay    Not Collective
543e5c89e4eSSatish Balay 
544e5c89e4eSSatish Balay    Input Parameters:
545e5c89e4eSSatish Balay +  a - pointer to first string
546e5c89e4eSSatish Balay .  b - pointer to second string
547e5c89e4eSSatish Balay -  n - length to compare up to
548e5c89e4eSSatish Balay 
549e5c89e4eSSatish Balay    Output Parameter:
550e5c89e4eSSatish Balay .  t - if the two strings are equal
551e5c89e4eSSatish Balay 
552e5c89e4eSSatish Balay    Level: intermediate
553e5c89e4eSSatish Balay 
5546f013253SBarry Smith    Notes:    Not for use in Fortran
5556f013253SBarry Smith 
556e5c89e4eSSatish Balay .seealso: PetscStrgrt(), PetscStrcmp(), PetscStrcasecmp()
557e5c89e4eSSatish Balay 
558e5c89e4eSSatish Balay @*/
5597087cfbeSBarry Smith PetscErrorCode  PetscStrncmp(const char a[],const char b[],size_t n,PetscBool  *t)
560e5c89e4eSSatish Balay {
561e5c89e4eSSatish Balay   int c;
562e5c89e4eSSatish Balay 
563e5c89e4eSSatish Balay   PetscFunctionBegin;
564e5c89e4eSSatish Balay   c = strncmp(a,b,n);
565e5c89e4eSSatish Balay   if (!c) *t = PETSC_TRUE;
566e5c89e4eSSatish Balay   else    *t = PETSC_FALSE;
567e5c89e4eSSatish Balay   PetscFunctionReturn(0);
568e5c89e4eSSatish Balay }
569e5c89e4eSSatish Balay 
570e5c89e4eSSatish Balay #undef __FUNCT__
571e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrchr"
572e5c89e4eSSatish Balay /*@C
573e5c89e4eSSatish Balay    PetscStrchr - Locates first occurance of a character in a string
574e5c89e4eSSatish Balay 
575e5c89e4eSSatish Balay    Not Collective
576e5c89e4eSSatish Balay 
577e5c89e4eSSatish Balay    Input Parameters:
578e5c89e4eSSatish Balay +  a - pointer to string
579e5c89e4eSSatish Balay -  b - character
580e5c89e4eSSatish Balay 
581e5c89e4eSSatish Balay    Output Parameter:
582e5c89e4eSSatish Balay .  c - location of occurance, PETSC_NULL if not found
583e5c89e4eSSatish Balay 
584e5c89e4eSSatish Balay    Level: intermediate
585e5c89e4eSSatish Balay 
5866f013253SBarry Smith    Notes:    Not for use in Fortran
5876f013253SBarry Smith 
588e5c89e4eSSatish Balay @*/
5897087cfbeSBarry Smith PetscErrorCode  PetscStrchr(const char a[],char b,char *c[])
590e5c89e4eSSatish Balay {
591e5c89e4eSSatish Balay   PetscFunctionBegin;
592e5c89e4eSSatish Balay   *c = (char *)strchr(a,b);
593e5c89e4eSSatish Balay   PetscFunctionReturn(0);
594e5c89e4eSSatish Balay }
595e5c89e4eSSatish Balay 
596e5c89e4eSSatish Balay #undef __FUNCT__
597e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrrchr"
598e5c89e4eSSatish Balay /*@C
599e5c89e4eSSatish Balay    PetscStrrchr - Locates one location past the last occurance of a character in a string,
600e5c89e4eSSatish Balay       if the character is not found then returns entire string
601e5c89e4eSSatish Balay 
602e5c89e4eSSatish Balay    Not Collective
603e5c89e4eSSatish Balay 
604e5c89e4eSSatish Balay    Input Parameters:
605e5c89e4eSSatish Balay +  a - pointer to string
606e5c89e4eSSatish Balay -  b - character
607e5c89e4eSSatish Balay 
608e5c89e4eSSatish Balay    Output Parameter:
609e5c89e4eSSatish Balay .  tmp - location of occurance, a if not found
610e5c89e4eSSatish Balay 
611e5c89e4eSSatish Balay    Level: intermediate
612e5c89e4eSSatish Balay 
6136f013253SBarry Smith    Notes:    Not for use in Fortran
6146f013253SBarry Smith 
615e5c89e4eSSatish Balay @*/
6167087cfbeSBarry Smith PetscErrorCode  PetscStrrchr(const char a[],char b,char *tmp[])
617e5c89e4eSSatish Balay {
618e5c89e4eSSatish Balay   PetscFunctionBegin;
619e5c89e4eSSatish Balay   *tmp = (char *)strrchr(a,b);
620e5c89e4eSSatish Balay   if (!*tmp) *tmp = (char*)a; else *tmp = *tmp + 1;
621e5c89e4eSSatish Balay   PetscFunctionReturn(0);
622e5c89e4eSSatish Balay }
623e5c89e4eSSatish Balay 
624e5c89e4eSSatish Balay #undef __FUNCT__
625e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrtolower"
626e5c89e4eSSatish Balay /*@C
627e5c89e4eSSatish Balay    PetscStrtolower - Converts string to lower case
628e5c89e4eSSatish Balay 
629e5c89e4eSSatish Balay    Not Collective
630e5c89e4eSSatish Balay 
631e5c89e4eSSatish Balay    Input Parameters:
632e5c89e4eSSatish Balay .  a - pointer to string
633e5c89e4eSSatish Balay 
634e5c89e4eSSatish Balay    Level: intermediate
635e5c89e4eSSatish Balay 
6366f013253SBarry Smith    Notes:    Not for use in Fortran
6376f013253SBarry Smith 
638e5c89e4eSSatish Balay @*/
6397087cfbeSBarry Smith PetscErrorCode  PetscStrtolower(char a[])
640e5c89e4eSSatish Balay {
641e5c89e4eSSatish Balay   PetscFunctionBegin;
642e5c89e4eSSatish Balay   while (*a) {
643e5c89e4eSSatish Balay     if (*a >= 'A' && *a <= 'Z') *a += 'a' - 'A';
644e5c89e4eSSatish Balay     a++;
645e5c89e4eSSatish Balay   }
646e5c89e4eSSatish Balay   PetscFunctionReturn(0);
647e5c89e4eSSatish Balay }
648e5c89e4eSSatish Balay 
6497ba3a57cSBarry Smith #undef __FUNCT__
6502f234a98SBarry Smith #define __FUNCT__ "PetscStrtoupper"
6512f234a98SBarry Smith /*@C
6522f234a98SBarry Smith    PetscStrtolower - Converts string to upper case
6532f234a98SBarry Smith 
6542f234a98SBarry Smith    Not Collective
6552f234a98SBarry Smith 
6562f234a98SBarry Smith    Input Parameters:
6572f234a98SBarry Smith .  a - pointer to string
6582f234a98SBarry Smith 
6592f234a98SBarry Smith    Level: intermediate
6602f234a98SBarry Smith 
6612f234a98SBarry Smith    Notes:    Not for use in Fortran
6622f234a98SBarry Smith 
6632f234a98SBarry Smith @*/
6642f234a98SBarry Smith PetscErrorCode  PetscStrtoupper(char a[])
6652f234a98SBarry Smith {
6662f234a98SBarry Smith   PetscFunctionBegin;
6672f234a98SBarry Smith   while (*a) {
6682f234a98SBarry Smith     if (*a >= 'a' && *a <= 'z') *a += 'A' - 'a';
6692f234a98SBarry Smith     a++;
6702f234a98SBarry Smith   }
6712f234a98SBarry Smith   PetscFunctionReturn(0);
6722f234a98SBarry Smith }
6732f234a98SBarry Smith 
6742f234a98SBarry Smith #undef __FUNCT__
6757ba3a57cSBarry Smith #define __FUNCT__ "PetscStrendswith"
6767ba3a57cSBarry Smith /*@C
6777ba3a57cSBarry Smith    PetscStrendswith - Determines if a string ends with a certain string
6781d1a0024SBarry Smith 
6797ba3a57cSBarry Smith    Not Collective
6807ba3a57cSBarry Smith 
6817ba3a57cSBarry Smith    Input Parameters:
6827ba3a57cSBarry Smith +  a - pointer to string
6837ba3a57cSBarry Smith -  b - string to endwith
6847ba3a57cSBarry Smith 
6857ba3a57cSBarry Smith    Output Parameter:
6867ba3a57cSBarry Smith .  flg - PETSC_TRUE or PETSC_FALSE
6877ba3a57cSBarry Smith 
6887ba3a57cSBarry Smith    Notes:     Not for use in Fortran
6897ba3a57cSBarry Smith 
6907ba3a57cSBarry Smith    Level: intermediate
6917ba3a57cSBarry Smith 
6927ba3a57cSBarry Smith @*/
6937ba3a57cSBarry Smith PetscErrorCode  PetscStrendswith(const char a[],const char b[],PetscBool *flg)
6947ba3a57cSBarry Smith {
6957ba3a57cSBarry Smith   char           *test;
6967ba3a57cSBarry Smith   PetscErrorCode ierr;
6977ba3a57cSBarry Smith   size_t         na,nb;
6987ba3a57cSBarry Smith 
6997ba3a57cSBarry Smith   PetscFunctionBegin;
7007ba3a57cSBarry Smith   *flg = PETSC_FALSE;
7017ba3a57cSBarry Smith   ierr = PetscStrrstr(a,b,&test);CHKERRQ(ierr);
7027ba3a57cSBarry Smith   if (test) {
7037ba3a57cSBarry Smith     ierr = PetscStrlen(a,&na);CHKERRQ(ierr);
7047ba3a57cSBarry Smith     ierr = PetscStrlen(b,&nb);CHKERRQ(ierr);
7057ba3a57cSBarry Smith     if (a+na-nb == test) *flg = PETSC_TRUE;
7067ba3a57cSBarry Smith   }
7077ba3a57cSBarry Smith   PetscFunctionReturn(0);
7087ba3a57cSBarry Smith }
7097ba3a57cSBarry Smith 
7107ba3a57cSBarry Smith #undef __FUNCT__
7112c9581d2SBarry Smith #define __FUNCT__ "PetscStrbeginswith"
7122c9581d2SBarry Smith /*@C
7132c9581d2SBarry Smith    PetscStrbeginswith - Determines if a string begins with a certain string
7142c9581d2SBarry Smith 
7152c9581d2SBarry Smith    Not Collective
7162c9581d2SBarry Smith 
7172c9581d2SBarry Smith    Input Parameters:
7182c9581d2SBarry Smith +  a - pointer to string
7192c9581d2SBarry Smith -  b - string to beginwith
7202c9581d2SBarry Smith 
7212c9581d2SBarry Smith    Output Parameter:
7222c9581d2SBarry Smith .  flg - PETSC_TRUE or PETSC_FALSE
7232c9581d2SBarry Smith 
7242c9581d2SBarry Smith    Notes:     Not for use in Fortran
7252c9581d2SBarry Smith 
7262c9581d2SBarry Smith    Level: intermediate
7272c9581d2SBarry Smith 
7282c9581d2SBarry Smith @*/
7292c9581d2SBarry Smith PetscErrorCode  PetscStrbeginswith(const char a[],const char b[],PetscBool *flg)
7302c9581d2SBarry Smith {
7312c9581d2SBarry Smith   char           *test;
7322c9581d2SBarry Smith   PetscErrorCode ierr;
7332c9581d2SBarry Smith 
7342c9581d2SBarry Smith   PetscFunctionBegin;
7352c9581d2SBarry Smith   *flg = PETSC_FALSE;
7362c9581d2SBarry Smith   ierr = PetscStrrstr(a,b,&test);CHKERRQ(ierr);
7372c9581d2SBarry Smith   if (test && (test == a)) {
7382c9581d2SBarry Smith     *flg = PETSC_TRUE;
7392c9581d2SBarry Smith   }
7402c9581d2SBarry Smith   PetscFunctionReturn(0);
7412c9581d2SBarry Smith }
7422c9581d2SBarry Smith 
7432c9581d2SBarry Smith 
7442c9581d2SBarry Smith #undef __FUNCT__
7457ba3a57cSBarry Smith #define __FUNCT__ "PetscStrendswithwhich"
7467ba3a57cSBarry Smith /*@C
7477ba3a57cSBarry Smith    PetscStrendswithwhich - Determines if a string ends with one of several possible strings
7487ba3a57cSBarry Smith 
7497ba3a57cSBarry Smith    Not Collective
7507ba3a57cSBarry Smith 
7517ba3a57cSBarry Smith    Input Parameters:
7527ba3a57cSBarry Smith +  a - pointer to string
7537ba3a57cSBarry Smith -  bs - strings to endwith (last entry must be null)
7547ba3a57cSBarry Smith 
7557ba3a57cSBarry Smith    Output Parameter:
7567ba3a57cSBarry Smith .  cnt - the index of the string it ends with or 1+the last possible index
7577ba3a57cSBarry Smith 
7587ba3a57cSBarry Smith    Notes:     Not for use in Fortran
7597ba3a57cSBarry Smith 
7607ba3a57cSBarry Smith    Level: intermediate
7617ba3a57cSBarry Smith 
7627ba3a57cSBarry Smith @*/
7637ba3a57cSBarry Smith PetscErrorCode  PetscStrendswithwhich(const char a[],const char *const *bs,PetscInt *cnt)
7647ba3a57cSBarry Smith {
7657ba3a57cSBarry Smith   PetscBool      flg;
7667ba3a57cSBarry Smith   PetscErrorCode ierr;
7677ba3a57cSBarry Smith 
7687ba3a57cSBarry Smith   PetscFunctionBegin;
7697ba3a57cSBarry Smith   *cnt = 0;
7707ba3a57cSBarry Smith   while (bs[*cnt]) {
7717ba3a57cSBarry Smith     ierr = PetscStrendswith(a,bs[*cnt],&flg);CHKERRQ(ierr);
7727ba3a57cSBarry Smith     if (flg) PetscFunctionReturn(0);
7737ba3a57cSBarry Smith     *cnt += 1;
7747ba3a57cSBarry Smith   }
7757ba3a57cSBarry Smith   PetscFunctionReturn(0);
7767ba3a57cSBarry Smith }
7777ba3a57cSBarry Smith 
7787ba3a57cSBarry Smith #undef __FUNCT__
7797ba3a57cSBarry Smith #define __FUNCT__ "PetscStrrstr"
7807ba3a57cSBarry Smith /*@C
7817ba3a57cSBarry Smith    PetscStrrstr - Locates last occurance of string in another string
7827ba3a57cSBarry Smith 
7837ba3a57cSBarry Smith    Not Collective
7847ba3a57cSBarry Smith 
7857ba3a57cSBarry Smith    Input Parameters:
7867ba3a57cSBarry Smith +  a - pointer to string
7877ba3a57cSBarry Smith -  b - string to find
7887ba3a57cSBarry Smith 
7897ba3a57cSBarry Smith    Output Parameter:
7907ba3a57cSBarry Smith .  tmp - location of occurance
7917ba3a57cSBarry Smith 
7927ba3a57cSBarry Smith    Notes:     Not for use in Fortran
7937ba3a57cSBarry Smith 
7947ba3a57cSBarry Smith    Level: intermediate
7957ba3a57cSBarry Smith 
7967ba3a57cSBarry Smith @*/
7977ba3a57cSBarry Smith PetscErrorCode  PetscStrrstr(const char a[],const char b[],char *tmp[])
7987ba3a57cSBarry Smith {
7997ba3a57cSBarry Smith   const char *stmp = a, *ltmp = 0;
8007ba3a57cSBarry Smith 
8017ba3a57cSBarry Smith   PetscFunctionBegin;
8027ba3a57cSBarry Smith   while (stmp) {
8037ba3a57cSBarry Smith     stmp = (char *)strstr(stmp,b);
8047ba3a57cSBarry Smith     if (stmp) {ltmp = stmp;stmp++;}
8057ba3a57cSBarry Smith   }
8067ba3a57cSBarry Smith   *tmp = (char *)ltmp;
8077ba3a57cSBarry Smith   PetscFunctionReturn(0);
8087ba3a57cSBarry Smith }
8097ba3a57cSBarry Smith 
8107ba3a57cSBarry Smith #undef __FUNCT__
8117ba3a57cSBarry Smith #define __FUNCT__ "PetscStrstr"
8127ba3a57cSBarry Smith /*@C
8137ba3a57cSBarry Smith    PetscStrstr - Locates first occurance of string in another string
8147ba3a57cSBarry Smith 
8157ba3a57cSBarry Smith    Not Collective
8167ba3a57cSBarry Smith 
8177ba3a57cSBarry Smith    Input Parameters:
818160f4796SJed Brown +  haystack - string to search
819160f4796SJed Brown -  needle - string to find
8207ba3a57cSBarry Smith 
8217ba3a57cSBarry Smith    Output Parameter:
8227ba3a57cSBarry Smith .  tmp - location of occurance, is a PETSC_NULL if the string is not found
8237ba3a57cSBarry Smith 
8247ba3a57cSBarry Smith    Notes: Not for use in Fortran
8257ba3a57cSBarry Smith 
8267ba3a57cSBarry Smith    Level: intermediate
8277ba3a57cSBarry Smith 
8287ba3a57cSBarry Smith @*/
829160f4796SJed Brown PetscErrorCode  PetscStrstr(const char haystack[],const char needle[],char *tmp[])
8307ba3a57cSBarry Smith {
8317ba3a57cSBarry Smith   PetscFunctionBegin;
832160f4796SJed Brown   *tmp = (char *)strstr(haystack,needle);
8337ba3a57cSBarry Smith   PetscFunctionReturn(0);
8347ba3a57cSBarry Smith }
8357ba3a57cSBarry Smith 
8367ba3a57cSBarry Smith struct _p_PetscToken {char token;char *array;char *current;};
8371d1a0024SBarry Smith 
838e5c89e4eSSatish Balay #undef __FUNCT__
839e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenFind"
840e5c89e4eSSatish Balay /*@C
841e5c89e4eSSatish Balay    PetscTokenFind - Locates next "token" in a string
842e5c89e4eSSatish Balay 
843e5c89e4eSSatish Balay    Not Collective
844e5c89e4eSSatish Balay 
845e5c89e4eSSatish Balay    Input Parameters:
846e5c89e4eSSatish Balay .  a - pointer to token
847e5c89e4eSSatish Balay 
848e5c89e4eSSatish Balay    Output Parameter:
849e5c89e4eSSatish Balay .  result - location of occurance, PETSC_NULL if not found
850e5c89e4eSSatish Balay 
851e5c89e4eSSatish Balay    Notes:
852e5c89e4eSSatish Balay 
853e5c89e4eSSatish Balay      This version is different from the system version in that
854e5c89e4eSSatish Balay   it allows you to pass a read-only string into the function.
855e5c89e4eSSatish Balay 
8564704e885SBarry Smith      This version also treats all characters etc. inside a double quote "
8574704e885SBarry Smith    as a single token.
8584704e885SBarry Smith 
8596f013253SBarry Smith     Not for use in Fortran
8606f013253SBarry Smith 
861e5c89e4eSSatish Balay    Level: intermediate
862e5c89e4eSSatish Balay 
8636f013253SBarry Smith 
864e5c89e4eSSatish Balay .seealso: PetscTokenCreate(), PetscTokenDestroy()
865e5c89e4eSSatish Balay @*/
8667087cfbeSBarry Smith PetscErrorCode  PetscTokenFind(PetscToken a,char *result[])
867e5c89e4eSSatish Balay {
8684704e885SBarry Smith   char *ptr = a->current,token;
869e5c89e4eSSatish Balay 
870e5c89e4eSSatish Balay   PetscFunctionBegin;
871e5c89e4eSSatish Balay   *result = a->current;
8724704e885SBarry Smith   if (ptr && !*ptr) {*result = 0;PetscFunctionReturn(0);}
8734704e885SBarry Smith   token = a->token;
87490fdf44cSMatthew Knepley   if (ptr && (*ptr == '"')) {token = '"';(*result)++;ptr++;}
875e5c89e4eSSatish Balay   while (ptr) {
8764704e885SBarry Smith     if (*ptr == token) {
877e5c89e4eSSatish Balay       *ptr++ = 0;
878e5c89e4eSSatish Balay       while (*ptr == a->token) ptr++;
879e5c89e4eSSatish Balay       a->current = ptr;
880e5c89e4eSSatish Balay       break;
881e5c89e4eSSatish Balay     }
882e5c89e4eSSatish Balay     if (!*ptr) {
883e5c89e4eSSatish Balay       a->current = 0;
884e5c89e4eSSatish Balay       break;
885e5c89e4eSSatish Balay     }
886e5c89e4eSSatish Balay     ptr++;
887e5c89e4eSSatish Balay   }
888e5c89e4eSSatish Balay   PetscFunctionReturn(0);
889e5c89e4eSSatish Balay }
890e5c89e4eSSatish Balay 
891e5c89e4eSSatish Balay #undef __FUNCT__
892e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenCreate"
893e5c89e4eSSatish Balay /*@C
894e5c89e4eSSatish Balay    PetscTokenCreate - Creates a PetscToken used to find tokens in a string
895e5c89e4eSSatish Balay 
896e5c89e4eSSatish Balay    Not Collective
897e5c89e4eSSatish Balay 
898e5c89e4eSSatish Balay    Input Parameters:
899e5c89e4eSSatish Balay +  string - the string to look in
900e5c89e4eSSatish Balay -  token - the character to look for
901e5c89e4eSSatish Balay 
902e5c89e4eSSatish Balay    Output Parameter:
903e5c89e4eSSatish Balay .  a - pointer to token
904e5c89e4eSSatish Balay 
905e5c89e4eSSatish Balay    Notes:
906e5c89e4eSSatish Balay 
907e5c89e4eSSatish Balay      This version is different from the system version in that
908e5c89e4eSSatish Balay   it allows you to pass a read-only string into the function.
909e5c89e4eSSatish Balay 
9106f013253SBarry Smith     Not for use in Fortran
9116f013253SBarry Smith 
912e5c89e4eSSatish Balay    Level: intermediate
913e5c89e4eSSatish Balay 
914e5c89e4eSSatish Balay .seealso: PetscTokenFind(), PetscTokenDestroy()
915e5c89e4eSSatish Balay @*/
9167087cfbeSBarry Smith PetscErrorCode  PetscTokenCreate(const char a[],const char b,PetscToken *t)
917e5c89e4eSSatish Balay {
918e5c89e4eSSatish Balay   PetscErrorCode ierr;
919e5c89e4eSSatish Balay 
920e5c89e4eSSatish Balay   PetscFunctionBegin;
9211d1a0024SBarry Smith   ierr = PetscNew(struct _p_PetscToken,t);CHKERRQ(ierr);
922e5c89e4eSSatish Balay   ierr = PetscStrallocpy(a,&(*t)->array);CHKERRQ(ierr);
923e5c89e4eSSatish Balay   (*t)->current = (*t)->array;
924e5c89e4eSSatish Balay   (*t)->token   = b;
925e5c89e4eSSatish Balay   PetscFunctionReturn(0);
926e5c89e4eSSatish Balay }
927e5c89e4eSSatish Balay 
928e5c89e4eSSatish Balay #undef __FUNCT__
929e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenDestroy"
930e5c89e4eSSatish Balay /*@C
931e5c89e4eSSatish Balay    PetscTokenDestroy - Destroys a PetscToken
932e5c89e4eSSatish Balay 
933e5c89e4eSSatish Balay    Not Collective
934e5c89e4eSSatish Balay 
935e5c89e4eSSatish Balay    Input Parameters:
936e5c89e4eSSatish Balay .  a - pointer to token
937e5c89e4eSSatish Balay 
938e5c89e4eSSatish Balay    Level: intermediate
939e5c89e4eSSatish Balay 
9406f013253SBarry Smith    Notes:     Not for use in Fortran
9416f013253SBarry Smith 
942e5c89e4eSSatish Balay .seealso: PetscTokenCreate(), PetscTokenFind()
943e5c89e4eSSatish Balay @*/
9448c74ee41SBarry Smith PetscErrorCode  PetscTokenDestroy(PetscToken *a)
945e5c89e4eSSatish Balay {
946e5c89e4eSSatish Balay   PetscErrorCode ierr;
947e5c89e4eSSatish Balay 
948e5c89e4eSSatish Balay   PetscFunctionBegin;
9498c74ee41SBarry Smith   if (!*a) PetscFunctionReturn(0);
9508c74ee41SBarry Smith   ierr = PetscFree((*a)->array);CHKERRQ(ierr);
9518c74ee41SBarry Smith   ierr = PetscFree(*a);CHKERRQ(ierr);
952e5c89e4eSSatish Balay   PetscFunctionReturn(0);
953e5c89e4eSSatish Balay }
954e5c89e4eSSatish Balay 
955e5c89e4eSSatish Balay 
956e5c89e4eSSatish Balay #undef __FUNCT__
957e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetPetscDir"
958e5c89e4eSSatish Balay /*@C
959e5c89e4eSSatish Balay    PetscGetPetscDir - Gets the directory PETSc is installed in
960e5c89e4eSSatish Balay 
961e5c89e4eSSatish Balay    Not Collective
962e5c89e4eSSatish Balay 
963e5c89e4eSSatish Balay    Output Parameter:
964e5c89e4eSSatish Balay .  dir - the directory
965e5c89e4eSSatish Balay 
966e5c89e4eSSatish Balay    Level: developer
967e5c89e4eSSatish Balay 
9686f013253SBarry Smith    Notes: Not for use in Fortran
9696f013253SBarry Smith 
970e5c89e4eSSatish Balay @*/
9717087cfbeSBarry Smith PetscErrorCode  PetscGetPetscDir(const char *dir[])
972e5c89e4eSSatish Balay {
973e5c89e4eSSatish Balay   PetscFunctionBegin;
974e5c89e4eSSatish Balay   *dir = PETSC_DIR;
975e5c89e4eSSatish Balay   PetscFunctionReturn(0);
976e5c89e4eSSatish Balay }
977e5c89e4eSSatish Balay 
978e5c89e4eSSatish Balay #undef __FUNCT__
979e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrreplace"
980e5c89e4eSSatish Balay /*@C
981e5c89e4eSSatish Balay    PetscStrreplace - Replaces substrings in string with other substrings
982e5c89e4eSSatish Balay 
983e5c89e4eSSatish Balay    Not Collective
984e5c89e4eSSatish Balay 
985e5c89e4eSSatish Balay    Input Parameters:
986e5c89e4eSSatish Balay +   comm - MPI_Comm of processors that are processing the string
98771573d7dSBarry Smith .   aa - the string to look in
988d8ccf1fbSBarry Smith .   b - the resulting copy of a with replaced strings (b can be the same as a)
989e5c89e4eSSatish Balay -   len - the length of b
990e5c89e4eSSatish Balay 
991e5c89e4eSSatish Balay    Notes:
992e5c89e4eSSatish Balay       Replaces   ${PETSC_ARCH},${PETSC_DIR},${PETSC_LIB_DIR},${DISPLAY},
993d5649816SBarry Smith       ${HOMEDIRECTORY},${WORKINGDIRECTORY},${USERNAME}, ${HOSTNAME} with appropriate values
994e5c89e4eSSatish Balay       as well as any environmental variables.
995e5c89e4eSSatish Balay 
9966f013253SBarry Smith       PETSC_LIB_DIR uses the environmental variable if it exists. PETSC_ARCH and PETSC_DIR use what
997acc6cc86SBarry Smith       PETSc was built with and do not use environmental variables.
998acc6cc86SBarry Smith 
9996f013253SBarry Smith       Not for use in Fortran
10006f013253SBarry Smith 
1001e5c89e4eSSatish Balay    Level: intermediate
1002e5c89e4eSSatish Balay 
1003e5c89e4eSSatish Balay @*/
10047087cfbeSBarry Smith PetscErrorCode  PetscStrreplace(MPI_Comm comm,const char aa[],char b[],size_t len)
1005e5c89e4eSSatish Balay {
1006e5c89e4eSSatish Balay   PetscErrorCode ierr;
1007e5c89e4eSSatish Balay   int            i = 0;
1008e5c89e4eSSatish Balay   size_t         l,l1,l2,l3;
100971573d7dSBarry Smith   char           *work,*par,*epar,env[1024],*tfree,*a = (char*)aa;
1010d5649816SBarry Smith   const char     *s[] = {"${PETSC_ARCH}","${PETSC_DIR}","${PETSC_LIB_DIR}","${DISPLAY}","${HOMEDIRECTORY}","${WORKINGDIRECTORY}","${USERNAME}","${HOSTNAME}",0};
1011d5649816SBarry Smith   const char     *r[] = {0,0,0,0,0,0,0,0,0};
1012ace3abfcSBarry Smith   PetscBool      flag;
1013e5c89e4eSSatish Balay 
1014e5c89e4eSSatish Balay   PetscFunctionBegin;
1015e32f2f54SBarry Smith   if (!a || !b) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"a and b strings must be nonnull");
101671573d7dSBarry Smith   if (aa == b) {
101722982a5fSBarry Smith     ierr    = PetscStrallocpy(aa,(char **)&a);CHKERRQ(ierr);
101871573d7dSBarry Smith   }
1019e5c89e4eSSatish Balay   ierr = PetscMalloc(len*sizeof(char*),&work);CHKERRQ(ierr);
1020e5c89e4eSSatish Balay 
1021e5c89e4eSSatish Balay   /* get values for replaced variables */
1022487e5849SBarry Smith   ierr = PetscStrallocpy(PETSC_ARCH,(char**)&r[0]);CHKERRQ(ierr);
1023487e5849SBarry Smith   ierr = PetscStrallocpy(PETSC_DIR,(char**)&r[1]);CHKERRQ(ierr);
1024487e5849SBarry Smith   ierr = PetscStrallocpy(PETSC_LIB_DIR,(char**)&r[2]);CHKERRQ(ierr);
1025487e5849SBarry Smith   ierr = PetscMalloc(256*sizeof(char),&r[3]);CHKERRQ(ierr);
1026487e5849SBarry Smith   ierr = PetscMalloc(PETSC_MAX_PATH_LEN*sizeof(char),&r[4]);CHKERRQ(ierr);
1027e5c89e4eSSatish Balay   ierr = PetscMalloc(PETSC_MAX_PATH_LEN*sizeof(char),&r[5]);CHKERRQ(ierr);
1028487e5849SBarry Smith   ierr = PetscMalloc(256*sizeof(char),&r[6]);CHKERRQ(ierr);
1029d5649816SBarry Smith   ierr = PetscMalloc(256*sizeof(char),&r[7]);CHKERRQ(ierr);
1030487e5849SBarry Smith   ierr = PetscGetDisplay((char*)r[3],256);CHKERRQ(ierr);
1031487e5849SBarry Smith   ierr = PetscGetHomeDirectory((char*)r[4],PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
1032487e5849SBarry Smith   ierr = PetscGetWorkingDirectory((char*)r[5],PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
1033487e5849SBarry Smith   ierr = PetscGetUserName((char*)r[6],256);CHKERRQ(ierr);
1034d5649816SBarry Smith   ierr = PetscGetHostName((char*)r[7],256);CHKERRQ(ierr);
1035487e5849SBarry Smith 
1036487e5849SBarry Smith   /* replace that are in environment */
1037487e5849SBarry Smith   ierr = PetscOptionsGetenv(comm,"PETSC_LIB_DIR",env,1024,&flag);CHKERRQ(ierr);
1038487e5849SBarry Smith   if (flag) {
1039487e5849SBarry Smith     ierr = PetscStrallocpy(env,(char**)&r[2]);CHKERRQ(ierr);
1040487e5849SBarry Smith   }
1041e5c89e4eSSatish Balay 
1042e5c89e4eSSatish Balay   /* replace the requested strings */
1043e5c89e4eSSatish Balay   ierr = PetscStrncpy(b,a,len);CHKERRQ(ierr);
1044e5c89e4eSSatish Balay   while (s[i]) {
1045e5c89e4eSSatish Balay     ierr = PetscStrlen(s[i],&l);CHKERRQ(ierr);
1046e5c89e4eSSatish Balay     ierr = PetscStrstr(b,s[i],&par);CHKERRQ(ierr);
1047e5c89e4eSSatish Balay     while (par) {
1048e5c89e4eSSatish Balay       *par  =  0;
1049e5c89e4eSSatish Balay       par  += l;
1050e5c89e4eSSatish Balay 
1051e5c89e4eSSatish Balay       ierr = PetscStrlen(b,&l1);CHKERRQ(ierr);
1052e5c89e4eSSatish Balay       ierr = PetscStrlen(r[i],&l2);CHKERRQ(ierr);
1053e5c89e4eSSatish Balay       ierr = PetscStrlen(par,&l3);CHKERRQ(ierr);
105417186662SBarry Smith       if (l1 + l2 + l3 >= len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"b len is not long enough to hold new values");
1055e5c89e4eSSatish Balay       ierr  = PetscStrcpy(work,b);CHKERRQ(ierr);
1056e5c89e4eSSatish Balay       ierr  = PetscStrcat(work,r[i]);CHKERRQ(ierr);
1057e5c89e4eSSatish Balay       ierr  = PetscStrcat(work,par);CHKERRQ(ierr);
1058e5c89e4eSSatish Balay       ierr  = PetscStrncpy(b,work,len);CHKERRQ(ierr);
1059e5c89e4eSSatish Balay       ierr  = PetscStrstr(b,s[i],&par);CHKERRQ(ierr);
1060e5c89e4eSSatish Balay     }
1061e5c89e4eSSatish Balay     i++;
1062e5c89e4eSSatish Balay   }
1063487e5849SBarry Smith   i = 0;
1064487e5849SBarry Smith   while (r[i]) {
1065e5c89e4eSSatish Balay     tfree = (char*)r[i];
1066e5c89e4eSSatish Balay     ierr = PetscFree(tfree);CHKERRQ(ierr);
1067487e5849SBarry Smith     i++;
1068e5c89e4eSSatish Balay   }
1069e5c89e4eSSatish Balay 
1070e5c89e4eSSatish Balay   /* look for any other ${xxx} strings to replace from environmental variables */
1071e5c89e4eSSatish Balay   ierr = PetscStrstr(b,"${",&par);CHKERRQ(ierr);
1072e5c89e4eSSatish Balay   while (par) {
1073e5c89e4eSSatish Balay     *par = 0;
1074e5c89e4eSSatish Balay     par += 2;
1075e5c89e4eSSatish Balay     ierr  = PetscStrcpy(work,b);CHKERRQ(ierr);
1076e5c89e4eSSatish Balay     ierr = PetscStrstr(par,"}",&epar);CHKERRQ(ierr);
1077e5c89e4eSSatish Balay     *epar = 0;
1078e5c89e4eSSatish Balay     epar += 1;
1079e5c89e4eSSatish Balay     ierr = PetscOptionsGetenv(comm,par,env,256,&flag);CHKERRQ(ierr);
10807ba3a57cSBarry Smith     if (!flag) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Substitution string ${%s} not found as environmental variable",par);
1081e5c89e4eSSatish Balay     ierr = PetscStrcat(work,env);CHKERRQ(ierr);
1082e5c89e4eSSatish Balay     ierr = PetscStrcat(work,epar);CHKERRQ(ierr);
1083e5c89e4eSSatish Balay     ierr = PetscStrcpy(b,work);CHKERRQ(ierr);
1084e5c89e4eSSatish Balay     ierr = PetscStrstr(b,"${",&par);CHKERRQ(ierr);
1085e5c89e4eSSatish Balay   }
1086e5c89e4eSSatish Balay   ierr = PetscFree(work);CHKERRQ(ierr);
108771573d7dSBarry Smith   if (aa == b) {
108871573d7dSBarry Smith     ierr = PetscFree(a);CHKERRQ(ierr);
108971573d7dSBarry Smith   }
1090e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1091e5c89e4eSSatish Balay }
1092e5c89e4eSSatish Balay 
1093e5c89e4eSSatish Balay 
1094