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 103964eb88SJed Brown #if defined(PETSC_HAVE_STRINGS_H) 113964eb88SJed Brown # include <strings.h> /* strcasecmp */ 123964eb88SJed Brown #endif 133964eb88SJed Brown 14e5c89e4eSSatish Balay #undef __FUNCT__ 153c311c98SBarry Smith #define __FUNCT__ "PetscStrToArray" 163c311c98SBarry Smith /*@C 17d67fe73bSBarry Smith PetscStrToArray - Seperates a string by a charactor (for example ' ' or '\n') and creates an array of strings 183c311c98SBarry Smith 193c311c98SBarry Smith Not Collective 203c311c98SBarry Smith 213c311c98SBarry Smith Input Parameters: 22d67fe73bSBarry Smith + s - pointer to string 23a2ea699eSBarry Smith - sp - separator charactor 243c311c98SBarry Smith 253c311c98SBarry Smith Output Parameter: 263c311c98SBarry Smith + argc - the number of entries in the array 273c311c98SBarry Smith - args - an array of the entries with a null at the end 283c311c98SBarry Smith 293c311c98SBarry Smith Level: intermediate 303c311c98SBarry Smith 31301d30feSBarry Smith Notes: this may be called before PetscInitialize() or after PetscFinalize() 323c311c98SBarry Smith 336f013253SBarry Smith Not for use in Fortran 346f013253SBarry Smith 35b4cd4cebSBarry Smith Developer Notes: Using raw malloc() and does not call error handlers since this may be used before PETSc is initialized. Used 36b4cd4cebSBarry Smith to generate argc, args arguments passed to MPI_Init() 37301d30feSBarry Smith 38b4cd4cebSBarry Smith .seealso: PetscStrToArrayDestroy(), PetscToken, PetscTokenCreate() 393c311c98SBarry Smith 403c311c98SBarry Smith @*/ 41d67fe73bSBarry Smith PetscErrorCode PetscStrToArray(const char s[],char sp,int *argc,char ***args) 423c311c98SBarry Smith { 433c311c98SBarry Smith int i,n,*lens,cnt = 0; 44ace3abfcSBarry Smith PetscBool flg = PETSC_FALSE; 453c311c98SBarry Smith 4640a7e1efSBarry Smith if (!s) n = 0; 4740a7e1efSBarry Smith else n = strlen(s); 483c311c98SBarry Smith *argc = 0; 494996c5bdSBarry Smith if (!n) { 504996c5bdSBarry Smith *args = 0; 514996c5bdSBarry Smith return(0); 524996c5bdSBarry Smith } 533c311c98SBarry Smith for (i=0; i<n; i++) { 54d67fe73bSBarry Smith if (s[i] != sp) break; 553c311c98SBarry Smith } 563c311c98SBarry Smith for (;i<n+1; i++) { 57d67fe73bSBarry Smith if ((s[i] == sp || s[i] == 0) && !flg) {flg = PETSC_TRUE; (*argc)++;} 58d67fe73bSBarry Smith else if (s[i] != sp) {flg = PETSC_FALSE;} 593c311c98SBarry Smith } 60a2ea699eSBarry Smith (*args) = (char**) malloc(((*argc)+1)*sizeof(char*)); if (!*args) return PETSC_ERR_MEM; 6153e6e2c4SHong Zhang lens = (int*) malloc((*argc)*sizeof(int)); if (!lens) return PETSC_ERR_MEM; 623c311c98SBarry Smith for (i=0; i<*argc; i++) lens[i] = 0; 633c311c98SBarry Smith 643c311c98SBarry Smith *argc = 0; 653c311c98SBarry Smith for (i=0; i<n; i++) { 66d67fe73bSBarry Smith if (s[i] != sp) break; 673c311c98SBarry Smith } 683c311c98SBarry Smith for (;i<n+1; i++) { 69d67fe73bSBarry Smith if ((s[i] == sp || s[i] == 0) && !flg) {flg = PETSC_TRUE; (*argc)++;} 70d67fe73bSBarry Smith else if (s[i] != sp) {lens[*argc]++;flg = PETSC_FALSE;} 713c311c98SBarry Smith } 723c311c98SBarry Smith 733c311c98SBarry Smith for (i=0; i<*argc; i++) { 74675282fdSHong Zhang (*args)[i] = (char*) malloc((lens[i]+1)*sizeof(char)); if (!(*args)[i]) return PETSC_ERR_MEM; 753c311c98SBarry Smith } 76a2ea699eSBarry Smith free(lens); 77301d30feSBarry Smith (*args)[*argc] = 0; 783c311c98SBarry Smith 793c311c98SBarry Smith *argc = 0; 803c311c98SBarry Smith for (i=0; i<n; i++) { 81d67fe73bSBarry Smith if (s[i] != sp) break; 823c311c98SBarry Smith } 833c311c98SBarry Smith for (;i<n+1; i++) { 84d67fe73bSBarry Smith if ((s[i] == sp || s[i] == 0) && !flg) {flg = PETSC_TRUE; (*args)[*argc][cnt++] = 0; (*argc)++; cnt = 0;} 85d67fe73bSBarry Smith else if (s[i] != sp && s[i] != 0) {(*args)[*argc][cnt++] = s[i]; flg = PETSC_FALSE;} 863c311c98SBarry Smith } 873c311c98SBarry Smith return 0; 883c311c98SBarry Smith } 893c311c98SBarry Smith 903c311c98SBarry Smith #undef __FUNCT__ 91301d30feSBarry Smith #define __FUNCT__ "PetscStrToArrayDestroy" 92301d30feSBarry Smith /*@C 93301d30feSBarry Smith PetscStrToArrayDestroy - Frees array created with PetscStrToArray(). 94301d30feSBarry Smith 95301d30feSBarry Smith Not Collective 96301d30feSBarry Smith 97301d30feSBarry Smith Output Parameters: 98301d30feSBarry Smith + argc - the number of arguments 99301d30feSBarry Smith - args - the array of arguments 100301d30feSBarry Smith 101301d30feSBarry Smith Level: intermediate 102301d30feSBarry Smith 103301d30feSBarry Smith Concepts: command line arguments 104301d30feSBarry Smith 105301d30feSBarry Smith Notes: This may be called before PetscInitialize() or after PetscFinalize() 106301d30feSBarry Smith 1076f013253SBarry Smith Not for use in Fortran 1086f013253SBarry Smith 109301d30feSBarry Smith .seealso: PetscStrToArray() 110301d30feSBarry Smith 111301d30feSBarry Smith @*/ 1127087cfbeSBarry Smith PetscErrorCode PetscStrToArrayDestroy(int argc,char **args) 113301d30feSBarry Smith { 114301d30feSBarry Smith PetscInt i; 115301d30feSBarry Smith 116a297a907SKarl Rupp for (i=0; i<argc; i++) free(args[i]); 117a297a907SKarl Rupp if (args) free(args); 118301d30feSBarry Smith return 0; 119301d30feSBarry Smith } 120301d30feSBarry Smith 121301d30feSBarry Smith #undef __FUNCT__ 122e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrlen" 123e5c89e4eSSatish Balay /*@C 124e5c89e4eSSatish Balay PetscStrlen - Gets length of a string 125e5c89e4eSSatish Balay 126e5c89e4eSSatish Balay Not Collective 127e5c89e4eSSatish Balay 128e5c89e4eSSatish Balay Input Parameters: 129e5c89e4eSSatish Balay . s - pointer to string 130e5c89e4eSSatish Balay 131e5c89e4eSSatish Balay Output Parameter: 132e5c89e4eSSatish Balay . len - length in bytes 133e5c89e4eSSatish Balay 134e5c89e4eSSatish Balay Level: intermediate 135e5c89e4eSSatish Balay 136e5c89e4eSSatish Balay Note: 137e5c89e4eSSatish Balay This routine is analogous to strlen(). 138e5c89e4eSSatish Balay 139e5c89e4eSSatish Balay Null string returns a length of zero 140e5c89e4eSSatish Balay 1416f013253SBarry Smith Not for use in Fortran 1426f013253SBarry Smith 143e5c89e4eSSatish Balay Concepts: string length 144e5c89e4eSSatish Balay 145e5c89e4eSSatish Balay @*/ 1467087cfbeSBarry Smith PetscErrorCode PetscStrlen(const char s[],size_t *len) 147e5c89e4eSSatish Balay { 148e5c89e4eSSatish Balay PetscFunctionBegin; 149a297a907SKarl Rupp if (!s) *len = 0; 150a297a907SKarl Rupp else *len = strlen(s); 151e5c89e4eSSatish Balay PetscFunctionReturn(0); 152e5c89e4eSSatish Balay } 153e5c89e4eSSatish Balay 154e5c89e4eSSatish Balay #undef __FUNCT__ 155e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrallocpy" 156e5c89e4eSSatish Balay /*@C 157e5c89e4eSSatish Balay PetscStrallocpy - Allocates space to hold a copy of a string then copies the string 158e5c89e4eSSatish Balay 159e5c89e4eSSatish Balay Not Collective 160e5c89e4eSSatish Balay 161e5c89e4eSSatish Balay Input Parameters: 162e5c89e4eSSatish Balay . s - pointer to string 163e5c89e4eSSatish Balay 164e5c89e4eSSatish Balay Output Parameter: 165e5c89e4eSSatish Balay . t - the copied string 166e5c89e4eSSatish Balay 167e5c89e4eSSatish Balay Level: intermediate 168e5c89e4eSSatish Balay 169e5c89e4eSSatish Balay Note: 170e5c89e4eSSatish Balay Null string returns a new null string 171e5c89e4eSSatish Balay 1726f013253SBarry Smith Not for use in Fortran 1736f013253SBarry Smith 174e5c89e4eSSatish Balay Concepts: string copy 175e5c89e4eSSatish Balay 176e5c89e4eSSatish Balay @*/ 1777087cfbeSBarry Smith PetscErrorCode PetscStrallocpy(const char s[],char *t[]) 178e5c89e4eSSatish Balay { 179e5c89e4eSSatish Balay PetscErrorCode ierr; 180e5c89e4eSSatish Balay size_t len; 18171573d7dSBarry Smith char *tmp = 0; 182e5c89e4eSSatish Balay 183e5c89e4eSSatish Balay PetscFunctionBegin; 184e5c89e4eSSatish Balay if (s) { 185e5c89e4eSSatish Balay ierr = PetscStrlen(s,&len);CHKERRQ(ierr); 18671573d7dSBarry Smith ierr = PetscMalloc((1+len)*sizeof(char),&tmp);CHKERRQ(ierr); 18771573d7dSBarry Smith ierr = PetscStrcpy(tmp,s);CHKERRQ(ierr); 188e5c89e4eSSatish Balay } 18971573d7dSBarry Smith *t = tmp; 190e5c89e4eSSatish Balay PetscFunctionReturn(0); 191e5c89e4eSSatish Balay } 192e5c89e4eSSatish Balay 193e5c89e4eSSatish Balay #undef __FUNCT__ 19447340559SBarry Smith #define __FUNCT__ "PetscStrArrayallocpy" 19547340559SBarry Smith /*@C 19647340559SBarry Smith PetscStrArrayallocpy - Allocates space to hold a copy of an array of strings then copies the strings 19747340559SBarry Smith 19847340559SBarry Smith Not Collective 19947340559SBarry Smith 20047340559SBarry Smith Input Parameters: 20147340559SBarry Smith . s - pointer to array of strings (final string is a null) 20247340559SBarry Smith 20347340559SBarry Smith Output Parameter: 20447340559SBarry Smith . t - the copied array string 20547340559SBarry Smith 20647340559SBarry Smith Level: intermediate 20747340559SBarry Smith 20847340559SBarry Smith Note: 20947340559SBarry Smith Not for use in Fortran 21047340559SBarry Smith 21147340559SBarry Smith Concepts: string copy 21247340559SBarry Smith 21347340559SBarry Smith .seealso: PetscStrallocpy() PetscStrArrayDestroy() 21447340559SBarry Smith 21547340559SBarry Smith @*/ 21647340559SBarry Smith PetscErrorCode PetscStrArrayallocpy(const char *const *list,char ***t) 21747340559SBarry Smith { 21847340559SBarry Smith PetscErrorCode ierr; 21947340559SBarry Smith PetscInt i,n = 0; 22047340559SBarry Smith 22147340559SBarry Smith PetscFunctionBegin; 22247340559SBarry Smith while (list[n++]) ; 22347340559SBarry Smith ierr = PetscMalloc((n+1)*sizeof(char**),t);CHKERRQ(ierr); 22447340559SBarry Smith for (i=0; i<n; i++) { 22547340559SBarry Smith ierr = PetscStrallocpy(list[i],(*t)+i);CHKERRQ(ierr); 22647340559SBarry Smith } 2270298fd71SBarry Smith (*t)[n] = NULL; 22847340559SBarry Smith PetscFunctionReturn(0); 22947340559SBarry Smith } 23047340559SBarry Smith 23147340559SBarry Smith #undef __FUNCT__ 23247340559SBarry Smith #define __FUNCT__ "PetscStrArrayDestroy" 23347340559SBarry Smith /*@C 23447340559SBarry Smith PetscStrArrayDestroy - Frees array of strings created with PetscStrArrayallocpy(). 23547340559SBarry Smith 23647340559SBarry Smith Not Collective 23747340559SBarry Smith 23847340559SBarry Smith Output Parameters: 23947340559SBarry Smith . list - array of strings 24047340559SBarry Smith 24147340559SBarry Smith Level: intermediate 24247340559SBarry Smith 24347340559SBarry Smith Concepts: command line arguments 24447340559SBarry Smith 24547340559SBarry Smith Notes: Not for use in Fortran 24647340559SBarry Smith 24747340559SBarry Smith .seealso: PetscStrArrayallocpy() 24847340559SBarry Smith 24947340559SBarry Smith @*/ 2506fed8037SJed Brown PetscErrorCode PetscStrArrayDestroy(char ***list) 25147340559SBarry Smith { 25247340559SBarry Smith PetscInt n = 0; 25347340559SBarry Smith PetscErrorCode ierr; 25447340559SBarry Smith 2556fed8037SJed Brown PetscFunctionBegin; 2566fed8037SJed Brown if (!*list) PetscFunctionReturn(0); 2576fed8037SJed Brown while ((*list)[n]) { 2586fed8037SJed Brown ierr = PetscFree((*list)[n]);CHKERRQ(ierr); 25947340559SBarry Smith n++; 26047340559SBarry Smith } 2616fed8037SJed Brown ierr = PetscFree(*list);CHKERRQ(ierr); 2626fed8037SJed Brown PetscFunctionReturn(0); 26347340559SBarry Smith } 26447340559SBarry Smith 26547340559SBarry Smith #undef __FUNCT__ 266e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcpy" 267e5c89e4eSSatish Balay /*@C 268e5c89e4eSSatish Balay PetscStrcpy - Copies a string 269e5c89e4eSSatish Balay 270e5c89e4eSSatish Balay Not Collective 271e5c89e4eSSatish Balay 272e5c89e4eSSatish Balay Input Parameters: 273e5c89e4eSSatish Balay . t - pointer to string 274e5c89e4eSSatish Balay 275e5c89e4eSSatish Balay Output Parameter: 276e5c89e4eSSatish Balay . s - the copied string 277e5c89e4eSSatish Balay 278e5c89e4eSSatish Balay Level: intermediate 279e5c89e4eSSatish Balay 2806f013253SBarry Smith Notes: 281e5c89e4eSSatish Balay Null string returns a string starting with zero 282e5c89e4eSSatish Balay 2836f013253SBarry Smith Not for use in Fortran 2846f013253SBarry Smith 285e5c89e4eSSatish Balay Concepts: string copy 286e5c89e4eSSatish Balay 287e5c89e4eSSatish Balay .seealso: PetscStrncpy(), PetscStrcat(), PetscStrncat() 288e5c89e4eSSatish Balay 289e5c89e4eSSatish Balay @*/ 290acc6cc86SBarry Smith 2917087cfbeSBarry Smith PetscErrorCode PetscStrcpy(char s[],const char t[]) 292e5c89e4eSSatish Balay { 293e5c89e4eSSatish Balay PetscFunctionBegin; 29417186662SBarry Smith if (t && !s) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy string into null pointer"); 295a297a907SKarl Rupp if (t) strcpy(s,t); 296a297a907SKarl Rupp else if (s) s[0] = 0; 297e5c89e4eSSatish Balay PetscFunctionReturn(0); 298e5c89e4eSSatish Balay } 299e5c89e4eSSatish Balay 300e5c89e4eSSatish Balay #undef __FUNCT__ 301e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncpy" 302e5c89e4eSSatish Balay /*@C 303e5c89e4eSSatish Balay PetscStrncpy - Copies a string up to a certain length 304e5c89e4eSSatish Balay 305e5c89e4eSSatish Balay Not Collective 306e5c89e4eSSatish Balay 307e5c89e4eSSatish Balay Input Parameters: 308e5c89e4eSSatish Balay + t - pointer to string 309e5c89e4eSSatish Balay - n - the length to copy 310e5c89e4eSSatish Balay 311e5c89e4eSSatish Balay Output Parameter: 312e5c89e4eSSatish Balay . s - the copied string 313e5c89e4eSSatish Balay 314e5c89e4eSSatish Balay Level: intermediate 315e5c89e4eSSatish Balay 316e5c89e4eSSatish Balay Note: 317e5c89e4eSSatish Balay Null string returns a string starting with zero 318e5c89e4eSSatish Balay 319e5c89e4eSSatish Balay Concepts: string copy 320e5c89e4eSSatish Balay 321e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrcat(), PetscStrncat() 322e5c89e4eSSatish Balay 323e5c89e4eSSatish Balay @*/ 3247087cfbeSBarry Smith PetscErrorCode PetscStrncpy(char s[],const char t[],size_t n) 325e5c89e4eSSatish Balay { 326e5c89e4eSSatish Balay PetscFunctionBegin; 32717186662SBarry Smith if (t && !s) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy string into null pointer"); 328a297a907SKarl Rupp if (t) strncpy(s,t,n); 329a297a907SKarl Rupp else if (s) s[0] = 0; 330e5c89e4eSSatish Balay PetscFunctionReturn(0); 331e5c89e4eSSatish Balay } 332e5c89e4eSSatish Balay 333e5c89e4eSSatish Balay #undef __FUNCT__ 334e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcat" 335e5c89e4eSSatish Balay /*@C 336e5c89e4eSSatish Balay PetscStrcat - Concatenates a string onto a given string 337e5c89e4eSSatish Balay 338e5c89e4eSSatish Balay Not Collective 339e5c89e4eSSatish Balay 340e5c89e4eSSatish Balay Input Parameters: 341e5e2177aSMatthew Knepley + s - string to be added to 342e5e2177aSMatthew Knepley - t - pointer to string to be added to end 343e5c89e4eSSatish Balay 344e5c89e4eSSatish Balay Level: intermediate 345e5c89e4eSSatish Balay 3466f013253SBarry Smith Notes: Not for use in Fortran 3476f013253SBarry Smith 348e5c89e4eSSatish Balay Concepts: string copy 349e5c89e4eSSatish Balay 350e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrncpy(), PetscStrncat() 351e5c89e4eSSatish Balay 352e5c89e4eSSatish Balay @*/ 3537087cfbeSBarry Smith PetscErrorCode PetscStrcat(char s[],const char t[]) 354e5c89e4eSSatish Balay { 355e5c89e4eSSatish Balay PetscFunctionBegin; 3569b754dc9SBarry Smith if (!t) PetscFunctionReturn(0); 357e5c89e4eSSatish Balay strcat(s,t); 358e5c89e4eSSatish Balay PetscFunctionReturn(0); 359e5c89e4eSSatish Balay } 360e5c89e4eSSatish Balay 361e5c89e4eSSatish Balay #undef __FUNCT__ 362e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncat" 363e5c89e4eSSatish Balay /*@C 364e5c89e4eSSatish Balay PetscStrncat - Concatenates a string onto a given string, up to a given length 365e5c89e4eSSatish Balay 366e5c89e4eSSatish Balay Not Collective 367e5c89e4eSSatish Balay 368e5c89e4eSSatish Balay Input Parameters: 369e5c89e4eSSatish Balay + s - pointer to string to be added to end 370e5c89e4eSSatish Balay . t - string to be added to 371e5c89e4eSSatish Balay . n - maximum length to copy 372e5c89e4eSSatish Balay 373e5c89e4eSSatish Balay Level: intermediate 374e5c89e4eSSatish Balay 3756f013253SBarry Smith Notes: Not for use in Fortran 3766f013253SBarry Smith 377e5c89e4eSSatish Balay Concepts: string copy 378e5c89e4eSSatish Balay 379e5c89e4eSSatish Balay .seealso: PetscStrcpy(), PetscStrncpy(), PetscStrcat() 380e5c89e4eSSatish Balay 381e5c89e4eSSatish Balay @*/ 3827087cfbeSBarry Smith PetscErrorCode PetscStrncat(char s[],const char t[],size_t n) 383e5c89e4eSSatish Balay { 384e5c89e4eSSatish Balay PetscFunctionBegin; 385e5c89e4eSSatish Balay strncat(s,t,n); 386e5c89e4eSSatish Balay PetscFunctionReturn(0); 387e5c89e4eSSatish Balay } 388e5c89e4eSSatish Balay 389e5c89e4eSSatish Balay #undef __FUNCT__ 390573b0fb4SBarry Smith #define __FUNCT__ "PetscStrcmpNoError" 391573b0fb4SBarry Smith /* 392573b0fb4SBarry Smith Only to be used with PetscCheck__FUNCT__()! 393573b0fb4SBarry Smith 394573b0fb4SBarry Smith Will be removed once we eliminate the __FUNCT__ paradigm 395573b0fb4SBarry Smith */ 396573b0fb4SBarry Smith void PetscStrcmpNoError(const char a[],const char b[],PetscBool *flg) 397573b0fb4SBarry Smith { 398573b0fb4SBarry Smith int c; 399573b0fb4SBarry Smith 400573b0fb4SBarry Smith if (!a && !b) *flg = PETSC_TRUE; 401573b0fb4SBarry Smith else if (!a || !b) *flg = PETSC_FALSE; 402573b0fb4SBarry Smith else { 403573b0fb4SBarry Smith c = strcmp(a,b); 404573b0fb4SBarry Smith if (c) *flg = PETSC_FALSE; 405573b0fb4SBarry Smith else *flg = PETSC_TRUE; 406573b0fb4SBarry Smith } 407573b0fb4SBarry Smith } 408573b0fb4SBarry Smith 409573b0fb4SBarry Smith #undef __FUNCT__ 410e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcmp" 411e5c89e4eSSatish Balay /*@C 412e5c89e4eSSatish Balay PetscStrcmp - Compares two strings, 413e5c89e4eSSatish Balay 414e5c89e4eSSatish Balay Not Collective 415e5c89e4eSSatish Balay 416e5c89e4eSSatish Balay Input Parameters: 417e5c89e4eSSatish Balay + a - pointer to string first string 418e5c89e4eSSatish Balay - b - pointer to second string 419e5c89e4eSSatish Balay 420e5c89e4eSSatish Balay Output Parameter: 4218c74ee41SBarry Smith . flg - PETSC_TRUE if the two strings are equal 422e5c89e4eSSatish Balay 423e5c89e4eSSatish Balay Level: intermediate 424e5c89e4eSSatish Balay 4256f013253SBarry Smith Notes: Not for use in Fortran 4266f013253SBarry Smith 427e5c89e4eSSatish Balay .seealso: PetscStrgrt(), PetscStrncmp(), PetscStrcasecmp() 428e5c89e4eSSatish Balay 429e5c89e4eSSatish Balay @*/ 4307087cfbeSBarry Smith PetscErrorCode PetscStrcmp(const char a[],const char b[],PetscBool *flg) 431e5c89e4eSSatish Balay { 432e5c89e4eSSatish Balay int c; 433e5c89e4eSSatish Balay 434e5c89e4eSSatish Balay PetscFunctionBegin; 435a297a907SKarl Rupp if (!a && !b) *flg = PETSC_TRUE; 436a297a907SKarl Rupp else if (!a || !b) *flg = PETSC_FALSE; 437a297a907SKarl Rupp else { 438e5c89e4eSSatish Balay c = strcmp(a,b); 439e5c89e4eSSatish Balay if (c) *flg = PETSC_FALSE; 440e5c89e4eSSatish Balay else *flg = PETSC_TRUE; 441e5c89e4eSSatish Balay } 442e5c89e4eSSatish Balay PetscFunctionReturn(0); 443e5c89e4eSSatish Balay } 444e5c89e4eSSatish Balay 445e5c89e4eSSatish Balay #undef __FUNCT__ 446e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrgrt" 447e5c89e4eSSatish Balay /*@C 448e5c89e4eSSatish Balay PetscStrgrt - If first string is greater than the second 449e5c89e4eSSatish Balay 450e5c89e4eSSatish Balay Not Collective 451e5c89e4eSSatish Balay 452e5c89e4eSSatish Balay Input Parameters: 453e5c89e4eSSatish Balay + a - pointer to first string 454e5c89e4eSSatish Balay - b - pointer to second string 455e5c89e4eSSatish Balay 456e5c89e4eSSatish Balay Output Parameter: 457e5c89e4eSSatish Balay . flg - if the first string is greater 458e5c89e4eSSatish Balay 459e5c89e4eSSatish Balay Notes: 460e5c89e4eSSatish Balay Null arguments are ok, a null string is considered smaller than 461e5c89e4eSSatish Balay all others 462e5c89e4eSSatish Balay 4636f013253SBarry Smith Not for use in Fortran 4646f013253SBarry Smith 465e5c89e4eSSatish Balay Level: intermediate 466e5c89e4eSSatish Balay 467e5c89e4eSSatish Balay .seealso: PetscStrcmp(), PetscStrncmp(), PetscStrcasecmp() 468e5c89e4eSSatish Balay 469e5c89e4eSSatish Balay @*/ 4707087cfbeSBarry Smith PetscErrorCode PetscStrgrt(const char a[],const char b[],PetscBool *t) 471e5c89e4eSSatish Balay { 472e5c89e4eSSatish Balay int c; 473e5c89e4eSSatish Balay 474e5c89e4eSSatish Balay PetscFunctionBegin; 475a297a907SKarl Rupp if (!a && !b) *t = PETSC_FALSE; 476a297a907SKarl Rupp else if (a && !b) *t = PETSC_TRUE; 477a297a907SKarl Rupp else if (!a && b) *t = PETSC_FALSE; 478a297a907SKarl Rupp else { 479e5c89e4eSSatish Balay c = strcmp(a,b); 480e5c89e4eSSatish Balay if (c > 0) *t = PETSC_TRUE; 481e5c89e4eSSatish Balay else *t = PETSC_FALSE; 482e5c89e4eSSatish Balay } 483e5c89e4eSSatish Balay PetscFunctionReturn(0); 484e5c89e4eSSatish Balay } 485e5c89e4eSSatish Balay 486e5c89e4eSSatish Balay #undef __FUNCT__ 487e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrcasecmp" 488e5c89e4eSSatish Balay /*@C 489e5c89e4eSSatish Balay PetscStrcasecmp - Returns true if the two strings are the same 490e5c89e4eSSatish Balay except possibly for case. 491e5c89e4eSSatish Balay 492e5c89e4eSSatish Balay Not Collective 493e5c89e4eSSatish Balay 494e5c89e4eSSatish Balay Input Parameters: 495e5c89e4eSSatish Balay + a - pointer to first string 496e5c89e4eSSatish Balay - b - pointer to second string 497e5c89e4eSSatish Balay 498e5c89e4eSSatish Balay Output Parameter: 499e5c89e4eSSatish Balay . flg - if the two strings are the same 500e5c89e4eSSatish Balay 501e5c89e4eSSatish Balay Notes: 502e5c89e4eSSatish Balay Null arguments are ok 503e5c89e4eSSatish Balay 5046f013253SBarry Smith Not for use in Fortran 5056f013253SBarry Smith 506e5c89e4eSSatish Balay Level: intermediate 507e5c89e4eSSatish Balay 508e5c89e4eSSatish Balay .seealso: PetscStrcmp(), PetscStrncmp(), PetscStrgrt() 509e5c89e4eSSatish Balay 510e5c89e4eSSatish Balay @*/ 5117087cfbeSBarry Smith PetscErrorCode PetscStrcasecmp(const char a[],const char b[],PetscBool *t) 512e5c89e4eSSatish Balay { 513e5c89e4eSSatish Balay int c; 514e5c89e4eSSatish Balay 515e5c89e4eSSatish Balay PetscFunctionBegin; 516e5c89e4eSSatish Balay if (!a && !b) c = 0; 517e5c89e4eSSatish Balay else if (!a || !b) c = 1; 51832b366c8SSatish Balay #if defined(PETSC_HAVE_STRCASECMP) 51932b366c8SSatish Balay else c = strcasecmp(a,b); 52032b366c8SSatish Balay #elif defined(PETSC_HAVE_STRICMP) 521e5c89e4eSSatish Balay else c = stricmp(a,b); 522e5c89e4eSSatish Balay #else 52332b366c8SSatish Balay else { 52432b366c8SSatish Balay char *aa,*bb; 52532b366c8SSatish Balay PetscErrorCode ierr; 52632b366c8SSatish Balay ierr = PetscStrallocpy(a,&aa);CHKERRQ(ierr); 52732b366c8SSatish Balay ierr = PetscStrallocpy(b,&bb);CHKERRQ(ierr); 52832b366c8SSatish Balay ierr = PetscStrtolower(aa);CHKERRQ(ierr); 52932b366c8SSatish Balay ierr = PetscStrtolower(bb);CHKERRQ(ierr); 53032b366c8SSatish Balay ierr = PetscStrcmp(aa,bb,t);CHKERRQ(ierr); 531503cfb0cSBarry Smith ierr = PetscFree(aa);CHKERRQ(ierr); 532503cfb0cSBarry Smith ierr = PetscFree(bb);CHKERRQ(ierr); 53332b366c8SSatish Balay PetscFunctionReturn(0); 53432b366c8SSatish Balay } 535e5c89e4eSSatish Balay #endif 536e5c89e4eSSatish Balay if (!c) *t = PETSC_TRUE; 537e5c89e4eSSatish Balay else *t = PETSC_FALSE; 538e5c89e4eSSatish Balay PetscFunctionReturn(0); 539e5c89e4eSSatish Balay } 540e5c89e4eSSatish Balay 54132b366c8SSatish Balay 54232b366c8SSatish Balay 543e5c89e4eSSatish Balay #undef __FUNCT__ 544e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrncmp" 545e5c89e4eSSatish Balay /*@C 546e5c89e4eSSatish Balay PetscStrncmp - Compares two strings, up to a certain length 547e5c89e4eSSatish Balay 548e5c89e4eSSatish Balay Not Collective 549e5c89e4eSSatish Balay 550e5c89e4eSSatish Balay Input Parameters: 551e5c89e4eSSatish Balay + a - pointer to first string 552e5c89e4eSSatish Balay . b - pointer to second string 553e5c89e4eSSatish Balay - n - length to compare up to 554e5c89e4eSSatish Balay 555e5c89e4eSSatish Balay Output Parameter: 556e5c89e4eSSatish Balay . t - if the two strings are equal 557e5c89e4eSSatish Balay 558e5c89e4eSSatish Balay Level: intermediate 559e5c89e4eSSatish Balay 5606f013253SBarry Smith Notes: Not for use in Fortran 5616f013253SBarry Smith 562e5c89e4eSSatish Balay .seealso: PetscStrgrt(), PetscStrcmp(), PetscStrcasecmp() 563e5c89e4eSSatish Balay 564e5c89e4eSSatish Balay @*/ 5657087cfbeSBarry Smith PetscErrorCode PetscStrncmp(const char a[],const char b[],size_t n,PetscBool *t) 566e5c89e4eSSatish Balay { 567e5c89e4eSSatish Balay int c; 568e5c89e4eSSatish Balay 569e5c89e4eSSatish Balay PetscFunctionBegin; 570e5c89e4eSSatish Balay c = strncmp(a,b,n); 571e5c89e4eSSatish Balay if (!c) *t = PETSC_TRUE; 572e5c89e4eSSatish Balay else *t = PETSC_FALSE; 573e5c89e4eSSatish Balay PetscFunctionReturn(0); 574e5c89e4eSSatish Balay } 575e5c89e4eSSatish Balay 576e5c89e4eSSatish Balay #undef __FUNCT__ 577e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrchr" 578e5c89e4eSSatish Balay /*@C 579e5c89e4eSSatish Balay PetscStrchr - Locates first occurance of a character in a string 580e5c89e4eSSatish Balay 581e5c89e4eSSatish Balay Not Collective 582e5c89e4eSSatish Balay 583e5c89e4eSSatish Balay Input Parameters: 584e5c89e4eSSatish Balay + a - pointer to string 585e5c89e4eSSatish Balay - b - character 586e5c89e4eSSatish Balay 587e5c89e4eSSatish Balay Output Parameter: 5880298fd71SBarry Smith . c - location of occurance, NULL if not found 589e5c89e4eSSatish Balay 590e5c89e4eSSatish Balay Level: intermediate 591e5c89e4eSSatish Balay 5926f013253SBarry Smith Notes: Not for use in Fortran 5936f013253SBarry Smith 594e5c89e4eSSatish Balay @*/ 5957087cfbeSBarry Smith PetscErrorCode PetscStrchr(const char a[],char b,char *c[]) 596e5c89e4eSSatish Balay { 597e5c89e4eSSatish Balay PetscFunctionBegin; 598e5c89e4eSSatish Balay *c = (char*)strchr(a,b); 599e5c89e4eSSatish Balay PetscFunctionReturn(0); 600e5c89e4eSSatish Balay } 601e5c89e4eSSatish Balay 602e5c89e4eSSatish Balay #undef __FUNCT__ 603e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrrchr" 604e5c89e4eSSatish Balay /*@C 605e5c89e4eSSatish Balay PetscStrrchr - Locates one location past the last occurance of a character in a string, 606e5c89e4eSSatish Balay if the character is not found then returns entire string 607e5c89e4eSSatish Balay 608e5c89e4eSSatish Balay Not Collective 609e5c89e4eSSatish Balay 610e5c89e4eSSatish Balay Input Parameters: 611e5c89e4eSSatish Balay + a - pointer to string 612e5c89e4eSSatish Balay - b - character 613e5c89e4eSSatish Balay 614e5c89e4eSSatish Balay Output Parameter: 615e5c89e4eSSatish Balay . tmp - location of occurance, a if not found 616e5c89e4eSSatish Balay 617e5c89e4eSSatish Balay Level: intermediate 618e5c89e4eSSatish Balay 6196f013253SBarry Smith Notes: Not for use in Fortran 6206f013253SBarry Smith 621e5c89e4eSSatish Balay @*/ 6227087cfbeSBarry Smith PetscErrorCode PetscStrrchr(const char a[],char b,char *tmp[]) 623e5c89e4eSSatish Balay { 624e5c89e4eSSatish Balay PetscFunctionBegin; 625e5c89e4eSSatish Balay *tmp = (char*)strrchr(a,b); 626a297a907SKarl Rupp if (!*tmp) *tmp = (char*)a; 627a297a907SKarl Rupp else *tmp = *tmp + 1; 628e5c89e4eSSatish Balay PetscFunctionReturn(0); 629e5c89e4eSSatish Balay } 630e5c89e4eSSatish Balay 631e5c89e4eSSatish Balay #undef __FUNCT__ 632e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrtolower" 633e5c89e4eSSatish Balay /*@C 634e5c89e4eSSatish Balay PetscStrtolower - Converts string to lower case 635e5c89e4eSSatish Balay 636e5c89e4eSSatish Balay Not Collective 637e5c89e4eSSatish Balay 638e5c89e4eSSatish Balay Input Parameters: 639e5c89e4eSSatish Balay . a - pointer to string 640e5c89e4eSSatish Balay 641e5c89e4eSSatish Balay Level: intermediate 642e5c89e4eSSatish Balay 6436f013253SBarry Smith Notes: Not for use in Fortran 6446f013253SBarry Smith 645e5c89e4eSSatish Balay @*/ 6467087cfbeSBarry Smith PetscErrorCode PetscStrtolower(char a[]) 647e5c89e4eSSatish Balay { 648e5c89e4eSSatish Balay PetscFunctionBegin; 649e5c89e4eSSatish Balay while (*a) { 650e5c89e4eSSatish Balay if (*a >= 'A' && *a <= 'Z') *a += 'a' - 'A'; 651e5c89e4eSSatish Balay a++; 652e5c89e4eSSatish Balay } 653e5c89e4eSSatish Balay PetscFunctionReturn(0); 654e5c89e4eSSatish Balay } 655e5c89e4eSSatish Balay 6567ba3a57cSBarry Smith #undef __FUNCT__ 6572f234a98SBarry Smith #define __FUNCT__ "PetscStrtoupper" 6582f234a98SBarry Smith /*@C 6592f234a98SBarry Smith PetscStrtolower - Converts string to upper case 6602f234a98SBarry Smith 6612f234a98SBarry Smith Not Collective 6622f234a98SBarry Smith 6632f234a98SBarry Smith Input Parameters: 6642f234a98SBarry Smith . a - pointer to string 6652f234a98SBarry Smith 6662f234a98SBarry Smith Level: intermediate 6672f234a98SBarry Smith 6682f234a98SBarry Smith Notes: Not for use in Fortran 6692f234a98SBarry Smith 6702f234a98SBarry Smith @*/ 6712f234a98SBarry Smith PetscErrorCode PetscStrtoupper(char a[]) 6722f234a98SBarry Smith { 6732f234a98SBarry Smith PetscFunctionBegin; 6742f234a98SBarry Smith while (*a) { 6752f234a98SBarry Smith if (*a >= 'a' && *a <= 'z') *a += 'A' - 'a'; 6762f234a98SBarry Smith a++; 6772f234a98SBarry Smith } 6782f234a98SBarry Smith PetscFunctionReturn(0); 6792f234a98SBarry Smith } 6802f234a98SBarry Smith 6812f234a98SBarry Smith #undef __FUNCT__ 6827ba3a57cSBarry Smith #define __FUNCT__ "PetscStrendswith" 6837ba3a57cSBarry Smith /*@C 6847ba3a57cSBarry Smith PetscStrendswith - Determines if a string ends with a certain string 6851d1a0024SBarry Smith 6867ba3a57cSBarry Smith Not Collective 6877ba3a57cSBarry Smith 6887ba3a57cSBarry Smith Input Parameters: 6897ba3a57cSBarry Smith + a - pointer to string 6907ba3a57cSBarry Smith - b - string to endwith 6917ba3a57cSBarry Smith 6927ba3a57cSBarry Smith Output Parameter: 6937ba3a57cSBarry Smith . flg - PETSC_TRUE or PETSC_FALSE 6947ba3a57cSBarry Smith 6957ba3a57cSBarry Smith Notes: Not for use in Fortran 6967ba3a57cSBarry Smith 6977ba3a57cSBarry Smith Level: intermediate 6987ba3a57cSBarry Smith 6997ba3a57cSBarry Smith @*/ 7007ba3a57cSBarry Smith PetscErrorCode PetscStrendswith(const char a[],const char b[],PetscBool *flg) 7017ba3a57cSBarry Smith { 7027ba3a57cSBarry Smith char *test; 7037ba3a57cSBarry Smith PetscErrorCode ierr; 7047ba3a57cSBarry Smith size_t na,nb; 7057ba3a57cSBarry Smith 7067ba3a57cSBarry Smith PetscFunctionBegin; 7077ba3a57cSBarry Smith *flg = PETSC_FALSE; 7087ba3a57cSBarry Smith ierr = PetscStrrstr(a,b,&test);CHKERRQ(ierr); 7097ba3a57cSBarry Smith if (test) { 7107ba3a57cSBarry Smith ierr = PetscStrlen(a,&na);CHKERRQ(ierr); 7117ba3a57cSBarry Smith ierr = PetscStrlen(b,&nb);CHKERRQ(ierr); 7127ba3a57cSBarry Smith if (a+na-nb == test) *flg = PETSC_TRUE; 7137ba3a57cSBarry Smith } 7147ba3a57cSBarry Smith PetscFunctionReturn(0); 7157ba3a57cSBarry Smith } 7167ba3a57cSBarry Smith 7177ba3a57cSBarry Smith #undef __FUNCT__ 7182c9581d2SBarry Smith #define __FUNCT__ "PetscStrbeginswith" 7192c9581d2SBarry Smith /*@C 7202c9581d2SBarry Smith PetscStrbeginswith - Determines if a string begins with a certain string 7212c9581d2SBarry Smith 7222c9581d2SBarry Smith Not Collective 7232c9581d2SBarry Smith 7242c9581d2SBarry Smith Input Parameters: 7252c9581d2SBarry Smith + a - pointer to string 7262c9581d2SBarry Smith - b - string to beginwith 7272c9581d2SBarry Smith 7282c9581d2SBarry Smith Output Parameter: 7292c9581d2SBarry Smith . flg - PETSC_TRUE or PETSC_FALSE 7302c9581d2SBarry Smith 7312c9581d2SBarry Smith Notes: Not for use in Fortran 7322c9581d2SBarry Smith 7332c9581d2SBarry Smith Level: intermediate 7342c9581d2SBarry Smith 7352c9581d2SBarry Smith @*/ 7362c9581d2SBarry Smith PetscErrorCode PetscStrbeginswith(const char a[],const char b[],PetscBool *flg) 7372c9581d2SBarry Smith { 7382c9581d2SBarry Smith char *test; 7392c9581d2SBarry Smith PetscErrorCode ierr; 7402c9581d2SBarry Smith 7412c9581d2SBarry Smith PetscFunctionBegin; 7422c9581d2SBarry Smith *flg = PETSC_FALSE; 7432c9581d2SBarry Smith ierr = PetscStrrstr(a,b,&test);CHKERRQ(ierr); 744a297a907SKarl Rupp if (test && (test == a)) *flg = PETSC_TRUE; 7452c9581d2SBarry Smith PetscFunctionReturn(0); 7462c9581d2SBarry Smith } 7472c9581d2SBarry Smith 7482c9581d2SBarry Smith 7492c9581d2SBarry Smith #undef __FUNCT__ 7507ba3a57cSBarry Smith #define __FUNCT__ "PetscStrendswithwhich" 7517ba3a57cSBarry Smith /*@C 7527ba3a57cSBarry Smith PetscStrendswithwhich - Determines if a string ends with one of several possible strings 7537ba3a57cSBarry Smith 7547ba3a57cSBarry Smith Not Collective 7557ba3a57cSBarry Smith 7567ba3a57cSBarry Smith Input Parameters: 7577ba3a57cSBarry Smith + a - pointer to string 7587ba3a57cSBarry Smith - bs - strings to endwith (last entry must be null) 7597ba3a57cSBarry Smith 7607ba3a57cSBarry Smith Output Parameter: 7617ba3a57cSBarry Smith . cnt - the index of the string it ends with or 1+the last possible index 7627ba3a57cSBarry Smith 7637ba3a57cSBarry Smith Notes: Not for use in Fortran 7647ba3a57cSBarry Smith 7657ba3a57cSBarry Smith Level: intermediate 7667ba3a57cSBarry Smith 7677ba3a57cSBarry Smith @*/ 7687ba3a57cSBarry Smith PetscErrorCode PetscStrendswithwhich(const char a[],const char *const *bs,PetscInt *cnt) 7697ba3a57cSBarry Smith { 7707ba3a57cSBarry Smith PetscBool flg; 7717ba3a57cSBarry Smith PetscErrorCode ierr; 7727ba3a57cSBarry Smith 7737ba3a57cSBarry Smith PetscFunctionBegin; 7747ba3a57cSBarry Smith *cnt = 0; 7757ba3a57cSBarry Smith while (bs[*cnt]) { 7767ba3a57cSBarry Smith ierr = PetscStrendswith(a,bs[*cnt],&flg);CHKERRQ(ierr); 7777ba3a57cSBarry Smith if (flg) PetscFunctionReturn(0); 7787ba3a57cSBarry Smith *cnt += 1; 7797ba3a57cSBarry Smith } 7807ba3a57cSBarry Smith PetscFunctionReturn(0); 7817ba3a57cSBarry Smith } 7827ba3a57cSBarry Smith 7837ba3a57cSBarry Smith #undef __FUNCT__ 7847ba3a57cSBarry Smith #define __FUNCT__ "PetscStrrstr" 7857ba3a57cSBarry Smith /*@C 7867ba3a57cSBarry Smith PetscStrrstr - Locates last occurance of string in another string 7877ba3a57cSBarry Smith 7887ba3a57cSBarry Smith Not Collective 7897ba3a57cSBarry Smith 7907ba3a57cSBarry Smith Input Parameters: 7917ba3a57cSBarry Smith + a - pointer to string 7927ba3a57cSBarry Smith - b - string to find 7937ba3a57cSBarry Smith 7947ba3a57cSBarry Smith Output Parameter: 7957ba3a57cSBarry Smith . tmp - location of occurance 7967ba3a57cSBarry Smith 7977ba3a57cSBarry Smith Notes: Not for use in Fortran 7987ba3a57cSBarry Smith 7997ba3a57cSBarry Smith Level: intermediate 8007ba3a57cSBarry Smith 8017ba3a57cSBarry Smith @*/ 8027ba3a57cSBarry Smith PetscErrorCode PetscStrrstr(const char a[],const char b[],char *tmp[]) 8037ba3a57cSBarry Smith { 8047ba3a57cSBarry Smith const char *stmp = a, *ltmp = 0; 8057ba3a57cSBarry Smith 8067ba3a57cSBarry Smith PetscFunctionBegin; 8077ba3a57cSBarry Smith while (stmp) { 8087ba3a57cSBarry Smith stmp = (char*)strstr(stmp,b); 8097ba3a57cSBarry Smith if (stmp) {ltmp = stmp;stmp++;} 8107ba3a57cSBarry Smith } 8117ba3a57cSBarry Smith *tmp = (char*)ltmp; 8127ba3a57cSBarry Smith PetscFunctionReturn(0); 8137ba3a57cSBarry Smith } 8147ba3a57cSBarry Smith 8157ba3a57cSBarry Smith #undef __FUNCT__ 8167ba3a57cSBarry Smith #define __FUNCT__ "PetscStrstr" 8177ba3a57cSBarry Smith /*@C 8187ba3a57cSBarry Smith PetscStrstr - Locates first occurance of string in another string 8197ba3a57cSBarry Smith 8207ba3a57cSBarry Smith Not Collective 8217ba3a57cSBarry Smith 8227ba3a57cSBarry Smith Input Parameters: 823160f4796SJed Brown + haystack - string to search 824160f4796SJed Brown - needle - string to find 8257ba3a57cSBarry Smith 8267ba3a57cSBarry Smith Output Parameter: 8270298fd71SBarry Smith . tmp - location of occurance, is a NULL if the string is not found 8287ba3a57cSBarry Smith 8297ba3a57cSBarry Smith Notes: Not for use in Fortran 8307ba3a57cSBarry Smith 8317ba3a57cSBarry Smith Level: intermediate 8327ba3a57cSBarry Smith 8337ba3a57cSBarry Smith @*/ 834160f4796SJed Brown PetscErrorCode PetscStrstr(const char haystack[],const char needle[],char *tmp[]) 8357ba3a57cSBarry Smith { 8367ba3a57cSBarry Smith PetscFunctionBegin; 837160f4796SJed Brown *tmp = (char*)strstr(haystack,needle); 8387ba3a57cSBarry Smith PetscFunctionReturn(0); 8397ba3a57cSBarry Smith } 8407ba3a57cSBarry Smith 8417ba3a57cSBarry Smith struct _p_PetscToken {char token;char *array;char *current;}; 8421d1a0024SBarry Smith 843e5c89e4eSSatish Balay #undef __FUNCT__ 844e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenFind" 845e5c89e4eSSatish Balay /*@C 846e5c89e4eSSatish Balay PetscTokenFind - Locates next "token" in a string 847e5c89e4eSSatish Balay 848e5c89e4eSSatish Balay Not Collective 849e5c89e4eSSatish Balay 850e5c89e4eSSatish Balay Input Parameters: 851e5c89e4eSSatish Balay . a - pointer to token 852e5c89e4eSSatish Balay 853e5c89e4eSSatish Balay Output Parameter: 8540298fd71SBarry Smith . result - location of occurance, NULL if not found 855e5c89e4eSSatish Balay 856e5c89e4eSSatish Balay Notes: 857e5c89e4eSSatish Balay 858e5c89e4eSSatish Balay This version is different from the system version in that 859e5c89e4eSSatish Balay it allows you to pass a read-only string into the function. 860e5c89e4eSSatish Balay 8614704e885SBarry Smith This version also treats all characters etc. inside a double quote " 8624704e885SBarry Smith as a single token. 8634704e885SBarry Smith 8646f013253SBarry Smith Not for use in Fortran 8656f013253SBarry Smith 866e5c89e4eSSatish Balay Level: intermediate 867e5c89e4eSSatish Balay 8686f013253SBarry Smith 869e5c89e4eSSatish Balay .seealso: PetscTokenCreate(), PetscTokenDestroy() 870e5c89e4eSSatish Balay @*/ 8717087cfbeSBarry Smith PetscErrorCode PetscTokenFind(PetscToken a,char *result[]) 872e5c89e4eSSatish Balay { 8734704e885SBarry Smith char *ptr = a->current,token; 874e5c89e4eSSatish Balay 875e5c89e4eSSatish Balay PetscFunctionBegin; 876e5c89e4eSSatish Balay *result = a->current; 8774704e885SBarry Smith if (ptr && !*ptr) {*result = 0;PetscFunctionReturn(0);} 8784704e885SBarry Smith token = a->token; 87990fdf44cSMatthew Knepley if (ptr && (*ptr == '"')) {token = '"';(*result)++;ptr++;} 880e5c89e4eSSatish Balay while (ptr) { 8814704e885SBarry Smith if (*ptr == token) { 882e5c89e4eSSatish Balay *ptr++ = 0; 883e5c89e4eSSatish Balay while (*ptr == a->token) ptr++; 884e5c89e4eSSatish Balay a->current = ptr; 885e5c89e4eSSatish Balay break; 886e5c89e4eSSatish Balay } 887e5c89e4eSSatish Balay if (!*ptr) { 888e5c89e4eSSatish Balay a->current = 0; 889e5c89e4eSSatish Balay break; 890e5c89e4eSSatish Balay } 891e5c89e4eSSatish Balay ptr++; 892e5c89e4eSSatish Balay } 893e5c89e4eSSatish Balay PetscFunctionReturn(0); 894e5c89e4eSSatish Balay } 895e5c89e4eSSatish Balay 896e5c89e4eSSatish Balay #undef __FUNCT__ 897e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenCreate" 898e5c89e4eSSatish Balay /*@C 899e5c89e4eSSatish Balay PetscTokenCreate - Creates a PetscToken used to find tokens in a string 900e5c89e4eSSatish Balay 901e5c89e4eSSatish Balay Not Collective 902e5c89e4eSSatish Balay 903e5c89e4eSSatish Balay Input Parameters: 904e5c89e4eSSatish Balay + string - the string to look in 905e5c89e4eSSatish Balay - token - the character to look for 906e5c89e4eSSatish Balay 907e5c89e4eSSatish Balay Output Parameter: 908e5c89e4eSSatish Balay . a - pointer to token 909e5c89e4eSSatish Balay 910e5c89e4eSSatish Balay Notes: 911e5c89e4eSSatish Balay 912e5c89e4eSSatish Balay This version is different from the system version in that 913e5c89e4eSSatish Balay it allows you to pass a read-only string into the function. 914e5c89e4eSSatish Balay 9156f013253SBarry Smith Not for use in Fortran 9166f013253SBarry Smith 917e5c89e4eSSatish Balay Level: intermediate 918e5c89e4eSSatish Balay 919e5c89e4eSSatish Balay .seealso: PetscTokenFind(), PetscTokenDestroy() 920e5c89e4eSSatish Balay @*/ 9217087cfbeSBarry Smith PetscErrorCode PetscTokenCreate(const char a[],const char b,PetscToken *t) 922e5c89e4eSSatish Balay { 923e5c89e4eSSatish Balay PetscErrorCode ierr; 924e5c89e4eSSatish Balay 925e5c89e4eSSatish Balay PetscFunctionBegin; 9261d1a0024SBarry Smith ierr = PetscNew(struct _p_PetscToken,t);CHKERRQ(ierr); 927e5c89e4eSSatish Balay ierr = PetscStrallocpy(a,&(*t)->array);CHKERRQ(ierr); 928a297a907SKarl Rupp 929e5c89e4eSSatish Balay (*t)->current = (*t)->array; 930e5c89e4eSSatish Balay (*t)->token = b; 931e5c89e4eSSatish Balay PetscFunctionReturn(0); 932e5c89e4eSSatish Balay } 933e5c89e4eSSatish Balay 934e5c89e4eSSatish Balay #undef __FUNCT__ 935e5c89e4eSSatish Balay #define __FUNCT__ "PetscTokenDestroy" 936e5c89e4eSSatish Balay /*@C 937e5c89e4eSSatish Balay PetscTokenDestroy - Destroys a PetscToken 938e5c89e4eSSatish Balay 939e5c89e4eSSatish Balay Not Collective 940e5c89e4eSSatish Balay 941e5c89e4eSSatish Balay Input Parameters: 942e5c89e4eSSatish Balay . a - pointer to token 943e5c89e4eSSatish Balay 944e5c89e4eSSatish Balay Level: intermediate 945e5c89e4eSSatish Balay 9466f013253SBarry Smith Notes: Not for use in Fortran 9476f013253SBarry Smith 948e5c89e4eSSatish Balay .seealso: PetscTokenCreate(), PetscTokenFind() 949e5c89e4eSSatish Balay @*/ 9508c74ee41SBarry Smith PetscErrorCode PetscTokenDestroy(PetscToken *a) 951e5c89e4eSSatish Balay { 952e5c89e4eSSatish Balay PetscErrorCode ierr; 953e5c89e4eSSatish Balay 954e5c89e4eSSatish Balay PetscFunctionBegin; 9558c74ee41SBarry Smith if (!*a) PetscFunctionReturn(0); 9568c74ee41SBarry Smith ierr = PetscFree((*a)->array);CHKERRQ(ierr); 9578c74ee41SBarry Smith ierr = PetscFree(*a);CHKERRQ(ierr); 958e5c89e4eSSatish Balay PetscFunctionReturn(0); 959e5c89e4eSSatish Balay } 960e5c89e4eSSatish Balay 961e5c89e4eSSatish Balay 962e5c89e4eSSatish Balay #undef __FUNCT__ 963e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetPetscDir" 964e5c89e4eSSatish Balay /*@C 965e5c89e4eSSatish Balay PetscGetPetscDir - Gets the directory PETSc is installed in 966e5c89e4eSSatish Balay 967e5c89e4eSSatish Balay Not Collective 968e5c89e4eSSatish Balay 969e5c89e4eSSatish Balay Output Parameter: 970e5c89e4eSSatish Balay . dir - the directory 971e5c89e4eSSatish Balay 972e5c89e4eSSatish Balay Level: developer 973e5c89e4eSSatish Balay 9746f013253SBarry Smith Notes: Not for use in Fortran 9756f013253SBarry Smith 976e5c89e4eSSatish Balay @*/ 9777087cfbeSBarry Smith PetscErrorCode PetscGetPetscDir(const char *dir[]) 978e5c89e4eSSatish Balay { 979e5c89e4eSSatish Balay PetscFunctionBegin; 980e5c89e4eSSatish Balay *dir = PETSC_DIR; 981e5c89e4eSSatish Balay PetscFunctionReturn(0); 982e5c89e4eSSatish Balay } 983e5c89e4eSSatish Balay 984e5c89e4eSSatish Balay #undef __FUNCT__ 985e5c89e4eSSatish Balay #define __FUNCT__ "PetscStrreplace" 986e5c89e4eSSatish Balay /*@C 987e5c89e4eSSatish Balay PetscStrreplace - Replaces substrings in string with other substrings 988e5c89e4eSSatish Balay 989e5c89e4eSSatish Balay Not Collective 990e5c89e4eSSatish Balay 991e5c89e4eSSatish Balay Input Parameters: 992e5c89e4eSSatish Balay + comm - MPI_Comm of processors that are processing the string 99371573d7dSBarry Smith . aa - the string to look in 994d8ccf1fbSBarry Smith . b - the resulting copy of a with replaced strings (b can be the same as a) 995e5c89e4eSSatish Balay - len - the length of b 996e5c89e4eSSatish Balay 997e5c89e4eSSatish Balay Notes: 998e5c89e4eSSatish Balay Replaces ${PETSC_ARCH},${PETSC_DIR},${PETSC_LIB_DIR},${DISPLAY}, 999d5649816SBarry Smith ${HOMEDIRECTORY},${WORKINGDIRECTORY},${USERNAME}, ${HOSTNAME} with appropriate values 1000e5c89e4eSSatish Balay as well as any environmental variables. 1001e5c89e4eSSatish Balay 10026f013253SBarry Smith PETSC_LIB_DIR uses the environmental variable if it exists. PETSC_ARCH and PETSC_DIR use what 1003acc6cc86SBarry Smith PETSc was built with and do not use environmental variables. 1004acc6cc86SBarry Smith 10056f013253SBarry Smith Not for use in Fortran 10066f013253SBarry Smith 1007e5c89e4eSSatish Balay Level: intermediate 1008e5c89e4eSSatish Balay 1009e5c89e4eSSatish Balay @*/ 10107087cfbeSBarry Smith PetscErrorCode PetscStrreplace(MPI_Comm comm,const char aa[],char b[],size_t len) 1011e5c89e4eSSatish Balay { 1012e5c89e4eSSatish Balay PetscErrorCode ierr; 1013e5c89e4eSSatish Balay int i = 0; 1014e5c89e4eSSatish Balay size_t l,l1,l2,l3; 101571573d7dSBarry Smith char *work,*par,*epar,env[1024],*tfree,*a = (char*)aa; 1016d5649816SBarry Smith const char *s[] = {"${PETSC_ARCH}","${PETSC_DIR}","${PETSC_LIB_DIR}","${DISPLAY}","${HOMEDIRECTORY}","${WORKINGDIRECTORY}","${USERNAME}","${HOSTNAME}",0}; 1017d5649816SBarry Smith const char *r[] = {0,0,0,0,0,0,0,0,0}; 1018ace3abfcSBarry Smith PetscBool flag; 1019e5c89e4eSSatish Balay 1020e5c89e4eSSatish Balay PetscFunctionBegin; 1021e32f2f54SBarry Smith if (!a || !b) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"a and b strings must be nonnull"); 102271573d7dSBarry Smith if (aa == b) { 102322982a5fSBarry Smith ierr = PetscStrallocpy(aa,(char**)&a);CHKERRQ(ierr); 102471573d7dSBarry Smith } 1025e5c89e4eSSatish Balay ierr = PetscMalloc(len*sizeof(char*),&work);CHKERRQ(ierr); 1026e5c89e4eSSatish Balay 1027e5c89e4eSSatish Balay /* get values for replaced variables */ 1028487e5849SBarry Smith ierr = PetscStrallocpy(PETSC_ARCH,(char**)&r[0]);CHKERRQ(ierr); 1029487e5849SBarry Smith ierr = PetscStrallocpy(PETSC_DIR,(char**)&r[1]);CHKERRQ(ierr); 1030487e5849SBarry Smith ierr = PetscStrallocpy(PETSC_LIB_DIR,(char**)&r[2]);CHKERRQ(ierr); 1031487e5849SBarry Smith ierr = PetscMalloc(256*sizeof(char),&r[3]);CHKERRQ(ierr); 1032487e5849SBarry Smith ierr = PetscMalloc(PETSC_MAX_PATH_LEN*sizeof(char),&r[4]);CHKERRQ(ierr); 1033e5c89e4eSSatish Balay ierr = PetscMalloc(PETSC_MAX_PATH_LEN*sizeof(char),&r[5]);CHKERRQ(ierr); 1034487e5849SBarry Smith ierr = PetscMalloc(256*sizeof(char),&r[6]);CHKERRQ(ierr); 1035d5649816SBarry Smith ierr = PetscMalloc(256*sizeof(char),&r[7]);CHKERRQ(ierr); 1036487e5849SBarry Smith ierr = PetscGetDisplay((char*)r[3],256);CHKERRQ(ierr); 1037487e5849SBarry Smith ierr = PetscGetHomeDirectory((char*)r[4],PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 1038487e5849SBarry Smith ierr = PetscGetWorkingDirectory((char*)r[5],PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 1039487e5849SBarry Smith ierr = PetscGetUserName((char*)r[6],256);CHKERRQ(ierr); 1040d5649816SBarry Smith ierr = PetscGetHostName((char*)r[7],256);CHKERRQ(ierr); 1041487e5849SBarry Smith 1042487e5849SBarry Smith /* replace that are in environment */ 1043487e5849SBarry Smith ierr = PetscOptionsGetenv(comm,"PETSC_LIB_DIR",env,1024,&flag);CHKERRQ(ierr); 1044487e5849SBarry Smith if (flag) { 1045487e5849SBarry Smith ierr = PetscStrallocpy(env,(char**)&r[2]);CHKERRQ(ierr); 1046487e5849SBarry Smith } 1047e5c89e4eSSatish Balay 1048e5c89e4eSSatish Balay /* replace the requested strings */ 1049e5c89e4eSSatish Balay ierr = PetscStrncpy(b,a,len);CHKERRQ(ierr); 1050e5c89e4eSSatish Balay while (s[i]) { 1051e5c89e4eSSatish Balay ierr = PetscStrlen(s[i],&l);CHKERRQ(ierr); 1052e5c89e4eSSatish Balay ierr = PetscStrstr(b,s[i],&par);CHKERRQ(ierr); 1053e5c89e4eSSatish Balay while (par) { 1054e5c89e4eSSatish Balay *par = 0; 1055e5c89e4eSSatish Balay par += l; 1056e5c89e4eSSatish Balay 1057e5c89e4eSSatish Balay ierr = PetscStrlen(b,&l1);CHKERRQ(ierr); 1058e5c89e4eSSatish Balay ierr = PetscStrlen(r[i],&l2);CHKERRQ(ierr); 1059e5c89e4eSSatish Balay ierr = PetscStrlen(par,&l3);CHKERRQ(ierr); 106017186662SBarry Smith if (l1 + l2 + l3 >= len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"b len is not long enough to hold new values"); 1061e5c89e4eSSatish Balay ierr = PetscStrcpy(work,b);CHKERRQ(ierr); 1062e5c89e4eSSatish Balay ierr = PetscStrcat(work,r[i]);CHKERRQ(ierr); 1063e5c89e4eSSatish Balay ierr = PetscStrcat(work,par);CHKERRQ(ierr); 1064e5c89e4eSSatish Balay ierr = PetscStrncpy(b,work,len);CHKERRQ(ierr); 1065e5c89e4eSSatish Balay ierr = PetscStrstr(b,s[i],&par);CHKERRQ(ierr); 1066e5c89e4eSSatish Balay } 1067e5c89e4eSSatish Balay i++; 1068e5c89e4eSSatish Balay } 1069487e5849SBarry Smith i = 0; 1070487e5849SBarry Smith while (r[i]) { 1071e5c89e4eSSatish Balay tfree = (char*)r[i]; 1072e5c89e4eSSatish Balay ierr = PetscFree(tfree);CHKERRQ(ierr); 1073487e5849SBarry Smith i++; 1074e5c89e4eSSatish Balay } 1075e5c89e4eSSatish Balay 1076e5c89e4eSSatish Balay /* look for any other ${xxx} strings to replace from environmental variables */ 1077e5c89e4eSSatish Balay ierr = PetscStrstr(b,"${",&par);CHKERRQ(ierr); 1078e5c89e4eSSatish Balay while (par) { 1079e5c89e4eSSatish Balay *par = 0; 1080e5c89e4eSSatish Balay par += 2; 1081e5c89e4eSSatish Balay ierr = PetscStrcpy(work,b);CHKERRQ(ierr); 1082e5c89e4eSSatish Balay ierr = PetscStrstr(par,"}",&epar);CHKERRQ(ierr); 1083e5c89e4eSSatish Balay *epar = 0; 1084e5c89e4eSSatish Balay epar += 1; 1085e5c89e4eSSatish Balay ierr = PetscOptionsGetenv(comm,par,env,256,&flag);CHKERRQ(ierr); 10867ba3a57cSBarry Smith if (!flag) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Substitution string ${%s} not found as environmental variable",par); 1087e5c89e4eSSatish Balay ierr = PetscStrcat(work,env);CHKERRQ(ierr); 1088e5c89e4eSSatish Balay ierr = PetscStrcat(work,epar);CHKERRQ(ierr); 1089e5c89e4eSSatish Balay ierr = PetscStrcpy(b,work);CHKERRQ(ierr); 1090e5c89e4eSSatish Balay ierr = PetscStrstr(b,"${",&par);CHKERRQ(ierr); 1091e5c89e4eSSatish Balay } 1092e5c89e4eSSatish Balay ierr = PetscFree(work);CHKERRQ(ierr); 109371573d7dSBarry Smith if (aa == b) { 109471573d7dSBarry Smith ierr = PetscFree(a);CHKERRQ(ierr); 109571573d7dSBarry Smith } 1096e5c89e4eSSatish Balay PetscFunctionReturn(0); 1097e5c89e4eSSatish Balay } 1098e5c89e4eSSatish Balay 1099a53986e1SJed Brown #undef __FUNCT__ 1100a53986e1SJed Brown #define __FUNCT__ "PetscEListFind" 1101a53986e1SJed Brown /*@C 1102a53986e1SJed Brown PetscEListFind - searches list of strings for given string, using case insensitive matching 1103e5c89e4eSSatish Balay 1104a53986e1SJed Brown Not Collective 1105a53986e1SJed Brown 1106a53986e1SJed Brown Input Parameters: 1107a53986e1SJed Brown + n - number of strings in 1108a53986e1SJed Brown . list - list of strings to search 1109a53986e1SJed Brown - str - string to look for, empty string "" accepts default (first entry in list) 1110a53986e1SJed Brown 1111a53986e1SJed Brown Output Parameters: 1112a53986e1SJed Brown + value - index of matching string (if found) 1113a53986e1SJed Brown - found - boolean indicating whether string was found (can be NULL) 1114a53986e1SJed Brown 1115a53986e1SJed Brown Notes: 1116a53986e1SJed Brown Not for use in Fortran 1117a53986e1SJed Brown 1118a53986e1SJed Brown Level: advanced 1119a53986e1SJed Brown @*/ 1120a53986e1SJed Brown PetscErrorCode PetscEListFind(PetscInt n,const char *const *list,const char *str,PetscInt *value,PetscBool *found) 1121a53986e1SJed Brown { 1122a53986e1SJed Brown PetscErrorCode ierr; 1123a53986e1SJed Brown PetscBool matched; 1124a53986e1SJed Brown PetscInt i; 1125a53986e1SJed Brown 1126a53986e1SJed Brown PetscFunctionBegin; 1127a53986e1SJed Brown if (found) *found = PETSC_FALSE; 1128a53986e1SJed Brown for (i=0; i<n; i++) { 1129a53986e1SJed Brown ierr = PetscStrcasecmp(str,list[i],&matched);CHKERRQ(ierr); 1130a53986e1SJed Brown if (matched || !str[0]) { 1131a53986e1SJed Brown if (found) *found = PETSC_TRUE; 1132a53986e1SJed Brown *value = i; 1133a53986e1SJed Brown break; 1134a53986e1SJed Brown } 1135a53986e1SJed Brown } 1136a53986e1SJed Brown PetscFunctionReturn(0); 1137a53986e1SJed Brown } 1138a53986e1SJed Brown 1139a53986e1SJed Brown #undef __FUNCT__ 1140a53986e1SJed Brown #define __FUNCT__ "PetscEnumFind" 1141a53986e1SJed Brown /*@C 1142a53986e1SJed Brown PetscEListFind - searches enum list of strings for given string, using case insensitive matching 1143a53986e1SJed Brown 1144a53986e1SJed Brown Not Collective 1145a53986e1SJed Brown 1146a53986e1SJed Brown Input Parameters: 1147a53986e1SJed Brown + enumlist - list of strings to search, followed by enum name, then enum prefix, then NUL 1148a53986e1SJed Brown - str - string to look for 1149a53986e1SJed Brown 1150a53986e1SJed Brown Output Parameters: 1151a53986e1SJed Brown + value - index of matching string (if found) 1152a53986e1SJed Brown - found - boolean indicating whether string was found (can be NULL) 1153a53986e1SJed Brown 1154a53986e1SJed Brown Notes: 1155a53986e1SJed Brown Not for use in Fortran 1156a53986e1SJed Brown 1157a53986e1SJed Brown Level: advanced 1158a53986e1SJed Brown @*/ 1159a53986e1SJed Brown PetscErrorCode PetscEnumFind(const char *const *enumlist,const char *str,PetscEnum *value,PetscBool *found) 1160a53986e1SJed Brown { 1161a53986e1SJed Brown PetscErrorCode ierr; 1162a53986e1SJed Brown PetscInt n,evalue; 1163a53986e1SJed Brown PetscBool efound; 1164a53986e1SJed Brown 1165a53986e1SJed Brown PetscFunctionBegin; 1166a53986e1SJed Brown for (n = 0; enumlist[n]; n++) { 1167a53986e1SJed Brown if (n > 50) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries"); 1168a53986e1SJed Brown } 1169a53986e1SJed Brown if (n < 3) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix"); 1170a53986e1SJed Brown n -= 3; /* drop enum name, prefix, and null termination */ 1171a53986e1SJed Brown ierr = PetscEListFind(n,enumlist,str,&evalue,&efound);CHKERRQ(ierr); 1172*cfb463b1SJed Brown if (efound) *value = (PetscEnum)evalue; 1173a53986e1SJed Brown if (found) *found = efound; 1174a53986e1SJed Brown PetscFunctionReturn(0); 1175a53986e1SJed Brown } 1176