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