1e5c89e4eSSatish Balay #define PETSC_DLL 2e5c89e4eSSatish Balay 3e5c89e4eSSatish Balay /* 4e5c89e4eSSatish Balay We define the memory operations here. The reason we just do not use 5e5c89e4eSSatish Balay the standard memory routines in the PETSc code is that on some machines 6e5c89e4eSSatish Balay they are broken. 7e5c89e4eSSatish Balay 8e5c89e4eSSatish Balay */ 9d382aafbSBarry Smith #include "petscsys.h" /*I "petscsys.h" I*/ 10e5c89e4eSSatish Balay #include "petscbt.h" 118397fe1aSBarry Smith #include "../src/sys/utils/ftn-kernels/fcopy.h" 12e5c89e4eSSatish Balay 13e5c89e4eSSatish Balay #undef __FUNCT__ 14e5c89e4eSSatish Balay #define __FUNCT__ "PetscMemcmp" 154610e317SSatish Balay /*@ 16e5c89e4eSSatish Balay PetscMemcmp - Compares two byte streams in memory. 17e5c89e4eSSatish Balay 18e5c89e4eSSatish Balay Not Collective 19e5c89e4eSSatish Balay 20e5c89e4eSSatish Balay Input Parameters: 21e5c89e4eSSatish Balay + str1 - Pointer to the first byte stream 22e5c89e4eSSatish Balay . str2 - Pointer to the second byte stream 23e5c89e4eSSatish Balay - len - The length of the byte stream 24e5c89e4eSSatish Balay (both str1 and str2 are assumed to be of length len) 25e5c89e4eSSatish Balay 26e5c89e4eSSatish Balay Output Parameters: 27e5c89e4eSSatish Balay . e - PETSC_TRUE if equal else PETSC_FALSE. 28e5c89e4eSSatish Balay 29e5c89e4eSSatish Balay Level: intermediate 30e5c89e4eSSatish Balay 31e5c89e4eSSatish Balay Note: 32e5c89e4eSSatish Balay This routine is anologous to memcmp() 33e5c89e4eSSatish Balay @*/ 34e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscMemcmp(const void *str1,const void *str2,size_t len,PetscTruth *e) 35e5c89e4eSSatish Balay { 36e5c89e4eSSatish Balay int r; 37e5c89e4eSSatish Balay 38e5c89e4eSSatish Balay PetscFunctionBegin; 39*e32f2f54SBarry Smith if (len > 0 && !str1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to compare at a null pointer"); 40*e32f2f54SBarry Smith if (len > 0 && !str2) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to compare at a null pointer"); 41e5c89e4eSSatish Balay r = memcmp((char *)str1,(char *)str2,len); 42e5c89e4eSSatish Balay if (!r) *e = PETSC_TRUE; 43e5c89e4eSSatish Balay else *e = PETSC_FALSE; 44e5c89e4eSSatish Balay PetscFunctionReturn(0); 45e5c89e4eSSatish Balay } 46e5c89e4eSSatish Balay 47e5c89e4eSSatish Balay #undef __FUNCT__ 48e5c89e4eSSatish Balay #define __FUNCT__ "PetscMemmove" 494610e317SSatish Balay /*@ 50e5c89e4eSSatish Balay PetscMemmove - Copies n bytes, beginning at location b, to the space 51e5c89e4eSSatish Balay beginning at location a. Copying between regions that overlap will 52e5c89e4eSSatish Balay take place correctly. 53e5c89e4eSSatish Balay 54e5c89e4eSSatish Balay Not Collective 55e5c89e4eSSatish Balay 56e5c89e4eSSatish Balay Input Parameters: 57e5c89e4eSSatish Balay + b - pointer to initial memory space 58e5c89e4eSSatish Balay - n - length (in bytes) of space to copy 59e5c89e4eSSatish Balay 60e5c89e4eSSatish Balay Output Parameter: 61e5c89e4eSSatish Balay . a - pointer to copy space 62e5c89e4eSSatish Balay 63e5c89e4eSSatish Balay Level: intermediate 64e5c89e4eSSatish Balay 65e5c89e4eSSatish Balay Note: 66e5c89e4eSSatish Balay This routine is analogous to memmove(). 67e5c89e4eSSatish Balay 68300a7f5bSBarry Smith Since b can overlap with a, b cannot be declared as const 69300a7f5bSBarry Smith 70e5c89e4eSSatish Balay Concepts: memory^copying with overlap 71e5c89e4eSSatish Balay Concepts: copying^memory with overlap 72e5c89e4eSSatish Balay 73e5c89e4eSSatish Balay .seealso: PetscMemcpy() 74e5c89e4eSSatish Balay @*/ 75e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscMemmove(void *a,void *b,size_t n) 76e5c89e4eSSatish Balay { 77e5c89e4eSSatish Balay PetscFunctionBegin; 78*e32f2f54SBarry Smith if (n > 0 && !a) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy to null pointer"); 79*e32f2f54SBarry Smith if (n > 0 && !b) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy from a null pointer"); 80e5c89e4eSSatish Balay #if !defined(PETSC_HAVE_MEMMOVE) 81e5c89e4eSSatish Balay if (a < b) { 82e5c89e4eSSatish Balay if (a <= b - n) { 83e5c89e4eSSatish Balay memcpy(a,b,n); 84e5c89e4eSSatish Balay } else { 85e5c89e4eSSatish Balay memcpy(a,b,(int)(b - a)); 86e5c89e4eSSatish Balay PetscMemmove(b,b + (int)(b - a),n - (int)(b - a)); 87e5c89e4eSSatish Balay } 88e5c89e4eSSatish Balay } else { 89e5c89e4eSSatish Balay if (b <= a - n) { 90e5c89e4eSSatish Balay memcpy(a,b,n); 91e5c89e4eSSatish Balay } else { 92e5c89e4eSSatish Balay memcpy(b + n,b + (n - (int)(a - b)),(int)(a - b)); 93e5c89e4eSSatish Balay PetscMemmove(a,b,n - (int)(a - b)); 94e5c89e4eSSatish Balay } 95e5c89e4eSSatish Balay } 96e5c89e4eSSatish Balay #else 97e5c89e4eSSatish Balay memmove((char*)(a),(char*)(b),n); 98e5c89e4eSSatish Balay #endif 99e5c89e4eSSatish Balay PetscFunctionReturn(0); 100e5c89e4eSSatish Balay } 101e5c89e4eSSatish Balay 102e5c89e4eSSatish Balay 103e5c89e4eSSatish Balay 104e5c89e4eSSatish Balay 105