]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - libs/picomodel/lwo/lwo2.h
d055c13e50b3003a26614afb19056c319ae75f99
[xonotic/netradiant.git] / libs / picomodel / lwo / lwo2.h
1 /*
2    ======================================================================
3    lwo2.h
4
5    Definitions and typedefs for LWO2 files.
6
7    Ernie Wright  17 Sep 00
8    ====================================================================== */
9
10 #ifndef LWO2_H
11 #define LWO2_H
12
13 /* chunk and subchunk IDs */
14
15 #define LWID_( a,b,c,d ) ( ( ( a ) << 24 ) | ( ( b ) << 16 ) | ( ( c ) << 8 ) | ( d ) )
16
17 #define ID_FORM  LWID_( 'F','O','R','M' )
18 #define ID_LWO2  LWID_( 'L','W','O','2' )
19 #define ID_LWOB  LWID_( 'L','W','O','B' )
20
21 /* top-level chunks */
22 #define ID_LAYR  LWID_( 'L','A','Y','R' )
23 #define ID_TAGS  LWID_( 'T','A','G','S' )
24 #define ID_PNTS  LWID_( 'P','N','T','S' )
25 #define ID_BBOX  LWID_( 'B','B','O','X' )
26 #define ID_VMAP  LWID_( 'V','M','A','P' )
27 #define ID_VMAD  LWID_( 'V','M','A','D' )
28 #define ID_POLS  LWID_( 'P','O','L','S' )
29 #define ID_PTAG  LWID_( 'P','T','A','G' )
30 #define ID_ENVL  LWID_( 'E','N','V','L' )
31 #define ID_CLIP  LWID_( 'C','L','I','P' )
32 #define ID_SURF  LWID_( 'S','U','R','F' )
33 #define ID_DESC  LWID_( 'D','E','S','C' )
34 #define ID_TEXT  LWID_( 'T','E','X','T' )
35 #define ID_ICON  LWID_( 'I','C','O','N' )
36
37 /* polygon types */
38 #define ID_FACE  LWID_( 'F','A','C','E' )
39 #define ID_CURV  LWID_( 'C','U','R','V' )
40 #define ID_PTCH  LWID_( 'P','T','C','H' )
41 #define ID_MBAL  LWID_( 'M','B','A','L' )
42 #define ID_BONE  LWID_( 'B','O','N','E' )
43
44 /* polygon tags */
45 #define ID_SURF  LWID_( 'S','U','R','F' )
46 #define ID_PART  LWID_( 'P','A','R','T' )
47 #define ID_SMGP  LWID_( 'S','M','G','P' )
48
49 /* envelopes */
50 #define ID_PRE   LWID_( 'P','R','E',' ' )
51 #define ID_POST  LWID_( 'P','O','S','T' )
52 #define ID_KEY   LWID_( 'K','E','Y',' ' )
53 #define ID_SPAN  LWID_( 'S','P','A','N' )
54 #define ID_TCB   LWID_( 'T','C','B',' ' )
55 #define ID_HERM  LWID_( 'H','E','R','M' )
56 #define ID_BEZI  LWID_( 'B','E','Z','I' )
57 #define ID_BEZ2  LWID_( 'B','E','Z','2' )
58 #define ID_LINE  LWID_( 'L','I','N','E' )
59 #define ID_STEP  LWID_( 'S','T','E','P' )
60
61 /* clips */
62 #define ID_STIL  LWID_( 'S','T','I','L' )
63 #define ID_ISEQ  LWID_( 'I','S','E','Q' )
64 #define ID_ANIM  LWID_( 'A','N','I','M' )
65 #define ID_XREF  LWID_( 'X','R','E','F' )
66 #define ID_STCC  LWID_( 'S','T','C','C' )
67 #define ID_TIME  LWID_( 'T','I','M','E' )
68 #define ID_CONT  LWID_( 'C','O','N','T' )
69 #define ID_BRIT  LWID_( 'B','R','I','T' )
70 #define ID_SATR  LWID_( 'S','A','T','R' )
71 #define ID_HUE   LWID_( 'H','U','E',' ' )
72 #define ID_GAMM  LWID_( 'G','A','M','M' )
73 #define ID_NEGA  LWID_( 'N','E','G','A' )
74 #define ID_IFLT  LWID_( 'I','F','L','T' )
75 #define ID_PFLT  LWID_( 'P','F','L','T' )
76
77 /* surfaces */
78 #define ID_COLR  LWID_( 'C','O','L','R' )
79 #define ID_LUMI  LWID_( 'L','U','M','I' )
80 #define ID_DIFF  LWID_( 'D','I','F','F' )
81 #define ID_SPEC  LWID_( 'S','P','E','C' )
82 #define ID_GLOS  LWID_( 'G','L','O','S' )
83 #define ID_REFL  LWID_( 'R','E','F','L' )
84 #define ID_RFOP  LWID_( 'R','F','O','P' )
85 #define ID_RIMG  LWID_( 'R','I','M','G' )
86 #define ID_RSAN  LWID_( 'R','S','A','N' )
87 #define ID_TRAN  LWID_( 'T','R','A','N' )
88 #define ID_TROP  LWID_( 'T','R','O','P' )
89 #define ID_TIMG  LWID_( 'T','I','M','G' )
90 #define ID_RIND  LWID_( 'R','I','N','D' )
91 #define ID_TRNL  LWID_( 'T','R','N','L' )
92 #define ID_BUMP  LWID_( 'B','U','M','P' )
93 #define ID_SMAN  LWID_( 'S','M','A','N' )
94 #define ID_SIDE  LWID_( 'S','I','D','E' )
95 #define ID_CLRH  LWID_( 'C','L','R','H' )
96 #define ID_CLRF  LWID_( 'C','L','R','F' )
97 #define ID_ADTR  LWID_( 'A','D','T','R' )
98 #define ID_SHRP  LWID_( 'S','H','R','P' )
99 #define ID_LINE  LWID_( 'L','I','N','E' )
100 #define ID_LSIZ  LWID_( 'L','S','I','Z' )
101 #define ID_ALPH  LWID_( 'A','L','P','H' )
102 #define ID_AVAL  LWID_( 'A','V','A','L' )
103 #define ID_GVAL  LWID_( 'G','V','A','L' )
104 #define ID_BLOK  LWID_( 'B','L','O','K' )
105
106 /* texture layer */
107 #define ID_TYPE  LWID_( 'T','Y','P','E' )
108 #define ID_CHAN  LWID_( 'C','H','A','N' )
109 #define ID_NAME  LWID_( 'N','A','M','E' )
110 #define ID_ENAB  LWID_( 'E','N','A','B' )
111 #define ID_OPAC  LWID_( 'O','P','A','C' )
112 #define ID_FLAG  LWID_( 'F','L','A','G' )
113 #define ID_PROJ  LWID_( 'P','R','O','J' )
114 #define ID_STCK  LWID_( 'S','T','C','K' )
115 #define ID_TAMP  LWID_( 'T','A','M','P' )
116
117 /* texture coordinates */
118 #define ID_TMAP  LWID_( 'T','M','A','P' )
119 #define ID_AXIS  LWID_( 'A','X','I','S' )
120 #define ID_CNTR  LWID_( 'C','N','T','R' )
121 #define ID_SIZE  LWID_( 'S','I','Z','E' )
122 #define ID_ROTA  LWID_( 'R','O','T','A' )
123 #define ID_OREF  LWID_( 'O','R','E','F' )
124 #define ID_FALL  LWID_( 'F','A','L','L' )
125 #define ID_CSYS  LWID_( 'C','S','Y','S' )
126
127 /* image map */
128 #define ID_IMAP  LWID_( 'I','M','A','P' )
129 #define ID_IMAG  LWID_( 'I','M','A','G' )
130 #define ID_WRAP  LWID_( 'W','R','A','P' )
131 #define ID_WRPW  LWID_( 'W','R','P','W' )
132 #define ID_WRPH  LWID_( 'W','R','P','H' )
133 #define ID_VMAP  LWID_( 'V','M','A','P' )
134 #define ID_AAST  LWID_( 'A','A','S','T' )
135 #define ID_PIXB  LWID_( 'P','I','X','B' )
136
137 /* procedural */
138 #define ID_PROC  LWID_( 'P','R','O','C' )
139 #define ID_COLR  LWID_( 'C','O','L','R' )
140 #define ID_VALU  LWID_( 'V','A','L','U' )
141 #define ID_FUNC  LWID_( 'F','U','N','C' )
142 #define ID_FTPS  LWID_( 'F','T','P','S' )
143 #define ID_ITPS  LWID_( 'I','T','P','S' )
144 #define ID_ETPS  LWID_( 'E','T','P','S' )
145
146 /* gradient */
147 #define ID_GRAD  LWID_( 'G','R','A','D' )
148 #define ID_GRST  LWID_( 'G','R','S','T' )
149 #define ID_GREN  LWID_( 'G','R','E','N' )
150 #define ID_PNAM  LWID_( 'P','N','A','M' )
151 #define ID_INAM  LWID_( 'I','N','A','M' )
152 #define ID_GRPT  LWID_( 'G','R','P','T' )
153 #define ID_FKEY  LWID_( 'F','K','E','Y' )
154 #define ID_IKEY  LWID_( 'I','K','E','Y' )
155
156 /* shader */
157 #define ID_SHDR  LWID_( 'S','H','D','R' )
158 #define ID_DATA  LWID_( 'D','A','T','A' )
159
160
161 /* generic linked list */
162
163 typedef struct st_lwNode {
164         struct st_lwNode *next, *prev;
165         void *data;
166 } lwNode;
167
168
169 /* plug-in reference */
170
171 typedef struct st_lwPlugin {
172         struct st_lwPlugin *next, *prev;
173         char          *ord;
174         char          *name;
175         int flags;
176         void          *data;
177 } lwPlugin;
178
179
180 /* envelopes */
181
182 typedef struct st_lwKey {
183         struct st_lwKey *next, *prev;
184         float value;
185         float time;
186         unsigned int shape;                /* ID_TCB, ID_BEZ2, etc. */
187         float tension;
188         float continuity;
189         float bias;
190         float param[ 4 ];
191 } lwKey;
192
193 typedef struct st_lwEnvelope {
194         struct st_lwEnvelope *next, *prev;
195         int index;
196         int type;
197         char          *name;
198         lwKey         *key;                /* linked list of keys */
199         int nkeys;
200         int behavior[ 2 ];                 /* pre and post (extrapolation) */
201         lwPlugin      *cfilter;            /* linked list of channel filters */
202         int ncfilters;
203 } lwEnvelope;
204
205 #define BEH_RESET      0
206 #define BEH_CONSTANT   1
207 #define BEH_REPEAT     2
208 #define BEH_OSCILLATE  3
209 #define BEH_OFFSET     4
210 #define BEH_LINEAR     5
211
212
213 /* values that can be enveloped */
214
215 typedef struct st_lwEParam {
216         float val;
217         int eindex;
218 } lwEParam;
219
220 typedef struct st_lwVParam {
221         float val[ 3 ];
222         int eindex;
223 } lwVParam;
224
225
226 /* clips */
227
228 typedef struct st_lwClipStill {
229         char          *name;
230 } lwClipStill;
231
232 typedef struct st_lwClipSeq {
233         char          *prefix;             /* filename before sequence digits */
234         char          *suffix;             /* after digits, e.g. extensions */
235         int digits;
236         int flags;
237         int offset;
238         int start;
239         int end;
240 } lwClipSeq;
241
242 typedef struct st_lwClipAnim {
243         char          *name;
244         char          *server;             /* anim loader plug-in */
245         void          *data;
246 } lwClipAnim;
247
248 typedef struct st_lwClipXRef {
249         char          *string;
250         int index;
251         struct st_lwClip *clip;
252 } lwClipXRef;
253
254 typedef struct st_lwClipCycle {
255         char          *name;
256         int lo;
257         int hi;
258 } lwClipCycle;
259
260 typedef struct st_lwClip {
261         struct st_lwClip *next, *prev;
262         int index;
263         unsigned int type;                 /* ID_STIL, ID_ISEQ, etc. */
264         union {
265                 lwClipStill still;
266                 lwClipSeq seq;
267                 lwClipAnim anim;
268                 lwClipXRef xref;
269                 lwClipCycle cycle;
270         }              source;
271         float start_time;
272         float duration;
273         float frame_rate;
274         lwEParam contrast;
275         lwEParam brightness;
276         lwEParam saturation;
277         lwEParam hue;
278         lwEParam gamma;
279         int negative;
280         lwPlugin      *ifilter;            /* linked list of image filters */
281         int nifilters;
282         lwPlugin      *pfilter;            /* linked list of pixel filters */
283         int npfilters;
284 } lwClip;
285
286
287 /* textures */
288
289 typedef struct st_lwTMap {
290         lwVParam size;
291         lwVParam center;
292         lwVParam rotate;
293         lwVParam falloff;
294         int fall_type;
295         char          *ref_object;
296         int coord_sys;
297 } lwTMap;
298
299 typedef struct st_lwImageMap {
300         int cindex;
301         int projection;
302         char          *vmap_name;
303         int axis;
304         int wrapw_type;
305         int wraph_type;
306         lwEParam wrapw;
307         lwEParam wraph;
308         float aa_strength;
309         int aas_flags;
310         int pblend;
311         lwEParam stck;
312         lwEParam amplitude;
313 } lwImageMap;
314
315 #define PROJ_PLANAR       0
316 #define PROJ_CYLINDRICAL  1
317 #define PROJ_SPHERICAL    2
318 #define PROJ_CUBIC        3
319 #define PROJ_FRONT        4
320
321 #define WRAP_NONE    0
322 #define WRAP_EDGE    1
323 #define WRAP_REPEAT  2
324 #define WRAP_MIRROR  3
325
326 typedef struct st_lwProcedural {
327         int axis;
328         float value[ 3 ];
329         char          *name;
330         void          *data;
331 } lwProcedural;
332
333 typedef struct st_lwGradKey {
334         struct st_lwGradKey *next, *prev;
335         float value;
336         float rgba[ 4 ];
337 } lwGradKey;
338
339 typedef struct st_lwGradient {
340         char          *paramname;
341         char          *itemname;
342         float start;
343         float end;
344         int repeat;
345         lwGradKey     *key;                /* array of gradient keys */
346         short         *ikey;               /* array of interpolation codes */
347 } lwGradient;
348
349 typedef struct st_lwTexture {
350         struct st_lwTexture *next, *prev;
351         char          *ord;
352         unsigned int type;
353         unsigned int chan;
354         lwEParam opacity;
355         short opac_type;
356         short enabled;
357         short negative;
358         short axis;
359         union {
360                 lwImageMap imap;
361                 lwProcedural proc;
362                 lwGradient grad;
363         }              param;
364         lwTMap tmap;
365 } lwTexture;
366
367
368 /* values that can be textured */
369
370 typedef struct st_lwTParam {
371         float val;
372         int eindex;
373         lwTexture     *tex;                /* linked list of texture layers */
374 } lwTParam;
375
376 typedef struct st_lwCParam {
377         float rgb[ 3 ];
378         int eindex;
379         lwTexture     *tex;                /* linked list of texture layers */
380 } lwCParam;
381
382
383 /* surfaces */
384
385 typedef struct st_lwGlow {
386         short enabled;
387         short type;
388         lwEParam intensity;
389         lwEParam size;
390 } Glow;
391
392 typedef struct st_lwRMap {
393         lwTParam val;
394         int options;
395         int cindex;
396         float seam_angle;
397 } lwRMap;
398
399 typedef struct st_lwLine {
400         short enabled;
401         unsigned short flags;
402         lwEParam size;
403 } lwLine;
404
405 typedef struct st_lwSurface {
406         struct st_lwSurface *next, *prev;
407         char          *name;
408         char          *srcname;
409         lwCParam color;
410         lwTParam luminosity;
411         lwTParam diffuse;
412         lwTParam specularity;
413         lwTParam glossiness;
414         lwRMap reflection;
415         lwRMap transparency;
416         lwTParam eta;
417         lwTParam translucency;
418         lwTParam bump;
419         float smooth;
420         int sideflags;
421         float alpha;
422         int alpha_mode;
423         lwEParam color_hilite;
424         lwEParam color_filter;
425         lwEParam add_trans;
426         lwEParam dif_sharp;
427         lwEParam glow;
428         lwLine line;
429         lwPlugin      *shader;             /* linked list of shaders */
430         int nshaders;
431 } lwSurface;
432
433
434 /* vertex maps */
435
436 typedef struct st_lwVMap {
437         struct st_lwVMap *next, *prev;
438         char          *name;
439         unsigned int type;
440         int dim;
441         int nverts;
442         int perpoly;
443         int           *vindex;             /* array of point indexes */
444         int           *pindex;             /* array of polygon indexes */
445         float        **val;
446 } lwVMap;
447
448 typedef struct st_lwVMapPt {
449         lwVMap        *vmap;
450         int index;                         /* vindex or pindex element */
451 } lwVMapPt;
452
453
454 /* points and polygons */
455
456 typedef struct st_lwPoint {
457         float pos[ 3 ];
458         int npols;                         /* number of polygons sharing the point */
459         int           *pol;                /* array of polygon indexes */
460         int nvmaps;
461         lwVMapPt      *vm;                 /* array of vmap references */
462 } lwPoint;
463
464 typedef struct st_lwPolVert {
465         int index;                         /* index into the point array */
466         float norm[ 3 ];
467         int nvmaps;
468         lwVMapPt      *vm;                 /* array of vmap references */
469 } lwPolVert;
470
471 typedef struct st_lwPolygon {
472         lwSurface     *surf;
473         int part;                          /* part index */
474         int smoothgrp;                     /* smoothing group */
475         int flags;
476         unsigned int type;
477         float norm[ 3 ];
478         int nverts;
479         lwPolVert     *v;                  /* array of vertex records */
480 } lwPolygon;
481
482 typedef struct st_lwPointList {
483         int count;
484         int offset;                        /* only used during reading */
485         lwPoint       *pt;                 /* array of points */
486 } lwPointList;
487
488 typedef struct st_lwPolygonList {
489         int count;
490         int offset;                        /* only used during reading */
491         int vcount;                        /* total number of vertices */
492         int voffset;                       /* only used during reading */
493         lwPolygon     *pol;                /* array of polygons */
494 } lwPolygonList;
495
496
497 /* geometry layers */
498
499 typedef struct st_lwLayer {
500         struct st_lwLayer *next, *prev;
501         char          *name;
502         int index;
503         int parent;
504         int flags;
505         float pivot[ 3 ];
506         float bbox[ 6 ];
507         lwPointList point;
508         lwPolygonList polygon;
509         int nvmaps;
510         lwVMap        *vmap;               /* linked list of vmaps */
511 } lwLayer;
512
513
514 /* tag strings */
515
516 typedef struct st_lwTagList {
517         int count;
518         int offset;                        /* only used during reading */
519         char         **tag;                /* array of strings */
520 } lwTagList;
521
522
523 /* an object */
524
525 typedef struct st_lwObject {
526         lwLayer       *layer;              /* linked list of layers */
527         lwEnvelope    *env;                /* linked list of envelopes */
528         lwClip        *clip;               /* linked list of clips */
529         lwSurface     *surf;               /* linked list of surfaces */
530         lwTagList taglist;
531         int nlayers;
532         int nenvs;
533         int nclips;
534         int nsurfs;
535 } lwObject;
536
537
538 /* lwo2.c */
539
540 void lwFreeLayer( lwLayer *layer );
541 void lwFreeObject( lwObject *object );
542 lwObject *lwGetObject( const char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
543 int lwValidateObject( const char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
544
545 /* pntspols.c */
546
547 void lwFreePoints( lwPointList *point );
548 void lwFreePolygons( lwPolygonList *plist );
549 int lwGetPoints( picoMemStream_t *fp, int cksize, lwPointList *point );
550 void lwGetBoundingBox( lwPointList * point, float bbox[] );
551 int lwAllocPolygons( lwPolygonList *plist, int npols, int nverts );
552 int lwGetPolygons( picoMemStream_t *fp, int cksize, lwPolygonList *plist, int ptoffset );
553 void lwGetPolyNormals( lwPointList *point, lwPolygonList *polygon );
554 int lwGetPointPolygons( lwPointList *point, lwPolygonList *polygon );
555 int lwResolvePolySurfaces( lwPolygonList *polygon, lwTagList *tlist,
556                                                    lwSurface **surf, int *nsurfs );
557 void lwGetVertNormals( lwPointList *point, lwPolygonList *polygon );
558 void lwFreeTags( lwTagList *tlist );
559 int lwGetTags( picoMemStream_t *fp, int cksize, lwTagList *tlist );
560 int lwGetPolygonTags( picoMemStream_t *fp, int cksize, lwTagList *tlist,
561                                           lwPolygonList *plist );
562
563 /* vmap.c */
564
565 void lwFreeVMap( lwVMap *vmap );
566 lwVMap *lwGetVMap( picoMemStream_t *fp, int cksize, int ptoffset, int poloffset,
567                                    int perpoly );
568 int lwGetPointVMaps( lwPointList *point, lwVMap *vmap );
569 int lwGetPolyVMaps( lwPolygonList *polygon, lwVMap *vmap );
570
571 /* clip.c */
572
573 void lwFreeClip( lwClip *clip );
574 lwClip *lwGetClip( picoMemStream_t *fp, int cksize );
575 lwClip *lwFindClip( lwClip *list, int index );
576
577 /* envelope.c */
578
579 void lwFreeEnvelope( lwEnvelope *env );
580 lwEnvelope *lwGetEnvelope( picoMemStream_t *fp, int cksize );
581 lwEnvelope *lwFindEnvelope( lwEnvelope *list, int index );
582 float lwEvalEnvelope( lwEnvelope *env, float time );
583
584 /* surface.c */
585
586 void lwFreePlugin( lwPlugin *p );
587 void lwFreeTexture( lwTexture *t );
588 void lwFreeSurface( lwSurface *surf );
589 int lwGetTHeader( picoMemStream_t *fp, int hsz, lwTexture *tex );
590 int lwGetTMap( picoMemStream_t *fp, int tmapsz, lwTMap *tmap );
591 int lwGetImageMap( picoMemStream_t *fp, int rsz, lwTexture *tex );
592 int lwGetProcedural( picoMemStream_t *fp, int rsz, lwTexture *tex );
593 int lwGetGradient( picoMemStream_t *fp, int rsz, lwTexture *tex );
594 lwTexture *lwGetTexture( picoMemStream_t *fp, int bloksz, unsigned int type );
595 lwPlugin *lwGetShader( picoMemStream_t *fp, int bloksz );
596 lwSurface *lwGetSurface( picoMemStream_t *fp, int cksize );
597 lwSurface *lwDefaultSurface( void );
598
599 /* lwob.c */
600
601 lwSurface *lwGetSurface5( picoMemStream_t *fp, int cksize, lwObject *obj );
602 int lwGetPolygons5( picoMemStream_t *fp, int cksize, lwPolygonList *plist, int ptoffset );
603 lwObject *lwGetObject5( const char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
604 int lwValidateObject5( const char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos );
605
606 /* list.c */
607
608 void lwListFree( void *list, void ( *freeNode )( void * ) );
609 void lwListAdd( void **list, void *node );
610 void lwListInsert( void **vlist, void *vitem,
611                                    int ( *compare )( void *, void * ) );
612
613 /* vecmath.c */
614
615 float dot( float a[], float b[] );
616 void cross( float a[], float b[], float c[] );
617 void normalize( float v[] );
618 #define vecangle( a, b ) ( float ) acos( dot( a, b ) )
619
620 /* lwio.c */
621
622 void  set_flen( int i );
623 int   get_flen( void );
624 void *getbytes( picoMemStream_t *fp, int size );
625 void  skipbytes( picoMemStream_t *fp, int n );
626 int   getI1( picoMemStream_t *fp );
627 short getI2( picoMemStream_t *fp );
628 int   getI4( picoMemStream_t *fp );
629 unsigned char  getU1( picoMemStream_t *fp );
630 unsigned short getU2( picoMemStream_t *fp );
631 unsigned int   getU4( picoMemStream_t *fp );
632 int   getVX( picoMemStream_t *fp );
633 float getF4( picoMemStream_t *fp );
634 char *getS0( picoMemStream_t *fp );
635 int   sgetI1( unsigned char **bp );
636 short sgetI2( unsigned char **bp );
637 int   sgetI4( unsigned char **bp );
638 unsigned char  sgetU1( unsigned char **bp );
639 unsigned short sgetU2( unsigned char **bp );
640 unsigned int   sgetU4( unsigned char **bp );
641 int   sgetVX( unsigned char **bp );
642 float sgetF4( unsigned char **bp );
643 char *sgetS0( unsigned char **bp );
644
645 #ifndef __BIG_ENDIAN__
646 void revbytes( void *bp, int elsize, int elcount );
647 #else
648   #define revbytes( b, s, c )
649 #endif
650
651 #endif