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