swig/Source/DOH/Include/doh.h
2000-01-27 22:07:22 +00:00

396 lines
14 KiB
C

/* -----------------------------------------------------------------------------
* doh.h
*
* This file describes of the externally visible functions in DOH.
*
* Author(s) : David Beazley (beazley@cs.uchicago.edu)
*
* Copyright (C) 1999-2000. The University of Chicago
* See the file LICENSE for information on usage and redistribution.
*
* $Header$
* ----------------------------------------------------------------------------- */
#ifndef _DOH_H
#define _DOH_H
#include <stdio.h>
#include <stdarg.h>
#ifdef __cplusplus
extern "C" {
#endif
#define DOH_MAJOR_VERSION 0
#define DOH_MINOR_VERSION 1
typedef void DOH;
#define DOH_BEGIN -1
#define DOH_END -2
#define DOH_CUR -3
#define DOH_CURRENT -3
/* -----------------------------------------------------------------------------
* These structures define the interface to various categories of objects.
* ----------------------------------------------------------------------------- */
/* Mapping Objects (i.e., hash tables) */
typedef struct {
DOH *(*doh_getattr)(DOH *obj, DOH *name); /* Get attribute */
int (*doh_setattr)(DOH *obj, DOH *name, DOH *value); /* Set attribute */
int (*doh_delattr)(DOH *obj, DOH *name); /* Del attribute */
DOH *(*doh_firstkey)(DOH *obj); /* First key */
DOH *(*doh_nextkey)(DOH *obj); /* Next key */
} DohMappingMethods;
/* Sequence methods (i.e., lists) */
typedef struct {
DOH *(*doh_getitem)(DOH *obj, int index); /* Get item */
int (*doh_setitem)(DOH *obj, int index, DOH *value); /* Set item */
int (*doh_delitem)(DOH *obj, int index); /* Delete item */
int (*doh_insitem)(DOH *obj, int index, DOH *value); /* Insert item */
DOH *(*doh_firstitem)(DOH *obj); /* Iterators */
DOH *(*doh_nextitem)(DOH *obj);
} DohSequenceMethods;
/* File methods */
typedef struct {
int (*doh_read)(DOH *obj, void *buffer, int nbytes);
int (*doh_write)(DOH *obj, void *buffer, int nbytes);
int (*doh_putc)(DOH *obj, int ch);
int (*doh_getc)(DOH *obj);
int (*doh_ungetc)(DOH *obj, int ch);
int (*doh_seek)(DOH *obj, long offset, int whence);
long (*doh_tell)(DOH *obj);
int (*doh_close)(DOH *obj);
} DohFileMethods;
/* String methods */
typedef struct {
int (*doh_replace)(DOH *obj, DOH *old, DOH *rep, int flags);
void (*doh_chop)(DOH *obj);
} DohStringMethods;
/* Callable */
typedef struct {
DOH *(*doh_call)(DOH *obj, DOH *args); /* Callable */
} DohCallableMethods;
/* Positional */
typedef struct {
void (*doh_setfile)(DOH *obj, DOH *file);
DOH *(*doh_getfile)(DOH *obj);
void (*doh_setline)(DOH *obj, int line);
int (*doh_getline)(DOH *obj);
} DohPositionalMethods;
/* -----------------------------------------------------------------------------
* DohObjInfo
*
* A pointer to this structure is included in all DOH types and is used to
* describe the properties of various objects.
* ----------------------------------------------------------------------------- */
typedef struct DohObjInfo {
char *objname; /* Object name */
int objsize; /* Object size */
/* Basic object methods */
void (*doh_del)(DOH *obj); /* Delete object */
DOH *(*doh_copy)(DOH *obj); /* Copy and object */
void (*doh_clear)(DOH *obj); /* Clear an object */
void (*doh_scope)(DOH *obj, int s); /* Change the scope on an object */
/* Output methods */
DOH *(*doh_str)(DOH *obj); /* Make a full string */
void *(*doh_data)(DOH *obj); /* Return raw data */
int (*doh_dump)(DOH *obj, DOH *out); /* Serialize on out */
/* Length and hash values */
int (*doh_len)(DOH *obj);
int (*doh_hash)(DOH *obj);
/* Compare */
int (*doh_cmp)(DOH *obj1, DOH *obj2);
DohMappingMethods *doh_mapping; /* Mapping methods */
DohSequenceMethods *doh_sequence; /* Sequence methods */
DohFileMethods *doh_file; /* File methods */
DohStringMethods *doh_string; /* String methods */
DohCallableMethods *doh_callable; /* Callable methods */
DohPositionalMethods *doh_position; /* Positional methods */
void *reserved4;
void *reserved5;
void *reserved6;
void *user1;
void *user2;
void *user3;
void *user4;
} DohObjInfo;
/* Memory management */
extern void *DohMalloc(size_t size); /* Allocate memory */
extern void *DohRealloc(void *, size_t size); /* Reallocate memory */
extern void DohFree(DOH *ptr); /* Free memory */
extern void *DohObjMalloc(size_t size); /* Allocate a DOH object */
extern void DohObjFree(DOH *ptr); /* Free a DOH object */
extern int DohObjFreeCheck(DOH *ptr); /* Check if already free */
extern void DohInit(DOH *obj); /* Initialize an object */
extern void DohXInit(DOH *obj); /* Initialize extended object */
extern int DohCheck(DOH *ptr); /* Check if a DOH object */
extern int DohPoolSize(int); /* Set memory alloc size */
extern int DohNewScope(); /* Create a new scope */
extern void DohDelScope(int); /* Delete a scope */
extern void DohGarbageCollect(); /* Invoke garbage collection */
extern void DohIntern(DOH *); /* Intern an object */
/* Basic object methods. Common to most objects */
extern void DohDelete(DOH *obj); /* Delete an object */
extern DOH *DohCopy(DOH *obj);
extern void DohClear(DOH *obj);
extern void DohSetScope(DOH *, int scp); /* Set scope of object */
extern DOH *DohStr(DOH *obj);
extern void *DohData(DOH *obj);
extern int DohDump(DOH *obj, DOH *out);
extern int DohLen(DOH *obj);
extern int DohHashval(DOH *obj);
extern int DohCmp(DOH *obj1, DOH *obj2);
/* Mapping methods */
extern DOH *DohGetattr(DOH *obj, DOH *name);
extern int DohSetattr(DOH *obj, DOH *name, DOH *value);
extern void DohDelattr(DOH *obj, DOH *name);
extern DOH *DohFirstkey(DOH *obj);
extern DOH *DohNextkey(DOH *obj);
extern int DohGetInt(DOH *obj, DOH *name);
extern double DohGetDouble(DOH *obj, DOH *name);
extern char *DohGetChar(DOH *obj, DOH *name);
extern void DohSetInt(DOH *obj, DOH *name, int);
extern void DohSetDouble(DOH *obj, DOH *name, double);
/* Sequence methods */
extern DOH *DohGetitem(DOH *obj, int index);
extern int DohSetitem(DOH *obj, int index, DOH *value);
extern int DohDelitem(DOH *obj, int index);
extern int DohInsertitem(DOH *obj, int index, DOH *value);
extern DOH *DohFirstitem(DOH *obj);
extern DOH *DohNextitem(DOH *obj);
/* File methods */
extern int DohWrite(DOH *obj, void *buffer, int length);
extern int DohRead(DOH *obj, void *buffer, int length);
extern int DohSeek(DOH *obj, long offset, int whence);
extern long DohTell(DOH *obj);
extern int DohGetc(DOH *obj);
extern int DohPutc(int ch, DOH *obj);
extern int DohUngetc(int ch, DOH *obj);
/* Callable Methods */
extern DOH *DohCall(DOH *obj, DOH *args);
/* Position Methods */
extern int DohGetline(DOH *obj);
extern void DohSetline(DOH *obj, int line);
extern DOH *DohGetfile(DOH *obj);
extern void DohSetfile(DOH *obj, DOH *file);
/* String Methods */
extern int DohReplace(DOH *src, DOH *token, DOH *rep, int flags);
extern void DohChop(DOH *src);
/* Utility functions */
extern void DohEncoding(char *name, DOH *(*fn)(DOH *s));
extern int DohPrintf(DOH *obj, char *format, ...);
extern int DohvPrintf(DOH *obj, char *format, va_list ap);
extern DOH *DohReadline(DOH *in);
/* Miscellaneous */
extern void DohTrace(int level, char *fmt,...);
extern void DohDebug(int d);
extern int DohIsMapping(DOH *obj);
extern int DohIsSequence(DOH *obj);
extern int DohIsString(DOH *obj);
extern int DohIsFile(DOH *obj);
extern int DohIsCallable(DOH *obj);
#ifndef DOH_LONG_NAMES
/* Macros to invoke the above functions. Includes the location of
the caller to simplify debugging if something goes wrong */
#define Delete DohDelete
#define Copy DohCopy
#define Clear DohClear
#define Str DohStr
#define Dump DohDump
#define Getattr DohGetattr
#define Setattr DohSetattr
#define Delattr DohDelattr
#define Hashval DohHashval
#define Getitem DohGetitem
#define Setitem DohSetitem
#define Delitem DohDelitem
#define Insert DohInsertitem
#define Append(s,x) DohInsertitem(s,DOH_END,x)
#define Push(s,x) DohInsertitem(s,DOH_BEGIN,x)
#define Len DohLen
#define Firstkey DohFirstkey
#define Nextkey DohNextkey
#define Data DohData
#define Char (char *) Data
#define Cmp DohCmp
#define Setline DohSetline
#define Getline DohGetline
#define Setfile DohSetfile
#define Getfile DohGetfile
#define Write DohWrite
#define Read DohRead
#define Seek DohSeek
#define Tell DohTell
#define Printf DohPrintf
#define Getc DohGetc
#define Putc DohPutc
#define Ungetc DohUngetc
#define vPrintf DohvPrintf
#define GetInt DohGetInt
#define GetDouble DohGetDouble
#define GetChar DohGetChar
#define SetInt DohSetInt
#define SetDouble DohSetDouble
#define Firstitem DohFirstitem
#define Nextitem DohNextitem
#define Readline DohReadline
#define Replace DohReplace
#define Chop DohChop
#define NewScope DohNewScope
#define DelScope DohDelScope
#define Call DohCall
#endif
/* -----------------------------------------------------------------------------
* DohBase
*
* DohBase object type. Attributes common to all objects.
* ----------------------------------------------------------------------------- */
#define DOHCOMMON \
DohObjInfo *objinfo; \
DOH *nextptr; \
int refcount; \
unsigned char flags; \
unsigned char scope
typedef struct {
DOHCOMMON;
} DohBase;
#define DOHXCOMMON \
DOHCOMMON; \
DOH *file; \
int line
typedef struct {
DOHXCOMMON;
} DohXBase;
/* Macros for decrefing and increfing (safe for null objects). */
#define Decref(a) if (a) ((DohBase *) a)->refcount--
#define Incref(a) if (a) ((DohBase *) a)->refcount++
#define Refcount(a) ((DohBase *) a)->refcount
#define Getscope(a) ((DohBase *) a)->scope
#define Setscope(a,s) DohSetScope(a,s)
#define Objname(a) ((DohBase *) a)->objinfo->objname
/* Flags for various internal operations */
#define DOH_FLAG_SETSCOPE 0x01
#define DOH_FLAG_PRINT 0x02
#define DOH_FLAG_DELSCOPE 0x04
#define DOH_FLAG_GC 0x08
#define DOH_FLAG_INTERN 0x10
/* -----------------------------------------------------------------------------
* Strings.
* ----------------------------------------------------------------------------- */
extern DOH *NewString(char *c);
extern int String_check(DOH *s);
/* String replacement flags */
#define DOH_REPLACE_ANY 0x00
#define DOH_REPLACE_NOQUOTE 0x01
#define DOH_REPLACE_ID 0x02
#define DOH_REPLACE_FIRST 0x04
/* -----------------------------------------------------------------------------
* Files
* ----------------------------------------------------------------------------- */
extern DOH *NewFile(DOH *file, char *mode);
extern DOH *NewFileFromFile(FILE *f);
extern DOH *NewFileFromFd(int fd);
extern int DohCopyto(DOH *input, DOH *output);
#define Copyto DohCopyto
/* -----------------------------------------------------------------------------
* List
* ----------------------------------------------------------------------------- */
extern DOH *NewList();
extern int List_check(DOH *);
extern void List_sort(DOH *);
/* -----------------------------------------------------------------------------
* Hash
* ----------------------------------------------------------------------------- */
extern DOH *NewHash();
extern int Hash_check(DOH *h);
extern DOH *Hash_keys(DOH *);
/* -----------------------------------------------------------------------------
* Void
* ----------------------------------------------------------------------------- */
extern DOH *NewVoid(void *ptr, void (*del)(void *));
extern DOH *DohSplit(DOH *input, char *chs, int nsplits);
#define Split DohSplit
extern DOH *DohNone;
/* -----------------------------------------------------------------------------
* Callable
* ----------------------------------------------------------------------------- */
extern DOH *NewCallable(DOH *(*func)(DOH *, DOH *));
/* -----------------------------------------------------------------------------
* Error handling levels.
* ----------------------------------------------------------------------------- */
#define DOH_UNSUPPORTED 0x01
#define DOH_UNKNOWN 0x02
#define DOH_MEMORY 0x04
#define DOH_CONVERSION 0x08
#define DOH_CALLS 0x10
#ifdef __cplusplus
}
#endif
#endif /* DOH_H */