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