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