Added implementation of VCard (RFC 2426).
[silc.git] / lib / silcutil / silcbuffmt.h
index 6d9acaeb736327deab7ee84a069cafd441006661..c76213657d202345933e5f3f3c74e4368fbcaf1d 100644 (file)
@@ -10,7 +10,7 @@
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
-  
+
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
 */
 
+/****h* silcutil/SILC Buffer Format Interface
+ *
+ * DESCRIPTION
+ *
+ *    SILC Buffer Format API provides a few functions for formatting
+ *    various different data types into a buffer, and retrieving
+ *    various data from buffer into specific data types.  It is usefull
+ *    to format for example packets and later unformat them.
+ *
+ ***/
+
 #ifndef SILCBUFFMT_H
 #define SILCBUFFMT_H
 
    _SI_ = signed
    _UI_ = unsigned
 
+  Any XXX_STRING_ALLOC types will allocate space for the data and
+  memcpy the data to the pointer sent as argument (in unformatting).
+
+  Any XXX_STRING will not allocate or copy any data.  Instead it
+  will set the pointer to the data.  Note that the data pointer
+  returned (in unformatting) must not be freed.
+
 */
 typedef enum {
   SILC_BUFFER_PARAM_SI8_CHAR,
@@ -37,22 +55,29 @@ typedef enum {
   SILC_BUFFER_PARAM_SI32_INT,
   SILC_BUFFER_PARAM_UI32_INT,
 
-  SILC_BUFFER_PARAM_UI16_STRING,
-  SILC_BUFFER_PARAM_UI16_STRING_ALLOC,
-  SILC_BUFFER_PARAM_UI32_STRING,
-  SILC_BUFFER_PARAM_UI32_STRING_ALLOC,
-  SILC_BUFFER_PARAM_UI16_NSTRING,
-  SILC_BUFFER_PARAM_UI16_NSTRING_ALLOC,
-  SILC_BUFFER_PARAM_UI32_NSTRING,
-  SILC_BUFFER_PARAM_UI32_NSTRING_ALLOC,
-  SILC_BUFFER_PARAM_UI_XNSTRING,
-  SILC_BUFFER_PARAM_UI_XNSTRING_ALLOC,
+  SILC_BUFFER_PARAM_SI64_INT,
+  SILC_BUFFER_PARAM_UI64_INT,
+
+  SILC_BUFFER_PARAM_UI8_STRING,         /* No copy */
+  SILC_BUFFER_PARAM_UI8_STRING_ALLOC,  /* Alloc + memcpy */
+  SILC_BUFFER_PARAM_UI16_STRING,        /* No copy */
+  SILC_BUFFER_PARAM_UI16_STRING_ALLOC, /* Alloc + memcpy */
+  SILC_BUFFER_PARAM_UI32_STRING,       /* No copy */
+  SILC_BUFFER_PARAM_UI32_STRING_ALLOC, /* Alloc + memcpy */
+  SILC_BUFFER_PARAM_UI8_NSTRING,       /* No copy */
+  SILC_BUFFER_PARAM_UI8_NSTRING_ALLOC, /* Alloc + memcpy */
+  SILC_BUFFER_PARAM_UI16_NSTRING,      /* No copy */
+  SILC_BUFFER_PARAM_UI16_NSTRING_ALLOC,        /* Alloc + memcpy */
+  SILC_BUFFER_PARAM_UI32_NSTRING,      /* No copy */
+  SILC_BUFFER_PARAM_UI32_NSTRING_ALLOC,        /* Alloc + memcpy */
+  SILC_BUFFER_PARAM_UI_XNSTRING,       /* No copy */
+  SILC_BUFFER_PARAM_UI_XNSTRING_ALLOC, /* Alloc + memcpy */
 
   SILC_BUFFER_PARAM_END
 } SilcBufferParamType;
 
-/* Macros for expanding parameters into variable function argument list. 
-   These are passed to silc_buffer_format and silc_buffer_unformat 
+/* Macros for expanding parameters into variable function argument list.
+   These are passed to silc_buffer_format and silc_buffer_unformat
    functions. */
 
 /* One signed/unsigned character.
@@ -66,56 +91,69 @@ typedef enum {
 #define SILC_STR_SI_CHAR(x) SILC_BUFFER_PARAM_SI8_CHAR, (x)
 #define SILC_STR_UI_CHAR(x) SILC_BUFFER_PARAM_UI8_CHAR, (x)
 
-/* Signed/unsigned short. 
+/* Signed/SilcUInt16.
 
    Formatting:    SILC_STR_SI_SHORT(short)
-                  SILC_STR_UI_SHORT(unsigned short)
+                  SILC_STR_UI_SHORT(SilcUInt16)
    Unformatting:  SILC_STR_SI_SHORT(short *)
-                  SILC_STR_UI_SHORT(unsigned short *)
+                  SILC_STR_UI_SHORT(SilcUInt16 *)
 
 */
 #define SILC_STR_SI_SHORT(x) SILC_BUFFER_PARAM_SI16_SHORT, (x)
 #define SILC_STR_UI_SHORT(x) SILC_BUFFER_PARAM_UI16_SHORT, (x)
 
-/* Signed/unsigned int. 
+/* Signed/SilcUInt32.
 
    Formatting:    SILC_STR_SI_INT(int)
-                  SILC_STR_UI_INT(unsigned int)
+                  SILC_STR_UI_INT(SilcUInt32)
    Unformatting:  SILC_STR_SI_INT(int *)
-                  SILC_STR_UI_INT(unsigned int *)
+                  SILC_STR_UI_INT(SilcUInt32 *)
 
 */
 #define SILC_STR_SI_INT(x) SILC_BUFFER_PARAM_SI32_INT, (x)
 #define SILC_STR_UI_INT(x) SILC_BUFFER_PARAM_UI32_INT, (x)
 
+/* Signed/SilcUInt64.
+
+   Formatting:    SILC_STR_SI_INT64(int)
+                  SILC_STR_UI_INT64(SilcUInt32)
+   Unformatting:  SILC_STR_SI_INT64(int *)
+                  SILC_STR_UI_INT64(SilcUInt32 *)
+
+*/
+#define SILC_STR_SI_INT64(x) SILC_BUFFER_PARAM_SI64_INT, (x)
+#define SILC_STR_UI_INT64(x) SILC_BUFFER_PARAM_UI64_INT, (x)
+
 /* Unsigned NULL terminated string. Note that the string must be
    NULL terminated because strlen() will be used to get the length of
-   the string. 
+   the string.
 
    Formatting:    SILC_STR_UI32_STRING(unsigned char *)
    Unformatting:  SILC_STR_UI32_STRING(unsigned char **)
 
    Unformatting procedure will check for length of the string from the
    buffer before trying to get the string out. Thus, one *must* format the
-   length as UI_INT or UI_SHORT into the buffer *before* formatting the 
-   actual string to the buffer, and, in unformatting one must ignore the 
-   length of the string because unformatting procedure will take it 
+   length as UI_INT or UI_SHORT into the buffer *before* formatting the
+   actual string to the buffer, and, in unformatting one must ignore the
+   length of the string because unformatting procedure will take it
    automatically.
 
    Example:
 
-   Formatting:    ..., SILC_STR_UI_INT(strlen(string)), 
+   Formatting:    ..., SILC_STR_UI_INT(strlen(string)),
                        SILC_STR_UI32_STRING(string), ...
    Unformatting:  ..., SILC_STR_UI32_STRING(&string), ...
 
    I.e., you ignore the formatted length field in unformatting. If you don't
    the unformatting procedure might fail and it definitely does not unformat
-   the data reliably. 
+   the data reliably.
 
-   _ALLOC routines automatically allocates memory for the variable sent 
+   _ALLOC routines automatically allocates memory for the variable sent
    as argument in unformatting.
 
 */
+#define SILC_STR_UI8_STRING(x) SILC_BUFFER_PARAM_UI8_STRING, (x)
+#define SILC_STR_UI8_STRING_ALLOC(x) SILC_BUFFER_PARAM_UI8_STRING_ALLOC, (x)
 #define SILC_STR_UI16_STRING(x) SILC_BUFFER_PARAM_UI16_STRING, (x)
 #define SILC_STR_UI16_STRING_ALLOC(x) SILC_BUFFER_PARAM_UI16_STRING_ALLOC, (x)
 #define SILC_STR_UI32_STRING(x) SILC_BUFFER_PARAM_UI32_STRING, (x)
@@ -123,19 +161,19 @@ typedef enum {
 
 /* Unsigned string. Second argument is the length of the string.
 
-   Formatting:    SILC_STR_UI32_NSTRING(unsigned char *, unsigned int)
-   Unformatting:  SILC_STR_UI32_NSTRING(unsigned char **, unsigned int *)
+   Formatting:    SILC_STR_UI32_NSTRING(unsigned char *, SilcUInt32)
+   Unformatting:  SILC_STR_UI32_NSTRING(unsigned char **, SilcUInt32 *)
 
    Unformatting procedure will check for length of the string from the
    buffer before trying to get the string out. Thus, one *must* format the
-   length as UI_INT or UI_SHORT into the buffer *before* formatting the 
-   actual string to the buffer, and, in unformatting one must ignore the 
-   length of the string because unformatting procedure will take it 
+   length as UI_INT or UI_SHORT into the buffer *before* formatting the
+   actual string to the buffer, and, in unformatting one must ignore the
+   length of the string because unformatting procedure will take it
    automatically.
 
    Example:
 
-   Formatting:    ..., SILC_STR_UI_INT(strlen(string)), 
+   Formatting:    ..., SILC_STR_UI_INT(strlen(string)),
                        SILC_STR_UI32_NSTRING(string, strlen(string)), ...
    Unformatting:  ..., SILC_STR_UI32_NSTRING(&string, &len), ...
 
@@ -147,10 +185,13 @@ typedef enum {
    UI/SI16 and UI/SI32 means that the length is considered to be either
    short (16 bits) or int (32 bits) in unformatting.
 
-   _ALLOC routines automatically allocates memory for the variable sent 
+   _ALLOC routines automatically allocates memory for the variable sent
    as argument in unformatting.
 
 */
+#define SILC_STR_UI8_NSTRING(x, l) SILC_BUFFER_PARAM_UI8_NSTRING, (x), (l)
+#define SILC_STR_UI8_NSTRING_ALLOC(x, l) \
+  SILC_BUFFER_PARAM_UI8_NSTRING_ALLOC, (x), (l)
 #define SILC_STR_UI16_NSTRING(x, l) SILC_BUFFER_PARAM_UI16_NSTRING, (x), (l)
 #define SILC_STR_UI16_NSTRING_ALLOC(x, l) \
   SILC_BUFFER_PARAM_UI16_NSTRING_ALLOC, (x), (l)
@@ -158,11 +199,11 @@ typedef enum {
 #define SILC_STR_UI32_NSTRING_ALLOC(x, l) \
   SILC_BUFFER_PARAM_UI32_NSTRING_ALLOC, (x), (l)
 
-/* Extended Unsigned string formatting. Second argument is the length of 
+/* Extended Unsigned string formatting. Second argument is the length of
    the string.
 
    Formatting:    This is equal to using *_NSTRING
-   Unformatting:  SILC_STR_UI_XNSTRING(unsigned char **, unsigned int)
+   Unformatting:  SILC_STR_UI_XNSTRING(unsigned char **, SilcUInt32)
 
    This type can be used to take arbitrary length string from the buffer
    by sending the requested amount of bytes as argument. This differs
@@ -172,7 +213,7 @@ typedef enum {
    from the buffer without having the length of the string formatted
    in the buffer.
 
-   _ALLOC routines automatically allocates memory for the variable sent 
+   _ALLOC routines automatically allocates memory for the variable sent
    as argument in unformatting.
 
 */
@@ -180,12 +221,84 @@ typedef enum {
 #define SILC_STR_UI_XNSTRING_ALLOC(x, l) \
   SILC_BUFFER_PARAM_UI_XNSTRING_ALLOC, (x), (l)
 
-/* Marks end of the argument list. This must the at the end of the
+/* Marks end of the argument list. This must be at the end of the
    argument list or error will occur. */
 #define SILC_STR_END SILC_BUFFER_PARAM_END
 
 /* Prototypes */
+
+/****f* silcutil/SilcBufferFormatAPI/silc_buffer_format
+ *
+ * SYNOPSIS
+ *
+ *    int silc_buffer_format(SilcBuffer dst, ...);
+ *
+ * DESCRIPTION
+ *
+ *    Formats a buffer from a variable argument list.  Returns -1 on error
+ *    and the length of the formatted buffer otherwise.
+ *
+ ***/
 int silc_buffer_format(SilcBuffer dst, ...);
+
+/****f* silcutil/SilcBufferFormatAPI/silc_buffer_unformat
+ *
+ * SYNOPSIS
+ *
+ *    int silc_buffer_unformat(SilcBuffer src, ...);
+ *
+ * DESCRIPTION
+ *
+ *    Unformats a buffer from a variable argument list.  Returns -1 on error
+ *    and the length of the unformatted buffer otherwise.
+ *
+ ***/
 int silc_buffer_unformat(SilcBuffer src, ...);
 
-#endif
+/****f* silcutil/SilcBufferFormatAPI/silc_buffer_format_vp
+ *
+ * SYNOPSIS
+ *
+ *    int silc_buffer_format_vp(SilcBuffer dst, va_list vp);
+ *
+ * DESCRIPTION
+ *
+ *    Formats a buffer from a variable argument list indicated by the `ap'.
+ *    Returns -1 on error and the length of the formatted buffer otherwise.
+ *
+ ***/
+int silc_buffer_format_vp(SilcBuffer dst, va_list ap);
+
+/****f* silcutil/SilcBufferFormatAPI/silc_buffer_unformat_vp
+ *
+ * SYNOPSIS
+ *
+ *    int silc_buffer_unformat_vp(SilcBuffer src, va_list vp);
+ *
+ * DESCRIPTION
+ *
+ *    Unformats a buffer from a variable argument list indicated by the `ap'.
+ *    Returns -1 on error and the length of the unformatted buffer otherwise.
+ *
+ ***/
+int silc_buffer_unformat_vp(SilcBuffer src, va_list ap);
+
+/****f* silcutil/SilcBufferFormatAPI/silc_buffer_strformat
+ *
+ * SYNOPSIS
+ *
+ *   int silc_buffer_strformat(SilcBuffer dst, ...);
+ *
+ * DESCRIPTION
+ *
+ *   Formats a buffer from variable argument list of strings.  Eachs
+ *   string must be NULL-terminated and the variable argument list must
+ *   be end with SILC_STR_END argument.  This allows that a string in
+ *   the list can be NULL, in which case it is skipped.  This automatically
+ *   allocates the space for the buffer data but `dst' must be already
+ *   allocated by the caller.
+ *
+ ***/
+int silc_buffer_strformat(SilcBuffer dst, ...);
+
+#endif /* !SILCBUFFMT_H */