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