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