Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
ZCHUNK(3)			  CZMQ Manual			     ZCHUNK(3)

NAME
       zchunk -	Class for work with memory chunks

SYNOPSIS
       //  This	is a stable class, and may not change except for emergencies. It
       //  is provided in stable builds.
       //  This	class has draft	methods, which may change over time. They are not
       //  in stable releases, by default. Use --enable-drafts to enable.
       //  Create a new	chunk of the specified size. If	you specify the	data, it
       //  is copied into the chunk. If	you do not specify the data, the chunk is
       //  allocated and left empty, and you can then add data using zchunk_append.
       CZMQ_EXPORT zchunk_t *
	   zchunk_new (const void *data, size_t	size);

       //  Destroy a chunk
       CZMQ_EXPORT void
	   zchunk_destroy (zchunk_t **self_p);

       //  Resizes chunk max_size as requested;	chunk_cur size is set to zero
       CZMQ_EXPORT void
	   zchunk_resize (zchunk_t *self, size_t size);

       //  Return chunk	cur size
       CZMQ_EXPORT size_t
	   zchunk_size (zchunk_t *self);

       //  Return chunk	max size
       CZMQ_EXPORT size_t
	   zchunk_max_size (zchunk_t *self);

       //  Return chunk	data
       CZMQ_EXPORT byte	*
	   zchunk_data (zchunk_t *self);

       //  Set chunk data from user-supplied data; truncate if too large. Data may
       //  be null. Returns actual size	of chunk
       CZMQ_EXPORT size_t
	   zchunk_set (zchunk_t	*self, const void *data, size_t	size);

       //  Fill	chunk data from	user-supplied octet
       CZMQ_EXPORT size_t
	   zchunk_fill (zchunk_t *self,	byte filler, size_t size);

       //  Append user-supplied	data to	chunk, return resulting	chunk size. If the
       //  data	would exceeded the available space, it is truncated. If	you want to
       //  grow	the chunk to accommodate new data, use the zchunk_extend method.
       CZMQ_EXPORT size_t
	   zchunk_append (zchunk_t *self, const	void *data, size_t size);

       //  Append user-supplied	data to	chunk, return resulting	chunk size. If the
       //  data	would exceeded the available space, the	chunk grows in size.
       CZMQ_EXPORT size_t
	   zchunk_extend (zchunk_t *self, const	void *data, size_t size);

       //  Copy	as much	data from 'source' into	the chunk as possible; returns the
       //  new size of chunk. If all data from 'source'	is used, returns exhausted
       //  on the source chunk.	Source can be consumed as many times as	needed until
       //  it is exhausted. If source was already exhausted, does not change chunk.
       CZMQ_EXPORT size_t
	   zchunk_consume (zchunk_t *self, zchunk_t *source);

       //  Returns true	if the chunk was exhausted by consume methods, or if the
       //  chunk has a size of zero.
       CZMQ_EXPORT bool
	   zchunk_exhausted (zchunk_t *self);

       //  Read	chunk from an open file	descriptor
       //  Caller owns return value and	must destroy it	when done.
       CZMQ_EXPORT zchunk_t *
	   zchunk_read (FILE *handle, size_t bytes);

       //  Write chunk to an open file descriptor
       CZMQ_EXPORT int
	   zchunk_write	(zchunk_t *self, FILE *handle);

       //  Try to slurp	an entire file into a chunk. Will read up to maxsize of
       //  the file. If	maxsize	is 0, will attempt to read the entire file and
       //  fail	with an	assertion if that cannot fit into memory. Returns a new
       //  chunk containing the	file data, or NULL if the file could not be read.
       //  Caller owns return value and	must destroy it	when done.
       CZMQ_EXPORT zchunk_t *
	   zchunk_slurp	(const char *filename, size_t maxsize);

       //  Create copy of chunk, as new	chunk object. Returns a	fresh zchunk_t
       //  object, or null if there was	not enough heap	memory.	If chunk is null,
       //  returns null.
       //  Caller owns return value and	must destroy it	when done.
       CZMQ_EXPORT zchunk_t *
	   zchunk_dup (zchunk_t	*self);

       //  Return chunk	data encoded as	printable hex string. Caller must free
       //  string when finished	with it.
       //  Caller owns return value and	must destroy it	when done.
       CZMQ_EXPORT char	*
	   zchunk_strhex (zchunk_t *self);

       //  Return chunk	data copied into freshly allocated string
       //  Caller must free string when	finished with it.
       //  Caller owns return value and	must destroy it	when done.
       CZMQ_EXPORT char	*
	   zchunk_strdup (zchunk_t *self);

       //  Return TRUE if chunk	body is	equal to string, excluding terminator
       CZMQ_EXPORT bool
	   zchunk_streq	(zchunk_t *self, const char *string);

       //  Transform zchunk into a zframe that can be sent in a	message.
       //  Caller owns return value and	must destroy it	when done.
       CZMQ_EXPORT zframe_t *
	   zchunk_pack (zchunk_t *self);

       //  Transform a zframe into a zchunk.
       //  Caller owns return value and	must destroy it	when done.
       CZMQ_EXPORT zchunk_t *
	   zchunk_unpack (zframe_t *frame);

       //  Calculate SHA1 digest for chunk, using zdigest class.
       CZMQ_EXPORT const char *
	   zchunk_digest (zchunk_t *self);

       //  Dump	chunk to FILE stream, for debugging and	tracing.
       CZMQ_EXPORT void
	   zchunk_fprint (zchunk_t *self, FILE *file);

       //  Dump	message	to stderr, for debugging and tracing.
       //  See zchunk_fprint for details
       CZMQ_EXPORT void
	   zchunk_print	(zchunk_t *self);

       //  Probe the supplied object, and report if it looks like a zchunk_t.
       CZMQ_EXPORT bool
	   zchunk_is (void *self);

       //  Self	test of	this class.
       CZMQ_EXPORT void
	   zchunk_test (bool verbose);

       #ifdef CZMQ_BUILD_DRAFT_API
       // Destroy an item
       typedef void (zchunk_destructor_fn) (
	   void	**hint);

       //  *** Draft method, for development use, may change without warning ***
       //  Create a new	chunk from memory. Take	ownership of the memory	and calling the	destructor
       //  on destroy.
       CZMQ_EXPORT zchunk_t *
	   zchunk_frommem (void	*data, size_t size, zchunk_destructor_fn destructor, void *hint);

       //  *** Draft method, for development use, may change without warning ***
       //  Transform zchunk into a zframe that can be sent in a	message.
       //  Take	ownership of the chunk.
       //  Caller owns return value and	must destroy it	when done.
       CZMQ_EXPORT zframe_t *
	   zchunk_packx	(zchunk_t **self_p);

       #endif // CZMQ_BUILD_DRAFT_API
       Please add '@interface' section in './../src/zchunk.c'.

DESCRIPTION
       The zchunk class	works with variable sized blobs. Not as	efficient as
       ZeroMQ's	messages but they do less weirdness and	so are easier to
       understand. The chunk class has methods to read and write chunks	from
       disk.

       Please add @discuss section in ./../src/zchunk.c.

EXAMPLE
       From zchunk_test	method.

	   zchunk_t *chunk = zchunk_new	("1234567890", 10);
	   assert (chunk);
	   assert (zchunk_size (chunk) == 10);
	   assert (memcmp (zchunk_data (chunk),	"1234567890", 10) == 0);
	   zchunk_destroy (&chunk);

	   chunk = zchunk_new (NULL, 10);
	   assert (chunk);
	   zchunk_append (chunk, "12345678", 8);
	   zchunk_append (chunk, "90ABCDEF", 8);
	   zchunk_append (chunk, "GHIJKLMN", 8);
	   assert (memcmp (zchunk_data (chunk),	"1234567890", 10) == 0);
	   assert (zchunk_size (chunk) == 10);
	   assert (zchunk_streq	(chunk,	"1234567890"));
	   assert (streq (zchunk_digest	(chunk), "01B307ACBA4F54F55AAFC33BB06BBBF6CA803E9A"));
	   char	*string	= zchunk_strdup	(chunk);
	   assert (streq (string, "1234567890"));
	   freen (string);
	   string = zchunk_strhex (chunk);
	   assert (streq (string, "31323334353637383930"));
	   freen (string);

	   zframe_t *frame = zchunk_pack (chunk);
	   assert (frame);

	   zchunk_t *chunk2 = zchunk_unpack (frame);
	   assert (chunk2);
	   assert (memcmp (zchunk_data (chunk2), "1234567890", 10) == 0);
	   zframe_destroy (&frame);
	   zchunk_destroy (&chunk2);

	   zchunk_t *copy = zchunk_dup (chunk);
	   assert (copy);
	   assert (memcmp (zchunk_data (copy), "1234567890", 10) == 0);
	   assert (zchunk_size (copy) == 10);
	   zchunk_destroy (&copy);
	   zchunk_destroy (&chunk);

	   chunk = zchunk_new (NULL, 0);
	   zchunk_extend (chunk, "12345678", 8);
	   zchunk_extend (chunk, "90ABCDEF", 8);
	   zchunk_extend (chunk, "GHIJKLMN", 8);
	   assert (zchunk_size (chunk) == 24);
	   assert (zchunk_streq	(chunk,	"1234567890ABCDEFGHIJKLMN"));
	   zchunk_destroy (&chunk);

	   copy	= zchunk_new ("1234567890abcdefghij", 20);
	   assert (copy);
	   chunk = zchunk_new (NULL, 8);
	   assert (chunk);
	   zchunk_consume (chunk, copy);
	   assert (!zchunk_exhausted (copy));
	   assert (memcmp (zchunk_data (chunk),	"12345678", 8) == 0);
	   zchunk_set (chunk, NULL, 0);
	   zchunk_consume (chunk, copy);
	   assert (!zchunk_exhausted (copy));
	   assert (memcmp (zchunk_data (chunk),	"90abcdef", 8) == 0);
	   zchunk_set (chunk, NULL, 0);
	   zchunk_consume (chunk, copy);
	   assert (zchunk_exhausted (copy));
	   assert (zchunk_size (chunk) == 4);
	   assert (memcmp (zchunk_data (chunk),	"ghij",	4) == 0);
	   zchunk_destroy (&copy);
	   zchunk_destroy (&chunk);

	   char	str[] =	"hello";
	   chunk = zchunk_frommem (str,	5, mem_destructor, str);
	   assert (chunk);
	   zchunk_destroy (&chunk);

	   //  The destructor doesn't free the memory, only changing the strid,
	   //  so we can check if the destructor was invoked
	   assert (streq (str, "world"));

	   chunk = zchunk_new ("1234567890", 10);
	   frame = zchunk_packx	(&chunk);
	   assert (frame);
	   assert (chunk == NULL);

	   chunk = zchunk_unpack (frame);
	   assert (chunk);
	   assert (memcmp (zchunk_data (chunk),	"1234567890", 10) == 0);
	   zframe_destroy (&frame);
	   zchunk_destroy (&chunk);

	   #if defined (__WINDOWS__)
	   zsys_shutdown();
	   #endif

AUTHORS
       The czmq	manual was written by the authors in the AUTHORS file.

RESOURCES
       Main web	site:

       Report bugs to the email	<zeromq-dev@lists.zeromq.org[1]>

COPYRIGHT
       Copyright (c) the Contributors as noted in the AUTHORS file. This file
       is part of CZMQ,	the high-level C binding for 0MQ:
       http://czmq.zeromq.org. This Source Code	Form is	subject	to the terms
       of the Mozilla Public License, v. 2.0. If a copy	of the MPL was not
       distributed with	this file, You can obtain one at
       http://mozilla.org/MPL/2.0/. LICENSE included with the czmq
       distribution.

NOTES
	1. zeromq-dev@lists.zeromq.org
	   mailto:zeromq-dev@lists.zeromq.org

CZMQ 4.2.1			  11/01/2025			     ZCHUNK(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=zchunk&sektion=3&manpath=FreeBSD+Ports+15.0>

home | help