Actual source code: memc.c

  1: #define PETSC_DLL

  3: /*
  4:     We define the memory operations here. The reason we just do not use 
  5:   the standard memory routines in the PETSc code is that on some machines 
  6:   they are broken.

  8: */
 9:  #include petscsys.h
 10:  #include petscbt.h
 11: #include "../src/sys/utils/ftn-kernels/fcopy.h"

 15: /*@
 16:    PetscMemcmp - Compares two byte streams in memory.

 18:    Not Collective

 20:    Input Parameters:
 21: +  str1 - Pointer to the first byte stream
 22: .  str2 - Pointer to the second byte stream
 23: -  len  - The length of the byte stream
 24:          (both str1 and str2 are assumed to be of length len)

 26:    Output Parameters:
 27: .   e - PETSC_TRUE if equal else PETSC_FALSE.

 29:    Level: intermediate

 31:    Note: 
 32:    This routine is anologous to memcmp()
 33: @*/
 34: PetscErrorCode  PetscMemcmp(const void *str1,const void *str2,size_t len,PetscTruth *e)
 35: {
 36:   int r;

 39:   if (len > 0 && !str1) SETERRQ(PETSC_ERR_ARG_NULL,"Trying to compare at a null pointer");
 40:   if (len > 0 && !str2) SETERRQ(PETSC_ERR_ARG_NULL,"Trying to compare at a null pointer");
 41:   r = memcmp((char *)str1,(char *)str2,len);
 42:   if (!r) *e = PETSC_TRUE;
 43:   else    *e = PETSC_FALSE;
 44:   return(0);
 45: }

 49: /*@
 50:    PetscMemmove - Copies n bytes, beginning at location b, to the space
 51:    beginning at location a. Copying  between regions that overlap will
 52:    take place correctly.

 54:    Not Collective

 56:    Input Parameters:
 57: +  b - pointer to initial memory space
 58: -  n - length (in bytes) of space to copy

 60:    Output Parameter:
 61: .  a - pointer to copy space

 63:    Level: intermediate

 65:    Note:
 66:    This routine is analogous to memmove().

 68:    Since b can overlap with a, b cannot be declared as const

 70:    Concepts: memory^copying with overlap
 71:    Concepts: copying^memory with overlap

 73: .seealso: PetscMemcpy()
 74: @*/
 75: PetscErrorCode  PetscMemmove(void *a,void *b,size_t n)
 76: {
 78:   if (n > 0 && !a) SETERRQ(PETSC_ERR_ARG_NULL,"Trying to copy to null pointer");
 79:   if (n > 0 && !b) SETERRQ(PETSC_ERR_ARG_NULL,"Trying to copy from a null pointer");
 80: #if !defined(PETSC_HAVE_MEMMOVE)
 81:   if (a < b) {
 82:     if (a <= b - n) {
 83:       memcpy(a,b,n);
 84:     } else {
 85:       memcpy(a,b,(int)(b - a));
 86:       PetscMemmove(b,b + (int)(b - a),n - (int)(b - a));
 87:     }
 88:   }  else {
 89:     if (b <= a - n) {
 90:       memcpy(a,b,n);
 91:     } else {
 92:       memcpy(b + n,b + (n - (int)(a - b)),(int)(a - b));
 93:       PetscMemmove(a,b,n - (int)(a - b));
 94:     }
 95:   }
 96: #else
 97:   memmove((char*)(a),(char*)(b),n);
 98: #endif
 99:   return(0);
100: }