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 */
DynDelete(obj,idx)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