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 internal function _DynRealloc().
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 <stdlib.h>
17
18#include "dynP.h"
19
20/*
21 * Resize the array so that element req exists.
22 */
23int _DynResize(obj, req)
24   DynObjectP obj;
25   int req;
26{
27     int cnt, size;
28
29     if (obj->size > req)
30	  return DYN_OK;
31     else if (obj->inc > 0)
32	  return _DynRealloc(obj, (req - obj->size) / obj->inc + 1);
33     else {
34	  if (obj->size == 0)
35	       size = -obj->inc;
36	  else
37	       size = obj->size;
38
39	  while (size <= req)
40	       size <<= 1;
41
42	  return _DynRealloc(obj, size);
43     }
44}
45
46/*
47 * Resize the array by num_incs units.  If obj->inc is positive, this
48 * means make it obj->inc*num_incs elements larger.  If obj->inc is
49 * negative, this means make the array num_incs elements long.
50 *
51 * Ideally, this function should not be called from outside the
52 * library.  However, nothing will break if it is.
53 */
54int _DynRealloc(obj, num_incs)
55   DynObjectP obj;
56   int num_incs;
57{
58     DynPtr temp;
59     int new_size_in_bytes;
60
61     if (obj->inc > 0)
62	  new_size_in_bytes = obj->el_size*(obj->size + obj->inc*num_incs);
63     else
64	  new_size_in_bytes = obj->el_size*num_incs;
65
66     if (obj->debug)
67	  fprintf(stderr,
68		  "dyn: alloc: Increasing object by %d bytes (%d incs).\n",
69		  new_size_in_bytes - obj->el_size*obj->size,
70		  num_incs);
71
72     temp = (DynPtr) realloc(obj->array, new_size_in_bytes);
73     if (temp == NULL) {
74	  if (obj->debug)
75	       fprintf(stderr, "dyn: alloc: Out of memory.\n");
76	  return DYN_NOMEM;
77     }
78     else {
79	  obj->array = temp;
80	  if (obj->inc > 0)
81	       obj->size += obj->inc*num_incs;
82	  else
83	       obj->size = num_incs;
84     }
85
86     if (obj->debug)
87	  fprintf(stderr, "dyn: alloc: done.\n");
88
89     return DYN_OK;
90}
91