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