xref: /illumos-gate/usr/src/lib/krb5/dyn/dyn_delete.c (revision 012e6ce759c490003aed29439cc47d3d73a99ad3)
1 /*
2  * This file is part of libdyn.a, the C Dynamic Object library.  It
3  * contains the source code for the function DynDelete().
4  *
5  * There are no restrictions on this code; however, if you make any
6  * changes, I request that you document them so that I do not get
7  * credit or blame for your modifications.
8  *
9  * Written by Barr3y Jaspan, Student Information Processing Board (SIPB)
10  * and MIT-Project Athena, 1989.
11  * Copyright (c) 2016 by Delphix. All rights reserved.
12  */
13 
14 #include <stdio.h>
15 #include <strings.h>
16 #include <string.h>
17 
18 #include "dynP.h"
19 
20 /*
21  * Checkers!  Get away from that "hard disk erase" button!
22  *    (Stupid dog.  He almost did it to me again ...)
23  */
24 int DynDelete(obj, idx)
25    DynObjectP obj;
26    int idx;
27 {
28      if (idx < 0) {
29 	  if (obj->debug)
30 	       fprintf(stderr, "dyn: delete: bad index %d\n", idx);
31 	  return DYN_BADINDEX;
32      }
33 
34      if (idx >= obj->num_el) {
35 	  if (obj->debug)
36 	       fprintf(stderr, "dyn: delete: Highest index is %d.\n",
37 		       obj->num_el);
38 	  return DYN_BADINDEX;
39      }
40 
41      if (idx == obj->num_el-1) {
42 	  if (obj->paranoid) {
43 	       if (obj->debug)
44 		    fprintf(stderr, "dyn: delete: last element, zeroing.\n");
45 	       memset(obj->array + idx*obj->el_size, 0, obj->el_size);
46 	  }
47 	  else {
48 	       if (obj->debug)
49 		    fprintf(stderr, "dyn: delete: last element, punting.\n");
50 	  }
51      }
52      else {
53 	  if (obj->debug)
54 	       fprintf(stderr,
55 		       "dyn: delete: copying %d bytes from %d + %d to + %d.\n",
56 		       obj->el_size*(obj->num_el - idx), obj->array,
57 		       (idx+1)*obj->el_size, idx*obj->el_size);
58 
59 #ifdef HAVE_MEMMOVE
60 	  memmove(obj->array + idx*obj->el_size,
61 		  obj->array + (idx+1)*obj->el_size,
62 		  obj->el_size*(obj->num_el - idx));
63 #else
64 	  bcopy(obj->array + (idx+1)*obj->el_size,
65 		  obj->array + idx*obj->el_size,
66 		  obj->el_size*(obj->num_el - idx));
67 #endif
68 	  if (obj->paranoid) {
69 	       if (obj->debug)
70 		    fprintf(stderr,
71 			    "dyn: delete: zeroing %d bytes from %d + %d\n",
72 			    obj->el_size, obj->array,
73 			    obj->el_size*(obj->num_el - 1));
74 	       memset(obj->array + obj->el_size*(obj->num_el - 1), 0,
75 		     obj->el_size);
76 	  }
77      }
78 
79      --obj->num_el;
80 
81      if (obj->debug)
82 	  fprintf(stderr, "dyn: delete: done.\n");
83 
84      return DYN_OK;
85 }
86