/*
* Copyright (c) 2005 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
* forth in the LICENSE file which can be found at the top level of
* the sendmail distribution.
*
* $Id: hdrmod.h,v 1.8 2005/11/19 01:52:54 ca Exp $
*/
#ifndef SM_HDRMOD_H
#define SM_HDRMOD_H 1
#include "sm/generic.h"
#include "sm/hdrmoddef.h"
#include "sm/types.h"
#include "sm/cstr.h"
#include "sm/queue.h"
#include "sm/rcb.h"
enum sm_hm_type_E
{
SM_HM_TYPE_PREPEND = SM_HDRMOD_T_PREPEND
,SM_HM_TYPE_INSERT = SM_HDRMOD_T_INSERT
,SM_HM_TYPE_REPLACE = SM_HDRMOD_T_REPLACE
,SM_HM_TYPE_REMOVE = SM_HDRMOD_T_REMOVE
,SM_HM_TYPE_APPEND = SM_HDRMOD_T_APPEND
};
typedef enum sm_hm_type_E sm_hm_type_T;
#define SM_HM_USE_POS(sm_hm_type) \
(SM_HM_TYPE_INSERT == (sm_hm_type) || \
SM_HM_TYPE_REPLACE == (sm_hm_type) || \
SM_HM_TYPE_REMOVE == (sm_hm_type))
/* header modification entry (in a list/simple queue) */
typedef struct sm_hdrmod_S sm_hdrmod_T, *sm_hdrmod_P;
/* head for header modification list */
TAILQ_HEAD(sm_hdrmodhd_S, sm_hdrmod_S);
typedef struct sm_hdrmodhd_S sm_hdrmodhd_T, *sm_hdrmodhd_P;
struct sm_hdrmod_S
{
sm_hm_type_T sm_hm_type;
uint sm_hm_pos;
sm_cstr_P sm_hm_hdr;
TAILQ_ENTRY(sm_hdrmod_S) sm_hm_next;
};
/* need to use tailq to allow removal of last element?? */
#define HDRMODL_INIT(sm_hdrmodhd) TAILQ_INIT(sm_hdrmodhd)
#define HDRMODL_FIRST(sm_hdrmodhd) \
(((sm_hdrmodhd) != NULL) ? TAILQ_FIRST(sm_hdrmodhd) : NULL)
#define HDRMODL_LAST(sm_hdrmodhd) TAILQ_LAST(sm_hdrmodhd, sm_hdrmodhd_S)
#define HDRMODL_END(sm_hdrmodhd) TAILQ_END(sm_hdrmodhd)
#define HDRMODL_EMPTY(sm_hdrmodhd) \
((NULL == (sm_hdrmodhd)) || TAILQ_EMPTY(sm_hdrmodhd))
#define HDRMODL_NEXT(sm_hdrmod) TAILQ_NEXT(sm_hdrmod, sm_hm_next)
#define HDRMODL_APP(sm_hdrmodhd, sm_hdrmod) TAILQ_INSERT_TAIL(sm_hdrmodhd, sm_hdrmod, sm_hm_next)
#define HDRMODL_PRE(sm_hdrmodhd, sm_hdrmod) TAILQ_INSERT_HEAD(sm_hdrmodhd, sm_hdrmod, sm_hm_next)
#define HDRMODL_INS_BEFORE(sm_hdrmodhd, sm_hdrmod_new, sm_hdrmod_old) \
TAILQ_INSERT_BEFORE(sm_hdrmod_old, sm_hdrmod_new, sm_hm_next)
#define HDRMODL_RM_FIRST(sm_hdrmodhd) TAILQ_REMOVE((sm_hdrmodhd), HDRMODL_FIRST(sm_hdrmodhd), sm_hm_next)
#define HDRMODL_RM_LAST(sm_hdrmodhd) TAILQ_REMOVE((sm_hdrmodhd), HDRMODL_LAST(sm_hdrmodhd), sm_hm_next)
#define HDRMODL_REMOVE(sm_hdrmodhd) TAILQ_REMOVE((sm_hdrmodhd), HDRMODL_FIRST(sm_hdrmodhd), sm_hm_next)
#define HDRMODL_RM_ELEM(sm_hdrmodhd, sm_hdrmod) TAILQ_REMOVE((sm_hdrmodhd), (sm_hdrmod), sm_hm_next)
sm_ret_T sm_hdrmod_new(sm_hdrmodhd_P *_psm_hdrmodhd, bool _append, sm_hdrmod_P *_psm_hdrmod);
sm_ret_T sm_hdrmod_rm(sm_hdrmodhd_P *_sm_hdrmodhd);
sm_ret_T sm_hdrmod_rm_last(sm_hdrmodhd_P *_psm_hdrmodhd);
sm_ret_T sm_hdrmod_rm_elem(sm_hdrmodhd_P *_psm_hdrmodhd, sm_hdrmod_P _sm_hdrmod);
sm_ret_T sm_hdrmodl_free(sm_hdrmodhd_P *_psm_hdrmodhd);
sm_ret_T sm_hdrmod_insert(sm_hdrmodhd_P _sm_hdrmodhd, sm_hdrmod_P _sm_hdrmod);
sm_ret_T sm_hdrmodl_wr(sm_hdrmodhd_P _sm_hdrmodhd, sm_rcb_P _rcb, uint32_t _rttp, uint32_t _rthdr);
sm_ret_T sm_hdrmodl_rd(sm_hdrmodhd_P _sm_hdrmodhd, sm_rcb_P _rcb, uint32_t _rttp, uint32_t _rthdr);
#endif /* SM_HDRMOD_H */
syntax highlighted by Code2HTML, v. 0.9.1