* Sebastian Hammer, Adam Dickmeiss
*
* $Log: proto.c,v $
- * Revision 1.10 1995-03-15 11:17:40 quinn
+ * Revision 1.11 1995-03-17 10:17:25 quinn
+ * Added memory management.
+ *
+ * Revision 1.10 1995/03/15 11:17:40 quinn
* Fixed some return-checks from choice.. need better ay to handle those..
*
* Revision 1.9 1995/03/15 08:37:06 quinn
int z_DatabaseSpecific(ODR o, Z_DatabaseSpecific **p, int opt)
{
if (o->direction == ODR_DECODE)
- *p = nalloc(o, sizeof(**p));
+ *p = odr_malloc(o, sizeof(**p));
else if (!*p)
return opt;
return opt;
if (o->direction == ODR_DECODE)
- *p = nalloc(o, sizeof(**p));
+ *p = odr_malloc(o, sizeof(**p));
if (odr_choice(o, arm, &(*p)->u, &(*p)->which) &&
odr_constructed_end(o))
if (!odr_constructed_begin(o, p, ODR_CONTEXT, 46))
return opt;
if (o->direction == ODR_DECODE)
- *p = nalloc(o, sizeof(**p));
+ *p = odr_malloc(o, sizeof(**p));
else
(*p)->u.and = &dummy;
};
if (o->direction ==ODR_DECODE)
- *p = nalloc(o, sizeof(**p));
+ *p = odr_malloc(o, sizeof(**p));
else if (!*p)
return opt;
if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
};
if (o->direction == ODR_DECODE)
- *p = nalloc(o, sizeof(**p));
+ *p = odr_malloc(o, sizeof(**p));
else if (!*p)
return opt;
if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
};
if (o->direction == ODR_DECODE)
- *p = nalloc(o, sizeof(**p));
+ *p = odr_malloc(o, sizeof(**p));
else if (!*p)
return opt;
if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
int z_NamePlusRecordList(ODR o, Z_NamePlusRecordList **p, int opt)
{
if (o->direction == ODR_DECODE)
- *p = nalloc(o, sizeof(**p));
+ *p = odr_malloc(o, sizeof(**p));
if (odr_sequence_of(o, z_NamePlusRecord, &(*p)->records,
&(*p)->num_records))
return 1;
};
if (o->direction == ODR_DECODE)
- *p = nalloc(o, sizeof(**p));
+ *p = odr_malloc(o, sizeof(**p));
else if (!*p)
return opt;
if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
};
if (o->direction == ODR_DECODE)
- *p = nalloc(o, sizeof(**p));
+ *p = odr_malloc(o, sizeof(**p));
if (!odr_choice(o, arm, &(*p)->u, &(*p)->which))
{
if (o->direction == ODR_DECODE)
# Copyright (C) 1994, Index Data I/S
# All rights reserved.
# Sebastian Hammer, Adam Dickmeiss
-# $Id: Makefile,v 1.7 1995-03-14 10:27:34 quinn Exp $
+# $Id: Makefile,v 1.8 1995-03-17 10:17:37 quinn Exp $
SHELL=/bin/sh
INCLUDE=-I../include -I.
PO = odr_bool.o ber_bool.o ber_len.o ber_tag.o odr_util.o odr_null.o \
ber_null.o odr_int.o ber_int.o odr_tag.o odr_cons.o odr_seq.o\
odr_oct.o ber_oct.o odr_bit.o ber_bit.o odr_oid.o ber_oid.o odr_use.o \
- odr_choice.o odr_any.o ber_any.o odr.o
+ odr_choice.o odr_any.o ber_any.o odr.o odr_mem.o
CPP=cc -E
all: $(LIBDIR) $(LIB)
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: ber_any.c,v $
- * Revision 1.6 1995-03-08 12:12:02 quinn
+ * Revision 1.7 1995-03-17 10:17:39 quinn
+ * Added memory management.
+ *
+ * Revision 1.6 1995/03/08 12:12:02 quinn
* Added better error checking.
*
* Revision 1.5 1995/02/14 20:39:54 quinn
o->error = OPROTO;
return 0;
}
- (*p)->buf = nalloc(o, res);
+ (*p)->buf = odr_malloc(o, res);
memcpy((*p)->buf, o->bp, res);
(*p)->len = (*p)->size = res;
o->bp += res;
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: ber_oct.c,v $
- * Revision 1.5 1995-03-08 12:12:10 quinn
+ * Revision 1.6 1995-03-17 10:17:41 quinn
+ * Added memory management.
+ *
+ * Revision 1.5 1995/03/08 12:12:10 quinn
* Added better error checking.
*
* Revision 1.4 1995/02/10 15:55:28 quinn
}
if (len + 1 > p->size - p->len)
{
- c = nalloc(o, p->size += len + 1);
+ c = odr_malloc(o, p->size += len + 1);
if (p->len)
memcpy(c, p->buf, p->len);
p->buf = c;
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: odr.c,v $
- * Revision 1.7 1995-03-10 11:44:41 quinn
+ * Revision 1.8 1995-03-17 10:17:43 quinn
+ * Added memory management.
+ *
+ * Revision 1.7 1995/03/10 11:44:41 quinn
* Fixed serious stack-bug in odr_cons_begin
*
* Revision 1.6 1995/03/08 12:12:15 quinn
r->print = stdout;
r->buf = 0;
r->buflen = 0;
+ r->mem = 0;
odr_reset(r);
return r;
}
o->t_tag = -1;
o->indent = 0;
o->stackp = -1;
+ odr_release_mem(o->mem);
+ o->mem = 0;
}
void odr_destroy(ODR o)
{
+ odr_release_mem(o->mem);
free(o);
}
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: odr_any.c,v $
- * Revision 1.2 1995-03-08 12:12:18 quinn
+ * Revision 1.3 1995-03-17 10:17:46 quinn
+ * Added memory management.
+ *
+ * Revision 1.2 1995/03/08 12:12:18 quinn
* Added better error checking.
*
* Revision 1.1 1995/02/09 15:51:47 quinn
return 1;
}
if (o->direction == ODR_DECODE)
- *p = nalloc(o, sizeof(**p));
+ *p = odr_malloc(o, sizeof(**p));
if (ber_any(o, p))
return 1;
*p = 0;
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: odr_bit.c,v $
- * Revision 1.6 1995-03-08 12:12:19 quinn
+ * Revision 1.7 1995-03-17 10:17:48 quinn
+ * Added memory management.
+ *
+ * Revision 1.6 1995/03/08 12:12:19 quinn
* Added better error checking.
*
* Revision 1.5 1995/02/10 18:57:25 quinn
}
if (o->direction == ODR_DECODE)
{
- *p = nalloc(o, sizeof(Odr_bitmask));
+ *p = odr_malloc(o, sizeof(Odr_bitmask));
memset((*p)->bits, 0, ODR_BITMASK_SIZE);
(*p)->top = -1;
}
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: odr_bool.c,v $
- * Revision 1.4 1995-03-08 12:12:20 quinn
+ * Revision 1.5 1995-03-17 10:17:49 quinn
+ * Added memory management.
+ *
+ * Revision 1.4 1995/03/08 12:12:20 quinn
* Added better error checking.
*
* Revision 1.3 1995/02/10 18:57:25 quinn
if (cons)
return 0;
if (o->direction == ODR_DECODE)
- *p = nalloc(o, sizeof(int));
+ *p = odr_malloc(o, sizeof(int));
return ber_boolean(o, *p);
}
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: odr_int.c,v $
- * Revision 1.5 1995-03-08 12:12:25 quinn
+ * Revision 1.6 1995-03-17 10:17:51 quinn
+ * Added memory management.
+ *
+ * Revision 1.5 1995/03/08 12:12:25 quinn
* Added better error checking.
*
* Revision 1.4 1995/02/10 18:57:25 quinn
return 0;
}
if (o->direction == ODR_DECODE)
- *p = nalloc(o, sizeof(int));
+ *p = odr_malloc(o, sizeof(int));
return ber_integer(o, *p);
}
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: odr_mem.c,v $
- * Revision 1.1 1995-03-14 10:27:40 quinn
+ * Revision 1.2 1995-03-17 10:17:52 quinn
+ * Added memory management.
+ *
+ * Revision 1.1 1995/03/14 10:27:40 quinn
* Modified makefile to use common lib
* Beginning to add memory management to odr
*
- *
*/
#include <stdlib.h>
-
#include <odr.h>
-char *odr_malloc(ODR o, int size)
+#define ODR_MEM_CHUNK (10*1024)
+
+typedef struct odr_memblock
+{
+ char *buf;
+ int size;
+ int top;
+ struct odr_memblock *next;
+} odr_memblock;
+
+static odr_memblock *freelist = 0;
+
+static void free_block(odr_memblock *p)
+{
+ p->next = freelist;
+ freelist = p;
+}
+
+static odr_memblock *get_block(int size)
{
- return malloc(size); /* REPLACE WITH NIBBLE MALLOC!! */
+ odr_memblock *r, *l;
+
+ for (r = freelist, l = 0; r; l = r, r = r->next)
+ if (r->size >= size)
+ break;
+ if (r)
+ if (l)
+ l->next = r->next;
+ else
+ freelist = r->next;
+ else
+ {
+ int get = ODR_MEM_CHUNK;
+
+ if (get < size)
+ get = size;
+ if (!(r = malloc(sizeof(*r))))
+ return 0;
+ if (!(r->buf = malloc(r->size = get)))
+ return 0;
+ }
+ r->top = 0;
+ return r;
+}
+
+void odr_release_mem(odr_memblock *p)
+{
+ odr_memblock *t;
+
+ while (p)
+ {
+ t = p;
+ p = p->next;
+ free_block(t);
+ }
+}
+
+void *odr_malloc(ODR o, int size)
+{
+ struct odr_memblock *p = o->mem;
+ char *r;
+
+ if (!p || p->size - p->top < size)
+ if (!(p = get_block(size)))
+ {
+ o->error = OMEMORY;
+ return 0;
+ }
+ else
+ {
+ p->next = o->mem;
+ o->mem = p;
+ }
+ r = p->buf + p->top;
+ p->top += (size + (sizeof(long) - 1)) & ~(sizeof(long) - 1);
+ return r;
}
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: odr_oct.c,v $
- * Revision 1.7 1995-03-08 12:12:27 quinn
+ * Revision 1.8 1995-03-17 10:17:54 quinn
+ * Added memory management.
+ *
+ * Revision 1.7 1995/03/08 12:12:27 quinn
* Added better error checking.
*
* Revision 1.6 1995/02/10 18:57:26 quinn
}
if (o->direction == ODR_DECODE)
{
- *p = nalloc(o, sizeof(Odr_oct));
+ *p = odr_malloc(o, sizeof(Odr_oct));
(*p)->size= 0;
(*p)->len = 0;
(*p)->buf = 0;
fprintf(o->print, "%s'%s'\n", odr_indent(o), *p);
return 1;
}
- t = nalloc(o, sizeof(Odr_oct)); /* wrapper for octstring */
+ t = odr_malloc(o, sizeof(Odr_oct)); /* wrapper for octstring */
if (o->direction == ODR_ENCODE)
{
t->buf = (unsigned char *) *p;
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: odr_oid.c,v $
- * Revision 1.7 1995-03-08 12:12:29 quinn
+ * Revision 1.8 1995-03-17 10:17:55 quinn
+ * Added memory management.
+ *
+ * Revision 1.7 1995/03/08 12:12:29 quinn
* Added better error checking.
*
* Revision 1.6 1995/03/01 08:40:56 quinn
return 1;
}
if (o->direction == ODR_DECODE)
- *p = nalloc(o, ODR_OID_SIZE * sizeof(**p));
+ *p = odr_malloc(o, ODR_OID_SIZE * sizeof(**p));
return ber_oidc(o, *p);
}
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: odr_seq.c,v $
- * Revision 1.8 1995-03-15 11:18:05 quinn
+ * Revision 1.9 1995-03-17 10:17:57 quinn
+ * Added memory management.
+ *
+ * Revision 1.8 1995/03/15 11:18:05 quinn
* Fixed serious bug in odr_cons
*
* Revision 1.7 1995/03/08 12:12:30 quinn
if (odr_constructed_begin(o, p, o->t_class, o->t_tag))
{
if (o->direction == ODR_DECODE && size)
- *pp = nalloc(o, size);
+ *pp = odr_malloc(o, size);
if (o->direction == ODR_PRINT)
{
fprintf(o->print, "%s{\n", odr_indent(o));
if (*num * sizeof(void*) >= size)
{
/* double the buffer size */
- tmp = nalloc(o, sizeof(void*) * (size += size ? size :
+ tmp = odr_malloc(o, sizeof(void*) * (size += size ? size :
128));
if (*num)
{
#include <odr.h>
#include <stdlib.h>
-void *nalloc(ODR o, int size) { return malloc(size); }
-
char *odr_indent(ODR o)
{
static char buf[512];
};
if (o->direction == ODR_DECODE && !*p)
- *p = nalloc(o, sizeof(**p));
+ *p = odr_malloc(o, sizeof(**p));
res = odr_choice(o, arm, &(*p)->u, &(*p)->which);
if (!res)
{
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: seshigh.c,v $
- * Revision 1.3 1995-03-16 17:42:39 quinn
+ * Revision 1.4 1995-03-17 10:18:08 quinn
+ * Added memory management.
+ *
+ * Revision 1.3 1995/03/16 17:42:39 quinn
* Little changes
*
* Revision 1.2 1995/03/16 13:29:01 quinn
odr_destroy(h->decode);
odr_destroy(h->encode);
free(h->encode_buffer);
+ if (h->input_buffer)
+ free(h->input_buffer);
free(h);
}
fprintf(stderr, "Bad APDU\n");
return -1;
}
+ odr_reset(assoc->decode);
return res;
}
resp.result = &result;
resp.implementationId = "YAZ";
resp.implementationName = "YAZ/Simple asynchronous test server";
- resp.implementationVersion = "$Revision: 1.3 $";
+ resp.implementationVersion = "$Revision: 1.4 $";
resp.userInformationField = 0;
if (!z_APDU(assoc->encode, &apdup, 0))
{
return -1;
}
odr_getbuf(assoc->encode, &assoc->encoded_len);
+ odr_reset(assoc->encode);
iochan_setflags(client, EVENT_OUTPUT | EVENT_EXCEPT);
return 0;
}
return -1;
}
odr_getbuf(assoc->encode, &assoc->encoded_len);
+ odr_reset(assoc->encode);
iochan_setflags(client, EVENT_OUTPUT | EVENT_EXCEPT);
return 0;
}
return -1;
}
odr_getbuf(assoc->encode, &assoc->encoded_len);
+ odr_reset(assoc->encode);
iochan_setflags(client, EVENT_OUTPUT | EVENT_EXCEPT);
return 0;
}