Annotation of embedaddon/libpdel/structs/structs_type.3, revision 1.1.1.1

1.1       misho       1: .\" Copyright (c) 2001-2002 Packet Design, LLC.
                      2: .\" All rights reserved.
                      3: .\" 
                      4: .\" Subject to the following obligations and disclaimer of warranty,
                      5: .\" use and redistribution of this software, in source or object code
                      6: .\" forms, with or without modifications are expressly permitted by
                      7: .\" Packet Design; provided, however, that:
                      8: .\" 
                      9: .\"    (i)  Any and all reproductions of the source or object code
                     10: .\"         must include the copyright notice above and the following
                     11: .\"         disclaimer of warranties; and
                     12: .\"    (ii) No rights are granted, in any manner or form, to use
                     13: .\"         Packet Design trademarks, including the mark "PACKET DESIGN"
                     14: .\"         on advertising, endorsements, or otherwise except as such
                     15: .\"         appears in the above copyright notice or in the software.
                     16: .\" 
                     17: .\" THIS SOFTWARE IS BEING PROVIDED BY PACKET DESIGN "AS IS", AND
                     18: .\" TO THE MAXIMUM EXTENT PERMITTED BY LAW, PACKET DESIGN MAKES NO
                     19: .\" REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING
                     20: .\" THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED
                     21: .\" WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
                     22: .\" OR NON-INFRINGEMENT.  PACKET DESIGN DOES NOT WARRANT, GUARANTEE,
                     23: .\" OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS
                     24: .\" OF THE USE OF THIS SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY,
                     25: .\" RELIABILITY OR OTHERWISE.  IN NO EVENT SHALL PACKET DESIGN BE
                     26: .\" LIABLE FOR ANY DAMAGES RESULTING FROM OR ARISING OUT OF ANY USE
                     27: .\" OF THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY DIRECT,
                     28: .\" INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE, OR CONSEQUENTIAL
                     29: .\" DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF
                     30: .\" USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY THEORY OF
                     31: .\" LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     32: .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
                     33: .\" THE USE OF THIS SOFTWARE, EVEN IF PACKET DESIGN IS ADVISED OF
                     34: .\" THE POSSIBILITY OF SUCH DAMAGE.
                     35: .\"
                     36: .\" Author: Archie Cobbs <archie@freebsd.org>
                     37: .\"
                     38: .\" $Id: structs_type.3,v 1.13 2004/06/02 17:24:38 archie Exp $
                     39: .\"
                     40: .Dd April 22, 2002
                     41: .Dt STRUCTS_TYPE 3
                     42: .Os
                     43: .Sh NAME
                     44: .Nm structs_type
                     45: .Nd data structure description structure
                     46: .Sh LIBRARY
                     47: PDEL Library (libpdel, \-lpdel)
                     48: .Sh SYNOPSIS
                     49: .In sys/types.h
                     50: .In pdel/structs/structs.h
                     51: .Sh DESCRIPTION
                     52: A
                     53: .Nm "structs type"
                     54: defines information about, and provides methods for dealing with,
                     55: instances of a particular data structure.
                     56: This information enables the
                     57: .Xr structs 3
                     58: library to access instances of the data structure in a consistent
                     59: and automated fashion.
                     60: .Pp
                     61: A
                     62: .Nm "structs type"
                     63: is defined by a
                     64: .Li "struct structs_type" :
                     65: .Pp
                     66: .Bd -literal -compact -offset 3n
                     67: struct structs_type {
                     68:     size_t                  size;       /* size of an instance */
                     69:     const char              *name;      /* human informative name */
                     70:     int                     tclass;     /* type class */
                     71:     structs_init_t          *init;      /* type "init" method */
                     72:     structs_copy_t          *copy;      /* type "copy" method */
                     73:     structs_equal_t         *equal;     /* type "equal" method */
                     74:     structs_ascify_t        *ascify;    /* type "ascify" method */
                     75:     structs_binify_t        *binify;    /* type "binify" method */
                     76:     structs_encode_t        *encode;    /* type "encode" method */
                     77:     structs_decode_t        *decode;    /* type "decode" method */
                     78:     structs_uninit_t        *uninit;    /* type "uninit" method */
                     79:     union {                             /* type specific arguments */
                     80:             const void      *v;
                     81:             const char      *s;
                     82:             int             i;
                     83:     }                       args[3];
                     84: };
                     85: .Ed
                     86: .Pp
                     87: .Fa size
                     88: is equal to the size of one instance of the data structure.
                     89: .Pp
                     90: The
                     91: .Fa name
                     92: is ignored by the
                     93: .Nm structs
                     94: library, but is useful for debugging purposes.
                     95: .Pp
                     96: .Fa tclass
                     97: is an internal field used by the
                     98: .Nm structs
                     99: library.
                    100: For completeness, the possible values are:
                    101: .Pp
                    102: .Bd -literal -compact -offset 3n
                    103: STRUCTS_TYPE_PRIMITIVE      Primitive type
                    104: STRUCTS_TYPE_POINTER        Pointer
                    105: STRUCTS_TYPE_ARRAY          Variable length array
                    106: STRUCTS_TYPE_FIXEDARRAY     Fixed length array
                    107: STRUCTS_TYPE_STRUCTURE      Structure type
                    108: STRUCTS_TYPE_UNION          Union
                    109: .Ed
                    110: .Pp
                    111: For user-defined types,
                    112: .Dv STRUCTS_TYPE_PRIMITIVE
                    113: should always be used.
                    114: .Pp
                    115: The
                    116: .Fn init
                    117: method has this type:
                    118: .Pp
                    119: .Bd -literal -compact -offset 3n
                    120: typedef int structs_init_t(const struct structs_type *type,
                    121:                 void *data);
                    122: .Ed
                    123: .Pp
                    124: It should initialize the uninitialized region of memory pointed to by
                    125: .Fa data
                    126: to be an instance of the type.
                    127: The instance should be equal to the default value for the type.
                    128: On success,
                    129: .Fn init
                    130: returns zero; otherwise, it returns -1 and sets
                    131: .Va errno
                    132: appropriately, and no resources have been allocated.
                    133: .Pp
                    134: The
                    135: .Fn copy
                    136: method has this type:
                    137: .Pp
                    138: .Bd -literal -compact -offset 3n
                    139: typedef int structs_copy_t(const struct structs_type *type,
                    140:                 const void *from, void *to);
                    141: .Ed
                    142: .Pp
                    143: It should initialize the uninitialized region of memory pointed to by
                    144: .Fa to
                    145: to be a new instance of the type equal to the instance pointed to by
                    146: .Fa from .
                    147: On success,
                    148: .Fn copy
                    149: returns zero; otherwise, it returns -1 and sets
                    150: .Va errno
                    151: appropriately, and no resources have been allocated.
                    152: .Pp
                    153: The
                    154: .Fn equal
                    155: method has this type:
                    156: .Pp
                    157: .Bd -literal -compact -offset 3n
                    158: typedef int structs_equal_t(const struct structs_type *type,
                    159:                 const void *data1, const void *data2);
                    160: .Ed
                    161: .Pp
                    162: .Fa data1
                    163: and
                    164: .Fa data2
                    165: point to initialized instances of the type
                    166: .Fa type .
                    167: .Fn equal
                    168: should return 1 if the two instances are equal, or 0 if not.
                    169: If an error occurs,
                    170: .Fn equal
                    171: returns -1 and sets
                    172: .Va errno
                    173: appropriately.
                    174: .Pp
                    175: The
                    176: .Fn ascify
                    177: method has this type:
                    178: .Pp
                    179: .Bd -literal -compact -offset 3n
                    180: typedef char *structs_ascify_t(const struct structs_type *type,
                    181:                   const char *mtype, const void *data);
                    182: .Ed
                    183: .Pp
                    184: .Fa data
                    185: points to an initialized instance of the type
                    186: .Fa type .
                    187: .Fn ascify
                    188: should convert this instance into an ASCII string terminated with '\\0' and
                    189: stored in a buffer allocated with
                    190: .Xr typed_mem 3
                    191: type
                    192: .Fa mtype .
                    193: The ASCII string must be unique, in the sense that it can be used as input
                    194: to the
                    195: .Fn binify
                    196: method to create an instance equal to the original
                    197: .Fa data .
                    198: If successful,
                    199: .Fn ascify
                    200: returns the ASCII string buffer; otherwise it returns
                    201: .Dv NULL
                    202: and sets
                    203: .Va errno
                    204: appropriately.
                    205: .Pp
                    206: The
                    207: .Fn binify
                    208: method has this type:
                    209: .Pp
                    210: .Bd -literal -compact -offset 3n
                    211: typedef int structs_binify_t(const struct structs_type *type,
                    212:                 const char *ascii, void *data,
                    213:                 char *ebuf, size_t emax);
                    214: .Ed
                    215: .Pp
                    216: .Fa data
                    217: points to an uninitialized region of memory large enough to hold an
                    218: instance of the type
                    219: .Fa type .
                    220: .Fn binify
                    221: should convert the ASCII string pointed to by
                    222: .Fa ascii
                    223: into an instance stored at
                    224: .Fa data ,
                    225: thus initializing the memory, and return zero.
                    226: If an error occurs,
                    227: .Fa data
                    228: should remain uninitialized and
                    229: .Fn binify
                    230: should return -1;
                    231: it may also optionally write an explanatory error message,
                    232: including '\\0' byte, into the character buffer having length
                    233: .Fa emax
                    234: and pointed to by
                    235: .Fa ebuf
                    236: (see
                    237: .Xr snprintf 3) .
                    238: .Fn binify
                    239: must successfully convert any ASCII string returned by
                    240: .Fn ascify .
                    241: However,
                    242: .Fa ascii
                    243: is by no means guaranteed to be valid;
                    244: .Fn binify
                    245: must gracefully handle any invalid input string by
                    246: returning an error instead of crashing.
                    247: .Pp
                    248: The
                    249: .Fn encode
                    250: method has this type:
                    251: .Pp
                    252: .Bd -literal -compact -offset 3n
                    253: typedef int structs_encode_t(const struct structs_type *type,
                    254:                 const char *mtype, struct structs_data *code,
                    255:                 const void *data);
                    256: .Ed
                    257: .Pp
                    258: .Fa data
                    259: points to an initialized instance of the type
                    260: .Fa type .
                    261: .Fn encode
                    262: should encode the instance into a byte-order independent, self-delimiting
                    263: sequence of bytes.
                    264: The sequence should be stored in a buffer allocated with
                    265: .Xr typed_mem 3
                    266: type
                    267: .Fa mtype .
                    268: The
                    269: .Fa code
                    270: structure, shown below, should be filled in with the buffer start and length:
                    271: .Pp
                    272: .Bd -literal -compact -offset 3n
                    273: struct structs_data {
                    274:         u_int     length;       /* number of bytes */
                    275:         u_char    *data;        /* byte sequence */   
                    276: };
                    277: .Ed
                    278: .Pp
                    279: The binary sequence must be unique, in the sense that it can be used as
                    280: input to the
                    281: .Fn decode
                    282: method to create an instance equal to the original
                    283: .Fa data .
                    284: .Fn encode
                    285: returns 0 if successful; otherwise it returns -1 and sets
                    286: .Va errno
                    287: appropriately and does not allocate any memory.
                    288: .Pp
                    289: The
                    290: .Fn decode
                    291: method has this type:
                    292: .Pp
                    293: .Bd -literal -compact -offset 3n
                    294: typedef int structs_decode_t(const struct structs_type *type,
                    295:                 const u_char *code, size_t cmax, void *data,
                    296:                 char *ebuf, size_t emax);
                    297: .Ed
                    298: .Pp
                    299: .Fa data
                    300: points to an uninitialized region of memory large enough to hold an
                    301: instance of the type
                    302: .Fa type .
                    303: .Fn decode
                    304: should convert the binary sequence pointed to by
                    305: .Fa code
                    306: into an instance stored at
                    307: .Fa data ,
                    308: thus initializing the memory.
                    309: .Fn decode
                    310: should return the number of bytes consumed, of the
                    311: .Fa cmax
                    312: total bytes available.
                    313: Note that
                    314: .Fa cmax
                    315: bytes may include additional bytes beyond those necessary for decoding
                    316: one instance of
                    317: .Fa type ;
                    318: this is why encodings generated by
                    319: .Fn encode
                    320: must be self-delimiting.
                    321: If an error occurs,
                    322: .Fa data
                    323: should remain uninitialized and
                    324: .Fn decode
                    325: should return -1;
                    326: it may also optionally write an explanatory error message,
                    327: including '\\0' byte, into the character buffer having length
                    328: .Fa emax
                    329: and pointed to by
                    330: .Fa ebuf
                    331: (see
                    332: .Xr snprintf 3) .
                    333: .Fn decode
                    334: must successfully convert any byte sequence generated by
                    335: .Fn encode .
                    336: However, the sequence defined by
                    337: .Fa code
                    338: and
                    339: .Fa cmax
                    340: is by no means guaranteed to be valid, have any particular length, etc.
                    341: .Fn decode
                    342: must gracefully handle any invalid input sequence by
                    343: returning an error instead of crashing.
                    344: .Pp
                    345: The
                    346: .Fn uninit
                    347: method has this type:
                    348: .Pp
                    349: .Bd -literal -compact -offset 3n
                    350: typedef void structs_uninit_t(const struct structs_type *type,
                    351:                  void *data);
                    352: .Ed
                    353: .Pp
                    354: .Fa data
                    355: points to an initialized instance of the type
                    356: .Fa type .
                    357: .Fn uninit
                    358: should free any resources allocated on behalf of the instance,
                    359: returning the memory region to an uninitialized state.
                    360: .Pp
                    361: The
                    362: .Fa args
                    363: array is useful for when the same functions are used to implement
                    364: several distinct but related types.
                    365: .Ss "Predefined Methods"
                    366: The following
                    367: .Nm "structs type"
                    368: methods are defined in the
                    369: .Xr structs 3
                    370: library:
                    371: .Pp
                    372: .Bl -tag -width "abcde"
                    373: .It Li "structs_region_init()"
                    374: .Fn init
                    375: method that fills in the region of memory with zeros.
                    376: .It Li "structs_region_copy()"
                    377: .Fn copy
                    378: method that copies the instance using
                    379: .Xr memcpy 3 .
                    380: .It Li "structs_region_equal()"
                    381: .Fn equal
                    382: method that compares two instances using
                    383: .Xr memcmp 3 .
                    384: .It Li "structs_region_encode()"
                    385: .Fn encode
                    386: method that encodes an instance by directly copying the bytes.
                    387: Note: this method is incorrect for host-order dependent data.
                    388: .It Li "structs_region_decode()"
                    389: Decodes data encoded by
                    390: .Li "structs_region_encode()" .
                    391: .It Li "structs_region_encode_netorder()"
                    392: .Fn encode
                    393: method that encodes an instance by copying it, after arranging the bytes
                    394: in network order.
                    395: Only valid for data types that have size 16 bytes or less.
                    396: .It Li "structs_region_decode_netorder()"
                    397: Decodes data encoded by
                    398: .Li "structs_region_encode_netorder()" .
                    399: .It Li "structs_nothing_free()"
                    400: .Fn free
                    401: method that does nothing.
                    402: .It Li "structs_ascii_copy()"
                    403: .Fn copy
                    404: method that copies an instance by converting it to ASCII and back.
                    405: This should work for any primitive type.
                    406: .It Li "structs_string_encode()"
                    407: .It Li "structs_string_decode()"
                    408: .Fn encode
                    409: and
                    410: .Fn decode
                    411: methods that encode an instance by converting it to a NUL-terminated
                    412: ASCII string.
                    413: These methods should work for any primitive type.
                    414: .It Li "structs_notsupp_init()"
                    415: .Fn encode
                    416: method that always returns -1 with
                    417: .Va errno
                    418: set to
                    419: .Er ENOTSUPP .
                    420: .It Li "structs_notsupp_copy()"
                    421: .Fn copy
                    422: method that always returns -1 with
                    423: .Va errno
                    424: set to
                    425: .Er ENOTSUPP .
                    426: .It Li "structs_notsupp_equal()"
                    427: .Fn equal
                    428: method that always returns -1 with
                    429: .Va errno
                    430: set to
                    431: .Er ENOTSUPP .
                    432: .It Li "structs_notsupp_ascify()"
                    433: .Fn ascify
                    434: method that always returns -1 with
                    435: .Va errno
                    436: set to
                    437: .Er ENOTSUPP .
                    438: .It Li "structs_notsupp_binify()"
                    439: .Fn binify
                    440: method that always returns -1 with
                    441: .Va errno
                    442: set to
                    443: .Er ENOTSUPP .
                    444: .It Li "structs_notsupp_encode()"
                    445: .Fn encode
                    446: method that always returns -1 with
                    447: .Va errno
                    448: set to
                    449: .Er ENOTSUPP .
                    450: .It Li "structs_notsupp_decode()"
                    451: .Fn decode
                    452: method that always returns -1 with
                    453: .Va errno
                    454: set to
                    455: .Er ENOTSUPP .
                    456: .El
                    457: .Pp
                    458: .Sh RETURN VALUES
                    459: All of the above functions indicate an error condition by returning
                    460: either -1 or
                    461: .Dv NULL
                    462: and setting
                    463: .Va errno
                    464: to an appropriate value.
                    465: .Pp
                    466: Whenever there is an error, no partial work is done: the state of
                    467: the parameters has not changed, and nothing has been allocated or freed.
                    468: .Sh SEE ALSO
                    469: .Xr libpdel 3 ,
                    470: .Xr snprintf 3 ,
                    471: .Xr structs 3 ,
                    472: .Xr structs_type_array 3 ,
                    473: .Xr structs_type_boolean 3 ,
                    474: .Xr structs_type_bpf 3 ,
                    475: .Xr structs_type_data 3 ,
                    476: .Xr structs_type_dnsname 3 ,
                    477: .Xr structs_type_ether 3 ,
                    478: .Xr structs_type_float 3 ,
                    479: .Xr structs_type_id 3 ,
                    480: .Xr structs_type_int 3 ,
                    481: .Xr structs_type_ip4 3 ,
                    482: .Xr structs_type_ip6 3 ,
                    483: .Xr structs_type_null 3 ,
                    484: .Xr structs_type_pointer 3 ,
                    485: .Xr structs_type_regex 3 ,
                    486: .Xr structs_type_string 3 ,
                    487: .Xr structs_type_struct 3 ,
                    488: .Xr structs_type_time 3 ,
                    489: .Xr structs_type_union 3 ,
                    490: .Xr typed_mem 3
                    491: .Sh HISTORY
                    492: The PDEL library was developed at Packet Design, LLC.
                    493: .Dv "http://www.packetdesign.com/"
                    494: .Sh AUTHORS
                    495: .An Archie Cobbs Aq archie@freebsd.org
                    496: .Sh BUGS
                    497: Instead of the
                    498: .Fa tclass
                    499: field, each type should provide its own method for accessing sub-elements
                    500: as appropriate.

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>