C:/jkyprian/devel/lib3ds/lib3ds/io.c

00001 /*
00002  * The 3D Studio File Format Library
00003  * Copyright (C) 1996-2007 by Jan Eric Kyprianidis <www.kyprianidis.com>
00004  * All rights reserved.
00005  *
00006  * This program is  free  software;  you can redistribute it and/or modify it
00007  * under the terms of the  GNU Lesser General Public License  as published by 
00008  * the  Free Software Foundation;  either version 2.1 of the License,  or (at 
00009  * your option) any later version.
00010  *
00011  * This  program  is  distributed in  the  hope that it will  be useful,  but
00012  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
00013  * or  FITNESS FOR A  PARTICULAR PURPOSE.  See the  GNU Lesser General Public  
00014  * License for more details.
00015  *
00016  * You should  have received  a copy of the GNU Lesser General Public License
00017  * along with  this program;  if not, write to the  Free Software Foundation,
00018  * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00019  *
00020  * $Id: io.c,v 1.9 2007/06/20 17:04:08 jeh Exp $
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 }

Hosted by
SourceForge.net Logo
Generated at Wed Jun 20 18:51:36 2007 by Doxygen 1.5.2