17d0a6c19SBarry Smith 2e5c89e4eSSatish Balay /* 3e5c89e4eSSatish Balay We define the string operations here. The reason we just do not use 4e5c89e4eSSatish Balay the standard string routines in the PETSc code is that on some machines 5e5c89e4eSSatish Balay they are broken or have the wrong prototypes. 6e5c89e4eSSatish Balay 7e5c89e4eSSatish Balay */ 8c6db04a5SJed Brown #include <petscsys.h> /*I "petscsys.h" I*/ 96ce87071SSatish Balay #if defined(PETSC_HAVE_STRING_H) 106ce87071SSatish Balay #include <string.h> /* strstr */ 116ce87071SSatish Balay #endif 123964eb88SJed Brown #if defined(PETSC_HAVE_STRINGS_H) 133964eb88SJed Brown # include <strings.h> /* strcasecmp */ 143964eb88SJed Brown #endif 153964eb88SJed Brown 16e5c89e4eSSatish Balay #undef __FUNCT__ 173c311c98SBarry Smith #define __FUNCT__ "PetscStrToArray" 183c311c98SBarry Smith /*@C 19d67fe73bSBarry Smith PetscStrToArray - Seperates a string by a charactor (for example ' ' or '\n') and creates an array of strings 203c311c98SBarry Smith 213c311c98SBarry Smith Not Collective 223c311c98SBarry Smith 233c311c98SBarry Smith Input Parameters: 24d67fe73bSBarry Smith + s - pointer to string 25a2ea699eSBarry Smith - sp - separator charactor 263c311c98SBarry Smith 273c311c98SBarry Smith Output Parameter: 283c311c98SBarry Smith + argc - the number of entries in the array 293c311c98SBarry Smith - args - an array of the entries with a null at the end 303c311c98SBarry Smith 313c311c98SBarry Smith Level: intermediate 323c311c98SBarry Smith 33301d30feSBarry Smith Notes: this may be called before PetscInitialize() or after PetscFinalize() 343c311c98SBarry Smith 356f013253SBarry Smith Not for use in Fortran 366f013253SBarry Smith 37b4cd4cebSBarry Smith Developer Notes: Using raw malloc() and does not call error handlers since this may be used before PETSc is initialized. Used 38b4cd4cebSBarry Smith to generate argc, args arguments passed to MPI_Init() 39301d30feSBarry Smith 40b4cd4cebSBarry Smith .seealso: PetscStrToArrayDestroy(), PetscToken, PetscTokenCreate() 413c311c98SBarry Smith 423c311c98SBarry Smith @*/ 43d67fe73bSBarry Smith PetscErrorCode PetscStrToArray(const char s[],char sp,int *argc,char ***args) 443c311c98SBarry Smith { 453c311c98SBarry Smith int i,n,*lens,cnt = 0; 46ace3abfcSBarry Smith PetscBool flg = PETSC_FALSE; 473c311c98SBarry Smith 4840a7e1efSBarry Smith if (!s) n = 0; 4940a7e1efSBarry Smith else n = strlen(s); 503c311c98SBarry Smith *argc = 0; 514996c5bdSBarry Smith if (!n) { 524996c5bdSBarry Smith *args = 0; 534996c5bdSBarry Smith return(0); 544996c5bdSBarry Smith } 553c311c98SBarry Smith for (i=0; i<n; i++) { 56d67fe73bSBarry Smith if (s[i] != sp) break; 573c311c98SBarry Smith } 583c311c98SBarry Smith for (;i<n+1; i++) { 59d67fe73bSBarry Smith if ((s[i] == sp || s[i] == 0) && !flg) {flg = PETSC_TRUE; (*argc)++;} 60d67fe73bSBarry Smith else if (s[i] != sp) {flg = PETSC_FALSE;} 613c311c98SBarry Smith } 62a2ea699eSBarry Smith (*args) = (char**) malloc(((*argc)+1)*sizeof(char*)); if (!*args) return PETSC_ERR_MEM; 6353e6e2c4SHong Zhang lens = (int*) malloc((*argc)*sizeof(int)); if (!lens) return PETSC_ERR_MEM; 643c311c98SBarry Smith for (i=0; i<*argc; i++) lens[i] = 0; 653c311c98SBarry Smith 663c311c98SBarry Smith *argc = 0; 673c311c98SBarry Smith for (i=0; i<n; i++) { 68d67fe73bSBarry Smith if (s[i] != sp) break; 693c311c98SBarry Smith } 703c311c98SBarry Smith for (;i<n+1; i++) { 71d67fe73bSBarry Smith if ((s[i] == sp || s[i] == 0) && !flg) {flg = PETSC_TRUE; (*argc)++;} 72d67fe73bSBarry Smith else if (s[i] != sp) {lens[*argc]++;flg = PETSC_FALSE;} 733c311c98SBarry Smith } 743c311c98SBarry Smith 753c311c98SBarry Smith for (i=0; i<*argc; i++) { 76675282fdSHong Zhang (*args)[i] = (char*) malloc((lens[i]+1)*sizeof(char)); if (!(*args)[i]) return PETSC_ERR_MEM; 773c311c98SBarry Smith } 78a2ea699eSBarry Smith free(lens); 79301d30feSBarry Smith (*args)[*argc] = 0; 803c311c98SBarry Smith 813c311c98SBarry Smith *argc = 0; 823c311c98SBarry Smith for (i=0; i<n; i++) { 83d67fe73bSBarry Smith if (s[i] != sp) break; 843c311c98SBarry Smith } 853c311c98SBarry Smith for (;i<n+1; i++) { 86d67fe73bSBarry Smith if ((s[i] == sp || s[i] == 0) && !flg) {flg = PETSC_TRUE; (*args)[*argc][cnt++] = 0; (*argc)++; cnt = 0;} 87d67fe73bSBarry Smith else if (s[i] != sp && s[i] != 0) {(*args)[*argc][cnt++] = s[i]; flg = PETSC_FALSE;} 883c311c98SBarry Smith } 893c311c98SBarry Smith return 0; 903c311c98SBarry Smith } 913c311c98SBarry Smith 923c311c98SBarry Smith #undef __FUNCT__ 93301d30feSBarry Smith #define __FUNCT__ "PetscStrToArrayDestroy" 94301d30feSBarry Smith /*@C 95301d30feSBarry Smith PetscStrToArrayDestroy - Frees array created with PetscStrToArray(). 96301d30feSBarry Smith 97301d30feSBarry Smith Not Collective 98301d30feSBarry Smith 99301d30feSBarry Smith Output Parameters: 100301d30feSBarry Smith + argc - the number of arguments 101301d30feSBarry Smith - args - the array of arguments 102301d30feSBarry Smith 103301d30feSBarry Smith Level: intermediate 104301d30feSBarry Smith 105301d30feSBarry Smith Concepts: command line arguments 106301d30feSBarry Smith 107301d30feSBarry Smith Notes: This may be called before PetscInitialize() or after PetscFinalize() 108301d30feSBarry Smith 1096f013253SBarry Smith Not for use in Fortran 1106f013253SBarry Smith 111301d30feSBarry Smith .seealso: PetscStrToArray() 112301d30feSBarry Smith 113301d30feSBarry Smith @*/ 1147087cfbeSBarry Smith PetscErrorCode PetscStrToArrayDestroy(int argc,char **args) 115301d30feSBarry Smith { 116301d30feSBarry Smith PetscInt i; 117301d30feSBarry Smith 118a297a907SKarl Rupp for (i=0; i<argc; i++) free(args[i]); 119a297a907SKarl Rupp if (args) free(args); 120301d30feSBarry Smith return 0; 121301d30feSBarry Smith } 122301d30feSBarry Smith 123301d30feSBarry Smith #undef __FUNCT__ 124e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrlen" 125e5c89e4eSSatish Balay /*@C 126e5c89e4eSSatish Balay PetscStrlen - Gets length of a string 127e5c89e4eSSatish Balay 128e5c89e4eSSatish Balay Not Collective 129e5c89e4eSSatish Balay 130e5c89e4eSSatish Balay Input Parameters: 131e5c89e4eSSatish Balay . s - pointer to string 132e5c89e4eSSatish Balay 133e5c89e4eSSatish Balay Output Parameter: 134e5c89e4eSSatish Balay . len - length in bytes 135e5c89e4eSSatish Balay 136e5c89e4eSSatish Balay Level: intermediate 137e5c89e4eSSatish Balay 138e5c89e4eSSatish Balay Note: 139e5c89e4eSSatish Balay This routine is analogous to strlen(). 140e5c89e4eSSatish Balay 141e5c89e4eSSatish Balay Null string returns a length of zero 142e5c89e4eSSatish Balay 1436f013253SBarry Smith Not for use in Fortran 1446f013253SBarry Smith 145e5c89e4eSSatish Balay Concepts: string length 146e5c89e4eSSatish Balay 147e5c89e4eSSatish Balay @*/ 1487087cfbeSBarry Smith PetscErrorCode PetscStrlen(const char s[],size_t *len) 149e5c89e4eSSatish Balay { 150e5c89e4eSSatish Balay PetscFunctionBegin; 151a297a907SKarl Rupp if (!s) *len = 0; 152a297a907SKarl Rupp else *len = strlen(s); 153e5c89e4eSSatish Balay PetscFunctionReturn(0); 154e5c89e4eSSatish Balay } 155e5c89e4eSSatish Balay 156e5c89e4eSSatish Balay #undef __FUNCT__ 157e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrallocpy" 158e5c89e4eSSatish Balay /*@C 159e5c89e4eSSatish Balay PetscStrallocpy - Allocates space to hold a copy of a string then copies the string 160e5c89e4eSSatish Balay 161e5c89e4eSSatish Balay Not Collective 162e5c89e4eSSatish Balay 163e5c89e4eSSatish Balay Input Parameters: 164e5c89e4eSSatish Balay . s - pointer to string 165e5c89e4eSSatish Balay 166e5c89e4eSSatish Balay Output Parameter: 167e5c89e4eSSatish Balay . t - the copied string 168e5c89e4eSSatish Balay 169e5c89e4eSSatish Balay Level: intermediate 170e5c89e4eSSatish Balay 171e5c89e4eSSatish Balay Note: 172e5c89e4eSSatish Balay Null string returns a new null string 173e5c89e4eSSatish Balay 1746f013253SBarry Smith Not for use in Fortran 1756f013253SBarry Smith 176e5c89e4eSSatish Balay Concepts: string copy 177e5c89e4eSSatish Balay 178e5c89e4eSSatish Balay @*/ 1797087cfbeSBarry Smith PetscErrorCode PetscStrallocpy(const char s[],char *t[]) 180e5c89e4eSSatish Balay { 181e5c89e4eSSatish Balay PetscErrorCode ierr; 182e5c89e4eSSatish Balay size_t len; 18371573d7dSBarry Smith char *tmp = 0; 184e5c89e4eSSatish Balay 185e5c89e4eSSatish Balay PetscFunctionBegin; 186e5c89e4eSSatish Balay if (s) { 187e5c89e4eSSatish Balay ierr = PetscStrlen(s,&len);CHKERRQ(ierr); 188785e854fSJed Brown ierr = PetscMalloc1((1+len),&tmp);CHKERRQ(ierr); 18971573d7dSBarry Smith ierr = PetscStrcpy(tmp,s);CHKERRQ(ierr); 190e5c89e4eSSatish Balay } 19171573d7dSBarry Smith *t = tmp; 192e5c89e4eSSatish Balay PetscFunctionReturn(0); 193e5c89e4eSSatish Balay } 194e5c89e4eSSatish Balay 195e5c89e4eSSatish Balay #undef __FUNCT__ 19647340559SBarry Smith #define __FUNCT__ "PetscStrArrayallocpy" 19747340559SBarry Smith /*@C 19847340559SBarry Smith PetscStrArrayallocpy - Allocates space to hold a copy of an array of strings then copies the strings 19947340559SBarry Smith 20047340559SBarry Smith Not Collective 20147340559SBarry Smith 20247340559SBarry Smith Input Parameters: 20347340559SBarry Smith . s - pointer to array of strings (final string is a null) 20447340559SBarry Smith 20547340559SBarry Smith Output Parameter: 20647340559SBarry Smith . t - the copied array string 20747340559SBarry Smith 20847340559SBarry Smith Level: intermediate 20947340559SBarry Smith 21047340559SBarry Smith Note: 21147340559SBarry Smith Not for use in Fortran 21247340559SBarry Smith 21347340559SBarry Smith Concepts: string copy 21447340559SBarry Smith 21547340559SBarry Smith .seealso: PetscStrallocpy() PetscStrArrayDestroy() 21647340559SBarry Smith 21747340559SBarry Smith @*/ 21847340559SBarry Smith PetscErrorCode PetscStrArrayallocpy(const char *const *list,char ***t) 21947340559SBarry Smith { 22047340559SBarry Smith PetscErrorCode ierr; 22147340559SBarry Smith PetscInt i,n = 0; 22247340559SBarry Smith 22347340559SBarry Smith PetscFunctionBegin; 22447340559SBarry Smith while (list[n++]) ; 225785e854fSJed Brown ierr = PetscMalloc1((n+1),t);CHKERRQ(ierr); 22647340559SBarry Smith for (i=0; i<n; i++) { 22747340559SBarry Smith ierr = PetscStrallocpy(list[i],(*t)+i);CHKERRQ(ierr); 22847340559SBarry Smith } 2290298fd71SBarry Smith (*t)[n] = NULL; 23047340559SBarry Smith PetscFunctionReturn(0); 23147340559SBarry Smith } 23247340559SBarry Smith 23347340559SBarry Smith #undef __FUNCT__ 23447340559SBarry Smith #define __FUNCT__ "PetscStrArrayDestroy" 23547340559SBarry Smith /*@C 23647340559SBarry Smith PetscStrArrayDestroy - Frees array of strings created with PetscStrArrayallocpy(). 23747340559SBarry Smith 23847340559SBarry Smith Not Collective 23947340559SBarry Smith 24047340559SBarry Smith Output Parameters: 24147340559SBarry Smith . list - array of strings 24247340559SBarry Smith 24347340559SBarry Smith Level: intermediate 24447340559SBarry Smith 24547340559SBarry Smith Concepts: command line arguments 24647340559SBarry Smith 24747340559SBarry Smith Notes: Not for use in Fortran 24847340559SBarry Smith 24947340559SBarry Smith .seealso: PetscStrArrayallocpy() 25047340559SBarry Smith 25147340559SBarry Smith @*/ 2526fed8037SJed Brown PetscErrorCode PetscStrArrayDestroy(char ***list) 25347340559SBarry Smith { 25447340559SBarry Smith PetscInt n = 0; 25547340559SBarry Smith PetscErrorCode ierr; 25647340559SBarry Smith 2576fed8037SJed Brown PetscFunctionBegin; 2586fed8037SJed Brown if (!*list) PetscFunctionReturn(0); 2596fed8037SJed Brown while ((*list)[n]) { 2606fed8037SJed Brown ierr = PetscFree((*list)[n]);CHKERRQ(ierr); 26147340559SBarry Smith n++; 26247340559SBarry Smith } 2636fed8037SJed Brown ierr = PetscFree(*list);CHKERRQ(ierr); 2646fed8037SJed Brown PetscFunctionReturn(0); 26547340559SBarry Smith } 26647340559SBarry Smith 26747340559SBarry Smith #undef __FUNCT__ 268e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcpy" 269e5c89e4eSSatish Balay /*@C 270e5c89e4eSSatish Balay PetscStrcpy - Copies a string 271e5c89e4eSSatish Balay 272e5c89e4eSSatish Balay Not Collective 273e5c89e4eSSatish Balay 274e5c89e4eSSatish Balay Input Parameters: 275e5c89e4eSSatish Balay . t - pointer to string 276e5c89e4eSSatish Balay 277e5c89e4eSSatish Balay Output Parameter: 278e5c89e4eSSatish Balay . s - the copied string 279e5c89e4eSSatish Balay 280e5c89e4eSSatish Balay Level: intermediate 281e5c89e4eSSatish Balay 2826f013253SBarry Smith Notes: 283e5c89e4eSSatish Balay Null string returns a string starting with zero 284e5c89e4eSSatish Balay 2856f013253SBarry Smith Not for use in Fortran 2866f013253SBarry Smith 287e5c89e4eSSatish Balay Concepts: string copy 288e5c89e4eSSatish Balay 289e5c89e4eSSatish Balay .seealso: PetscStrncpy(), PetscStrcat(), PetscStrncat() 290e5c89e4eSSatish Balay 291e5c89e4eSSatish Balay @*/ 292acc6cc86SBarry Smith 2937087cfbeSBarry Smith PetscErrorCode PetscStrcpy(char s[],const char t[]) 294e5c89e4eSSatish Balay { 295e5c89e4eSSatish Balay PetscFunctionBegin; 29617186662SBarry Smith if (t && !s) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy string into null pointer"); 297a297a907SKarl Rupp if (t) strcpy(s,t); 298a297a907SKarl Rupp else if (s) s[0] = 0; 299e5c89e4eSSatish Balay PetscFunctionReturn(0); 300e5c89e4eSSatish Balay } 301e5c89e4eSSatish Balay 302e5c89e4eSSatish Balay #undef __FUNCT__ 303e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncpy" 304e5c89e4eSSatish Balay /*@C 305e5c89e4eSSatish Balay PetscStrncpy - Copies a string up to a certain length 306e5c89e4eSSatish Balay 307e5c89e4eSSatish Balay Not Collective 308e5c89e4eSSatish Balay 309e5c89e4eSSatish Balay Input Parameters: 310e5c89e4eSSatish Balay + t - pointer to string 311e5c89e4eSSatish Balay - n - the length to copy 312e5c89e4eSSatish Balay 313e5c89e4eSSatish Balay Output Parameter: 314e5c89e4eSSatish Balay . s - the copied string 315e5c89e4eSSatish Balay 316e5c89e4eSSatish Balay Level: intermediate 317e5c89e4eSSatish Balay 318e5c89e4eSSatish Balay Note: 319e5c89e4eSSatish Balay Null string returns a string starting with zero 320e5c89e4eSSatish Balay 321ff32304bSBarry Smith If the string that is being copied is of length n or larger then the entire string is not 322ff32304bSBarry Smith copied and the file location of s is set to NULL. This is different then the behavior of 323ff32304bSBarry Smith strncpy() which leaves s non-terminated. 324ff32304bSBarry Smith 325e5c89e4eSSatish Balay Concepts: string copy 326e5c89e4eSSatish Balay 327e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrcat(), PetscStrncat() 328e5c89e4eSSatish Balay 329e5c89e4eSSatish Balay @*/ 3307087cfbeSBarry Smith PetscErrorCode PetscStrncpy(char s[],const char t[],size_t n) 331e5c89e4eSSatish Balay { 332e5c89e4eSSatish Balay PetscFunctionBegin; 33317186662SBarry Smith if (t && !s) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy string into null pointer"); 334ff32304bSBarry Smith if (t) { 3358dc57659SBarry Smith if (n > 1) { 3362c26941aSBarry Smith strncpy(s,t,n-1); 337ff32304bSBarry Smith s[n-1] = '\0'; 3388dc57659SBarry Smith } else { 3398dc57659SBarry Smith s[0] = '\0'; 3408dc57659SBarry Smith } 341ff32304bSBarry Smith } else if (s) s[0] = 0; 342e5c89e4eSSatish Balay PetscFunctionReturn(0); 343e5c89e4eSSatish Balay } 344e5c89e4eSSatish Balay 345e5c89e4eSSatish Balay #undef __FUNCT__ 346e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcat" 347e5c89e4eSSatish Balay /*@C 348e5c89e4eSSatish Balay PetscStrcat - Concatenates a string onto a given string 349e5c89e4eSSatish Balay 350e5c89e4eSSatish Balay Not Collective 351e5c89e4eSSatish Balay 352e5c89e4eSSatish Balay Input Parameters: 353e5e2177aSMatthew Knepley + s - string to be added to 354e5e2177aSMatthew Knepley - t - pointer to string to be added to end 355e5c89e4eSSatish Balay 356e5c89e4eSSatish Balay Level: intermediate 357e5c89e4eSSatish Balay 3586f013253SBarry Smith Notes: Not for use in Fortran 3596f013253SBarry Smith 360e5c89e4eSSatish Balay Concepts: string copy 361e5c89e4eSSatish Balay 362e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrncpy(), PetscStrncat() 363e5c89e4eSSatish Balay 364e5c89e4eSSatish Balay @*/ 3657087cfbeSBarry Smith PetscErrorCode PetscStrcat(char s[],const char t[]) 366e5c89e4eSSatish Balay { 367e5c89e4eSSatish Balay PetscFunctionBegin; 3689b754dc9SBarry Smith if (!t) PetscFunctionReturn(0); 369e5c89e4eSSatish Balay strcat(s,t); 370e5c89e4eSSatish Balay PetscFunctionReturn(0); 371e5c89e4eSSatish Balay } 372e5c89e4eSSatish Balay 373e5c89e4eSSatish Balay #undef __FUNCT__ 374e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncat" 375e5c89e4eSSatish Balay /*@C 376e5c89e4eSSatish Balay PetscStrncat - Concatenates a string onto a given string, up to a given length 377e5c89e4eSSatish Balay 378e5c89e4eSSatish Balay Not Collective 379e5c89e4eSSatish Balay 380e5c89e4eSSatish Balay Input Parameters: 381e5c89e4eSSatish Balay + s - pointer to string to be added to end 382e5c89e4eSSatish Balay . t - string to be added to 383e5c89e4eSSatish Balay . n - maximum length to copy 384e5c89e4eSSatish Balay 385e5c89e4eSSatish Balay Level: intermediate 386e5c89e4eSSatish Balay 3876f013253SBarry Smith Notes: Not for use in Fortran 3886f013253SBarry Smith 389e5c89e4eSSatish Balay Concepts: string copy 390e5c89e4eSSatish Balay 391e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrncpy(), PetscStrcat() 392e5c89e4eSSatish Balay 393e5c89e4eSSatish Balay @*/ 3947087cfbeSBarry Smith PetscErrorCode PetscStrncat(char s[],const char t[],size_t n) 395e5c89e4eSSatish Balay { 396e5c89e4eSSatish Balay PetscFunctionBegin; 397e5c89e4eSSatish Balay strncat(s,t,n); 398e5c89e4eSSatish Balay PetscFunctionReturn(0); 399e5c89e4eSSatish Balay } 400e5c89e4eSSatish Balay 401e5c89e4eSSatish Balay #undef __FUNCT__ 402573b0fb4SBarry Smith #define __FUNCT__ "PetscStrcmpNoError" 403573b0fb4SBarry Smith /* 404573b0fb4SBarry Smith Only to be used with PetscCheck__FUNCT__()! 405573b0fb4SBarry Smith 406573b0fb4SBarry Smith Will be removed once we eliminate the __FUNCT__ paradigm 407573b0fb4SBarry Smith */ 408573b0fb4SBarry Smith void PetscStrcmpNoError(const char a[],const char b[],PetscBool *flg) 409573b0fb4SBarry Smith { 410573b0fb4SBarry Smith int c; 411573b0fb4SBarry Smith 412573b0fb4SBarry Smith if (!a && !b) *flg = PETSC_TRUE; 413573b0fb4SBarry Smith else if (!a || !b) *flg = PETSC_FALSE; 414573b0fb4SBarry Smith else { 415573b0fb4SBarry Smith c = strcmp(a,b); 416573b0fb4SBarry Smith if (c) *flg = PETSC_FALSE; 417573b0fb4SBarry Smith else *flg = PETSC_TRUE; 418573b0fb4SBarry Smith } 419573b0fb4SBarry Smith } 420573b0fb4SBarry Smith 421573b0fb4SBarry Smith #undef __FUNCT__ 422e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcmp" 423e5c89e4eSSatish Balay /*@C 424e5c89e4eSSatish Balay PetscStrcmp - Compares two strings, 425e5c89e4eSSatish Balay 426e5c89e4eSSatish Balay Not Collective 427e5c89e4eSSatish Balay 428e5c89e4eSSatish Balay Input Parameters: 429e5c89e4eSSatish Balay + a - pointer to string first string 430e5c89e4eSSatish Balay - b - pointer to second string 431e5c89e4eSSatish Balay 432e5c89e4eSSatish Balay Output Parameter: 4338c74ee41SBarry Smith . flg - PETSC_TRUE if the two strings are equal 434e5c89e4eSSatish Balay 435e5c89e4eSSatish Balay Level: intermediate 436e5c89e4eSSatish Balay 4376f013253SBarry Smith Notes: Not for use in Fortran 4386f013253SBarry Smith 439e5c89e4eSSatish Balay .seealso: PetscStrgrt(), PetscStrncmp(), PetscStrcasecmp() 440e5c89e4eSSatish Balay 441e5c89e4eSSatish Balay @*/ 4427087cfbeSBarry Smith PetscErrorCode PetscStrcmp(const char a[],const char b[],PetscBool *flg) 443e5c89e4eSSatish Balay { 444e5c89e4eSSatish Balay int c; 445e5c89e4eSSatish Balay 446e5c89e4eSSatish Balay PetscFunctionBegin; 447a297a907SKarl Rupp if (!a && !b) *flg = PETSC_TRUE; 448a297a907SKarl Rupp else if (!a || !b) *flg = PETSC_FALSE; 449a297a907SKarl Rupp else { 450e5c89e4eSSatish Balay c = strcmp(a,b); 451e5c89e4eSSatish Balay if (c) *flg = PETSC_FALSE; 452e5c89e4eSSatish Balay else *flg = PETSC_TRUE; 453e5c89e4eSSatish Balay } 454e5c89e4eSSatish Balay PetscFunctionReturn(0); 455e5c89e4eSSatish Balay } 456e5c89e4eSSatish Balay 457e5c89e4eSSatish Balay #undef __FUNCT__ 458e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrgrt" 459e5c89e4eSSatish Balay /*@C 460e5c89e4eSSatish Balay PetscStrgrt - If first string is greater than the second 461e5c89e4eSSatish Balay 462e5c89e4eSSatish Balay Not Collective 463e5c89e4eSSatish Balay 464e5c89e4eSSatish Balay Input Parameters: 465e5c89e4eSSatish Balay + a - pointer to first string 466e5c89e4eSSatish Balay - b - pointer to second string 467e5c89e4eSSatish Balay 468e5c89e4eSSatish Balay Output Parameter: 469e5c89e4eSSatish Balay . flg - if the first string is greater 470e5c89e4eSSatish Balay 471e5c89e4eSSatish Balay Notes: 472e5c89e4eSSatish Balay Null arguments are ok, a null string is considered smaller than 473e5c89e4eSSatish Balay all others 474e5c89e4eSSatish Balay 4756f013253SBarry Smith Not for use in Fortran 4766f013253SBarry Smith 477e5c89e4eSSatish Balay Level: intermediate 478e5c89e4eSSatish Balay 479e5c89e4eSSatish Balay .seealso: PetscStrcmp(), PetscStrncmp(), PetscStrcasecmp() 480e5c89e4eSSatish Balay 481e5c89e4eSSatish Balay @*/ 4827087cfbeSBarry Smith PetscErrorCode PetscStrgrt(const char a[],const char b[],PetscBool *t) 483e5c89e4eSSatish Balay { 484e5c89e4eSSatish Balay int c; 485e5c89e4eSSatish Balay 486e5c89e4eSSatish Balay PetscFunctionBegin; 487a297a907SKarl Rupp if (!a && !b) *t = PETSC_FALSE; 488a297a907SKarl Rupp else if (a && !b) *t = PETSC_TRUE; 489a297a907SKarl Rupp else if (!a && b) *t = PETSC_FALSE; 490a297a907SKarl Rupp else { 491e5c89e4eSSatish Balay c = strcmp(a,b); 492e5c89e4eSSatish Balay if (c > 0) *t = PETSC_TRUE; 493e5c89e4eSSatish Balay else *t = PETSC_FALSE; 494e5c89e4eSSatish Balay } 495e5c89e4eSSatish Balay PetscFunctionReturn(0); 496e5c89e4eSSatish Balay } 497e5c89e4eSSatish Balay 498e5c89e4eSSatish Balay #undef __FUNCT__ 499e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcasecmp" 500e5c89e4eSSatish Balay /*@C 501e5c89e4eSSatish Balay PetscStrcasecmp - Returns true if the two strings are the same 502e5c89e4eSSatish Balay except possibly for case. 503e5c89e4eSSatish Balay 504e5c89e4eSSatish Balay Not Collective 505e5c89e4eSSatish Balay 506e5c89e4eSSatish Balay Input Parameters: 507e5c89e4eSSatish Balay + a - pointer to first string 508e5c89e4eSSatish Balay - b - pointer to second string 509e5c89e4eSSatish Balay 510e5c89e4eSSatish Balay Output Parameter: 511e5c89e4eSSatish Balay . flg - if the two strings are the same 512e5c89e4eSSatish Balay 513e5c89e4eSSatish Balay Notes: 514e5c89e4eSSatish Balay Null arguments are ok 515e5c89e4eSSatish Balay 5166f013253SBarry Smith Not for use in Fortran 5176f013253SBarry Smith 518e5c89e4eSSatish Balay Level: intermediate 519e5c89e4eSSatish Balay 520e5c89e4eSSatish Balay .seealso: PetscStrcmp(), PetscStrncmp(), PetscStrgrt() 521e5c89e4eSSatish Balay 522e5c89e4eSSatish Balay @*/ 5237087cfbeSBarry Smith PetscErrorCode PetscStrcasecmp(const char a[],const char b[],PetscBool *t) 524e5c89e4eSSatish Balay { 525e5c89e4eSSatish Balay int c; 526e5c89e4eSSatish Balay 527e5c89e4eSSatish Balay PetscFunctionBegin; 528e5c89e4eSSatish Balay if (!a && !b) c = 0; 529e5c89e4eSSatish Balay else if (!a || !b) c = 1; 53032b366c8SSatish Balay #if defined(PETSC_HAVE_STRCASECMP) 53132b366c8SSatish Balay else c = strcasecmp(a,b); 53232b366c8SSatish Balay #elif defined(PETSC_HAVE_STRICMP) 533e5c89e4eSSatish Balay else c = stricmp(a,b); 534e5c89e4eSSatish Balay #else 53532b366c8SSatish Balay else { 53632b366c8SSatish Balay char *aa,*bb; 53732b366c8SSatish Balay PetscErrorCode ierr; 53832b366c8SSatish Balay ierr = PetscStrallocpy(a,&aa);CHKERRQ(ierr); 53932b366c8SSatish Balay ierr = PetscStrallocpy(b,&bb);CHKERRQ(ierr); 54032b366c8SSatish Balay ierr = PetscStrtolower(aa);CHKERRQ(ierr); 54132b366c8SSatish Balay ierr = PetscStrtolower(bb);CHKERRQ(ierr); 54232b366c8SSatish Balay ierr = PetscStrcmp(aa,bb,t);CHKERRQ(ierr); 543503cfb0cSBarry Smith ierr = PetscFree(aa);CHKERRQ(ierr); 544503cfb0cSBarry Smith ierr = PetscFree(bb);CHKERRQ(ierr); 54532b366c8SSatish Balay PetscFunctionReturn(0); 54632b366c8SSatish Balay } 547e5c89e4eSSatish Balay #endif 548e5c89e4eSSatish Balay if (!c) *t = PETSC_TRUE; 549e5c89e4eSSatish Balay else *t = PETSC_FALSE; 550e5c89e4eSSatish Balay PetscFunctionReturn(0); 551e5c89e4eSSatish Balay } 552e5c89e4eSSatish Balay 55332b366c8SSatish Balay 55432b366c8SSatish Balay 555e5c89e4eSSatish Balay #undef __FUNCT__ 556e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncmp" 557e5c89e4eSSatish Balay /*@C 558e5c89e4eSSatish Balay PetscStrncmp - Compares two strings, up to a certain length 559e5c89e4eSSatish Balay 560e5c89e4eSSatish Balay Not Collective 561e5c89e4eSSatish Balay 562e5c89e4eSSatish Balay Input Parameters: 563e5c89e4eSSatish Balay + a - pointer to first string 564e5c89e4eSSatish Balay . b - pointer to second string 565e5c89e4eSSatish Balay - n - length to compare up to 566e5c89e4eSSatish Balay 567e5c89e4eSSatish Balay Output Parameter: 568e5c89e4eSSatish Balay . t - if the two strings are equal 569e5c89e4eSSatish Balay 570e5c89e4eSSatish Balay Level: intermediate 571e5c89e4eSSatish Balay 5726f013253SBarry Smith Notes: Not for use in Fortran 5736f013253SBarry Smith 574e5c89e4eSSatish Balay .seealso: PetscStrgrt(), PetscStrcmp(), PetscStrcasecmp() 575e5c89e4eSSatish Balay 576e5c89e4eSSatish Balay @*/ 5777087cfbeSBarry Smith PetscErrorCode PetscStrncmp(const char a[],const char b[],size_t n,PetscBool *t) 578e5c89e4eSSatish Balay { 579e5c89e4eSSatish Balay int c; 580e5c89e4eSSatish Balay 581e5c89e4eSSatish Balay PetscFunctionBegin; 582e5c89e4eSSatish Balay c = strncmp(a,b,n); 583e5c89e4eSSatish Balay if (!c) *t = PETSC_TRUE; 584e5c89e4eSSatish Balay else *t = PETSC_FALSE; 585e5c89e4eSSatish Balay PetscFunctionReturn(0); 586e5c89e4eSSatish Balay } 587e5c89e4eSSatish Balay 588e5c89e4eSSatish Balay #undef __FUNCT__ 589e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrchr" 590e5c89e4eSSatish Balay /*@C 591e5c89e4eSSatish Balay PetscStrchr - Locates first occurance of a character in a string 592e5c89e4eSSatish Balay 593e5c89e4eSSatish Balay Not Collective 594e5c89e4eSSatish Balay 595e5c89e4eSSatish Balay Input Parameters: 596e5c89e4eSSatish Balay + a - pointer to string 597e5c89e4eSSatish Balay - b - character 598e5c89e4eSSatish Balay 599e5c89e4eSSatish Balay Output Parameter: 6000298fd71SBarry Smith . c - location of occurance, NULL if not found 601e5c89e4eSSatish Balay 602e5c89e4eSSatish Balay Level: intermediate 603e5c89e4eSSatish Balay 6046f013253SBarry Smith Notes: Not for use in Fortran 6056f013253SBarry Smith 606e5c89e4eSSatish Balay @*/ 6077087cfbeSBarry Smith PetscErrorCode PetscStrchr(const char a[],char b,char *c[]) 608e5c89e4eSSatish Balay { 609e5c89e4eSSatish Balay PetscFunctionBegin; 610e5c89e4eSSatish Balay *c = (char*)strchr(a,b); 611e5c89e4eSSatish Balay PetscFunctionReturn(0); 612e5c89e4eSSatish Balay } 613e5c89e4eSSatish Balay 614e5c89e4eSSatish Balay #undef __FUNCT__ 615e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrrchr" 616e5c89e4eSSatish Balay /*@C 617e5c89e4eSSatish Balay PetscStrrchr - Locates one location past the last occurance of a character in a string, 618e5c89e4eSSatish Balay if the character is not found then returns entire string 619e5c89e4eSSatish Balay 620e5c89e4eSSatish Balay Not Collective 621e5c89e4eSSatish Balay 622e5c89e4eSSatish Balay Input Parameters: 623e5c89e4eSSatish Balay + a - pointer to string 624e5c89e4eSSatish Balay - b - character 625e5c89e4eSSatish Balay 626e5c89e4eSSatish Balay Output Parameter: 627e5c89e4eSSatish Balay . tmp - location of occurance, a if not found 628e5c89e4eSSatish Balay 629e5c89e4eSSatish Balay Level: intermediate 630e5c89e4eSSatish Balay 6316f013253SBarry Smith Notes: Not for use in Fortran 6326f013253SBarry Smith 633e5c89e4eSSatish Balay @*/ 6347087cfbeSBarry Smith PetscErrorCode PetscStrrchr(const char a[],char b,char *tmp[]) 635e5c89e4eSSatish Balay { 636e5c89e4eSSatish Balay PetscFunctionBegin; 637e5c89e4eSSatish Balay *tmp = (char*)strrchr(a,b); 638a297a907SKarl Rupp if (!*tmp) *tmp = (char*)a; 639a297a907SKarl Rupp else *tmp = *tmp + 1; 640e5c89e4eSSatish Balay PetscFunctionReturn(0); 641e5c89e4eSSatish Balay } 642e5c89e4eSSatish Balay 643e5c89e4eSSatish Balay #undef __FUNCT__ 644e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrtolower" 645e5c89e4eSSatish Balay /*@C 646e5c89e4eSSatish Balay PetscStrtolower - Converts string to lower case 647e5c89e4eSSatish Balay 648e5c89e4eSSatish Balay Not Collective 649e5c89e4eSSatish Balay 650e5c89e4eSSatish Balay Input Parameters: 651e5c89e4eSSatish Balay . a - pointer to string 652e5c89e4eSSatish Balay 653e5c89e4eSSatish Balay Level: intermediate 654e5c89e4eSSatish Balay 6556f013253SBarry Smith Notes: Not for use in Fortran 6566f013253SBarry Smith 657e5c89e4eSSatish Balay @*/ 6587087cfbeSBarry Smith PetscErrorCode PetscStrtolower(char a[]) 659e5c89e4eSSatish Balay { 660e5c89e4eSSatish Balay PetscFunctionBegin; 661e5c89e4eSSatish Balay while (*a) { 662e5c89e4eSSatish Balay if (*a >= 'A' && *a <= 'Z') *a += 'a' - 'A'; 663e5c89e4eSSatish Balay a++; 664e5c89e4eSSatish Balay } 665e5c89e4eSSatish Balay PetscFunctionReturn(0); 666e5c89e4eSSatish Balay } 667e5c89e4eSSatish Balay 6687ba3a57cSBarry Smith #undef __FUNCT__ 6692f234a98SBarry Smith #define __FUNCT__ "PetscStrtoupper" 6702f234a98SBarry Smith /*@C 6712f234a98SBarry Smith PetscStrtolower - Converts string to upper case 6722f234a98SBarry Smith 6732f234a98SBarry Smith Not Collective 6742f234a98SBarry Smith 6752f234a98SBarry Smith Input Parameters: 6762f234a98SBarry Smith . a - pointer to string 6772f234a98SBarry Smith 6782f234a98SBarry Smith Level: intermediate 6792f234a98SBarry Smith 6802f234a98SBarry Smith Notes: Not for use in Fortran 6812f234a98SBarry Smith 6822f234a98SBarry Smith @*/ 6832f234a98SBarry Smith PetscErrorCode PetscStrtoupper(char a[]) 6842f234a98SBarry Smith { 6852f234a98SBarry Smith PetscFunctionBegin; 6862f234a98SBarry Smith while (*a) { 6872f234a98SBarry Smith if (*a >= 'a' && *a <= 'z') *a += 'A' - 'a'; 6882f234a98SBarry Smith a++; 6892f234a98SBarry Smith } 6902f234a98SBarry Smith PetscFunctionReturn(0); 6912f234a98SBarry Smith } 6922f234a98SBarry Smith 6932f234a98SBarry Smith #undef __FUNCT__ 6947ba3a57cSBarry Smith #define __FUNCT__ "PetscStrendswith" 6957ba3a57cSBarry Smith /*@C 6967ba3a57cSBarry Smith PetscStrendswith - Determines if a string ends with a certain string 6971d1a0024SBarry Smith 6987ba3a57cSBarry Smith Not Collective 6997ba3a57cSBarry Smith 7007ba3a57cSBarry Smith Input Parameters: 7017ba3a57cSBarry Smith + a - pointer to string 7027ba3a57cSBarry Smith - b - string to endwith 7037ba3a57cSBarry Smith 7047ba3a57cSBarry Smith Output Parameter: 7057ba3a57cSBarry Smith . flg - PETSC_TRUE or PETSC_FALSE 7067ba3a57cSBarry Smith 7077ba3a57cSBarry Smith Notes: Not for use in Fortran 7087ba3a57cSBarry Smith 7097ba3a57cSBarry Smith Level: intermediate 7107ba3a57cSBarry Smith 7117ba3a57cSBarry Smith @*/ 7127ba3a57cSBarry Smith PetscErrorCode PetscStrendswith(const char a[],const char b[],PetscBool *flg) 7137ba3a57cSBarry Smith { 7147ba3a57cSBarry Smith char *test; 7157ba3a57cSBarry Smith PetscErrorCode ierr; 7167ba3a57cSBarry Smith size_t na,nb; 7177ba3a57cSBarry Smith 7187ba3a57cSBarry Smith PetscFunctionBegin; 7197ba3a57cSBarry Smith *flg = PETSC_FALSE; 7207ba3a57cSBarry Smith ierr = PetscStrrstr(a,b,&test);CHKERRQ(ierr); 7217ba3a57cSBarry Smith if (test) { 7227ba3a57cSBarry Smith ierr = PetscStrlen(a,&na);CHKERRQ(ierr); 7237ba3a57cSBarry Smith ierr = PetscStrlen(b,&nb);CHKERRQ(ierr); 7247ba3a57cSBarry Smith if (a+na-nb == test) *flg = PETSC_TRUE; 7257ba3a57cSBarry Smith } 7267ba3a57cSBarry Smith PetscFunctionReturn(0); 7277ba3a57cSBarry Smith } 7287ba3a57cSBarry Smith 7297ba3a57cSBarry Smith #undef __FUNCT__ 7302c9581d2SBarry Smith #define __FUNCT__ "PetscStrbeginswith" 7312c9581d2SBarry Smith /*@C 7322c9581d2SBarry Smith PetscStrbeginswith - Determines if a string begins with a certain string 7332c9581d2SBarry Smith 7342c9581d2SBarry Smith Not Collective 7352c9581d2SBarry Smith 7362c9581d2SBarry Smith Input Parameters: 7372c9581d2SBarry Smith + a - pointer to string 7382c9581d2SBarry Smith - b - string to beginwith 7392c9581d2SBarry Smith 7402c9581d2SBarry Smith Output Parameter: 7412c9581d2SBarry Smith . flg - PETSC_TRUE or PETSC_FALSE 7422c9581d2SBarry Smith 7432c9581d2SBarry Smith Notes: Not for use in Fortran 7442c9581d2SBarry Smith 7452c9581d2SBarry Smith Level: intermediate 7462c9581d2SBarry Smith 7472c9581d2SBarry Smith @*/ 7482c9581d2SBarry Smith PetscErrorCode PetscStrbeginswith(const char a[],const char b[],PetscBool *flg) 7492c9581d2SBarry Smith { 7502c9581d2SBarry Smith char *test; 7512c9581d2SBarry Smith PetscErrorCode ierr; 7522c9581d2SBarry Smith 7532c9581d2SBarry Smith PetscFunctionBegin; 7542c9581d2SBarry Smith *flg = PETSC_FALSE; 7552c9581d2SBarry Smith ierr = PetscStrrstr(a,b,&test);CHKERRQ(ierr); 756a297a907SKarl Rupp if (test && (test == a)) *flg = PETSC_TRUE; 7572c9581d2SBarry Smith PetscFunctionReturn(0); 7582c9581d2SBarry Smith } 7592c9581d2SBarry Smith 7602c9581d2SBarry Smith 7612c9581d2SBarry Smith #undef __FUNCT__ 7627ba3a57cSBarry Smith #define __FUNCT__ "PetscStrendswithwhich" 7637ba3a57cSBarry Smith /*@C 7647ba3a57cSBarry Smith PetscStrendswithwhich - Determines if a string ends with one of several possible strings 7657ba3a57cSBarry Smith 7667ba3a57cSBarry Smith Not Collective 7677ba3a57cSBarry Smith 7687ba3a57cSBarry Smith Input Parameters: 7697ba3a57cSBarry Smith + a - pointer to string 7707ba3a57cSBarry Smith - bs - strings to endwith (last entry must be null) 7717ba3a57cSBarry Smith 7727ba3a57cSBarry Smith Output Parameter: 7737ba3a57cSBarry Smith . cnt - the index of the string it ends with or 1+the last possible index 7747ba3a57cSBarry Smith 7757ba3a57cSBarry Smith Notes: Not for use in Fortran 7767ba3a57cSBarry Smith 7777ba3a57cSBarry Smith Level: intermediate 7787ba3a57cSBarry Smith 7797ba3a57cSBarry Smith @*/ 7807ba3a57cSBarry Smith PetscErrorCode PetscStrendswithwhich(const char a[],const char *const *bs,PetscInt *cnt) 7817ba3a57cSBarry Smith { 7827ba3a57cSBarry Smith PetscBool flg; 7837ba3a57cSBarry Smith PetscErrorCode ierr; 7847ba3a57cSBarry Smith 7857ba3a57cSBarry Smith PetscFunctionBegin; 7867ba3a57cSBarry Smith *cnt = 0; 7877ba3a57cSBarry Smith while (bs[*cnt]) { 7887ba3a57cSBarry Smith ierr = PetscStrendswith(a,bs[*cnt],&flg);CHKERRQ(ierr); 7897ba3a57cSBarry Smith if (flg) PetscFunctionReturn(0); 7907ba3a57cSBarry Smith *cnt += 1; 7917ba3a57cSBarry Smith } 7927ba3a57cSBarry Smith PetscFunctionReturn(0); 7937ba3a57cSBarry Smith } 7947ba3a57cSBarry Smith 7957ba3a57cSBarry Smith #undef __FUNCT__ 7967ba3a57cSBarry Smith #define __FUNCT__ "PetscStrrstr" 7977ba3a57cSBarry Smith /*@C 7987ba3a57cSBarry Smith PetscStrrstr - Locates last occurance of string in another string 7997ba3a57cSBarry Smith 8007ba3a57cSBarry Smith Not Collective 8017ba3a57cSBarry Smith 8027ba3a57cSBarry Smith Input Parameters: 8037ba3a57cSBarry Smith + a - pointer to string 8047ba3a57cSBarry Smith - b - string to find 8057ba3a57cSBarry Smith 8067ba3a57cSBarry Smith Output Parameter: 8077ba3a57cSBarry Smith . tmp - location of occurance 8087ba3a57cSBarry Smith 8097ba3a57cSBarry Smith Notes: Not for use in Fortran 8107ba3a57cSBarry Smith 8117ba3a57cSBarry Smith Level: intermediate 8127ba3a57cSBarry Smith 8137ba3a57cSBarry Smith @*/ 8147ba3a57cSBarry Smith PetscErrorCode PetscStrrstr(const char a[],const char b[],char *tmp[]) 8157ba3a57cSBarry Smith { 8167ba3a57cSBarry Smith const char *stmp = a, *ltmp = 0; 8177ba3a57cSBarry Smith 8187ba3a57cSBarry Smith PetscFunctionBegin; 8197ba3a57cSBarry Smith while (stmp) { 8207ba3a57cSBarry Smith stmp = (char*)strstr(stmp,b); 8217ba3a57cSBarry Smith if (stmp) {ltmp = stmp;stmp++;} 8227ba3a57cSBarry Smith } 8237ba3a57cSBarry Smith *tmp = (char*)ltmp; 8247ba3a57cSBarry Smith PetscFunctionReturn(0); 8257ba3a57cSBarry Smith } 8267ba3a57cSBarry Smith 8277ba3a57cSBarry Smith #undef __FUNCT__ 8287ba3a57cSBarry Smith #define __FUNCT__ "PetscStrstr" 8297ba3a57cSBarry Smith /*@C 8307ba3a57cSBarry Smith PetscStrstr - Locates first occurance of string in another string 8317ba3a57cSBarry Smith 8327ba3a57cSBarry Smith Not Collective 8337ba3a57cSBarry Smith 8347ba3a57cSBarry Smith Input Parameters: 835160f4796SJed Brown + haystack - string to search 836160f4796SJed Brown - needle - string to find 8377ba3a57cSBarry Smith 8387ba3a57cSBarry Smith Output Parameter: 8390298fd71SBarry Smith . tmp - location of occurance, is a NULL if the string is not found 8407ba3a57cSBarry Smith 8417ba3a57cSBarry Smith Notes: Not for use in Fortran 8427ba3a57cSBarry Smith 8437ba3a57cSBarry Smith Level: intermediate 8447ba3a57cSBarry Smith 8457ba3a57cSBarry Smith @*/ 846160f4796SJed Brown PetscErrorCode PetscStrstr(const char haystack[],const char needle[],char *tmp[]) 8477ba3a57cSBarry Smith { 8487ba3a57cSBarry Smith PetscFunctionBegin; 849160f4796SJed Brown *tmp = (char*)strstr(haystack,needle); 8507ba3a57cSBarry Smith PetscFunctionReturn(0); 8517ba3a57cSBarry Smith } 8527ba3a57cSBarry Smith 8537ba3a57cSBarry Smith struct _p_PetscToken {char token;char *array;char *current;}; 8541d1a0024SBarry Smith 855e5c89e4eSSatish Balay #undef __FUNCT__ 856e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenFind" 857e5c89e4eSSatish Balay /*@C 858e5c89e4eSSatish Balay PetscTokenFind - Locates next "token" in a string 859e5c89e4eSSatish Balay 860e5c89e4eSSatish Balay Not Collective 861e5c89e4eSSatish Balay 862e5c89e4eSSatish Balay Input Parameters: 863e5c89e4eSSatish Balay . a - pointer to token 864e5c89e4eSSatish Balay 865e5c89e4eSSatish Balay Output Parameter: 8660298fd71SBarry Smith . result - location of occurance, NULL if not found 867e5c89e4eSSatish Balay 868e5c89e4eSSatish Balay Notes: 869e5c89e4eSSatish Balay 870e5c89e4eSSatish Balay This version is different from the system version in that 871e5c89e4eSSatish Balay it allows you to pass a read-only string into the function. 872e5c89e4eSSatish Balay 8734704e885SBarry Smith This version also treats all characters etc. inside a double quote " 8744704e885SBarry Smith as a single token. 8754704e885SBarry Smith 8766f013253SBarry Smith Not for use in Fortran 8776f013253SBarry Smith 878e5c89e4eSSatish Balay Level: intermediate 879e5c89e4eSSatish Balay 8806f013253SBarry Smith 881e5c89e4eSSatish Balay .seealso: PetscTokenCreate(), PetscTokenDestroy() 882e5c89e4eSSatish Balay @*/ 8837087cfbeSBarry Smith PetscErrorCode PetscTokenFind(PetscToken a,char *result[]) 884e5c89e4eSSatish Balay { 8854704e885SBarry Smith char *ptr = a->current,token; 886e5c89e4eSSatish Balay 887e5c89e4eSSatish Balay PetscFunctionBegin; 888e5c89e4eSSatish Balay *result = a->current; 8894704e885SBarry Smith if (ptr && !*ptr) {*result = 0;PetscFunctionReturn(0);} 8904704e885SBarry Smith token = a->token; 89190fdf44cSMatthew Knepley if (ptr && (*ptr == '"')) {token = '"';(*result)++;ptr++;} 892e5c89e4eSSatish Balay while (ptr) { 8934704e885SBarry Smith if (*ptr == token) { 894e5c89e4eSSatish Balay *ptr++ = 0; 895e5c89e4eSSatish Balay while (*ptr == a->token) ptr++; 896e5c89e4eSSatish Balay a->current = ptr; 897e5c89e4eSSatish Balay break; 898e5c89e4eSSatish Balay } 899e5c89e4eSSatish Balay if (!*ptr) { 900e5c89e4eSSatish Balay a->current = 0; 901e5c89e4eSSatish Balay break; 902e5c89e4eSSatish Balay } 903e5c89e4eSSatish Balay ptr++; 904e5c89e4eSSatish Balay } 905e5c89e4eSSatish Balay PetscFunctionReturn(0); 906e5c89e4eSSatish Balay } 907e5c89e4eSSatish Balay 908e5c89e4eSSatish Balay #undef __FUNCT__ 909e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenCreate" 910e5c89e4eSSatish Balay /*@C 911e5c89e4eSSatish Balay PetscTokenCreate - Creates a PetscToken used to find tokens in a string 912e5c89e4eSSatish Balay 913e5c89e4eSSatish Balay Not Collective 914e5c89e4eSSatish Balay 915e5c89e4eSSatish Balay Input Parameters: 916e5c89e4eSSatish Balay + string - the string to look in 917e5c89e4eSSatish Balay - token - the character to look for 918e5c89e4eSSatish Balay 919e5c89e4eSSatish Balay Output Parameter: 920e5c89e4eSSatish Balay . a - pointer to token 921e5c89e4eSSatish Balay 922e5c89e4eSSatish Balay Notes: 923e5c89e4eSSatish Balay 924e5c89e4eSSatish Balay This version is different from the system version in that 925e5c89e4eSSatish Balay it allows you to pass a read-only string into the function. 926e5c89e4eSSatish Balay 9276f013253SBarry Smith Not for use in Fortran 9286f013253SBarry Smith 929e5c89e4eSSatish Balay Level: intermediate 930e5c89e4eSSatish Balay 931e5c89e4eSSatish Balay .seealso: PetscTokenFind(), PetscTokenDestroy() 932e5c89e4eSSatish Balay @*/ 9337087cfbeSBarry Smith PetscErrorCode PetscTokenCreate(const char a[],const char b,PetscToken *t) 934e5c89e4eSSatish Balay { 935e5c89e4eSSatish Balay PetscErrorCode ierr; 936e5c89e4eSSatish Balay 937e5c89e4eSSatish Balay PetscFunctionBegin; 938b00a9115SJed Brown ierr = PetscNew(t);CHKERRQ(ierr); 939e5c89e4eSSatish Balay ierr = PetscStrallocpy(a,&(*t)->array);CHKERRQ(ierr); 940a297a907SKarl Rupp 941e5c89e4eSSatish Balay (*t)->current = (*t)->array; 942e5c89e4eSSatish Balay (*t)->token = b; 943e5c89e4eSSatish Balay PetscFunctionReturn(0); 944e5c89e4eSSatish Balay } 945e5c89e4eSSatish Balay 946e5c89e4eSSatish Balay #undef __FUNCT__ 947e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenDestroy" 948e5c89e4eSSatish Balay /*@C 949e5c89e4eSSatish Balay PetscTokenDestroy - Destroys a PetscToken 950e5c89e4eSSatish Balay 951e5c89e4eSSatish Balay Not Collective 952e5c89e4eSSatish Balay 953e5c89e4eSSatish Balay Input Parameters: 954e5c89e4eSSatish Balay . a - pointer to token 955e5c89e4eSSatish Balay 956e5c89e4eSSatish Balay Level: intermediate 957e5c89e4eSSatish Balay 9586f013253SBarry Smith Notes: Not for use in Fortran 9596f013253SBarry Smith 960e5c89e4eSSatish Balay .seealso: PetscTokenCreate(), PetscTokenFind() 961e5c89e4eSSatish Balay @*/ 9628c74ee41SBarry Smith PetscErrorCode PetscTokenDestroy(PetscToken *a) 963e5c89e4eSSatish Balay { 964e5c89e4eSSatish Balay PetscErrorCode ierr; 965e5c89e4eSSatish Balay 966e5c89e4eSSatish Balay PetscFunctionBegin; 9678c74ee41SBarry Smith if (!*a) PetscFunctionReturn(0); 9688c74ee41SBarry Smith ierr = PetscFree((*a)->array);CHKERRQ(ierr); 9698c74ee41SBarry Smith ierr = PetscFree(*a);CHKERRQ(ierr); 970e5c89e4eSSatish Balay PetscFunctionReturn(0); 971e5c89e4eSSatish Balay } 972e5c89e4eSSatish Balay 973e5c89e4eSSatish Balay 974e5c89e4eSSatish Balay #undef __FUNCT__ 975e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetPetscDir" 976e5c89e4eSSatish Balay /*@C 977e5c89e4eSSatish Balay PetscGetPetscDir - Gets the directory PETSc is installed in 978e5c89e4eSSatish Balay 979e5c89e4eSSatish Balay Not Collective 980e5c89e4eSSatish Balay 981e5c89e4eSSatish Balay Output Parameter: 982e5c89e4eSSatish Balay . dir - the directory 983e5c89e4eSSatish Balay 984e5c89e4eSSatish Balay Level: developer 985e5c89e4eSSatish Balay 9866f013253SBarry Smith Notes: Not for use in Fortran 9876f013253SBarry Smith 988e5c89e4eSSatish Balay @*/ 9897087cfbeSBarry Smith PetscErrorCode PetscGetPetscDir(const char *dir[]) 990e5c89e4eSSatish Balay { 991e5c89e4eSSatish Balay PetscFunctionBegin; 992e5c89e4eSSatish Balay *dir = PETSC_DIR; 993e5c89e4eSSatish Balay PetscFunctionReturn(0); 994e5c89e4eSSatish Balay } 995e5c89e4eSSatish Balay 996e5c89e4eSSatish Balay #undef __FUNCT__ 997e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrreplace" 998e5c89e4eSSatish Balay /*@C 999e5c89e4eSSatish Balay PetscStrreplace - Replaces substrings in string with other substrings 1000e5c89e4eSSatish Balay 1001e5c89e4eSSatish Balay Not Collective 1002e5c89e4eSSatish Balay 1003e5c89e4eSSatish Balay Input Parameters: 1004e5c89e4eSSatish Balay + comm - MPI_Comm of processors that are processing the string 100571573d7dSBarry Smith . aa - the string to look in 1006d8ccf1fbSBarry Smith . b - the resulting copy of a with replaced strings (b can be the same as a) 1007e5c89e4eSSatish Balay - len - the length of b 1008e5c89e4eSSatish Balay 1009e5c89e4eSSatish Balay Notes: 1010e5c89e4eSSatish Balay Replaces ${PETSC_ARCH},${PETSC_DIR},${PETSC_LIB_DIR},${DISPLAY}, 1011d5649816SBarry Smith ${HOMEDIRECTORY},${WORKINGDIRECTORY},${USERNAME}, ${HOSTNAME} with appropriate values 1012e5c89e4eSSatish Balay as well as any environmental variables. 1013e5c89e4eSSatish Balay 10146f013253SBarry Smith PETSC_LIB_DIR uses the environmental variable if it exists. PETSC_ARCH and PETSC_DIR use what 1015acc6cc86SBarry Smith PETSc was built with and do not use environmental variables. 1016acc6cc86SBarry Smith 10176f013253SBarry Smith Not for use in Fortran 10186f013253SBarry Smith 1019e5c89e4eSSatish Balay Level: intermediate 1020e5c89e4eSSatish Balay 1021e5c89e4eSSatish Balay @*/ 10227087cfbeSBarry Smith PetscErrorCode PetscStrreplace(MPI_Comm comm,const char aa[],char b[],size_t len) 1023e5c89e4eSSatish Balay { 1024e5c89e4eSSatish Balay PetscErrorCode ierr; 1025e5c89e4eSSatish Balay int i = 0; 1026e5c89e4eSSatish Balay size_t l,l1,l2,l3; 102771573d7dSBarry Smith char *work,*par,*epar,env[1024],*tfree,*a = (char*)aa; 1028d5649816SBarry Smith const char *s[] = {"${PETSC_ARCH}","${PETSC_DIR}","${PETSC_LIB_DIR}","${DISPLAY}","${HOMEDIRECTORY}","${WORKINGDIRECTORY}","${USERNAME}","${HOSTNAME}",0}; 1029d5649816SBarry Smith const char *r[] = {0,0,0,0,0,0,0,0,0}; 1030ace3abfcSBarry Smith PetscBool flag; 1031e5c89e4eSSatish Balay 1032e5c89e4eSSatish Balay PetscFunctionBegin; 1033e32f2f54SBarry Smith if (!a || !b) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"a and b strings must be nonnull"); 103471573d7dSBarry Smith if (aa == b) { 103522982a5fSBarry Smith ierr = PetscStrallocpy(aa,(char**)&a);CHKERRQ(ierr); 103671573d7dSBarry Smith } 1037785e854fSJed Brown ierr = PetscMalloc1(len,&work);CHKERRQ(ierr); 1038e5c89e4eSSatish Balay 1039e5c89e4eSSatish Balay /* get values for replaced variables */ 1040487e5849SBarry Smith ierr = PetscStrallocpy(PETSC_ARCH,(char**)&r[0]);CHKERRQ(ierr); 1041487e5849SBarry Smith ierr = PetscStrallocpy(PETSC_DIR,(char**)&r[1]);CHKERRQ(ierr); 1042487e5849SBarry Smith ierr = PetscStrallocpy(PETSC_LIB_DIR,(char**)&r[2]);CHKERRQ(ierr); 1043785e854fSJed Brown ierr = PetscMalloc1(256,&r[3]);CHKERRQ(ierr); 1044785e854fSJed Brown ierr = PetscMalloc1(PETSC_MAX_PATH_LEN,&r[4]);CHKERRQ(ierr); 1045785e854fSJed Brown ierr = PetscMalloc1(PETSC_MAX_PATH_LEN,&r[5]);CHKERRQ(ierr); 1046785e854fSJed Brown ierr = PetscMalloc1(256,&r[6]);CHKERRQ(ierr); 1047785e854fSJed Brown ierr = PetscMalloc1(256,&r[7]);CHKERRQ(ierr); 1048487e5849SBarry Smith ierr = PetscGetDisplay((char*)r[3],256);CHKERRQ(ierr); 1049487e5849SBarry Smith ierr = PetscGetHomeDirectory((char*)r[4],PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 1050487e5849SBarry Smith ierr = PetscGetWorkingDirectory((char*)r[5],PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 1051487e5849SBarry Smith ierr = PetscGetUserName((char*)r[6],256);CHKERRQ(ierr); 1052d5649816SBarry Smith ierr = PetscGetHostName((char*)r[7],256);CHKERRQ(ierr); 1053487e5849SBarry Smith 1054487e5849SBarry Smith /* replace that are in environment */ 1055487e5849SBarry Smith ierr = PetscOptionsGetenv(comm,"PETSC_LIB_DIR",env,1024,&flag);CHKERRQ(ierr); 1056487e5849SBarry Smith if (flag) { 105731936d58SMatthew G. Knepley ierr = PetscFree(r[2]);CHKERRQ(ierr); 1058487e5849SBarry Smith ierr = PetscStrallocpy(env,(char**)&r[2]);CHKERRQ(ierr); 1059487e5849SBarry Smith } 1060e5c89e4eSSatish Balay 1061e5c89e4eSSatish Balay /* replace the requested strings */ 1062e5c89e4eSSatish Balay ierr = PetscStrncpy(b,a,len);CHKERRQ(ierr); 1063e5c89e4eSSatish Balay while (s[i]) { 1064e5c89e4eSSatish Balay ierr = PetscStrlen(s[i],&l);CHKERRQ(ierr); 1065e5c89e4eSSatish Balay ierr = PetscStrstr(b,s[i],&par);CHKERRQ(ierr); 1066e5c89e4eSSatish Balay while (par) { 1067e5c89e4eSSatish Balay *par = 0; 1068e5c89e4eSSatish Balay par += l; 1069e5c89e4eSSatish Balay 1070e5c89e4eSSatish Balay ierr = PetscStrlen(b,&l1);CHKERRQ(ierr); 1071e5c89e4eSSatish Balay ierr = PetscStrlen(r[i],&l2);CHKERRQ(ierr); 1072e5c89e4eSSatish Balay ierr = PetscStrlen(par,&l3);CHKERRQ(ierr); 107317186662SBarry Smith if (l1 + l2 + l3 >= len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"b len is not long enough to hold new values"); 1074e5c89e4eSSatish Balay ierr = PetscStrcpy(work,b);CHKERRQ(ierr); 1075e5c89e4eSSatish Balay ierr = PetscStrcat(work,r[i]);CHKERRQ(ierr); 1076e5c89e4eSSatish Balay ierr = PetscStrcat(work,par);CHKERRQ(ierr); 1077e5c89e4eSSatish Balay ierr = PetscStrncpy(b,work,len);CHKERRQ(ierr); 1078e5c89e4eSSatish Balay ierr = PetscStrstr(b,s[i],&par);CHKERRQ(ierr); 1079e5c89e4eSSatish Balay } 1080e5c89e4eSSatish Balay i++; 1081e5c89e4eSSatish Balay } 1082487e5849SBarry Smith i = 0; 1083487e5849SBarry Smith while (r[i]) { 1084e5c89e4eSSatish Balay tfree = (char*)r[i]; 1085e5c89e4eSSatish Balay ierr = PetscFree(tfree);CHKERRQ(ierr); 1086487e5849SBarry Smith i++; 1087e5c89e4eSSatish Balay } 1088e5c89e4eSSatish Balay 1089e5c89e4eSSatish Balay /* look for any other ${xxx} strings to replace from environmental variables */ 1090e5c89e4eSSatish Balay ierr = PetscStrstr(b,"${",&par);CHKERRQ(ierr); 1091e5c89e4eSSatish Balay while (par) { 1092e5c89e4eSSatish Balay *par = 0; 1093e5c89e4eSSatish Balay par += 2; 1094e5c89e4eSSatish Balay ierr = PetscStrcpy(work,b);CHKERRQ(ierr); 1095e5c89e4eSSatish Balay ierr = PetscStrstr(par,"}",&epar);CHKERRQ(ierr); 1096e5c89e4eSSatish Balay *epar = 0; 1097e5c89e4eSSatish Balay epar += 1; 1098e5c89e4eSSatish Balay ierr = PetscOptionsGetenv(comm,par,env,256,&flag);CHKERRQ(ierr); 10997ba3a57cSBarry Smith if (!flag) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Substitution string ${%s} not found as environmental variable",par); 1100e5c89e4eSSatish Balay ierr = PetscStrcat(work,env);CHKERRQ(ierr); 1101e5c89e4eSSatish Balay ierr = PetscStrcat(work,epar);CHKERRQ(ierr); 1102e5c89e4eSSatish Balay ierr = PetscStrcpy(b,work);CHKERRQ(ierr); 1103e5c89e4eSSatish Balay ierr = PetscStrstr(b,"${",&par);CHKERRQ(ierr); 1104e5c89e4eSSatish Balay } 1105e5c89e4eSSatish Balay ierr = PetscFree(work);CHKERRQ(ierr); 110671573d7dSBarry Smith if (aa == b) { 110771573d7dSBarry Smith ierr = PetscFree(a);CHKERRQ(ierr); 110871573d7dSBarry Smith } 1109e5c89e4eSSatish Balay PetscFunctionReturn(0); 1110e5c89e4eSSatish Balay } 1111e5c89e4eSSatish Balay 1112a53986e1SJed Brown #undef __FUNCT__ 1113a53986e1SJed Brown #define __FUNCT__ "PetscEListFind" 1114a53986e1SJed Brown /*@C 1115a53986e1SJed Brown PetscEListFind - searches list of strings for given string, using case insensitive matching 1116e5c89e4eSSatish Balay 1117a53986e1SJed Brown Not Collective 1118a53986e1SJed Brown 1119a53986e1SJed Brown Input Parameters: 1120a53986e1SJed Brown + n - number of strings in 1121a53986e1SJed Brown . list - list of strings to search 1122a53986e1SJed Brown - str - string to look for, empty string "" accepts default (first entry in list) 1123a53986e1SJed Brown 1124a53986e1SJed Brown Output Parameters: 1125a53986e1SJed Brown + value - index of matching string (if found) 1126a53986e1SJed Brown - found - boolean indicating whether string was found (can be NULL) 1127a53986e1SJed Brown 1128a53986e1SJed Brown Notes: 1129a53986e1SJed Brown Not for use in Fortran 1130a53986e1SJed Brown 1131a53986e1SJed Brown Level: advanced 1132a53986e1SJed Brown @*/ 1133a53986e1SJed Brown PetscErrorCode PetscEListFind(PetscInt n,const char *const *list,const char *str,PetscInt *value,PetscBool *found) 1134a53986e1SJed Brown { 1135a53986e1SJed Brown PetscErrorCode ierr; 1136a53986e1SJed Brown PetscBool matched; 1137a53986e1SJed Brown PetscInt i; 1138a53986e1SJed Brown 1139a53986e1SJed Brown PetscFunctionBegin; 1140a53986e1SJed Brown if (found) *found = PETSC_FALSE; 1141a53986e1SJed Brown for (i=0; i<n; i++) { 1142a53986e1SJed Brown ierr = PetscStrcasecmp(str,list[i],&matched);CHKERRQ(ierr); 1143a53986e1SJed Brown if (matched || !str[0]) { 1144a53986e1SJed Brown if (found) *found = PETSC_TRUE; 1145a53986e1SJed Brown *value = i; 1146a53986e1SJed Brown break; 1147a53986e1SJed Brown } 1148a53986e1SJed Brown } 1149a53986e1SJed Brown PetscFunctionReturn(0); 1150a53986e1SJed Brown } 1151a53986e1SJed Brown 1152a53986e1SJed Brown #undef __FUNCT__ 1153a53986e1SJed Brown #define __FUNCT__ "PetscEnumFind" 1154a53986e1SJed Brown /*@C 1155a53986e1SJed Brown PetscEListFind - searches enum list of strings for given string, using case insensitive matching 1156a53986e1SJed Brown 1157a53986e1SJed Brown Not Collective 1158a53986e1SJed Brown 1159a53986e1SJed Brown Input Parameters: 1160a53986e1SJed Brown + enumlist - list of strings to search, followed by enum name, then enum prefix, then NUL 1161a53986e1SJed Brown - str - string to look for 1162a53986e1SJed Brown 1163a53986e1SJed Brown Output Parameters: 1164a53986e1SJed Brown + value - index of matching string (if found) 1165a53986e1SJed Brown - found - boolean indicating whether string was found (can be NULL) 1166a53986e1SJed Brown 1167a53986e1SJed Brown Notes: 1168a53986e1SJed Brown Not for use in Fortran 1169a53986e1SJed Brown 1170a53986e1SJed Brown Level: advanced 1171a53986e1SJed Brown @*/ 1172a53986e1SJed Brown PetscErrorCode PetscEnumFind(const char *const *enumlist,const char *str,PetscEnum *value,PetscBool *found) 1173a53986e1SJed Brown { 1174a53986e1SJed Brown PetscErrorCode ierr; 1175*d05ba7d2SLisandro Dalcin PetscInt n = 0,evalue; 1176a53986e1SJed Brown PetscBool efound; 1177a53986e1SJed Brown 1178a53986e1SJed Brown PetscFunctionBegin; 1179*d05ba7d2SLisandro Dalcin while (enumlist[n++]) if (n > 50) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries"); 1180a53986e1SJed Brown if (n < 3) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix"); 1181a53986e1SJed Brown n -= 3; /* drop enum name, prefix, and null termination */ 1182a53986e1SJed Brown ierr = PetscEListFind(n,enumlist,str,&evalue,&efound);CHKERRQ(ierr); 1183cfb463b1SJed Brown if (efound) *value = (PetscEnum)evalue; 1184a53986e1SJed Brown if (found) *found = efound; 1185a53986e1SJed Brown PetscFunctionReturn(0); 1186a53986e1SJed Brown } 1187