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

FreeBSD Manual Pages

  
 
  

home | help
STRUCTS_TYPE_STRUCT(3)	    Library Functions Manual	STRUCTS_TYPE_STRUCT(3)

NAME
       structs_type_struct -- structs types for	C structures

LIBRARY
       PDEL Library (libpdel, -lpdel)

SYNOPSIS
       #include	<sys/types.h>
       #include	<stddef.h>
       #include	<pdel/structs/structs.h>
       #include	<pdel/structs/type/struct.h>

       STRUCTS_STRUCT_TYPE(struct_name,	field_list);

       STRUCTS_STRUCT_FIELD(struct_name, field_name, field_type);

       STRUCTS_STRUCT_FIELD2(struct_name,	field_name,	 display_name,
	   field_type);

DESCRIPTION
       The STRUCTS_STRUCT_TYPE() macro defines	a  structs(3)  type  (i.e.,  a
       struct structs_type) for	describing the C structure struct struct_name.
       The field_list parameter	must point to an array of struct structs_field
       structures describing the fields:

	  /* This structure describes one field	in a structure */
	  struct structs_field {
	      const char		  *name;      /* field name */
	      const struct structs_type	  *type;      /* field type */
	      u_int16_t			  size;	      /* field size */
	      u_int16_t			  offset;     /* field offset */
	  };

       The  fields  need  not be listed	in the array in	the same order as they
       are declared in the C structure.	 However, the array must be terminated
       with STRUCTS_STRUCT_FIELD_END, which is defined as follows:

	     #define STRUCTS_STRUCT_FIELD_END {	NULL, NULL, 0, 0 }

       The STRUCTS_STRUCT_FIELD() macro	should be used to define an  entry  in
       the  field array: field_name is the name	of the field and field_type is
       a pointer to the	structs(3) type	describing the field.

       To define a field and give it a different structs(3) name than its name
       in the  C  structure,  use  STRUCTS_STRUCT_FIELD2()  with  the  desired
       display_name in double quotes.

SEE ALSO
       libpdel(3), structs(3), structs_type(3),	structs_type_union(3)

EXAMPLES
       The  program  below prints out the contents (as an ASCII	string)	of the
       field specified on the command line:

	  #include <sys/types.h>
	  #include <sys/socket.h>
	  #include <netinet/in.h>
	  #include <arpa/inet.h>

	  #include <stdio.h>
	  #include <stdlib.h>
	  #include <err.h>

	  #include <pdel/structs/structs.h>
	  #include <pdel/structs/type/struct.h>
	  #include <pdel/structs/type/string.h>
	  #include <pdel/structs/type/ip4.h>
	  #include <pdel/util/typed_mem.h>

	  /* My	structure */
	  struct foobar	{
		  char		  *name;
		  u_int16_t	  index;
		  struct in_addr  ipaddr;
	  };

	  /* Structs type describing a 'struct foobar' */
	  static const struct structs_field foobar_fields = {
		  STRUCTS_STRUCT_FIELD(foobar, name, &structs_type_string),
		  STRUCTS_STRUCT_FIELD(foobar, index, &structs_type_uint16),
		  STRUCTS_STRUCT_FIELD(foobar, ipaddr, &structs_type_ip4),
		  STRUCTS_STRUCT_FIELD_END
	  };
	  static const struct structs_type foobar_type =
		  STRUCTS_STRUCT_TYPE(foobar, &foobar_fields);

	  int
	  main(int argc, char **argv)
	  {
		  struct foobar	f;
		  const	char *fieldname;
		  char *fieldvalue;

		  /* Initialize	our structure with some	contents */
		  if (structs_init(&foobar_type, NULL, &f) == -1)
			  err(1, "structs_init");
		  f.index = 123;
		  (void)inet_aton("12.34.56.78", &f.ipaddr);
		  if (structs_set_string(&foobar_type, "name",
		      "this is a string", &f, NULL, 0) == -1)
			  err(1, "structs_set_string");

		  /* Get the requested field's name from the command line */
		  if (argc != 2)
			  err(1, "usage: getfield <fieldname>");
		  fieldname = argv[1];

		  /* Display the requested field's value */
		  if ((fieldvalue = structs_get_string(&foobar_type,
		      fieldname, &f, TYPED_MEM_TEMP)) == NULL)
			  err(1, "%s", fieldname);
		  printf("The value of field \"%s\" is:	%s\n",
		      fieldname, fieldvalue);

		  /* Done, clean up */
		  FREE(TYPED_MEM_TEMP, fieldvalue);
		  structs_free(&foobar_type, NULL, &f);
		  return (0);
	  }

HISTORY
       The   PDEL   library   was   developed	at   Packet    Design,	  LLC.
       http://www.packetdesign.com/

AUTHORS
       Archie Cobbs <archie@freebsd.org>

FreeBSD	ports 15.0		April 22, 2002		STRUCTS_TYPE_STRUCT(3)

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

home | help