sxpr.h

来自「xen虚拟机源代码安装包」· C头文件 代码 · 共 441 行

H
441
字号
/* * Copyright (C) 2001 - 2004 Mike Wray <mike.wray@hp.com> * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the * License, or  (at your option) any later version. This library 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 GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software Foundation, * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA */#ifndef _XUTIL_SXPR_H_#define _XUTIL_SXPR_H_#ifdef __KERNEL__#include <linux/config.h>#include <linux/types.h>#else#include <stdint.h>#endif#include "hash_table.h"#include "iostream.h"#include "allocate.h"/** @file * Definitions for rules and sxprs. */#ifndef NULL#define NULL 0#endif#ifndef TRUE#define TRUE 1#endif#ifndef FALSE#define FALSE 0#endif/** Sxpr type. */typedef int16_t TypeCode;/** A typed sxpr handle.*/typedef struct Sxpr {    /** Sxpr type. */    TypeCode type;    union {        /** Sxpr value. */        unsigned long ul;        /** Pointer. */        void *ptr;    } v;} Sxpr;/** Get the integer value from an sxpr. * * @param obj sxpr * @return value */static inline unsigned long get_ul(Sxpr obj){    return obj.v.ul;}/** Get the pointer value from an sxpr. * * @param obj sxpr * @return value */static inline void * get_ptr(Sxpr obj){    return obj.v.ptr;}/** Create an sxpr containing a pointer. * * @param ty typecode * @param val pointer * @return sxpr */static inline Sxpr obj_ptr(TypeCode ty, void *val){    return (Sxpr){ .type= ty, .v= { .ptr= val } };}/** Create an sxpr containing an integer. * * @param ty typecode * @param val integer * @return sxpr */static inline Sxpr obj_ul(TypeCode ty, unsigned long val){    return (Sxpr){ .type= ty, .v= { .ul= val } };}/** Get the type of an sxpr. * * @param obj sxpr * @return type */static inline TypeCode get_type(Sxpr obj){    return obj.type;}/** Check the type of an sxpr. * * @param obj sxpr * @param type to check * @return 1 if has the type, 0 otherwise */static inline int has_type(Sxpr obj, TypeCode type){    return get_type(obj) == type;}/** Compare sxprs for literal equality of type and value. * * @param x sxpr to compare * @param y sxpr to compare * @return 1 if equal, 0 otherwise */static inline int eq(Sxpr x, Sxpr y){    return ((get_type(x) == get_type(y)) && (get_ul(x) == get_ul(y)));}/** The 'unspecified' sxpr. */#define T_NONE       ((TypeCode)0)/** The empty list. */#define T_NULL       ((TypeCode)1)/** Unsigned integer. */#define T_UINT       ((TypeCode)2)/** A string. */#define T_STRING     ((TypeCode)3)/** An atom. */#define T_ATOM       ((TypeCode)4)/** A boolean. */#define T_BOOL       ((TypeCode)5)/** A cons (pair or list). */#define T_CONS       ((TypeCode)10)/** An error. */#define T_ERR        ((TypeCode)40)/** Sxpr type to indicate out of memory. */#define T_NOMEM      ((TypeCode)41)typedef struct ObjString {    int len;    char data[0];} ObjString;/** An atom. */typedef struct ObjAtom {    Sxpr name;    Hashcode hashcode;    int interned;} ObjAtom;/** A cons (pair). */typedef struct ObjCons {    Sxpr car;    Sxpr cdr;} ObjCons;/** Flags for sxpr printing. */enum PrintFlags {    PRINT_RAW           = 0x001,    PRINT_TYPE          = 0x002,    PRINT_PRETTY        = 0x004,    PRINT_COUNTED       = 0x008,    PRINT_ADDR          = 0x010,};extern int _string_print(IOStream *io, char *str, int n, unsigned flags);extern int _string_print_raw(IOStream *io, char *str, int n);extern int _string_print_counted(IOStream *io, char *str, int n);extern int _string_print_quoted(IOStream *io, char *str, int n);extern int _string_print_string(IOStream *io, char *str, int n);/** An integer sxpr. * * @param ty type * @param val integer value */#define OBJI(ty, val) obj_ul(ty, val)/** Make an integer sxpr. * @param x value */#define OINT(x)       OBJI(T_UINT,  x)/** Make an error sxpr. * * @param x value */#define OERR(x)       OBJI(T_ERR,   x)/** Out of memory constant. */#define ONOMEM        OBJI(T_NOMEM, 0)/** The `unspecified' constant. */#define ONONE         OBJI(T_NONE,  0)/** Empty list constant. */#define ONULL         OBJI(T_NULL,  0)/** False constant. */#define OFALSE        OBJI(T_BOOL,  0)/** True constant. */#define OTRUE         OBJI(T_BOOL,  1)/** A pointer sxpr. * If the pointer is non-null, returns an sxpr containing it. * If the pointer is null, returns ONOMEM. * * @param ty type * @param val pointer */static inline Sxpr OBJP(int ty, void *val){    return (val ? obj_ptr(ty, val) : ONOMEM);}/** Make an integer sxpr containing a pointer. * * @param val pointer */static inline Sxpr PTR(void *val){    return OBJP(T_UINT, (void*)(val));}/** Allocate some memory and return an sxpr containing it. * Returns ONOMEM if allocation failed. * * @param n number of bytes to allocate * @param ty typecode * @return sxpr */static inline Sxpr halloc(int n, int ty){    return OBJP(ty, allocate(n));}/** Allocate an sxpr containing a pointer to the given type. * * @param _ctype type (uses sizeof to determine how many bytes to allocate) * @param _tycode typecode * @return sxpr, ONOMEM if allocation failed */#define HALLOC(_ctype, _tycode) halloc(sizeof(_ctype), _tycode)/* Recognizers for the various sxpr types.  */#define ATOMP(obj)        has_type(obj, T_ATOM)#define BOOLP(obj)        has_type(obj, T_BOOL)#define CONSP(obj)        has_type(obj, T_CONS)#define ERRP(obj)         has_type(obj, T_ERR)#define INTP(obj)         has_type(obj, T_UINT)#define NOMEMP(obj)       has_type(obj, T_NOMEM)#define NONEP(obj)        has_type(obj, T_NONE)#define NULLP(obj)        has_type(obj, T_NULL)#define STRINGP(obj)      has_type(obj, T_STRING)#define TRUEP(obj)    get_ul(obj)/** Convert an sxpr to an unsigned integer. */#define OBJ_UINT(x)   get_ul(x)/** Convert an sxpr to an integer. */#define OBJ_INT(x)    (int)get_ul(x)/* Conversions of sxprs to their values. * No checking is done. */#define OBJ_STRING(x)  ((ObjString*)get_ptr(x))#define OBJ_CONS(x)    ((ObjCons*)get_ptr(x))#define OBJ_ATOM(x)    ((ObjAtom*)get_ptr(x))#define OBJ_SET(x)     ((ObjSet*)get_ptr(x))#define CAR(x)         (OBJ_CONS(x)->car)#define CDR(x)         (OBJ_CONS(x)->cdr)#define CAAR(x)        (CAR(CAR(x)))#define CADR(x)        (CAR(CDR(x)))#define CDAR(x)        (CDR(CAR(x)))#define CDDR(x)        (CDR(CDR(x)))/** Checked version of CAR * * @param x sxpr * @return CAR if a cons, x otherwise */static inline Sxpr car(Sxpr x){    return (CONSP(x) ? CAR(x) : x);}/** Checked version of CDR. * * @param x sxpr * @return CDR if a cons, null otherwise */static inline Sxpr cdr(Sxpr x){    return (CONSP(x) ? CDR(x) : ONULL);}typedef int ObjPrintFn(IOStream *io, Sxpr obj, unsigned flags);typedef int ObjEqualFn(Sxpr obj, Sxpr other);typedef void ObjFreeFn(Sxpr obj);typedef Sxpr ObjCopyFn(Sxpr obj);/** An sxpr type definition. */typedef struct SxprType {    TypeCode type;    char *name;    int pointer;    ObjPrintFn *print;    ObjEqualFn *equal;    ObjFreeFn *free;    ObjCopyFn *copy;} SxprType;extern int def_sxpr_type(SxprType *tydef);extern SxprType *get_sxpr_type(int ty);/** Free the pointer in an sxpr. * * @param x sxpr containing a pointer */static inline void hfree(Sxpr x){    deallocate(get_ptr(x));}extern int objprint(IOStream *io, Sxpr x, unsigned flags);extern int objequal(Sxpr x, Sxpr y);extern void objfree(Sxpr x);extern Sxpr objcopy(Sxpr x);extern void cons_free_cells(Sxpr obj);extern Sxpr intern(char *s);extern Sxpr assoc(Sxpr k, Sxpr l);extern Sxpr assocq(Sxpr k, Sxpr l);extern Sxpr acons(Sxpr k, Sxpr v, Sxpr l);extern Sxpr nrev(Sxpr l);extern Sxpr cons_member(Sxpr l, Sxpr x);extern Sxpr cons_member_if(Sxpr l, ObjEqualFn *test_fn, Sxpr v);extern int cons_subset(Sxpr s, Sxpr t);extern int cons_set_equal(Sxpr s, Sxpr t);#ifdef USE_GCextern Sxpr cons_remove(Sxpr l, Sxpr x);extern Sxpr cons_remove_if(Sxpr l, ObjEqualFn *test_fn, Sxpr v);#endifextern Sxpr atom_new(char *name);extern char * atom_name(Sxpr obj);extern int atom_length(Sxpr obj);extern Sxpr string_new(char *s);extern Sxpr string_new_n(char *s, int n);extern char * string_string(Sxpr obj);extern int string_length(Sxpr obj);extern Sxpr cons_new(Sxpr car, Sxpr cdr);extern int cons_push(Sxpr *list, Sxpr elt);extern int cons_length(Sxpr obj);Sxpr sxpr_name(Sxpr obj);int sxpr_is(Sxpr obj, char *s);int sxpr_elementp(Sxpr obj, Sxpr name);Sxpr sxpr_attributes(Sxpr obj);Sxpr sxpr_attribute(Sxpr obj, Sxpr key, Sxpr def);Sxpr sxpr_children(Sxpr obj);Sxpr sxpr_child(Sxpr obj, Sxpr name, Sxpr def);Sxpr sxpr_childN(Sxpr obj, int n, Sxpr def);Sxpr sxpr_child0(Sxpr obj, Sxpr def);Sxpr sxpr_child_value(Sxpr obj, Sxpr name, Sxpr def);/** Create a new atom. * * @param s atom name * @return new atom */static inline Sxpr mkatom(char *s){    return atom_new(s);}/** Create a new string sxpr. * * @param s string bytes (copied) * @return new string */static inline Sxpr mkstring(char *s){    return string_new(s);}/** Create an integer sxpr. * * @param i value * @return sxpr */static inline Sxpr mkint(int i){    return OBJI(T_UINT, i);}/** Create a boolean sxpr. * * @param b value * @return sxpr */static inline Sxpr mkbool(int b){    return OBJI(T_BOOL, (b ? 1 : 0));}/* Constants used in parsing and printing. */#define k_list_open    "("#define c_list_open    '('#define k_list_close   ")"#define c_list_close   ')'#define k_true         "true"#define k_false        "false"#define c_escape       '\\'#define c_single_quote '\''#define c_double_quote '"'#define c_string_open  c_double_quote#define c_string_close c_double_quote#define c_data_open    '<'#define c_data_quote   '<'#define c_data_count   '*'//#define c_data_open    '['//#define c_data_close   ']'//#define c_binary       '*'#define c_var          '$'#define c_eval         '!'#define c_concat_open  '{'#define c_concat_close '}'#endif /* ! _XUTIL_SXPR_H_ */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?