1 /* $NetBSD: tok822_node.c,v 1.1.1.1 2009/06/23 10:08:48 tron Exp $ */ 2 3 /*++ 4 /* NAME 5 /* tok822_node 3 6 /* SUMMARY 7 /* token memory management 8 /* SYNOPSIS 9 /* #include <tok822.h> 10 /* 11 /* TOK822 *tok822_alloc(type, strval) 12 /* int type; 13 /* const char *strval; 14 /* 15 /* TOK822 *tok822_free(tp) 16 /* TOK822 *tp; 17 /* DESCRIPTION 18 /* This module implements memory management for token 19 /* structures. A distinction is made between single-character 20 /* tokens that have no string value, and string-valued tokens. 21 /* 22 /* tok822_alloc() allocates memory for a token structure of 23 /* the named type, and initializes it properly. In case of 24 /* a single-character token, no string memory is allocated. 25 /* Otherwise, \fIstrval\fR is a null pointer or provides 26 /* string data to initialize the token with. 27 /* 28 /* tok822_free() releases the memory used for the specified token 29 /* and conveniently returns a null pointer value. 30 /* LICENSE 31 /* .ad 32 /* .fi 33 /* The Secure Mailer license must be distributed with this software. 34 /* AUTHOR(S) 35 /* Wietse Venema 36 /* IBM T.J. Watson Research 37 /* P.O. Box 704 38 /* Yorktown Heights, NY 10598, USA 39 /*--*/ 40 41 /* System library. */ 42 43 #include <sys_defs.h> 44 #include <string.h> 45 46 /* Utility library. */ 47 48 #include <mymalloc.h> 49 #include <vstring.h> 50 51 /* Global library. */ 52 53 #include "tok822.h" 54 55 /* tok822_alloc - allocate and initialize token */ 56 57 TOK822 *tok822_alloc(int type, const char *strval) 58 { 59 TOK822 *tp; 60 61 #define CONTAINER_TOKEN(x) \ 62 ((x) == TOK822_ADDR || (x) == TOK822_STARTGRP) 63 64 tp = (TOK822 *) mymalloc(sizeof(*tp)); 65 tp->type = type; 66 tp->next = tp->prev = tp->head = tp->tail = tp->owner = 0; 67 tp->vstr = (type < TOK822_MINTOK || CONTAINER_TOKEN(type) ? 0 : 68 strval == 0 ? vstring_alloc(10) : 69 vstring_strcpy(vstring_alloc(strlen(strval) + 1), strval)); 70 return (tp); 71 } 72 73 /* tok822_free - destroy token */ 74 75 TOK822 *tok822_free(TOK822 *tp) 76 { 77 if (tp->vstr) 78 vstring_free(tp->vstr); 79 myfree((char *) tp); 80 return (0); 81 } 82