1 /*********************************************************************** 2 * * 3 * This software is part of the ast package * 4 * Copyright (c) 2003-2011 AT&T Intellectual Property * 5 * and is licensed under the * 6 * Eclipse Public License, Version 1.0 * 7 * by AT&T Intellectual Property * 8 * * 9 * A copy of the License is available at * 10 * http://www.eclipse.org/org/documents/epl-v10.html * 11 * (with md5 checksum b35adb5213ca9657e911e9befb180842) * 12 * * 13 * Information and Software Systems Research * 14 * AT&T Research * 15 * Florham Park NJ * 16 * * 17 * Glenn Fowler <gsf@research.att.com> * 18 * David Korn <dgk@research.att.com> * 19 * Phong Vo <kpv@research.att.com> * 20 * * 21 ***********************************************************************/ 22 #pragma prototyped 23 24 /* 25 * codex public interface 26 */ 27 28 #ifndef _CODEX_H 29 #define _CODEX_H 1 30 31 #include <ast.h> 32 #include <error.h> 33 34 #define CODEX_VERSION 20090704L 35 #define CODEX_PLUGIN_VERSION AST_PLUGIN_VERSION(CODEX_VERSION) 36 37 #define CODEX_DECODE 0x0001 /* decode supported */ 38 #define CODEX_ENCODE 0x0002 /* encode supported */ 39 40 #define CODEX_RETAIN 0x0010 /* initf-donef retain state */ 41 #define CODEX_INVERT 0x0020 /* invert composition */ 42 #define CODEX_TRACE 0x0040 /* enable trace */ 43 #define CODEX_VERBOSE 0x0080 /* enable verbose trace */ 44 45 #define CODEX_COMPRESS 0x0100 /* compression */ 46 #define CODEX_CRYPT 0x0200 /* encryption */ 47 #define CODEX_ICONV 0x0400 /* character code translation */ 48 #define CODEX_SUM 0x0800 /* checksum */ 49 #define CODEX_UU 0x1000 /* uuencode (ISO text) */ 50 51 #define CODEX_CACHED 0x10000000L /* cached entry */ 52 #define CODEX_SERIAL 0x20000000L /* serial number assigned */ 53 #define CODEX_FLUSH 0x40000000L /* flush-only sync */ 54 #define CODEX_ACTIVE 0x80000000L /* active cache entry */ 55 56 #define CODEX_IDENT 1024 /* max ident buffer size */ 57 #define CODEX_NAME 256 /* max coder name w/args */ 58 #define CODEX_ARGS 32 /* max coder args in name */ 59 60 #define CODEX(d) ((Codex_t*)(d)) 61 62 typedef uint32_t Codexnum_t; 63 64 struct Codex_s; typedef struct Codex_s Codex_t; 65 struct Codexdata_s; typedef struct Codexdata_s Codexdata_t; 66 struct Codexdisc_s; typedef struct Codexdisc_s Codexdisc_t; 67 struct Codexmeth_s; typedef struct Codexmeth_s Codexmeth_t; 68 69 typedef Codexmeth_t* (*Codexlib_f)(const char*); 70 71 struct Codex_s /* coder public state */ 72 { 73 Sfdisc_t sfdisc; /* coder sfio discipline */ 74 Sfio_t* sp; /* data base stream */ 75 Sfio_t* dp; /* optional data delta stream */ 76 Sfoff_t size; /* expected size if != -1 */ 77 Codexdisc_t* disc; /* coder discipline */ 78 Codexmeth_t* meth; /* coder method */ 79 Codexnum_t flags; /* CODEX_* flags */ 80 Codexnum_t index; /* per-process index */ 81 int serial; /* codex() serial number */ 82 void* data; /* coder private state */ 83 Sfio_t* op; /* original stream */ 84 }; 85 86 struct Codexdata_s /* codexdata() info */ 87 { 88 Codexnum_t size; /* value size */ 89 Codexnum_t num; /* value if buf!=0 */ 90 void* buf; /* size byte value */ 91 }; 92 93 struct Codexdisc_s /* coder discipline */ 94 { 95 Codexnum_t version; /* CODEX_VERSION */ 96 Error_f errorf; /* error message function */ 97 ssize_t (*passf)(void*, size_t, Codexdisc_t*, Codexmeth_t*); 98 const char* passphrase; /* passphrase */ 99 Sfio_t* identify; /* decode method string if != 0 */ 100 }; 101 102 struct Codexmeth_s /* coder method */ 103 { 104 const char* name; /* coder name */ 105 const char* description; /* coder description */ 106 const char* options; /* static optget() options */ 107 Codexnum_t flags; /* CODEX_* flags */ 108 109 int (*optionsf)(Codexmeth_t*, Sfio_t*); 110 int (*identf)(Codexmeth_t*, const void*, size_t, char*, size_t); 111 int (*openf)(Codex_t*, char* const[], Codexnum_t); 112 int (*closef)(Codex_t*); 113 int (*initf)(Codex_t*); 114 int (*donef)(Codex_t*); 115 ssize_t (*readf)(Sfio_t*, void*, size_t, Sfdisc_t*); 116 ssize_t (*writef)(Sfio_t*, const void*, size_t, Sfdisc_t*); 117 int (*syncf)(Codex_t*); 118 Sfoff_t (*seekf)(Codex_t*, Sfoff_t, int); 119 int (*dataf)(Codex_t*, Codexdata_t*); 120 121 void* vcmeth; /* vcodex(3) method */ 122 void* data; /* coder private data */ 123 Codexmeth_t* next; /* next in list of all coders */ 124 }; 125 126 #if _BLD_codex && !defined(main) 127 128 #include <codexlib.h> 129 130 #define CODEXLIB(m) 131 #define CODEXNEXT(m) codex_##m##_next 132 133 #else 134 135 #ifdef __STDC__ 136 #define CODEXLIB(m) extern Codexmeth_t* codex_lib(const char* name) { return &codex_##m; } unsigned long plugin_version(void) { return CODEX_PLUGIN_VERSION; } 137 #else 138 #define CODEXLIB(m) extern Codexmeth_t* codex_lib(name) char* name; { return &codex_##m; } unsigned long plugin_version() { return CODEX_PLUGIN_VERSION; } 139 #endif 140 141 #define CODEXNEXT(m) 0 142 143 #if defined(__EXPORT__) 144 #define extern __EXPORT__ 145 #endif 146 147 extern Codexmeth_t* codex_lib(const char*); 148 149 #undef extern 150 151 #endif 152 153 #define codexinit(d,e) (memset(d,0,sizeof(*(d))),(d)->version=CODEX_VERSION,(d)->errorf=(Error_f)(e)) 154 155 #if _BLD_codex && defined(__EXPORT__) 156 #define extern __EXPORT__ 157 #endif 158 159 extern int codex(Sfio_t*, Sfio_t*, const char*, Codexnum_t, Codexdisc_t*, Codexmeth_t*); 160 extern int codexpop(Sfio_t*, Sfio_t*, int); 161 extern int codexcmp(const char*, const char*); 162 extern int codexdata(Sfio_t*, Codexdata_t*); 163 extern ssize_t codexgetpass(const char*, void*, size_t); 164 extern Codexmeth_t* codexid(const void*, size_t, char*, size_t); 165 extern Codexmeth_t* codexlist(Codexmeth_t*); 166 extern Codexmeth_t* codexmeth(const char*); 167 extern int codexadd(const char*, Codexmeth_t*); 168 extern Sfio_t* codexnull(void); 169 extern ssize_t codexpass(void*, size_t, Codexdisc_t*, Codexmeth_t*); 170 extern int codexsize(Sfio_t*, Sfoff_t); 171 172 #undef extern 173 174 #endif 175