Postfix3.3.1
mvect.c
[詳解]
1 /*++
2 /* NAME
3 /* mvect 3
4 /* SUMMARY
5 /* memory vector management
6 /* SYNOPSIS
7 /* #include <mvect.h>
8 /*
9 /* char *mvect_alloc(vector, elsize, nelm, init_fn, wipe_fn)
10 /* MVECT *vector;
11 /* ssize_t elsize;
12 /* ssize_t nelm;
13 /* void (*init_fn)(char *ptr, ssize_t count);
14 /* void (*wipe_fn)(char *ptr, ssize_t count);
15 /*
16 /* char *mvect_realloc(vector, nelm)
17 /* MVECT *vector;
18 /* ssize_t nelm;
19 /*
20 /* char *mvect_free(vector)
21 /* MVECT *vector;
22 /* DESCRIPTION
23 /* This module supports memory management for arrays of arbitrary
24 /* objects. It is up to the application to provide specific code
25 /* that initializes and uses object memory.
26 /*
27 /* mvect_alloc() initializes memory for a vector with elements
28 /* of \fIelsize\fR bytes, and with at least \fInelm\fR elements.
29 /* \fIinit_fn\fR is a null pointer, or a pointer to a function
30 /* that initializes \fIcount\fR vector elements.
31 /* \fIwipe_fn\fR is a null pointer, or a pointer to a function
32 /* that is complementary to \fIinit_fn\fR. This routine is called
33 /* by mvect_free(). The result of mvect_alloc() is a pointer to
34 /* the allocated vector.
35 /*
36 /* mvect_realloc() guarantees that the specified vector has space
37 /* for at least \fInelm\fR elements. The result is a pointer to the
38 /* allocated vector, which may change across calls.
39 /*
40 /* mvect_free() releases storage for the named vector. The result
41 /* is a convenient null pointer.
42 /* SEE ALSO
43 /* mymalloc(3) memory management
44 /* DIAGNOSTICS
45 /* Problems are reported via the msg(3) diagnostics routines:
46 /* the requested amount of memory is not available; improper use
47 /* is detected; other fatal errors.
48 /* LICENSE
49 /* .ad
50 /* .fi
51 /* The Secure Mailer license must be distributed with this software.
52 /* AUTHOR(S)
53 /* Wietse Venema
54 /* IBM T.J. Watson Research
55 /* P.O. Box 704
56 /* Yorktown Heights, NY 10598, USA
57 /*
58 /* Wietse Venema
59 /* Google, Inc.
60 /* 111 8th Avenue
61 /* New York, NY 10011, USA
62 /*--*/
63 
64 /* System library. */
65 
66 #include <sys_defs.h>
67 
68 /* Utility library. */
69 
70 #include "mymalloc.h"
71 #include "mvect.h"
72 
73 /* mvect_alloc - allocate memory vector */
74 
75 char *mvect_alloc(MVECT *vect, ssize_t elsize, ssize_t nelm,
76  void (*init_fn) (char *, ssize_t), void (*wipe_fn) (char *, ssize_t))
77 {
78  vect->init_fn = init_fn;
79  vect->wipe_fn = wipe_fn;
80  vect->nelm = 0;
81  vect->ptr = mymalloc(elsize * nelm);
82  vect->nelm = nelm;
83  vect->elsize = elsize;
84  if (vect->init_fn)
85  vect->init_fn(vect->ptr, vect->nelm);
86  return (vect->ptr);
87 }
88 
89 /* mvect_realloc - adjust memory vector allocation */
90 
91 char *mvect_realloc(MVECT *vect, ssize_t nelm)
92 {
93  ssize_t old_len = vect->nelm;
94  ssize_t incr = nelm - old_len;
95  ssize_t new_nelm;
96 
97  if (incr > 0) {
98  if (incr < old_len)
99  incr = old_len;
100  new_nelm = vect->nelm + incr;
101  vect->ptr = myrealloc(vect->ptr, vect->elsize * new_nelm);
102  vect->nelm = new_nelm;
103  if (vect->init_fn)
104  vect->init_fn(vect->ptr + old_len * vect->elsize, incr);
105  }
106  return (vect->ptr);
107 }
108 
109 /* mvect_free - release memory vector storage */
110 
111 char *mvect_free(MVECT *vect)
112 {
113  if (vect->wipe_fn)
114  vect->wipe_fn(vect->ptr, vect->nelm);
115  myfree(vect->ptr);
116  return (0);
117 }
MVECT_FN init_fn
Definition: mvect.h:23
char * ptr
Definition: mvect.h:20
void myfree(void *ptr)
Definition: mymalloc.c:207
Definition: mvect.h:19
void * myrealloc(void *ptr, ssize_t len)
Definition: mymalloc.c:175
char * mvect_free(MVECT *vect)
Definition: mvect.c:111
char * mvect_alloc(MVECT *vect, ssize_t elsize, ssize_t nelm, void(*init_fn)(char *, ssize_t), void(*wipe_fn)(char *, ssize_t))
Definition: mvect.c:75
char * mvect_realloc(MVECT *vect, ssize_t nelm)
Definition: mvect.c:91
ssize_t elsize
Definition: mvect.h:21
MVECT_FN wipe_fn
Definition: mvect.h:24
ssize_t nelm
Definition: mvect.h:22
void * mymalloc(ssize_t len)
Definition: mymalloc.c:150