00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <lib3ds/io.h>
00023 #include <stdlib.h>
00024 #include <string.h>
00025
00026
00031 typedef union {
00032 Lib3dsDword dword_value;
00033 Lib3dsFloat float_value;
00034 } Lib3dsDwordFloat;
00035
00036
00037 struct Lib3dsIo {
00038 void *self;
00039 Lib3dsIoErrorFunc error_func;
00040 Lib3dsIoSeekFunc seek_func;
00041 Lib3dsIoTellFunc tell_func;
00042 Lib3dsIoReadFunc read_func;
00043 Lib3dsIoWriteFunc write_func;
00044 };
00045
00046
00047 Lib3dsIo*
00048 lib3ds_io_new(void *self, Lib3dsIoErrorFunc error_func, Lib3dsIoSeekFunc seek_func,
00049 Lib3dsIoTellFunc tell_func, Lib3dsIoReadFunc read_func, Lib3dsIoWriteFunc write_func)
00050 {
00051 Lib3dsIo *io = calloc(sizeof(Lib3dsIo),1);
00052 ASSERT(io);
00053 if (!io) {
00054 return 0;
00055 }
00056
00057 io->self = self;
00058 io->error_func = error_func;
00059 io->seek_func = seek_func;
00060 io->tell_func = tell_func;
00061 io->read_func = read_func;
00062 io->write_func = write_func;
00063
00064 return io;
00065 }
00066
00067
00068 void
00069 lib3ds_io_free(Lib3dsIo *io)
00070 {
00071 ASSERT(io);
00072 if (!io) {
00073 return;
00074 }
00075 free(io);
00076 }
00077
00078
00079 Lib3dsBool
00080 lib3ds_io_error(Lib3dsIo *io)
00081 {
00082 ASSERT(io);
00083 if (!io || !io->error_func) {
00084 return 0;
00085 }
00086 return (*io->error_func)(io->self);
00087 }
00088
00089
00090 long
00091 lib3ds_io_seek(Lib3dsIo *io, long offset, Lib3dsIoSeek origin)
00092 {
00093 ASSERT(io);
00094 if (!io || !io->seek_func) {
00095 return 0;
00096 }
00097 return (*io->seek_func)(io->self, offset, origin);
00098 }
00099
00100
00101 long
00102 lib3ds_io_tell(Lib3dsIo *io)
00103 {
00104 ASSERT(io);
00105 if (!io || !io->tell_func) {
00106 return 0;
00107 }
00108 return (*io->tell_func)(io->self);
00109 }
00110
00111
00112 size_t
00113 lib3ds_io_read(Lib3dsIo *io, void *buffer, size_t size)
00114 {
00115 ASSERT(io);
00116 if (!io || !io->read_func) {
00117 return 0;
00118 }
00119 return (*io->read_func)(io->self, buffer, size);
00120 }
00121
00122
00123 size_t
00124 lib3ds_io_write(Lib3dsIo *io, const void *buffer, size_t size)
00125 {
00126 ASSERT(io);
00127 if (!io || !io->write_func) {
00128 return 0;
00129 }
00130 return (*io->write_func)(io->self, buffer, size);
00131 }
00132
00133
00139 Lib3dsByte
00140 lib3ds_io_read_byte(Lib3dsIo *io)
00141 {
00142 Lib3dsByte b;
00143
00144 ASSERT(io);
00145 lib3ds_io_read(io, &b, 1);
00146 return(b);
00147 }
00148
00149
00153 Lib3dsWord
00154 lib3ds_io_read_word(Lib3dsIo *io)
00155 {
00156 Lib3dsByte b[2];
00157 Lib3dsWord w;
00158
00159 ASSERT(io);
00160 lib3ds_io_read(io, b, 2);
00161 w=((Lib3dsWord)b[1] << 8) |
00162 ((Lib3dsWord)b[0]);
00163 return(w);
00164 }
00165
00166
00172 Lib3dsDword
00173 lib3ds_io_read_dword(Lib3dsIo *io)
00174 {
00175 Lib3dsByte b[4];
00176 Lib3dsDword d;
00177
00178 ASSERT(io);
00179 lib3ds_io_read(io, b, 4);
00180 d=((Lib3dsDword)b[3] << 24) |
00181 ((Lib3dsDword)b[2] << 16) |
00182 ((Lib3dsDword)b[1] << 8) |
00183 ((Lib3dsDword)b[0]);
00184 return(d);
00185 }
00186
00187
00193 Lib3dsIntb
00194 lib3ds_io_read_intb(Lib3dsIo *io)
00195 {
00196 Lib3dsIntb b;
00197
00198 ASSERT(io);
00199 lib3ds_io_read(io, &b, 1);
00200 return(b);
00201 }
00202
00203
00209 Lib3dsIntw
00210 lib3ds_io_read_intw(Lib3dsIo *io)
00211 {
00212 Lib3dsByte b[2];
00213 Lib3dsWord w;
00214
00215 ASSERT(io);
00216 lib3ds_io_read(io, b, 2);
00217 w=((Lib3dsWord)b[1] << 8) |
00218 ((Lib3dsWord)b[0]);
00219 return((Lib3dsIntw)w);
00220 }
00221
00222
00228 Lib3dsIntd
00229 lib3ds_io_read_intd(Lib3dsIo *io)
00230 {
00231 Lib3dsByte b[4];
00232 Lib3dsDword d;
00233
00234 ASSERT(io);
00235 lib3ds_io_read(io, b, 4);
00236 d=((Lib3dsDword)b[3] << 24) |
00237 ((Lib3dsDword)b[2] << 16) |
00238 ((Lib3dsDword)b[1] << 8) |
00239 ((Lib3dsDword)b[0]);
00240 return((Lib3dsIntd)d);
00241 }
00242
00243
00249 Lib3dsFloat
00250 lib3ds_io_read_float(Lib3dsIo *io)
00251 {
00252 Lib3dsByte b[4];
00253 Lib3dsDwordFloat d;
00254
00255 ASSERT(io);
00256 lib3ds_io_read(io, b, 4);
00257 d.dword_value=((Lib3dsDword)b[3] << 24) |
00258 ((Lib3dsDword)b[2] << 16) |
00259 ((Lib3dsDword)b[1] << 8) |
00260 ((Lib3dsDword)b[0]);
00261 return d.float_value;
00262 }
00263
00264
00273 Lib3dsBool
00274 lib3ds_io_read_vector(Lib3dsIo *io, Lib3dsVector v)
00275 {
00276 ASSERT(io);
00277
00278 v[0]=lib3ds_io_read_float(io);
00279 v[1]=lib3ds_io_read_float(io);
00280 v[2]=lib3ds_io_read_float(io);
00281
00282 return(!lib3ds_io_error(io));
00283 }
00284
00285
00289 Lib3dsBool
00290 lib3ds_io_read_rgb(Lib3dsIo *io, Lib3dsRgb rgb)
00291 {
00292 ASSERT(io);
00293
00294 rgb[0]=lib3ds_io_read_float(io);
00295 rgb[1]=lib3ds_io_read_float(io);
00296 rgb[2]=lib3ds_io_read_float(io);
00297
00298 return(!lib3ds_io_error(io));
00299 }
00300
00301
00313 Lib3dsBool
00314 lib3ds_io_read_string(Lib3dsIo *io, char *s, int buflen)
00315 {
00316 char c;
00317 int k=0;
00318
00319 ASSERT(io);
00320 for (;;) {
00321 if (lib3ds_io_read(io, &c, 1)!=1) {
00322 return LIB3DS_FALSE;
00323 }
00324 *s++ = c;
00325 if (!c) {
00326 break;
00327 }
00328 ++k;
00329 if (k>=buflen) {
00330 return(LIB3DS_FALSE);
00331 }
00332 }
00333
00334 return(!lib3ds_io_error(io));
00335 }
00336
00337
00343 Lib3dsBool
00344 lib3ds_io_write_byte(Lib3dsIo *io, Lib3dsByte b)
00345 {
00346 ASSERT(io);
00347 if (lib3ds_io_write(io, &b, 1)!=1) {
00348 return(LIB3DS_FALSE);
00349 }
00350 return(LIB3DS_TRUE);
00351 }
00352
00353
00359 Lib3dsBool
00360 lib3ds_io_write_word(Lib3dsIo *io, Lib3dsWord w)
00361 {
00362 Lib3dsByte b[2];
00363
00364 ASSERT(io);
00365 b[1]=((Lib3dsWord)w & 0xFF00) >> 8;
00366 b[0]=((Lib3dsWord)w & 0x00FF);
00367 if (lib3ds_io_write(io, b, 2)!=2) {
00368 return(LIB3DS_FALSE);
00369 }
00370 return(LIB3DS_TRUE);
00371 }
00372
00373
00379 Lib3dsBool
00380 lib3ds_io_write_dword(Lib3dsIo *io, Lib3dsDword d)
00381 {
00382 Lib3dsByte b[4];
00383
00384 ASSERT(io);
00385 b[3]=(Lib3dsByte)(((Lib3dsDword)d & 0xFF000000) >> 24);
00386 b[2]=(Lib3dsByte)(((Lib3dsDword)d & 0x00FF0000) >> 16);
00387 b[1]=(Lib3dsByte)(((Lib3dsDword)d & 0x0000FF00) >> 8);
00388 b[0]=(Lib3dsByte)(((Lib3dsDword)d & 0x000000FF));
00389 if (lib3ds_io_write(io, b, 4)!=4) {
00390 return(LIB3DS_FALSE);
00391 }
00392 return(LIB3DS_TRUE);
00393 }
00394
00395
00401 Lib3dsBool
00402 lib3ds_io_write_intb(Lib3dsIo *io, Lib3dsIntb b)
00403 {
00404 ASSERT(io);
00405 if (lib3ds_io_write(io, &b, 1)!=1) {
00406 return(LIB3DS_FALSE);
00407 }
00408 return(LIB3DS_TRUE);
00409 }
00410
00411
00417 Lib3dsBool
00418 lib3ds_io_write_intw(Lib3dsIo *io, Lib3dsIntw w)
00419 {
00420 Lib3dsByte b[2];
00421
00422 ASSERT(io);
00423 b[1]=((Lib3dsWord)w & 0xFF00) >> 8;
00424 b[0]=((Lib3dsWord)w & 0x00FF);
00425 if (lib3ds_io_write(io, b, 2)!=2) {
00426 return(LIB3DS_FALSE);
00427 }
00428 return(LIB3DS_TRUE);
00429 }
00430
00431
00437 Lib3dsBool
00438 lib3ds_io_write_intd(Lib3dsIo *io, Lib3dsIntd d)
00439 {
00440 Lib3dsByte b[4];
00441
00442 ASSERT(io);
00443 b[3]=(Lib3dsByte)(((Lib3dsDword)d & 0xFF000000) >> 24);
00444 b[2]=(Lib3dsByte)(((Lib3dsDword)d & 0x00FF0000) >> 16);
00445 b[1]=(Lib3dsByte)(((Lib3dsDword)d & 0x0000FF00) >> 8);
00446 b[0]=(Lib3dsByte)(((Lib3dsDword)d & 0x000000FF));
00447 if (lib3ds_io_write(io, b, 4)!=4) {
00448 return(LIB3DS_FALSE);
00449 }
00450 return(LIB3DS_TRUE);
00451 }
00452
00453
00459 Lib3dsBool
00460 lib3ds_io_write_float(Lib3dsIo *io, Lib3dsFloat l)
00461 {
00462 Lib3dsByte b[4];
00463 Lib3dsDwordFloat d;
00464
00465 ASSERT(io);
00466 d.float_value=l;
00467 b[3]=(Lib3dsByte)(((Lib3dsDword)d.dword_value & 0xFF000000) >> 24);
00468 b[2]=(Lib3dsByte)(((Lib3dsDword)d.dword_value & 0x00FF0000) >> 16);
00469 b[1]=(Lib3dsByte)(((Lib3dsDword)d.dword_value & 0x0000FF00) >> 8);
00470 b[0]=(Lib3dsByte)(((Lib3dsDword)d.dword_value & 0x000000FF));
00471 if (lib3ds_io_write(io, b, 4)!=4) {
00472 return(LIB3DS_FALSE);
00473 }
00474 return(LIB3DS_TRUE);
00475 }
00476
00477
00483 Lib3dsBool
00484 lib3ds_io_write_vector(Lib3dsIo *io, Lib3dsVector v)
00485 {
00486 int i;
00487 for (i=0; i<3; ++i) {
00488 if (!lib3ds_io_write_float(io, v[i])) {
00489 return(LIB3DS_FALSE);
00490 }
00491 }
00492 return(LIB3DS_TRUE);
00493 }
00494
00495
00499 Lib3dsBool
00500 lib3ds_io_write_rgb(Lib3dsIo *io, Lib3dsRgb rgb)
00501 {
00502 int i;
00503 for (i=0; i<3; ++i) {
00504 if (!lib3ds_io_write_float(io, rgb[i])) {
00505 return(LIB3DS_FALSE);
00506 }
00507 }
00508 return(LIB3DS_TRUE);
00509 }
00510
00511
00517 Lib3dsBool
00518 lib3ds_io_write_string(Lib3dsIo *io, const char *s)
00519 {
00520 ASSERT(s);
00521 ASSERT(io);
00522 lib3ds_io_write(io, s, strlen(s)+1);
00523 return(!lib3ds_io_error(io));
00524 }