/*
* METAOPS - Implements the operations that can be performed performed on
* individual or lists of data items described by metadata specs
*
* Author:
* Emile van Bergen, emile@evbergen.xs4all.nl
*
* Permission to redistribute an original or modified version of this program
* in source, intermediate or object code form is hereby granted exclusively
* under the terms of the GNU General Public License, version 2. Please see the
* file COPYING for details, or refer to http://www.gnu.org/copyleft/gpl.html.
*
* History:
* 2001/03/17 - EvB - Created
* 2001/05/08 - EvB - Added ord value and temporary flag to META_AV
* 2001/05/16 - EvB - Added printav / printavlist debugging functions here
* 2001/06/04 - EvB - Converted META_AV into a double linked list, to ease
* their use in the VM (adding before / after etc.)
* 2001/06/25 - EvB - Added meta_avtomsg / meta_msgtoav
* 2001/09/11 - EvB - Added meta_addav here; used by job_new, chan_handle_read
* and vm_run (we should, at least).
*/
#ifndef __METAOPS_H
#define __METAOPS_H 1
/*
* INCLUDES & DEFINES
*/
#include <constants.h>
#include <metatype.h>
#include <platform.h>
/* Values for flags in META_AV below. WARNING: Don't ever change the value of
AV_USEREP, as flags & AV_USEREP is used as index into an array in langvm.c */
#define AV_USEREP 1 /* use attr from reply instead of request */
#define AV_USEREPVALID 2 /* use the userep flag instead of opcode def. */
#define AV_FREE_P 4 /* p must be freed when freeing this object */
#define AV_FIRST 8 /* use first instead of last atr from req/rep */
#define AV_UNRESOLVED 16 /* p and/or l not initialised from i yet */
#define AV_DEL 32 /* treat this item as deleted */
/* Values for flags parameter in meta_avtomsg - see constants.h for descr. */
#define AVMSG_ONESHOT C_DV_FLAGS_RESV0 /* send only one item */
#define AVMSG_ASCII C_DV_FLAGS_ASCII
#define AVMSG_ADDTAB C_DV_FLAGS_ADDTAB
#define AVMSG_ADDSPACES C_DV_FLAGS_ADDSPACES
#define AVMSG_ADDTYPE C_DV_FLAGS_ADDTYPE
#define AVMSG_HEXVALUE C_DV_FLAGS_HEXVALUE
#define AVMSG_DBLBACKSLASH C_DV_FLAGS_DBLBACKSLASH
#define AVMSG_NAMEDCONST C_DV_FLAGS_NAMEDCONST
#define AVMSG_SHORTATTR C_DV_FLAGS_SHORTATTR
#define AVMSG_ADDIGNORE C_DV_FLAGS_ADDIGNORE
/*
* TYPES
*/
typedef struct meta_av {
struct meta_av *next; /* Next item */
struct meta_av *prev; /* Previous item - not valid after buildtree */
struct meta_av *sub; /* 'Sub'-list for use by buildtree and encode.
After calling buildtree, 'sub' on the
destination tree refers to the first child
node of this node. */
META_ITEM *i; /* Metadata item */
char *p; /* Data */
META_ORD l; /* Length or, if p == 0, data in host order */
int flags; /* Flags */
struct meta_av *treeitem; /* After calling buildtree, this refers in
the pairs on the source list to their
corresponding pairs in the dest. tree */
char *encp; /* Only valid in A/V pairs on avlst after
calling meta_encode; refers to location of
value in encoded packet. Always non-NULL if
the A/V pair was encoded at all, regardless
of type and/or value of p. */
int rest; /* Used to indicate that this stack item has
'rest' lower items attached during vm_run;
also used by buildtree's getcopy for
splitting long attributes */
} META_AV;
/*
* PROTOTYPES
*/
/* Decoding */
META_AV *meta_decode(META *m, META_SPC *s, META_ORD defvnd,
char *blk, META_ORD blksize, META_AV **rettail);
/* Encoding */
void meta_buildtree(META_AV *srclst, META_AV **dstlst, META_SPC *groundspc);
META_ORD meta_encode(META_SPC *s, char *blk, META_ORD blksize, META_AV *avlst,
META_ORD *retvnd);
/* From/to ASCII/binary messages */
int meta_ascmsgtoav(META *m, char *buf, ssize_t len,
META_AV **head, META_AV **tail,
int flags, META_AV *acl);
int meta_binmsgtoav(META *m, U_INT32_T *buf, ssize_t len,
META_AV **head, META_AV **tail,
int nocopy, META_AV *acl);
ssize_t meta_avtomsg(META *m, META_AV *avlst,
char *buf, ssize_t buflen,
int flags, META_AV *acl, U_INT32_T magic);
/* Misc */
void meta_addav(META_AV **head, META_AV **tail, META_AV *rel, int before,
META_AV *av);
void meta_remav(META_AV **head, META_AV **tail, META_AV *av);
void meta_freeavdata(META_AV *av);
void meta_freeavlist(META_AV *avlist);
void meta_freeavtree(META_AV *avtree);
/* Debugging */
void meta_printav(META *m, META_AV *av, int depth);
void meta_printavlist(META *m, META_AV *avlst, int depth);
#endif
syntax highlighted by Code2HTML, v. 0.9.1