xref: /petsc/include/petscstring.h (revision bbcf679c7ce315810b13005931dd3a7fb75b5053)
1*bbcf679cSJacob Faibussowitsch #ifndef PETSC_STRING_H
2*bbcf679cSJacob Faibussowitsch #define PETSC_STRING_H
3*bbcf679cSJacob Faibussowitsch 
4*bbcf679cSJacob Faibussowitsch #include <petscsystypes.h>
5*bbcf679cSJacob Faibussowitsch #include <petscerror.h>
6*bbcf679cSJacob Faibussowitsch #include <petscmacros.h>
7*bbcf679cSJacob Faibussowitsch #include <petscsys.h>
8*bbcf679cSJacob Faibussowitsch 
9*bbcf679cSJacob Faibussowitsch /* SUBMANSEC = Sys */
10*bbcf679cSJacob Faibussowitsch 
11*bbcf679cSJacob Faibussowitsch #include <stddef.h> /* size_t */
12*bbcf679cSJacob Faibussowitsch #include <string.h> /* for memcpy, memset */
13*bbcf679cSJacob Faibussowitsch 
14*bbcf679cSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscMemcmp(const void *, const void *, size_t, PetscBool *);
15*bbcf679cSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscStrToArray(const char[], char, int *, char ***);
16*bbcf679cSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscStrToArrayDestroy(int, char **);
17*bbcf679cSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscStrcasecmp(const char[], const char[], PetscBool *);
18*bbcf679cSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscStrendswithwhich(const char[], const char *const *, PetscInt *);
19*bbcf679cSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscStrArrayallocpy(const char *const *, char ***);
20*bbcf679cSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscStrArrayDestroy(char ***);
21*bbcf679cSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscStrNArrayallocpy(PetscInt, const char *const *, char ***);
22*bbcf679cSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscStrNArrayDestroy(PetscInt, char ***);
23*bbcf679cSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscStrreplace(MPI_Comm, const char[], char[], size_t);
24*bbcf679cSJacob Faibussowitsch 
25*bbcf679cSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscTokenCreate(const char[], char, PetscToken *);
26*bbcf679cSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscTokenFind(PetscToken, char *[]);
27*bbcf679cSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscTokenDestroy(PetscToken *);
28*bbcf679cSJacob Faibussowitsch 
29*bbcf679cSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscStrInList(const char[], const char[], char, PetscBool *);
30*bbcf679cSJacob Faibussowitsch PETSC_EXTERN const char    *PetscBasename(const char[]);
31*bbcf679cSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscEListFind(PetscInt, const char *const *, const char *, PetscInt *, PetscBool *);
32*bbcf679cSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscEnumFind(const char *const *, const char *, PetscEnum *, PetscBool *);
33*bbcf679cSJacob Faibussowitsch 
34*bbcf679cSJacob Faibussowitsch #define PetscAssertPointer_Private(ptr, arg) PetscAssert((ptr), PETSC_COMM_SELF, PETSC_ERR_ARG_NULL, "Null Pointer: Parameter '" PetscStringize(ptr) "' # " PetscStringize(arg))
35*bbcf679cSJacob Faibussowitsch 
36*bbcf679cSJacob Faibussowitsch /*@C
37*bbcf679cSJacob Faibussowitsch   PetscStrtolower - Converts string to lower case
38*bbcf679cSJacob Faibussowitsch 
39*bbcf679cSJacob Faibussowitsch   Not Collective, Not for use in Fortran
40*bbcf679cSJacob Faibussowitsch 
41*bbcf679cSJacob Faibussowitsch   Input Parameters:
42*bbcf679cSJacob Faibussowitsch . a - pointer to string
43*bbcf679cSJacob Faibussowitsch 
44*bbcf679cSJacob Faibussowitsch   Level: intermediate
45*bbcf679cSJacob Faibussowitsch 
46*bbcf679cSJacob Faibussowitsch .seealso: `PetscStrtoupper()`
47*bbcf679cSJacob Faibussowitsch @*/
48*bbcf679cSJacob Faibussowitsch static inline PetscErrorCode PetscStrtolower(char a[])
49*bbcf679cSJacob Faibussowitsch {
50*bbcf679cSJacob Faibussowitsch   PetscFunctionBegin;
51*bbcf679cSJacob Faibussowitsch   PetscAssertPointer_Private(a, 1);
52*bbcf679cSJacob Faibussowitsch   while (*a) {
53*bbcf679cSJacob Faibussowitsch     if (*a >= 'A' && *a <= 'Z') *a += 'a' - 'A';
54*bbcf679cSJacob Faibussowitsch     a++;
55*bbcf679cSJacob Faibussowitsch   }
56*bbcf679cSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
57*bbcf679cSJacob Faibussowitsch }
58*bbcf679cSJacob Faibussowitsch 
59*bbcf679cSJacob Faibussowitsch /*@C
60*bbcf679cSJacob Faibussowitsch   PetscStrtoupper - Converts string to upper case
61*bbcf679cSJacob Faibussowitsch 
62*bbcf679cSJacob Faibussowitsch   Not Collective, Not for use in Fortran
63*bbcf679cSJacob Faibussowitsch 
64*bbcf679cSJacob Faibussowitsch   Input Parameters:
65*bbcf679cSJacob Faibussowitsch . a - pointer to string
66*bbcf679cSJacob Faibussowitsch 
67*bbcf679cSJacob Faibussowitsch   Level: intermediate
68*bbcf679cSJacob Faibussowitsch 
69*bbcf679cSJacob Faibussowitsch .seealso: `PetscStrtolower()`
70*bbcf679cSJacob Faibussowitsch @*/
71*bbcf679cSJacob Faibussowitsch static inline PetscErrorCode PetscStrtoupper(char a[])
72*bbcf679cSJacob Faibussowitsch {
73*bbcf679cSJacob Faibussowitsch   PetscFunctionBegin;
74*bbcf679cSJacob Faibussowitsch   PetscAssertPointer_Private(a, 1);
75*bbcf679cSJacob Faibussowitsch   while (*a) {
76*bbcf679cSJacob Faibussowitsch     if (*a >= 'a' && *a <= 'z') *a += 'A' - 'a';
77*bbcf679cSJacob Faibussowitsch     a++;
78*bbcf679cSJacob Faibussowitsch   }
79*bbcf679cSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
80*bbcf679cSJacob Faibussowitsch }
81*bbcf679cSJacob Faibussowitsch 
82*bbcf679cSJacob Faibussowitsch /*@C
83*bbcf679cSJacob Faibussowitsch   PetscStrlen - Gets length of a string
84*bbcf679cSJacob Faibussowitsch 
85*bbcf679cSJacob Faibussowitsch   Not Collective, Not for use in Fortran
86*bbcf679cSJacob Faibussowitsch 
87*bbcf679cSJacob Faibussowitsch   Input Parameters:
88*bbcf679cSJacob Faibussowitsch . s - pointer to string
89*bbcf679cSJacob Faibussowitsch 
90*bbcf679cSJacob Faibussowitsch   Output Parameter:
91*bbcf679cSJacob Faibussowitsch . len - length in bytes
92*bbcf679cSJacob Faibussowitsch 
93*bbcf679cSJacob Faibussowitsch   Level: intermediate
94*bbcf679cSJacob Faibussowitsch 
95*bbcf679cSJacob Faibussowitsch   Notes:
96*bbcf679cSJacob Faibussowitsch   This routine is analogous to `strlen()`. `NULL` string returns a length of zero.
97*bbcf679cSJacob Faibussowitsch 
98*bbcf679cSJacob Faibussowitsch .seealso: `PetscStrallocpy()`
99*bbcf679cSJacob Faibussowitsch @*/
100*bbcf679cSJacob Faibussowitsch static inline PetscErrorCode PetscStrlen(const char s[], size_t *len)
101*bbcf679cSJacob Faibussowitsch {
102*bbcf679cSJacob Faibussowitsch   PetscFunctionBegin;
103*bbcf679cSJacob Faibussowitsch   PetscAssertPointer_Private(len, 2);
104*bbcf679cSJacob Faibussowitsch   if (s) {
105*bbcf679cSJacob Faibussowitsch #if PetscHasBuiltin(__builtin_strlen)
106*bbcf679cSJacob Faibussowitsch     *len = __builtin_strlen(s);
107*bbcf679cSJacob Faibussowitsch #else
108*bbcf679cSJacob Faibussowitsch     *len = strlen(s);
109*bbcf679cSJacob Faibussowitsch #endif
110*bbcf679cSJacob Faibussowitsch   } else {
111*bbcf679cSJacob Faibussowitsch     *len = 0;
112*bbcf679cSJacob Faibussowitsch   }
113*bbcf679cSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
114*bbcf679cSJacob Faibussowitsch }
115*bbcf679cSJacob Faibussowitsch 
116*bbcf679cSJacob Faibussowitsch /*@C
117*bbcf679cSJacob Faibussowitsch   PetscStrcpy - Copies a string
118*bbcf679cSJacob Faibussowitsch 
119*bbcf679cSJacob Faibussowitsch   Not Collective, Not for use in Fortran
120*bbcf679cSJacob Faibussowitsch 
121*bbcf679cSJacob Faibussowitsch   Input Parameters:
122*bbcf679cSJacob Faibussowitsch . t - pointer to string
123*bbcf679cSJacob Faibussowitsch 
124*bbcf679cSJacob Faibussowitsch   Output Parameter:
125*bbcf679cSJacob Faibussowitsch . s - the copied string
126*bbcf679cSJacob Faibussowitsch 
127*bbcf679cSJacob Faibussowitsch   Level: intermediate
128*bbcf679cSJacob Faibussowitsch 
129*bbcf679cSJacob Faibussowitsch   Notes:
130*bbcf679cSJacob Faibussowitsch   `NULL` strings returns a string starting with zero. It is recommended you use
131*bbcf679cSJacob Faibussowitsch   `PetscStrncpy()` (equivelently `PetscArraycpy()` or `PetscMemcpy()`) instead of this routine.
132*bbcf679cSJacob Faibussowitsch 
133*bbcf679cSJacob Faibussowitsch .seealso: `PetscStrncpy()`, `PetscStrcat()`, `PetscStrlcat()`, `PetscStrallocpy()`,
134*bbcf679cSJacob Faibussowitsch `PetscArrycpy()`, `PetscMemcpy()`
135*bbcf679cSJacob Faibussowitsch @*/
136*bbcf679cSJacob Faibussowitsch static inline PetscErrorCode PetscStrcpy(char s[], const char t[])
137*bbcf679cSJacob Faibussowitsch {
138*bbcf679cSJacob Faibussowitsch   PetscFunctionBegin;
139*bbcf679cSJacob Faibussowitsch   if (t) {
140*bbcf679cSJacob Faibussowitsch     PetscAssertPointer_Private(s, 1);
141*bbcf679cSJacob Faibussowitsch     PetscAssertPointer_Private(t, 2);
142*bbcf679cSJacob Faibussowitsch #if PetscHasBuiltin(__builtin_strcpy)
143*bbcf679cSJacob Faibussowitsch     __builtin_strcpy(s, t);
144*bbcf679cSJacob Faibussowitsch #else
145*bbcf679cSJacob Faibussowitsch     strcpy(s, t);
146*bbcf679cSJacob Faibussowitsch #endif
147*bbcf679cSJacob Faibussowitsch   } else if (s) {
148*bbcf679cSJacob Faibussowitsch     s[0] = '\0';
149*bbcf679cSJacob Faibussowitsch   }
150*bbcf679cSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
151*bbcf679cSJacob Faibussowitsch }
152*bbcf679cSJacob Faibussowitsch 
153*bbcf679cSJacob Faibussowitsch /*@C
154*bbcf679cSJacob Faibussowitsch   PetscStrallocpy - Allocates space to hold a copy of a string then copies the string in the new space
155*bbcf679cSJacob Faibussowitsch 
156*bbcf679cSJacob Faibussowitsch   Not Collective, Not for use in Fortran
157*bbcf679cSJacob Faibussowitsch 
158*bbcf679cSJacob Faibussowitsch   Input Parameters:
159*bbcf679cSJacob Faibussowitsch . s - pointer to string
160*bbcf679cSJacob Faibussowitsch 
161*bbcf679cSJacob Faibussowitsch   Output Parameter:
162*bbcf679cSJacob Faibussowitsch . t - the copied string
163*bbcf679cSJacob Faibussowitsch 
164*bbcf679cSJacob Faibussowitsch   Level: intermediate
165*bbcf679cSJacob Faibussowitsch 
166*bbcf679cSJacob Faibussowitsch   Notes:
167*bbcf679cSJacob Faibussowitsch   `NULL` string returns a new `NULL` string.
168*bbcf679cSJacob Faibussowitsch 
169*bbcf679cSJacob Faibussowitsch   If `t` has previously been allocated then that memory is lost, you may need to `PetscFree()`
170*bbcf679cSJacob Faibussowitsch   the array before calling this routine.
171*bbcf679cSJacob Faibussowitsch 
172*bbcf679cSJacob Faibussowitsch .seealso: `PetscStrArrayallocpy()`, `PetscStrcpy()`, `PetscStrNArrayallocpy()`
173*bbcf679cSJacob Faibussowitsch @*/
174*bbcf679cSJacob Faibussowitsch static inline PetscErrorCode PetscStrallocpy(const char s[], char *t[])
175*bbcf679cSJacob Faibussowitsch {
176*bbcf679cSJacob Faibussowitsch   PetscFunctionBegin;
177*bbcf679cSJacob Faibussowitsch   PetscAssertPointer_Private(t, 2);
178*bbcf679cSJacob Faibussowitsch   *t = PETSC_NULLPTR;
179*bbcf679cSJacob Faibussowitsch   if (s) {
180*bbcf679cSJacob Faibussowitsch     size_t len;
181*bbcf679cSJacob Faibussowitsch     char  *tmp;
182*bbcf679cSJacob Faibussowitsch 
183*bbcf679cSJacob Faibussowitsch     PetscAssertPointer_Private(s, 1);
184*bbcf679cSJacob Faibussowitsch     PetscCall(PetscStrlen(s, &len));
185*bbcf679cSJacob Faibussowitsch     PetscCall(PetscMalloc1(len + 1, &tmp));
186*bbcf679cSJacob Faibussowitsch #if PetscHasBuiltin(__builtin_memcpy)
187*bbcf679cSJacob Faibussowitsch     __builtin_memcpy(tmp, s, len);
188*bbcf679cSJacob Faibussowitsch #else
189*bbcf679cSJacob Faibussowitsch     memcpy(tmp, s, len);
190*bbcf679cSJacob Faibussowitsch #endif
191*bbcf679cSJacob Faibussowitsch     tmp[len] = '\0';
192*bbcf679cSJacob Faibussowitsch     *t       = tmp;
193*bbcf679cSJacob Faibussowitsch   }
194*bbcf679cSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
195*bbcf679cSJacob Faibussowitsch }
196*bbcf679cSJacob Faibussowitsch 
197*bbcf679cSJacob Faibussowitsch static inline void PetscStrcmpNoError(const char a[], const char b[], PetscBool *flg)
198*bbcf679cSJacob Faibussowitsch {
199*bbcf679cSJacob Faibussowitsch   if (!a && !b) {
200*bbcf679cSJacob Faibussowitsch     *flg = PETSC_TRUE;
201*bbcf679cSJacob Faibussowitsch   } else if (!a || !b) {
202*bbcf679cSJacob Faibussowitsch     *flg = PETSC_FALSE;
203*bbcf679cSJacob Faibussowitsch   } else {
204*bbcf679cSJacob Faibussowitsch #if PetscHasBuiltin(__builtin_strcmp)
205*bbcf679cSJacob Faibussowitsch     *flg = __builtin_strcmp(a, b) ? PETSC_FALSE : PETSC_TRUE;
206*bbcf679cSJacob Faibussowitsch #else
207*bbcf679cSJacob Faibussowitsch     *flg = strcmp(a, b) ? PETSC_FALSE : PETSC_TRUE;
208*bbcf679cSJacob Faibussowitsch #endif
209*bbcf679cSJacob Faibussowitsch   }
210*bbcf679cSJacob Faibussowitsch }
211*bbcf679cSJacob Faibussowitsch 
212*bbcf679cSJacob Faibussowitsch /*@C
213*bbcf679cSJacob Faibussowitsch   PetscStrcmp - Compares two strings,
214*bbcf679cSJacob Faibussowitsch 
215*bbcf679cSJacob Faibussowitsch   Not Collective, Not for use in Fortran
216*bbcf679cSJacob Faibussowitsch 
217*bbcf679cSJacob Faibussowitsch   Input Parameters:
218*bbcf679cSJacob Faibussowitsch + a - pointer to string first string
219*bbcf679cSJacob Faibussowitsch - b - pointer to second string
220*bbcf679cSJacob Faibussowitsch 
221*bbcf679cSJacob Faibussowitsch   Output Parameter:
222*bbcf679cSJacob Faibussowitsch . flg - `PETSC_TRUE` if the two strings are equal
223*bbcf679cSJacob Faibussowitsch 
224*bbcf679cSJacob Faibussowitsch   Level: intermediate
225*bbcf679cSJacob Faibussowitsch 
226*bbcf679cSJacob Faibussowitsch .seealso: `PetscStrgrt()`, `PetscStrncmp()`, `PetscStrcasecmp()`
227*bbcf679cSJacob Faibussowitsch @*/
228*bbcf679cSJacob Faibussowitsch static inline PetscErrorCode PetscStrcmp(const char a[], const char b[], PetscBool *flg)
229*bbcf679cSJacob Faibussowitsch {
230*bbcf679cSJacob Faibussowitsch   PetscFunctionBegin;
231*bbcf679cSJacob Faibussowitsch   PetscAssertPointer_Private(flg, 3);
232*bbcf679cSJacob Faibussowitsch   PetscStrcmpNoError(a, b, flg);
233*bbcf679cSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
234*bbcf679cSJacob Faibussowitsch }
235*bbcf679cSJacob Faibussowitsch 
236*bbcf679cSJacob Faibussowitsch /*@C
237*bbcf679cSJacob Faibussowitsch   PetscStrncpy - Copies a string up to a certain length
238*bbcf679cSJacob Faibussowitsch 
239*bbcf679cSJacob Faibussowitsch   Not Collective
240*bbcf679cSJacob Faibussowitsch 
241*bbcf679cSJacob Faibussowitsch   Input Parameters:
242*bbcf679cSJacob Faibussowitsch + t - pointer to string
243*bbcf679cSJacob Faibussowitsch - n - the length to copy
244*bbcf679cSJacob Faibussowitsch 
245*bbcf679cSJacob Faibussowitsch   Output Parameter:
246*bbcf679cSJacob Faibussowitsch . s - the copied string
247*bbcf679cSJacob Faibussowitsch 
248*bbcf679cSJacob Faibussowitsch   Level: intermediate
249*bbcf679cSJacob Faibussowitsch 
250*bbcf679cSJacob Faibussowitsch   Notes:
251*bbcf679cSJacob Faibussowitsch   `NULL` string returns a string starting with zero.
252*bbcf679cSJacob Faibussowitsch 
253*bbcf679cSJacob Faibussowitsch   If the string that is being copied is of length `n` or larger, then the entire string is not
254*bbcf679cSJacob Faibussowitsch   copied and the final location of `s` is set to `NULL`. This is different then the behavior of
255*bbcf679cSJacob Faibussowitsch   `strncpy()` which leaves `s` non-terminated if there is not room for the entire string.
256*bbcf679cSJacob Faibussowitsch 
257*bbcf679cSJacob Faibussowitsch   Developers Notes:
258*bbcf679cSJacob Faibussowitsch   Should this be `PetscStrlcpy()` to reflect its behavior which is like `strlcpy()` not
259*bbcf679cSJacob Faibussowitsch   `strncpy()`?
260*bbcf679cSJacob Faibussowitsch 
261*bbcf679cSJacob Faibussowitsch .seealso: `PetscStrcpy()`, `PetscStrcat()`, `PetscStrlcat()`, `PetscStrallocpy()`
262*bbcf679cSJacob Faibussowitsch @*/
263*bbcf679cSJacob Faibussowitsch static inline PetscErrorCode PetscStrncpy(char s[], const char t[], size_t n)
264*bbcf679cSJacob Faibussowitsch {
265*bbcf679cSJacob Faibussowitsch   PetscFunctionBegin;
266*bbcf679cSJacob Faibussowitsch   if (s) PetscAssert(n, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL, "Requires an output string of length at least 1 to hold the termination character");
267*bbcf679cSJacob Faibussowitsch   if (t) {
268*bbcf679cSJacob Faibussowitsch     PetscAssertPointer_Private(s, 1);
269*bbcf679cSJacob Faibussowitsch     if (n > 1) {
270*bbcf679cSJacob Faibussowitsch #if PetscHasBuiltin(__builtin_strncpy)
271*bbcf679cSJacob Faibussowitsch       (__builtin_strncpy(s, t, n - 1));
272*bbcf679cSJacob Faibussowitsch #else
273*bbcf679cSJacob Faibussowitsch       (strncpy(s, t, n - 1));
274*bbcf679cSJacob Faibussowitsch #endif
275*bbcf679cSJacob Faibussowitsch       s[n - 1] = '\0';
276*bbcf679cSJacob Faibussowitsch     } else {
277*bbcf679cSJacob Faibussowitsch       s[0] = '\0';
278*bbcf679cSJacob Faibussowitsch     }
279*bbcf679cSJacob Faibussowitsch   } else if (s) {
280*bbcf679cSJacob Faibussowitsch     s[0] = '\0';
281*bbcf679cSJacob Faibussowitsch   }
282*bbcf679cSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
283*bbcf679cSJacob Faibussowitsch }
284*bbcf679cSJacob Faibussowitsch 
285*bbcf679cSJacob Faibussowitsch /*@C
286*bbcf679cSJacob Faibussowitsch   PetscStrcat - Concatenates a string onto a given string
287*bbcf679cSJacob Faibussowitsch 
288*bbcf679cSJacob Faibussowitsch   Not Collective, Not for use in Fortran
289*bbcf679cSJacob Faibussowitsch 
290*bbcf679cSJacob Faibussowitsch   Input Parameters:
291*bbcf679cSJacob Faibussowitsch + s - string to be added to
292*bbcf679cSJacob Faibussowitsch - t - pointer to string to be added to end
293*bbcf679cSJacob Faibussowitsch 
294*bbcf679cSJacob Faibussowitsch   Level: intermediate
295*bbcf679cSJacob Faibussowitsch 
296*bbcf679cSJacob Faibussowitsch   Notes:
297*bbcf679cSJacob Faibussowitsch   It is recommended you use `PetscStrlcat()` instead of this routine.
298*bbcf679cSJacob Faibussowitsch 
299*bbcf679cSJacob Faibussowitsch .seealso: `PetscStrcpy()`, `PetscStrncpy()`, `PetscStrlcat()`
300*bbcf679cSJacob Faibussowitsch @*/
301*bbcf679cSJacob Faibussowitsch static inline PetscErrorCode PetscStrcat(char s[], const char t[])
302*bbcf679cSJacob Faibussowitsch {
303*bbcf679cSJacob Faibussowitsch   PetscFunctionBegin;
304*bbcf679cSJacob Faibussowitsch   if (!t) PetscFunctionReturn(PETSC_SUCCESS);
305*bbcf679cSJacob Faibussowitsch   PetscAssertPointer_Private(s, 1);
306*bbcf679cSJacob Faibussowitsch #if PetscHasBuiltin(__builtin_strcat)
307*bbcf679cSJacob Faibussowitsch   __builtin_strcat(s, t);
308*bbcf679cSJacob Faibussowitsch #else
309*bbcf679cSJacob Faibussowitsch   strcat(s, t);
310*bbcf679cSJacob Faibussowitsch #endif
311*bbcf679cSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
312*bbcf679cSJacob Faibussowitsch }
313*bbcf679cSJacob Faibussowitsch 
314*bbcf679cSJacob Faibussowitsch /*@C
315*bbcf679cSJacob Faibussowitsch   PetscStrlcat - Concatenates a string onto a given string, up to a given length
316*bbcf679cSJacob Faibussowitsch 
317*bbcf679cSJacob Faibussowitsch   Not Collective, Not for use in Fortran
318*bbcf679cSJacob Faibussowitsch 
319*bbcf679cSJacob Faibussowitsch   Input Parameters:
320*bbcf679cSJacob Faibussowitsch + s - pointer to string to be added to at end
321*bbcf679cSJacob Faibussowitsch . t - string to be added
322*bbcf679cSJacob Faibussowitsch - n - length of the original allocated string
323*bbcf679cSJacob Faibussowitsch 
324*bbcf679cSJacob Faibussowitsch   Level: intermediate
325*bbcf679cSJacob Faibussowitsch 
326*bbcf679cSJacob Faibussowitsch   Notes:
327*bbcf679cSJacob Faibussowitsch   Unlike the system call `strncat()`, the length passed in is the length of the
328*bbcf679cSJacob Faibussowitsch   original allocated space, not the length of the left-over space. This is
329*bbcf679cSJacob Faibussowitsch   similar to the BSD system call `strlcat()`.
330*bbcf679cSJacob Faibussowitsch 
331*bbcf679cSJacob Faibussowitsch .seealso: `PetscStrcpy()`, `PetscStrncpy()`, `PetscStrcat()`
332*bbcf679cSJacob Faibussowitsch @*/
333*bbcf679cSJacob Faibussowitsch static inline PetscErrorCode PetscStrlcat(char s[], const char t[], size_t n)
334*bbcf679cSJacob Faibussowitsch {
335*bbcf679cSJacob Faibussowitsch   size_t len;
336*bbcf679cSJacob Faibussowitsch 
337*bbcf679cSJacob Faibussowitsch   PetscFunctionBegin;
338*bbcf679cSJacob Faibussowitsch   if (!t) PetscFunctionReturn(PETSC_SUCCESS);
339*bbcf679cSJacob Faibussowitsch   PetscAssert(n, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "String buffer length must be positive");
340*bbcf679cSJacob Faibussowitsch   PetscCall(PetscStrlen(t, &len));
341*bbcf679cSJacob Faibussowitsch #if PetscHasBuiltin(__builtin_strncat)
342*bbcf679cSJacob Faibussowitsch   __builtin_strncat(s, t, n - len);
343*bbcf679cSJacob Faibussowitsch #else
344*bbcf679cSJacob Faibussowitsch   strncat(s, t, n - len);
345*bbcf679cSJacob Faibussowitsch #endif
346*bbcf679cSJacob Faibussowitsch   s[n - 1] = '\0';
347*bbcf679cSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
348*bbcf679cSJacob Faibussowitsch }
349*bbcf679cSJacob Faibussowitsch 
350*bbcf679cSJacob Faibussowitsch /*@C
351*bbcf679cSJacob Faibussowitsch   PetscStrncmp - Compares two strings, up to a certain length
352*bbcf679cSJacob Faibussowitsch 
353*bbcf679cSJacob Faibussowitsch   Not Collective, Not for use in Fortran
354*bbcf679cSJacob Faibussowitsch 
355*bbcf679cSJacob Faibussowitsch   Input Parameters:
356*bbcf679cSJacob Faibussowitsch + a - pointer to first string
357*bbcf679cSJacob Faibussowitsch . b - pointer to second string
358*bbcf679cSJacob Faibussowitsch - n - length to compare up to
359*bbcf679cSJacob Faibussowitsch 
360*bbcf679cSJacob Faibussowitsch   Output Parameter:
361*bbcf679cSJacob Faibussowitsch . t - `PETSC_TRUE` if the two strings are equal, `PETSC_FALSE` otherwise
362*bbcf679cSJacob Faibussowitsch 
363*bbcf679cSJacob Faibussowitsch   Level: intermediate
364*bbcf679cSJacob Faibussowitsch 
365*bbcf679cSJacob Faibussowitsch   Notes:
366*bbcf679cSJacob Faibussowitsch   If `n` is `0`, `t` is set to `PETSC_FALSE`. `a` and/or `b` may be `NULL` in this case.
367*bbcf679cSJacob Faibussowitsch 
368*bbcf679cSJacob Faibussowitsch .seealso: `PetscStrgrt()`, `PetscStrcmp()`, `PetscStrcasecmp()`
369*bbcf679cSJacob Faibussowitsch @*/
370*bbcf679cSJacob Faibussowitsch static inline PetscErrorCode PetscStrncmp(const char a[], const char b[], size_t n, PetscBool *t)
371*bbcf679cSJacob Faibussowitsch {
372*bbcf679cSJacob Faibussowitsch   PetscFunctionBegin;
373*bbcf679cSJacob Faibussowitsch   PetscAssertPointer_Private(t, 4);
374*bbcf679cSJacob Faibussowitsch   *t = PETSC_FALSE;
375*bbcf679cSJacob Faibussowitsch   if (n) {
376*bbcf679cSJacob Faibussowitsch     PetscAssertPointer_Private(a, 1);
377*bbcf679cSJacob Faibussowitsch     PetscAssertPointer_Private(b, 2);
378*bbcf679cSJacob Faibussowitsch   }
379*bbcf679cSJacob Faibussowitsch #if PetscHasBuiltin(__builtin_strncmp)
380*bbcf679cSJacob Faibussowitsch   *t = __builtin_strncmp(a, b, n) ? PETSC_FALSE : PETSC_TRUE;
381*bbcf679cSJacob Faibussowitsch #else
382*bbcf679cSJacob Faibussowitsch   *t = strncmp(a, b, n) ? PETSC_FALSE : PETSC_TRUE;
383*bbcf679cSJacob Faibussowitsch #endif
384*bbcf679cSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
385*bbcf679cSJacob Faibussowitsch }
386*bbcf679cSJacob Faibussowitsch 
387*bbcf679cSJacob Faibussowitsch /*@C
388*bbcf679cSJacob Faibussowitsch   PetscStrrstr - Locates last occurrence of string in another string
389*bbcf679cSJacob Faibussowitsch 
390*bbcf679cSJacob Faibussowitsch   Not Collective, Not for use in Fortran
391*bbcf679cSJacob Faibussowitsch 
392*bbcf679cSJacob Faibussowitsch   Input Parameters:
393*bbcf679cSJacob Faibussowitsch + a - pointer to string
394*bbcf679cSJacob Faibussowitsch - b - string to find
395*bbcf679cSJacob Faibussowitsch 
396*bbcf679cSJacob Faibussowitsch   Output Parameter:
397*bbcf679cSJacob Faibussowitsch . tmp - location of occurrence
398*bbcf679cSJacob Faibussowitsch 
399*bbcf679cSJacob Faibussowitsch   Level: intermediate
400*bbcf679cSJacob Faibussowitsch 
401*bbcf679cSJacob Faibussowitsch .seealso: `PetscStrbeginswithwhich()`, `PetscStrendswith()`, `PetscStrtoupper`,
402*bbcf679cSJacob Faibussowitsch `PetscStrtolower()`, `PetscStrrchr()`, `PetscStrchr()`, `PetscStrncmp()`, `PetscStrlen()`,
403*bbcf679cSJacob Faibussowitsch `PetscStrcmp()`
404*bbcf679cSJacob Faibussowitsch @*/
405*bbcf679cSJacob Faibussowitsch static inline PetscErrorCode PetscStrrstr(const char a[], const char b[], char *tmp[])
406*bbcf679cSJacob Faibussowitsch {
407*bbcf679cSJacob Faibussowitsch   const char *ltmp = PETSC_NULLPTR;
408*bbcf679cSJacob Faibussowitsch 
409*bbcf679cSJacob Faibussowitsch   PetscFunctionBegin;
410*bbcf679cSJacob Faibussowitsch   PetscAssertPointer_Private(a, 1);
411*bbcf679cSJacob Faibussowitsch   PetscAssertPointer_Private(b, 2);
412*bbcf679cSJacob Faibussowitsch   PetscAssertPointer_Private(tmp, 3);
413*bbcf679cSJacob Faibussowitsch   while (a) {
414*bbcf679cSJacob Faibussowitsch #if PetscHasBuiltin(__builtin_strstr)
415*bbcf679cSJacob Faibussowitsch     a = (char *)__builtin_strstr(a, b);
416*bbcf679cSJacob Faibussowitsch #else
417*bbcf679cSJacob Faibussowitsch     a = (char *)strstr(a, b);
418*bbcf679cSJacob Faibussowitsch #endif
419*bbcf679cSJacob Faibussowitsch     if (a) ltmp = a++;
420*bbcf679cSJacob Faibussowitsch   }
421*bbcf679cSJacob Faibussowitsch   *tmp = (char *)ltmp;
422*bbcf679cSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
423*bbcf679cSJacob Faibussowitsch }
424*bbcf679cSJacob Faibussowitsch 
425*bbcf679cSJacob Faibussowitsch /*@C
426*bbcf679cSJacob Faibussowitsch   PetscStrstr - Locates first occurrence of string in another string
427*bbcf679cSJacob Faibussowitsch 
428*bbcf679cSJacob Faibussowitsch   Not Collective, Not for use in Fortran
429*bbcf679cSJacob Faibussowitsch 
430*bbcf679cSJacob Faibussowitsch   Input Parameters:
431*bbcf679cSJacob Faibussowitsch + haystack - string to search
432*bbcf679cSJacob Faibussowitsch - needle   - string to find
433*bbcf679cSJacob Faibussowitsch 
434*bbcf679cSJacob Faibussowitsch   Output Parameter:
435*bbcf679cSJacob Faibussowitsch . tmp - location of `needle` within `haystack`, `NULL` if `needle` is not found
436*bbcf679cSJacob Faibussowitsch 
437*bbcf679cSJacob Faibussowitsch   Level: intermediate
438*bbcf679cSJacob Faibussowitsch 
439*bbcf679cSJacob Faibussowitsch .seealso: `PetscStrbeginswithwhich()`, `PetscStrendswith()`, `PetscStrtoupper`,
440*bbcf679cSJacob Faibussowitsch `PetscStrtolower()`, `PetscStrrchr()`, `PetscStrchr()`, `PetscStrncmp()`, `PetscStrlen()`,
441*bbcf679cSJacob Faibussowitsch `PetscStrcmp()`
442*bbcf679cSJacob Faibussowitsch @*/
443*bbcf679cSJacob Faibussowitsch static inline PetscErrorCode PetscStrstr(const char haystack[], const char needle[], char *tmp[])
444*bbcf679cSJacob Faibussowitsch {
445*bbcf679cSJacob Faibussowitsch   PetscFunctionBegin;
446*bbcf679cSJacob Faibussowitsch   PetscAssertPointer_Private(haystack, 1);
447*bbcf679cSJacob Faibussowitsch   PetscAssertPointer_Private(needle, 2);
448*bbcf679cSJacob Faibussowitsch   PetscAssertPointer_Private(tmp, 3);
449*bbcf679cSJacob Faibussowitsch #if PetscHasBuiltin(__builtin_strstr)
450*bbcf679cSJacob Faibussowitsch   *tmp = (char *)__builtin_strstr(haystack, needle);
451*bbcf679cSJacob Faibussowitsch #else
452*bbcf679cSJacob Faibussowitsch   *tmp = (char *)strstr(haystack, needle);
453*bbcf679cSJacob Faibussowitsch #endif
454*bbcf679cSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
455*bbcf679cSJacob Faibussowitsch }
456*bbcf679cSJacob Faibussowitsch 
457*bbcf679cSJacob Faibussowitsch /*@C
458*bbcf679cSJacob Faibussowitsch   PetscStrgrt - If first string is greater than the second
459*bbcf679cSJacob Faibussowitsch 
460*bbcf679cSJacob Faibussowitsch   Not Collective, Not for use in Fortran
461*bbcf679cSJacob Faibussowitsch 
462*bbcf679cSJacob Faibussowitsch   Input Parameters:
463*bbcf679cSJacob Faibussowitsch + a - pointer to first string
464*bbcf679cSJacob Faibussowitsch - b - pointer to second string
465*bbcf679cSJacob Faibussowitsch 
466*bbcf679cSJacob Faibussowitsch   Output Parameter:
467*bbcf679cSJacob Faibussowitsch . flg - `PETSC_TRUE` if `a` is strictly greater than `b`, `PETSC_FALSE` otherwise
468*bbcf679cSJacob Faibussowitsch 
469*bbcf679cSJacob Faibussowitsch   Level: intermediate
470*bbcf679cSJacob Faibussowitsch 
471*bbcf679cSJacob Faibussowitsch   Notes:
472*bbcf679cSJacob Faibussowitsch   `NULL` arguments are OK, a `NULL` string is considered smaller than all others. If both `a`
473*bbcf679cSJacob Faibussowitsch   and `b` are `NULL` then `t` is set to `PETSC_FALSE`.
474*bbcf679cSJacob Faibussowitsch 
475*bbcf679cSJacob Faibussowitsch .seealso: `PetscStrcmp()`, `PetscStrncmp()`, `PetscStrcasecmp()`
476*bbcf679cSJacob Faibussowitsch @*/
477*bbcf679cSJacob Faibussowitsch static inline PetscErrorCode PetscStrgrt(const char a[], const char b[], PetscBool *t)
478*bbcf679cSJacob Faibussowitsch {
479*bbcf679cSJacob Faibussowitsch   PetscFunctionBegin;
480*bbcf679cSJacob Faibussowitsch   PetscAssertPointer_Private(t, 3);
481*bbcf679cSJacob Faibussowitsch   if (!a && !b) {
482*bbcf679cSJacob Faibussowitsch     *t = PETSC_FALSE;
483*bbcf679cSJacob Faibussowitsch   } else if (a && !b) {
484*bbcf679cSJacob Faibussowitsch     *t = PETSC_TRUE;
485*bbcf679cSJacob Faibussowitsch   } else if (!a && b) {
486*bbcf679cSJacob Faibussowitsch     *t = PETSC_FALSE;
487*bbcf679cSJacob Faibussowitsch   } else {
488*bbcf679cSJacob Faibussowitsch #if PetscHasBuiltin(__builtin_strcmp)
489*bbcf679cSJacob Faibussowitsch     *t = __builtin_strcmp(a, b) > 0 ? PETSC_TRUE : PETSC_FALSE;
490*bbcf679cSJacob Faibussowitsch #else
491*bbcf679cSJacob Faibussowitsch     *t = strcmp(a, b) > 0 ? PETSC_TRUE : PETSC_FALSE;
492*bbcf679cSJacob Faibussowitsch #endif
493*bbcf679cSJacob Faibussowitsch   }
494*bbcf679cSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
495*bbcf679cSJacob Faibussowitsch }
496*bbcf679cSJacob Faibussowitsch 
497*bbcf679cSJacob Faibussowitsch /*@C
498*bbcf679cSJacob Faibussowitsch   PetscStrchr - Locates first occurrence of a character in a string
499*bbcf679cSJacob Faibussowitsch 
500*bbcf679cSJacob Faibussowitsch   Not Collective, Not for use in Fortran
501*bbcf679cSJacob Faibussowitsch 
502*bbcf679cSJacob Faibussowitsch   Input Parameters:
503*bbcf679cSJacob Faibussowitsch + a - pointer to string
504*bbcf679cSJacob Faibussowitsch - b - character
505*bbcf679cSJacob Faibussowitsch 
506*bbcf679cSJacob Faibussowitsch   Output Parameter:
507*bbcf679cSJacob Faibussowitsch . c - location of occurrence, `NULL` if not found
508*bbcf679cSJacob Faibussowitsch 
509*bbcf679cSJacob Faibussowitsch   Level: intermediate
510*bbcf679cSJacob Faibussowitsch 
511*bbcf679cSJacob Faibussowitsch .seealso: `PetscStrrchr()`, `PetscTokenCreate()`, `PetscStrendswith()`, `PetscStrbeginsswith()`
512*bbcf679cSJacob Faibussowitsch @*/
513*bbcf679cSJacob Faibussowitsch static inline PetscErrorCode PetscStrchr(const char a[], char b, char *c[])
514*bbcf679cSJacob Faibussowitsch {
515*bbcf679cSJacob Faibussowitsch   PetscFunctionBegin;
516*bbcf679cSJacob Faibussowitsch   PetscAssertPointer_Private(a, 1);
517*bbcf679cSJacob Faibussowitsch   PetscAssertPointer_Private(c, 3);
518*bbcf679cSJacob Faibussowitsch #if PetscHasBuiltin(__builtin_strchr)
519*bbcf679cSJacob Faibussowitsch   *c = (char *)__builtin_strchr(a, b);
520*bbcf679cSJacob Faibussowitsch #else
521*bbcf679cSJacob Faibussowitsch   *c = (char *)strchr(a, b);
522*bbcf679cSJacob Faibussowitsch #endif
523*bbcf679cSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
524*bbcf679cSJacob Faibussowitsch }
525*bbcf679cSJacob Faibussowitsch 
526*bbcf679cSJacob Faibussowitsch /*@C
527*bbcf679cSJacob Faibussowitsch   PetscStrrchr - Locates one location past the last occurrence of a character in a string, if
528*bbcf679cSJacob Faibussowitsch   the character is not found then returns entire string
529*bbcf679cSJacob Faibussowitsch 
530*bbcf679cSJacob Faibussowitsch   Not Collective, Not for use in Fortran
531*bbcf679cSJacob Faibussowitsch 
532*bbcf679cSJacob Faibussowitsch   Input Parameters:
533*bbcf679cSJacob Faibussowitsch + a - pointer to string
534*bbcf679cSJacob Faibussowitsch - b - character
535*bbcf679cSJacob Faibussowitsch 
536*bbcf679cSJacob Faibussowitsch   Output Parameter:
537*bbcf679cSJacob Faibussowitsch . tmp - one past location of `b` in `a`, or `a` if `b` was not found
538*bbcf679cSJacob Faibussowitsch 
539*bbcf679cSJacob Faibussowitsch   Level: intermediate
540*bbcf679cSJacob Faibussowitsch 
541*bbcf679cSJacob Faibussowitsch .seealso: `PetscStrchr()`, `PetscTokenCreate()`, `PetscStrendswith()`, `PetscStrbeginsswith()`
542*bbcf679cSJacob Faibussowitsch @*/
543*bbcf679cSJacob Faibussowitsch static inline PetscErrorCode PetscStrrchr(const char a[], char b, char *tmp[])
544*bbcf679cSJacob Faibussowitsch {
545*bbcf679cSJacob Faibussowitsch   PetscFunctionBegin;
546*bbcf679cSJacob Faibussowitsch   PetscAssertPointer_Private(a, 1);
547*bbcf679cSJacob Faibussowitsch   PetscAssertPointer_Private(tmp, 3);
548*bbcf679cSJacob Faibussowitsch #if PetscHasBuiltin(__builtin_strrchr)
549*bbcf679cSJacob Faibussowitsch   *tmp = (char *)__builtin_strrchr(a, b);
550*bbcf679cSJacob Faibussowitsch #else
551*bbcf679cSJacob Faibussowitsch   *tmp = (char *)strrchr(a, b);
552*bbcf679cSJacob Faibussowitsch #endif
553*bbcf679cSJacob Faibussowitsch   if (!*tmp) {
554*bbcf679cSJacob Faibussowitsch     *tmp = (char *)a;
555*bbcf679cSJacob Faibussowitsch   } else {
556*bbcf679cSJacob Faibussowitsch     *tmp = *tmp + 1;
557*bbcf679cSJacob Faibussowitsch   }
558*bbcf679cSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
559*bbcf679cSJacob Faibussowitsch }
560*bbcf679cSJacob Faibussowitsch 
561*bbcf679cSJacob Faibussowitsch /*@C
562*bbcf679cSJacob Faibussowitsch   PetscStrendswith - Determines if a string ends with a certain string
563*bbcf679cSJacob Faibussowitsch 
564*bbcf679cSJacob Faibussowitsch   Not Collective, Not for use in Fortran
565*bbcf679cSJacob Faibussowitsch 
566*bbcf679cSJacob Faibussowitsch   Input Parameters:
567*bbcf679cSJacob Faibussowitsch + a - string to search
568*bbcf679cSJacob Faibussowitsch - b - string to end with
569*bbcf679cSJacob Faibussowitsch 
570*bbcf679cSJacob Faibussowitsch   Output Parameter:
571*bbcf679cSJacob Faibussowitsch . flg - `PETSC_TRUE` if `a` ends with `b`, `PETSC_FALSE` otherwise
572*bbcf679cSJacob Faibussowitsch 
573*bbcf679cSJacob Faibussowitsch   Level: intermediate
574*bbcf679cSJacob Faibussowitsch 
575*bbcf679cSJacob Faibussowitsch   Notes:
576*bbcf679cSJacob Faibussowitsch   Both `a` and `b` may be `NULL` (in which case `flg` is set to `PETSC_FALSE`) bot not either.
577*bbcf679cSJacob Faibussowitsch 
578*bbcf679cSJacob Faibussowitsch .seealso: `PetscStrendswithwhich()`, `PetscStrbeginswith()`, `PetscStrtoupper`,
579*bbcf679cSJacob Faibussowitsch `PetscStrtolower()`, `PetscStrrchr()`, `PetscStrchr()`, `PetscStrncmp()`, `PetscStrlen()`,
580*bbcf679cSJacob Faibussowitsch `PetscStrcmp()`
581*bbcf679cSJacob Faibussowitsch @*/
582*bbcf679cSJacob Faibussowitsch static inline PetscErrorCode PetscStrendswith(const char a[], const char b[], PetscBool *flg)
583*bbcf679cSJacob Faibussowitsch {
584*bbcf679cSJacob Faibussowitsch   size_t na = 0, nb = 0;
585*bbcf679cSJacob Faibussowitsch 
586*bbcf679cSJacob Faibussowitsch   PetscFunctionBegin;
587*bbcf679cSJacob Faibussowitsch   PetscAssertPointer_Private(flg, 3);
588*bbcf679cSJacob Faibussowitsch   // do this here to silence stupid "may be used uninitialized"" warnings
589*bbcf679cSJacob Faibussowitsch   *flg = PETSC_FALSE;
590*bbcf679cSJacob Faibussowitsch   PetscCall(PetscStrlen(a, &na));
591*bbcf679cSJacob Faibussowitsch   PetscCall(PetscStrlen(b, &nb));
592*bbcf679cSJacob Faibussowitsch   if (na >= nb) {
593*bbcf679cSJacob Faibussowitsch #if PetscHasBuiltin(__builtin_memcmp)
594*bbcf679cSJacob Faibussowitsch     *flg = __builtin_memcmp(b, a + (na - nb), nb) == 0 ? PETSC_TRUE : PETSC_FALSE;
595*bbcf679cSJacob Faibussowitsch #else
596*bbcf679cSJacob Faibussowitsch     *flg = memcmp(b, a + (na - nb), nb) == 0 ? PETSC_TRUE : PETSC_FALSE;
597*bbcf679cSJacob Faibussowitsch #endif
598*bbcf679cSJacob Faibussowitsch   }
599*bbcf679cSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
600*bbcf679cSJacob Faibussowitsch }
601*bbcf679cSJacob Faibussowitsch 
602*bbcf679cSJacob Faibussowitsch /*@C
603*bbcf679cSJacob Faibussowitsch   PetscStrbeginswith - Determines if a string begins with a certain string
604*bbcf679cSJacob Faibussowitsch 
605*bbcf679cSJacob Faibussowitsch   Not Collective, Not for use in Fortran
606*bbcf679cSJacob Faibussowitsch 
607*bbcf679cSJacob Faibussowitsch   Input Parameters:
608*bbcf679cSJacob Faibussowitsch + a - string to search
609*bbcf679cSJacob Faibussowitsch - b - string to begin with
610*bbcf679cSJacob Faibussowitsch 
611*bbcf679cSJacob Faibussowitsch   Output Parameter:
612*bbcf679cSJacob Faibussowitsch . flg - `PETSC_TRUE` if `a` begins with `b`, `PETSC_FALSE` otherwise
613*bbcf679cSJacob Faibussowitsch 
614*bbcf679cSJacob Faibussowitsch   Level: intermediate
615*bbcf679cSJacob Faibussowitsch 
616*bbcf679cSJacob Faibussowitsch   Notes:
617*bbcf679cSJacob Faibussowitsch   Both `a` and `b` may be `NULL` (in which case `flg` is set to `PETSC_FALSE`) but not
618*bbcf679cSJacob Faibussowitsch   either. Both `a` and `b` may point to the same string.
619*bbcf679cSJacob Faibussowitsch 
620*bbcf679cSJacob Faibussowitsch .seealso: `PetscStrendswithwhich()`, `PetscStrendswith()`, `PetscStrtoupper`,
621*bbcf679cSJacob Faibussowitsch `PetscStrtolower()`, `PetscStrrchr()`, `PetscStrchr()`, `PetscStrncmp()`, `PetscStrlen()`,
622*bbcf679cSJacob Faibussowitsch `PetscStrcmp()`
623*bbcf679cSJacob Faibussowitsch @*/
624*bbcf679cSJacob Faibussowitsch static inline PetscErrorCode PetscStrbeginswith(const char a[], const char b[], PetscBool *flg)
625*bbcf679cSJacob Faibussowitsch {
626*bbcf679cSJacob Faibussowitsch   size_t len = 0;
627*bbcf679cSJacob Faibussowitsch 
628*bbcf679cSJacob Faibussowitsch   PetscFunctionBegin;
629*bbcf679cSJacob Faibussowitsch   PetscAssertPointer_Private(flg, 3);
630*bbcf679cSJacob Faibussowitsch   // do this here to silence stupid "may be used uninitialized"" warnings
631*bbcf679cSJacob Faibussowitsch   *flg = PETSC_FALSE;
632*bbcf679cSJacob Faibussowitsch   PetscCall(PetscStrlen(b, &len));
633*bbcf679cSJacob Faibussowitsch   PetscCall(PetscStrncmp(a, b, len, flg));
634*bbcf679cSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
635*bbcf679cSJacob Faibussowitsch }
636*bbcf679cSJacob Faibussowitsch 
637*bbcf679cSJacob Faibussowitsch #undef PetscAssertPointer_Private
638*bbcf679cSJacob Faibussowitsch 
639*bbcf679cSJacob Faibussowitsch /*@C
640*bbcf679cSJacob Faibussowitsch    PetscMemmove - Copies n bytes, beginning at location b, to the space
641*bbcf679cSJacob Faibussowitsch    beginning at location a. Copying  between regions that overlap will
642*bbcf679cSJacob Faibussowitsch    take place correctly. Use `PetscMemcpy()` if the locations do not overlap
643*bbcf679cSJacob Faibussowitsch 
644*bbcf679cSJacob Faibussowitsch    Not Collective
645*bbcf679cSJacob Faibussowitsch 
646*bbcf679cSJacob Faibussowitsch    Input Parameters:
647*bbcf679cSJacob Faibussowitsch +  b - pointer to initial memory space
648*bbcf679cSJacob Faibussowitsch .  a - pointer to copy space
649*bbcf679cSJacob Faibussowitsch -  n - length (in bytes) of space to copy
650*bbcf679cSJacob Faibussowitsch 
651*bbcf679cSJacob Faibussowitsch    Level: intermediate
652*bbcf679cSJacob Faibussowitsch 
653*bbcf679cSJacob Faibussowitsch    Notes:
654*bbcf679cSJacob Faibussowitsch    `PetscArraymove()` is preferred
655*bbcf679cSJacob Faibussowitsch 
656*bbcf679cSJacob Faibussowitsch    This routine is analogous to `memmove()`.
657*bbcf679cSJacob Faibussowitsch 
658*bbcf679cSJacob Faibussowitsch    Developers Notes:
659*bbcf679cSJacob Faibussowitsch    This is inlined for performance
660*bbcf679cSJacob Faibussowitsch 
661*bbcf679cSJacob Faibussowitsch .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscMemzero()`, `PetscArraycmp()`, `PetscArraycpy()`, `PetscStrallocpy()`,
662*bbcf679cSJacob Faibussowitsch           `PetscArraymove()`
663*bbcf679cSJacob Faibussowitsch @*/
664*bbcf679cSJacob Faibussowitsch static inline PetscErrorCode PetscMemmove(void *a, const void *b, size_t n)
665*bbcf679cSJacob Faibussowitsch {
666*bbcf679cSJacob Faibussowitsch   PetscFunctionBegin;
667*bbcf679cSJacob Faibussowitsch   if (PetscUnlikely((n == 0) || (a == b))) PetscFunctionReturn(PETSC_SUCCESS);
668*bbcf679cSJacob Faibussowitsch   PetscAssert(a, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL, "Trying to copy %zu bytes to null pointer (Argument #1)", n);
669*bbcf679cSJacob Faibussowitsch   PetscAssert(b, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL, "Trying to copy %zu bytes from a null pointer (Argument #2)", n);
670*bbcf679cSJacob Faibussowitsch #if PetscDefined(HAVE_MEMMOVE)
671*bbcf679cSJacob Faibussowitsch   memmove((char *)a, (const char *)b, n);
672*bbcf679cSJacob Faibussowitsch #else
673*bbcf679cSJacob Faibussowitsch   if (a < b) {
674*bbcf679cSJacob Faibussowitsch     if (a <= b - n) {
675*bbcf679cSJacob Faibussowitsch       memcpy(a, b, n);
676*bbcf679cSJacob Faibussowitsch     } else {
677*bbcf679cSJacob Faibussowitsch       const size_t ptr_diff = (size_t)(b - a);
678*bbcf679cSJacob Faibussowitsch 
679*bbcf679cSJacob Faibussowitsch       memcpy(a, b, ptr_diff);
680*bbcf679cSJacob Faibussowitsch       PetscCall(PetscMemmove((void *)b, b + ptr_diff, n - ptr_diff));
681*bbcf679cSJacob Faibussowitsch     }
682*bbcf679cSJacob Faibussowitsch   } else {
683*bbcf679cSJacob Faibussowitsch     if (b <= a - n) {
684*bbcf679cSJacob Faibussowitsch       memcpy(a, b, n);
685*bbcf679cSJacob Faibussowitsch     } else {
686*bbcf679cSJacob Faibussowitsch       const size_t ptr_diff = (size_t)(a - b);
687*bbcf679cSJacob Faibussowitsch 
688*bbcf679cSJacob Faibussowitsch       memcpy((void *)(b + n), b + (n - ptr_diff), ptr_diff);
689*bbcf679cSJacob Faibussowitsch       PetscCall(PetscMemmove(a, b, n - ptr_diff));
690*bbcf679cSJacob Faibussowitsch     }
691*bbcf679cSJacob Faibussowitsch   }
692*bbcf679cSJacob Faibussowitsch #endif
693*bbcf679cSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
694*bbcf679cSJacob Faibussowitsch }
695*bbcf679cSJacob Faibussowitsch 
696*bbcf679cSJacob Faibussowitsch /*@C
697*bbcf679cSJacob Faibussowitsch    PetscMemcpy - Copies n bytes, beginning at location b, to the space
698*bbcf679cSJacob Faibussowitsch    beginning at location a. The two memory regions CANNOT overlap, use
699*bbcf679cSJacob Faibussowitsch    `PetscMemmove()` in that case.
700*bbcf679cSJacob Faibussowitsch 
701*bbcf679cSJacob Faibussowitsch    Not Collective
702*bbcf679cSJacob Faibussowitsch 
703*bbcf679cSJacob Faibussowitsch    Input Parameters:
704*bbcf679cSJacob Faibussowitsch +  b - pointer to initial memory space
705*bbcf679cSJacob Faibussowitsch -  n - length (in bytes) of space to copy
706*bbcf679cSJacob Faibussowitsch 
707*bbcf679cSJacob Faibussowitsch    Output Parameter:
708*bbcf679cSJacob Faibussowitsch .  a - pointer to copy space
709*bbcf679cSJacob Faibussowitsch 
710*bbcf679cSJacob Faibussowitsch    Level: intermediate
711*bbcf679cSJacob Faibussowitsch 
712*bbcf679cSJacob Faibussowitsch    Compile Option:
713*bbcf679cSJacob Faibussowitsch     `PETSC_PREFER_DCOPY_FOR_MEMCPY` will cause the BLAS dcopy() routine to be used
714*bbcf679cSJacob Faibussowitsch                                   for memory copies on double precision values.
715*bbcf679cSJacob Faibussowitsch     `PETSC_PREFER_COPY_FOR_MEMCPY` will cause C code to be used
716*bbcf679cSJacob Faibussowitsch                                   for memory copies on double precision values.
717*bbcf679cSJacob Faibussowitsch     `PETSC_PREFER_FORTRAN_FORMEMCPY` will cause Fortran code to be used
718*bbcf679cSJacob Faibussowitsch                                   for memory copies on double precision values.
719*bbcf679cSJacob Faibussowitsch 
720*bbcf679cSJacob Faibussowitsch    Notes:
721*bbcf679cSJacob Faibussowitsch    Prefer `PetscArraycpy()`
722*bbcf679cSJacob Faibussowitsch 
723*bbcf679cSJacob Faibussowitsch    This routine is analogous to `memcpy()`.
724*bbcf679cSJacob Faibussowitsch 
725*bbcf679cSJacob Faibussowitsch    Developer Notes:
726*bbcf679cSJacob Faibussowitsch    This is inlined for fastest performance
727*bbcf679cSJacob Faibussowitsch 
728*bbcf679cSJacob Faibussowitsch .seealso: `PetscMemzero()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscArraycmp()`, `PetscArraycpy()`, `PetscMemmove()`, `PetscStrallocpy()`
729*bbcf679cSJacob Faibussowitsch @*/
730*bbcf679cSJacob Faibussowitsch static inline PetscErrorCode PetscMemcpy(void *a, const void *b, size_t n)
731*bbcf679cSJacob Faibussowitsch {
732*bbcf679cSJacob Faibussowitsch   const PETSC_UINTPTR_T al = (PETSC_UINTPTR_T)a;
733*bbcf679cSJacob Faibussowitsch   const PETSC_UINTPTR_T bl = (PETSC_UINTPTR_T)b;
734*bbcf679cSJacob Faibussowitsch 
735*bbcf679cSJacob Faibussowitsch   PetscFunctionBegin;
736*bbcf679cSJacob Faibussowitsch   if (PetscUnlikely((n == 0) || (a == b))) PetscFunctionReturn(PETSC_SUCCESS);
737*bbcf679cSJacob Faibussowitsch   PetscAssert(a, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL, "Trying to copy %zu bytes to a null pointer (Argument #1)", n);
738*bbcf679cSJacob Faibussowitsch   PetscAssert(b, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL, "Trying to copy %zu bytes from a null pointer (Argument #2)", n);
739*bbcf679cSJacob Faibussowitsch   PetscAssert(!(((al > bl) && (al - bl) < n) || (bl - al) < n), PETSC_COMM_SELF, PETSC_ERR_ARG_INCOMP, "Memory regions overlap: either use PetscMemmove()\nor make sure your copy regions and lengths are correct.\nLength (bytes) %zu first address %" PRIxPTR " second address %" PRIxPTR, n, al, bl);
740*bbcf679cSJacob Faibussowitsch   if (PetscDefined(PREFER_DCOPY_FOR_MEMCPY) || PetscDefined(PREFER_COPY_FOR_MEMCPY) || PetscDefined(PREFER_FORTRAN_FORMEMCPY)) {
741*bbcf679cSJacob Faibussowitsch     if (!(al % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) {
742*bbcf679cSJacob Faibussowitsch       const size_t       scalar_len = n / sizeof(PetscScalar);
743*bbcf679cSJacob Faibussowitsch       const PetscScalar *x          = (PetscScalar *)b;
744*bbcf679cSJacob Faibussowitsch       PetscScalar       *y          = (PetscScalar *)a;
745*bbcf679cSJacob Faibussowitsch 
746*bbcf679cSJacob Faibussowitsch #if PetscDefined(PREFER_DCOPY_FOR_MEMCPY)
747*bbcf679cSJacob Faibussowitsch       {
748*bbcf679cSJacob Faibussowitsch         const PetscBLASInt one = 1;
749*bbcf679cSJacob Faibussowitsch         PetscBLASInt       blen;
750*bbcf679cSJacob Faibussowitsch 
751*bbcf679cSJacob Faibussowitsch         PetscCall(PetscBLASIntCast(scalar_len, &blen));
752*bbcf679cSJacob Faibussowitsch         PetscCallBLAS("BLAScopy", BLAScopy_(&blen, x, &one, y, &one));
753*bbcf679cSJacob Faibussowitsch       }
754*bbcf679cSJacob Faibussowitsch #elif PetscDefined(PREFER_FORTRAN_FORMEMCPY)
755*bbcf679cSJacob Faibussowitsch       fortrancopy_(&scalar_len, x, y);
756*bbcf679cSJacob Faibussowitsch #else
757*bbcf679cSJacob Faibussowitsch       for (size_t i = 0; i < scalar_len; i++) y[i] = x[i];
758*bbcf679cSJacob Faibussowitsch #endif
759*bbcf679cSJacob Faibussowitsch       PetscFunctionReturn(PETSC_SUCCESS);
760*bbcf679cSJacob Faibussowitsch     }
761*bbcf679cSJacob Faibussowitsch   }
762*bbcf679cSJacob Faibussowitsch   memcpy(a, b, n);
763*bbcf679cSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
764*bbcf679cSJacob Faibussowitsch }
765*bbcf679cSJacob Faibussowitsch 
766*bbcf679cSJacob Faibussowitsch /*@C
767*bbcf679cSJacob Faibussowitsch    PetscMemzero - Zeros the specified memory.
768*bbcf679cSJacob Faibussowitsch 
769*bbcf679cSJacob Faibussowitsch    Not Collective
770*bbcf679cSJacob Faibussowitsch 
771*bbcf679cSJacob Faibussowitsch    Input Parameters:
772*bbcf679cSJacob Faibussowitsch +  a - pointer to beginning memory location
773*bbcf679cSJacob Faibussowitsch -  n - length (in bytes) of memory to initialize
774*bbcf679cSJacob Faibussowitsch 
775*bbcf679cSJacob Faibussowitsch    Level: intermediate
776*bbcf679cSJacob Faibussowitsch 
777*bbcf679cSJacob Faibussowitsch    Compile Option:
778*bbcf679cSJacob Faibussowitsch    `PETSC_PREFER_BZERO` - on certain machines (the IBM RS6000) the bzero() routine happens
779*bbcf679cSJacob Faibussowitsch   to be faster than the memset() routine. This flag causes the bzero() routine to be used.
780*bbcf679cSJacob Faibussowitsch 
781*bbcf679cSJacob Faibussowitsch    Notes:
782*bbcf679cSJacob Faibussowitsch    Prefer `PetscArrayzero()`
783*bbcf679cSJacob Faibussowitsch 
784*bbcf679cSJacob Faibussowitsch    Developer Notes:
785*bbcf679cSJacob Faibussowitsch    This is inlined for fastest performance
786*bbcf679cSJacob Faibussowitsch 
787*bbcf679cSJacob Faibussowitsch .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscArraycmp()`, `PetscArraycpy()`, `PetscMemmove()`, `PetscStrallocpy()`
788*bbcf679cSJacob Faibussowitsch @*/
789*bbcf679cSJacob Faibussowitsch static inline PetscErrorCode PetscMemzero(void *a, size_t n)
790*bbcf679cSJacob Faibussowitsch {
791*bbcf679cSJacob Faibussowitsch   PetscFunctionBegin;
792*bbcf679cSJacob Faibussowitsch   if (PetscUnlikely(n == 0)) PetscFunctionReturn(PETSC_SUCCESS);
793*bbcf679cSJacob Faibussowitsch   PetscAssert(a, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL, "Trying to zero %zu bytes at a null pointer", n);
794*bbcf679cSJacob Faibussowitsch   if (PetscDefined(PREFER_ZERO_FOR_MEMZERO) || PetscDefined(PREFER_FORTRAN_FOR_MEMZERO)) {
795*bbcf679cSJacob Faibussowitsch     if (!(((PETSC_UINTPTR_T)a) % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) {
796*bbcf679cSJacob Faibussowitsch       const size_t scalar_len = n / sizeof(PetscScalar);
797*bbcf679cSJacob Faibussowitsch       PetscScalar *x          = (PetscScalar *)a;
798*bbcf679cSJacob Faibussowitsch 
799*bbcf679cSJacob Faibussowitsch       if (PetscDefined(PREFER_ZERO_FOR_MEMZERO)) {
800*bbcf679cSJacob Faibussowitsch         for (size_t i = 0; i < scalar_len; ++i) x[i] = 0;
801*bbcf679cSJacob Faibussowitsch       } else {
802*bbcf679cSJacob Faibussowitsch #if PetscDefined(PREFER_FORTRAN_FOR_MEMZERO)
803*bbcf679cSJacob Faibussowitsch         fortranzero_(&scalar_len, x);
804*bbcf679cSJacob Faibussowitsch #else
805*bbcf679cSJacob Faibussowitsch         (void)scalar_len;
806*bbcf679cSJacob Faibussowitsch         (void)x;
807*bbcf679cSJacob Faibussowitsch #endif
808*bbcf679cSJacob Faibussowitsch       }
809*bbcf679cSJacob Faibussowitsch       PetscFunctionReturn(PETSC_SUCCESS);
810*bbcf679cSJacob Faibussowitsch     }
811*bbcf679cSJacob Faibussowitsch   }
812*bbcf679cSJacob Faibussowitsch #if PetscDefined(PREFER_BZERO)
813*bbcf679cSJacob Faibussowitsch   bzero(a, n);
814*bbcf679cSJacob Faibussowitsch #else
815*bbcf679cSJacob Faibussowitsch   memset(a, 0, n);
816*bbcf679cSJacob Faibussowitsch #endif
817*bbcf679cSJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
818*bbcf679cSJacob Faibussowitsch }
819*bbcf679cSJacob Faibussowitsch 
820*bbcf679cSJacob Faibussowitsch /*MC
821*bbcf679cSJacob Faibussowitsch    PetscArraycmp - Compares two arrays in memory.
822*bbcf679cSJacob Faibussowitsch 
823*bbcf679cSJacob Faibussowitsch    Synopsis:
824*bbcf679cSJacob Faibussowitsch     #include <petscstring.h>
825*bbcf679cSJacob Faibussowitsch     PetscErrorCode PetscArraycmp(const anytype *str1,const anytype *str2,size_t cnt,PetscBool *e)
826*bbcf679cSJacob Faibussowitsch 
827*bbcf679cSJacob Faibussowitsch    Not Collective
828*bbcf679cSJacob Faibussowitsch 
829*bbcf679cSJacob Faibussowitsch    Input Parameters:
830*bbcf679cSJacob Faibussowitsch +  str1 - First array
831*bbcf679cSJacob Faibussowitsch .  str2 - Second array
832*bbcf679cSJacob Faibussowitsch -  cnt  - Count of the array, not in bytes, but number of entries in the arrays
833*bbcf679cSJacob Faibussowitsch 
834*bbcf679cSJacob Faibussowitsch    Output Parameters:
835*bbcf679cSJacob Faibussowitsch .   e - `PETSC_TRUE` if equal else `PETSC_FALSE`.
836*bbcf679cSJacob Faibussowitsch 
837*bbcf679cSJacob Faibussowitsch    Level: intermediate
838*bbcf679cSJacob Faibussowitsch 
839*bbcf679cSJacob Faibussowitsch    Notes:
840*bbcf679cSJacob Faibussowitsch    This routine is a preferred replacement to `PetscMemcmp()`
841*bbcf679cSJacob Faibussowitsch 
842*bbcf679cSJacob Faibussowitsch    The arrays must be of the same type
843*bbcf679cSJacob Faibussowitsch 
844*bbcf679cSJacob Faibussowitsch .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscMemzero()`, `PetscArraycpy()`, `PetscMemmove()`, `PetscStrallocpy()`,
845*bbcf679cSJacob Faibussowitsch           `PetscArraymove()`
846*bbcf679cSJacob Faibussowitsch M*/
847*bbcf679cSJacob Faibussowitsch #define PetscArraycmp(str1, str2, cnt, e) ((sizeof(*(str1)) == sizeof(*(str2))) ? PetscMemcmp((str1), (str2), (size_t)(cnt) * sizeof(*(str1)), (e)) : PETSC_ERR_ARG_SIZ)
848*bbcf679cSJacob Faibussowitsch 
849*bbcf679cSJacob Faibussowitsch /*MC
850*bbcf679cSJacob Faibussowitsch    PetscArraymove - Copies from one array in memory to another, the arrays may overlap. Use `PetscArraycpy()` when the arrays
851*bbcf679cSJacob Faibussowitsch                     do not overlap
852*bbcf679cSJacob Faibussowitsch 
853*bbcf679cSJacob Faibussowitsch    Synopsis:
854*bbcf679cSJacob Faibussowitsch     #include <petscstring.h>
855*bbcf679cSJacob Faibussowitsch     PetscErrorCode PetscArraymove(anytype *str1,const anytype *str2,size_t cnt)
856*bbcf679cSJacob Faibussowitsch 
857*bbcf679cSJacob Faibussowitsch    Not Collective
858*bbcf679cSJacob Faibussowitsch 
859*bbcf679cSJacob Faibussowitsch    Input Parameters:
860*bbcf679cSJacob Faibussowitsch +  str1 - First array
861*bbcf679cSJacob Faibussowitsch .  str2 - Second array
862*bbcf679cSJacob Faibussowitsch -  cnt  - Count of the array, not in bytes, but number of entries in the arrays
863*bbcf679cSJacob Faibussowitsch 
864*bbcf679cSJacob Faibussowitsch    Level: intermediate
865*bbcf679cSJacob Faibussowitsch 
866*bbcf679cSJacob Faibussowitsch    Notes:
867*bbcf679cSJacob Faibussowitsch    This routine is a preferred replacement to `PetscMemmove()`
868*bbcf679cSJacob Faibussowitsch 
869*bbcf679cSJacob Faibussowitsch    The arrays must be of the same type
870*bbcf679cSJacob Faibussowitsch 
871*bbcf679cSJacob Faibussowitsch .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscMemzero()`, `PetscArraycpy()`, `PetscMemmove()`, `PetscArraycmp()`, `PetscStrallocpy()`
872*bbcf679cSJacob Faibussowitsch M*/
873*bbcf679cSJacob Faibussowitsch #define PetscArraymove(str1, str2, cnt) ((sizeof(*(str1)) == sizeof(*(str2))) ? PetscMemmove((str1), (str2), (size_t)(cnt) * sizeof(*(str1))) : PETSC_ERR_ARG_SIZ)
874*bbcf679cSJacob Faibussowitsch 
875*bbcf679cSJacob Faibussowitsch /*MC
876*bbcf679cSJacob Faibussowitsch    PetscArraycpy - Copies from one array in memory to another
877*bbcf679cSJacob Faibussowitsch 
878*bbcf679cSJacob Faibussowitsch    Synopsis:
879*bbcf679cSJacob Faibussowitsch     #include <petscstring.h>
880*bbcf679cSJacob Faibussowitsch     PetscErrorCode PetscArraycpy(anytype *str1,const anytype *str2,size_t cnt)
881*bbcf679cSJacob Faibussowitsch 
882*bbcf679cSJacob Faibussowitsch    Not Collective
883*bbcf679cSJacob Faibussowitsch 
884*bbcf679cSJacob Faibussowitsch    Input Parameters:
885*bbcf679cSJacob Faibussowitsch +  str1 - First array (destination)
886*bbcf679cSJacob Faibussowitsch .  str2 - Second array (source)
887*bbcf679cSJacob Faibussowitsch -  cnt  - Count of the array, not in bytes, but number of entries in the arrays
888*bbcf679cSJacob Faibussowitsch 
889*bbcf679cSJacob Faibussowitsch    Level: intermediate
890*bbcf679cSJacob Faibussowitsch 
891*bbcf679cSJacob Faibussowitsch    Notes:
892*bbcf679cSJacob Faibussowitsch    This routine is a preferred replacement to `PetscMemcpy()`
893*bbcf679cSJacob Faibussowitsch 
894*bbcf679cSJacob Faibussowitsch    The arrays must be of the same type
895*bbcf679cSJacob Faibussowitsch 
896*bbcf679cSJacob Faibussowitsch .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscMemzero()`, `PetscArraymove()`, `PetscMemmove()`, `PetscArraycmp()`, `PetscStrallocpy()`
897*bbcf679cSJacob Faibussowitsch M*/
898*bbcf679cSJacob Faibussowitsch #define PetscArraycpy(str1, str2, cnt) ((sizeof(*(str1)) == sizeof(*(str2))) ? PetscMemcpy((str1), (str2), (size_t)(cnt) * sizeof(*(str1))) : PETSC_ERR_ARG_SIZ)
899*bbcf679cSJacob Faibussowitsch 
900*bbcf679cSJacob Faibussowitsch /*MC
901*bbcf679cSJacob Faibussowitsch    PetscArrayzero - Zeros an array in memory.
902*bbcf679cSJacob Faibussowitsch 
903*bbcf679cSJacob Faibussowitsch    Synopsis:
904*bbcf679cSJacob Faibussowitsch     #include <petscstring.h>
905*bbcf679cSJacob Faibussowitsch     PetscErrorCode PetscArrayzero(anytype *str1,size_t cnt)
906*bbcf679cSJacob Faibussowitsch 
907*bbcf679cSJacob Faibussowitsch    Not Collective
908*bbcf679cSJacob Faibussowitsch 
909*bbcf679cSJacob Faibussowitsch    Input Parameters:
910*bbcf679cSJacob Faibussowitsch +  str1 - array
911*bbcf679cSJacob Faibussowitsch -  cnt  - Count of the array, not in bytes, but number of entries in the array
912*bbcf679cSJacob Faibussowitsch 
913*bbcf679cSJacob Faibussowitsch    Level: intermediate
914*bbcf679cSJacob Faibussowitsch 
915*bbcf679cSJacob Faibussowitsch    Notes:
916*bbcf679cSJacob Faibussowitsch    This routine is a preferred replacement to `PetscMemzero()`
917*bbcf679cSJacob Faibussowitsch 
918*bbcf679cSJacob Faibussowitsch .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscMemzero()`, `PetscArraycmp()`, `PetscArraycpy()`, `PetscMemmove()`, `PetscStrallocpy()`, `PetscArraymove()`
919*bbcf679cSJacob Faibussowitsch M*/
920*bbcf679cSJacob Faibussowitsch #define PetscArrayzero(str1, cnt) PetscMemzero((str1), (size_t)(cnt) * sizeof(*(str1)))
921*bbcf679cSJacob Faibussowitsch 
922*bbcf679cSJacob Faibussowitsch #endif // PETSC_STRING_H
923