summaryrefslogtreecommitdiffstats
path: root/include/libaccess/attrec.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/libaccess/attrec.h')
-rw-r--r--include/libaccess/attrec.h157
1 files changed, 157 insertions, 0 deletions
diff --git a/include/libaccess/attrec.h b/include/libaccess/attrec.h
new file mode 100644
index 00000000..267c32ff
--- /dev/null
+++ b/include/libaccess/attrec.h
@@ -0,0 +1,157 @@
+/** BEGIN COPYRIGHT BLOCK
+ * Copyright 2001 Sun Microsystems, Inc.
+ * Portions copyright 1999, 2001-2003 Netscape Communications Corporation.
+ * All rights reserved.
+ * END COPYRIGHT BLOCK **/
+#ifndef __attrec_h
+#define __attrec_h
+
+/*
+ * Description (attrec.h)
+ *
+ * This file describes the encoding and decoding of attribute
+ * records. Attribute records consist of a sequence of items
+ * of the form:
+ *
+ * <tag><length><contents>
+ *
+ * The <tag> is an integer code which identifies a particular
+ * attribute. The <length> is the integer length in bytes of
+ * the <contents>. The encoding of the contents is determined
+ * by the <tag>, and is application-specific.
+ *
+ * Primitive data types currently supported are unsigned
+ * integers (USI) and null-terminated strings (NTS). The
+ * encoding of USI values less than 128 is simply an octet
+ * containing the value. For values 128 or greater, the first
+ * octet is 0x80 plus the length of the value, in octets.
+ * This octet is followed by the indicated number of octets,
+ * containing the USI value, with the most significant bits in
+ * the first octet, and the least significant bits in the last
+ * octet.
+ *
+ * Examples of USI encoding:
+ *
+ * Value Encoding (each value is an octet)
+ * 4 0x04
+ * 127 0x7f
+ * -1 (this is not a USI)
+ * 128 0x81 0x80
+ * 1023 0x82 0x03 0xff
+ *
+ * The encoding of a null-terminated string (NTS) is simply the
+ * sequence of octets which comprise the string, including the
+ * terminating null (0x00) octet. The terminating null octet is
+ * the only null value in the string. The character set used to
+ * encode the other string octets is ASCII.
+ */
+
+#include "usi.h"
+
+NSPR_BEGIN_EXTERN_C
+
+/* Define a type to reference an attribute record */
+typedef unsigned char * ATR_t;
+
+/*
+ * Description (USILENGTH)
+ *
+ * This macro returns the length of the USI encoding for a specified
+ * unsigned integer value. The length is the number of octets
+ * required. It will be greater than zero, and less than or equal
+ * to USIALLOC(). This is a partial inline optimization of
+ * USI_Length().
+ */
+
+#define USILENGTH(val) (((USI_t)(val) <= 0x7f) ? 1 : USI_Length((USI_t)(val)))
+
+/*
+ * Description (USIALLOC)
+ *
+ * This macro returns the maximum length of an unsigned integer
+ * encoding.
+ */
+
+#define USIALLOC() (5)
+
+/*
+ * Description (USIENCODE)
+ *
+ * This macro encodes a USI value into a specified buffer. It
+ * returns a pointer to the first octet after the encoding.
+ * This is a partial inline optimization for USI_Encode().
+ */
+
+#define USIENCODE(cp, val) (((USI_t)(val) <= 0x7f) ? (*(cp) = (val), (cp)+1) \
+ : USI_Encode((cp), (val)))
+
+/*
+ * Description (USIINSERT)
+ *
+ * This macro performs a variation of USIENCODE which always
+ * generates the maximum-sized USI encoding, i.e. the number of
+ * octets indicated by USIALLOC().
+ */
+
+#define USIINSERT(cp, val) USI_Insert((ATR_t)(cp), (USI_t)(val))
+
+/*
+ * Description (USIDECODE)
+ *
+ * This macro decodes a USI value from a specified buffer. It
+ * returns a pointer to the first octet after the encoding.
+ * This is a partial inline optimization for USI_Decode().
+ */
+
+#define USIDECODE(cp, pval) \
+ ((*(cp) & 0x80) ? USI_Decode((cp), (pval)) \
+ : (((pval) ? (*(pval) = *(cp)) : 0), (cp)+1))
+
+/* Define a type to reference a null-terminated string */
+typedef unsigned char * NTS_t;
+
+/*
+ * Decription (NTSLENGTH)
+ *
+ * Return the length, in octets, of a null-terminated string.
+ * It includes the terminating null octet.
+ */
+
+#define NTSLENGTH(nts) ((nts) ? strlen((char *)(nts)) + 1 : 1)
+
+/*
+ * Description (NTSENCODE)
+ *
+ * This macro copies a null-terminated string to a specified
+ * attribute record buffer. It returns a pointer to the octet
+ * following the NTS in the buffer.
+ */
+
+#define NTSENCODE(cp, nts) \
+ ((ATR_t)memccpy((void *)(cp), \
+ (void *)((nts) ? (NTS_t)(nts) : (NTS_t)""), \
+ 0, NTSLENGTH(nts)))
+
+/*
+ * Description (NTSDECODE)
+ *
+ * This macro decodes a null-terminated string in a specified
+ * attribute record buffer into a dynamically allocated buffer.
+ * It returns a pointer to the first octet after the NTS in the
+ * attribute record buffer.
+ */
+
+#define NTSDECODE(cp, pnts) NTS_Decode((cp), (pnts))
+
+/* Functions in attrec.c */
+extern int NTS_Length(NTS_t ntsp);
+extern ATR_t NTS_Decode(ATR_t cp, NTS_t * pnts);
+extern ATR_t NTS_Encode(ATR_t cp, NTS_t nts);
+extern ATR_t USI_Decode(ATR_t cp, USI_t * pval);
+extern ATR_t USI_Encode(ATR_t cp, USI_t val);
+extern ATR_t USI_Insert(ATR_t cp, USI_t val);
+extern int USI_Length(USI_t val);
+
+NSPR_END_EXTERN_C
+
+#endif /* __attrec_h */