00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #ifndef lint
00040 static char copyright[] =
00041 "@(#) Copyright (c) 2002\n\
00042 Netherlands Forensic Institute. All rights reserved.\n";
00043 #endif
00044
00045 #ifdef HAVE_CONFIG_H
00046 #include <config.h>
00047 #endif
00048
00049 #include <stdlib.h>
00050 #include <string.h>
00051 #include <stddef.h>
00052
00053 #include "rdd.h"
00054 #include "alignedbuf.h"
00055
00056 int
00057 rdd_new_alignedbuf(RDD_ALIGNEDBUF *buf, unsigned bufsize, unsigned align)
00058 {
00059 ptrdiff_t unaligned;
00060 ptrdiff_t aligned;
00061
00062 if (align <= 0) return RDD_BADARG;
00063
00064 bufsize += align;
00065 bufsize += align;
00066
00067 memset(buf, 0, sizeof(*buf));
00068
00069 if ((buf->unaligned = malloc(bufsize)) == 0) {
00070 return RDD_NOMEM;
00071 }
00072
00073 unaligned = buf->unaligned - (unsigned char *) 0;
00074
00075 if ((unaligned % align) == 0) {
00076 aligned = unaligned;
00077 } else {
00078 aligned = unaligned + align - (unaligned % align);
00079 }
00080
00081 buf->aligned = (unsigned char *) aligned;
00082 buf->align = align;
00083 buf->asize = bufsize - (aligned - unaligned);
00084
00085 return RDD_OK;
00086 }
00087
00088 int
00089 rdd_free_alignedbuf(RDD_ALIGNEDBUF *buf)
00090 {
00091 free(buf->unaligned);
00092 memset(buf, 0, sizeof(*buf));
00093
00094 return RDD_OK;
00095 }
00096
00097 unsigned
00098 rdd_abuf_get_size(RDD_ALIGNEDBUF *buf)
00099 {
00100 return buf->asize;
00101 }
00102
00103 unsigned
00104 rdd_abuf_get_alignment(RDD_ALIGNEDBUF *buf)
00105 {
00106 return buf->align;
00107 }