root/usr/src/head/lber.h
/*
 * Copyright (c) 2001 by Sun Microsystems, Inc.
 * All rights reserved.
 */

/*
 * Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4
 *
 * The contents of this file are subject to the Netscape Public License
 * Version 1.0(the "NPL"); you may not use this file except in
 * compliance with the NPL.  You may obtain a copy of the NPL at
 * http:/ /www.mozilla.org/NPL/
 *
 * Software distributed under the NPL is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
 * for the specific language governing rights and limitations under the
 * NPL.
 *
 * The Initial Developer of this code under the NPL is Netscape
 * Communications Corporation.  Portions created by Netscape are
 * Copyright(C) 1998 Netscape Communications Corporation.  All Rights
 * Reserved.
 */

#ifndef _LBER_H
#define _LBER_H

#ifdef  __cplusplus
extern "C" {
#endif

#ifndef _SOLARIS_SDK
#define _SOLARIS_SDK
#endif

#include <stdlib.h>     /* to pick up size_t typedef */

#ifdef  _SOLARIS_SDK
#ifdef  sunos4
#define SAFEMEMCPY(d, s, n)   bcopy(s, d, n)
#else /* sunos4 */
#define SAFEMEMCPY(d, s, n)   memmove(d, s, n)
#endif /* sunos4 */
#endif /* _SOLARIS_SDK */
/*
 * Note that LBER_ERROR and LBER_DEFAULT are values that can never appear
 * as valid BER tags, and so it is safe to use them to report errors.  In
 * fact, any tag for which the following is true is invalid:
 *     (( tag & 0x00000080 ) != 0 ) && (( tag & 0xFFFFFF00 ) != 0 )
 */
#define LBER_ERROR              0xffffffffU
#define LBER_DEFAULT            0xffffffffU
#define LBER_END_OF_SEQORSET    0xfffffffeU
/* BER classes and mask */
#define LBER_CLASS_UNIVERSAL    0x00
#define LBER_CLASS_APPLICATION  0x40
#define LBER_CLASS_CONTEXT      0x80
#define LBER_CLASS_PRIVATE      0xc0
#define LBER_CLASS_MASK         0xc0

/* BER encoding type and mask */
#define LBER_PRIMITIVE          0x00
#define LBER_CONSTRUCTED        0x20
#define LBER_ENCODING_MASK      0x20

#define LBER_BIG_TAG_MASK       0x1f
#define LBER_MORE_TAG_MASK      0x80

/* general BER types we know about */
#define LBER_BOOLEAN            0x01
#define LBER_INTEGER            0x02
#define LBER_BITSTRING          0x03
#define LBER_OCTETSTRING        0x04
#define LBER_NULL               0x05
#define LBER_ENUMERATED         0x0a
#define LBER_SEQUENCE           0x30
#define LBER_SET                0x31


typedef unsigned int    ber_len_t;   /* for BER len */
typedef unsigned int    ber_tag_t;   /* for BER tags */
typedef int             ber_int_t;   /* for BER ints, enums, and Booleans */
typedef unsigned int    ber_uint_t; /* unsigned equivalent of ber_int_t */
typedef int             ber_slen_t; /* signed equivalent of ber_len_t */

typedef struct berval {
        ber_len_t       bv_len;
        char            *bv_val;
} BerValue;

typedef struct berelement BerElement;

#ifdef  _SOLARIS_SDK
#define NULLBER ((BerElement *)NULL)
#endif

typedef int (*BERTranslateProc)(char **bufp, ber_uint_t *buflenp,
        int free_input);
#ifndef macintosh
#if defined(_WINDOWS) || defined(_WIN32) || defined(_CONSOLE)
#include <winsock.h> /* for SOCKET */
typedef SOCKET LBER_SOCKET;
#else
typedef int LBER_SOCKET;
#endif /* _WINDOWS */
#else /* macintosh */
typedef void *LBER_SOCKET;
#endif /* macintosh */

/* calling conventions used by library */
#ifndef LDAP_CALL
#if defined(_WINDOWS) || defined(_WIN32)
#define LDAP_C __cdecl
#ifndef _WIN32
#define __stdcall _far _pascal
#define LDAP_CALLBACK _loadds
#else
#define LDAP_CALLBACK
#endif /* _WIN32 */
#define LDAP_PASCAL __stdcall
#define LDAP_CALL LDAP_PASCAL
#else /* _WINDOWS */
#define LDAP_C
#define LDAP_CALLBACK
#define LDAP_PASCAL
#define LDAP_CALL
#endif /* _WINDOWS */
#endif /* LDAP_CALL */

/*
 * function prototypes for lber library
 */
#ifndef LDAP_API
#if defined(_WINDOWS) || defined(_WIN32)
#define LDAP_API(rt) rt
#else /* _WINDOWS */
#define LDAP_API(rt) rt
#endif /* _WINDOWS */
#endif /* LDAP_API */

/*
 * decode routines
 */
ber_tag_t LDAP_CALL ber_get_tag(BerElement *ber);
ber_tag_t LDAP_CALL ber_skip_tag(BerElement *ber,
        ber_len_t *len);
ber_tag_t LDAP_CALL ber_peek_tag(BerElement *ber,
        ber_len_t *len);
ber_tag_t LDAP_CALL ber_get_int(BerElement *ber, ber_int_t *num);
ber_tag_t LDAP_CALL ber_get_stringb(BerElement *ber, char *buf,
        ber_len_t *len);
ber_tag_t LDAP_CALL ber_get_stringa(BerElement *ber,
        char **buf);
ber_tag_t LDAP_CALL ber_get_stringal(BerElement *ber,
        struct berval **bv);
ber_tag_t ber_get_bitstringa(BerElement *ber,
        char **buf, ber_len_t *len);
ber_tag_t LDAP_CALL ber_get_null(BerElement *ber);
ber_tag_t LDAP_CALL ber_get_boolean(BerElement *ber,
        int *boolval);
ber_tag_t LDAP_CALL ber_first_element(BerElement *ber,
        ber_len_t *len, char **last);
ber_tag_t LDAP_CALL ber_next_element(BerElement *ber,
        ber_len_t *len, char *last);
ber_tag_t LDAP_C ber_scanf(BerElement *ber, const char *fmt,
        ...);
LDAP_API(void) LDAP_CALL ber_bvfree(struct berval *bv);
LDAP_API(void) LDAP_CALL ber_bvecfree(struct berval **bv);
struct berval *LDAP_CALL ber_bvdup(const struct berval *bv);
LDAP_API(void) LDAP_CALL ber_set_string_translators(BerElement *ber,
        BERTranslateProc encode_proc, BERTranslateProc decode_proc);
LDAP_API(BerElement *) LDAP_CALL ber_init(const struct berval *bv);

/*
 * encoding routines
 */
int LDAP_CALL ber_put_enum(BerElement *ber, ber_int_t num,
        ber_tag_t tag);
int LDAP_CALL ber_put_int(BerElement *ber, ber_int_t num,
        ber_tag_t tag);
int LDAP_CALL ber_put_ostring(BerElement *ber, char *str,
        ber_len_t len, ber_tag_t tag);
int LDAP_CALL ber_put_string(BerElement *ber, char *str,
        ber_tag_t tag);
int LDAP_CALL ber_put_bitstring(BerElement *ber, char *str,
        ber_len_t bitlen, ber_tag_t tag);
int LDAP_CALL ber_put_null(BerElement *ber, ber_tag_t tag);
int LDAP_CALL ber_put_boolean(BerElement *ber, int boolval,
        ber_tag_t tag);
int LDAP_CALL ber_start_seq(BerElement *ber, ber_tag_t tag);
int LDAP_CALL ber_start_set(BerElement *ber, ber_tag_t tag);
int LDAP_CALL ber_put_seq(BerElement *ber);
int LDAP_CALL ber_put_set(BerElement *ber);
int LDAP_C ber_printf(BerElement *ber, const char *fmt, ...);
int LDAP_CALL ber_flatten(BerElement *ber,
        struct berval **bvPtr);

/*
 * miscellaneous routines
 */
LDAP_API(void) LDAP_CALL ber_free(BerElement *ber, int freebuf);
LDAP_API(BerElement*) LDAP_CALL ber_alloc(void);
LDAP_API(BerElement*) LDAP_CALL der_alloc(void);
LDAP_API(BerElement*) LDAP_CALL ber_alloc_t(int options);
LDAP_API(BerElement*) LDAP_CALL ber_dup(BerElement *ber);
ber_int_t LDAP_CALL ber_read(BerElement *ber, char *buf,
        ber_len_t len);
ber_int_t LDAP_CALL ber_write(BerElement *ber, char *buf,
        ber_len_t len, int nosos);
LDAP_API(void) LDAP_CALL ber_reset(BerElement *ber, int was_writing);

#ifdef  __cplusplus
}
#endif

#endif /* _LBER_H */