xref: /petsc/src/sys/utils/memc.c (revision e32f2f54e699d0aa6e733466c00da7e34666fe5e)
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