SIBCUtil.h

00001 //***************************************************************************************
00002 //
00003 // File supervisor: Crosswalk team
00004 //
00005 // Copyright 2008 Autodesk, Inc.  All rights reserved.
00006 // Use of this software is subject to the terms of the Autodesk license agreement
00007 // provided at the time of installation or download, or which otherwise accompanies
00008 // this software in either electronic or hard copy form.
00009 //
00010 //***************************************************************************************
00011 
00012 //**************************************************************************************
00013 // Defines
00014 //**************************************************************************************
00015 #ifndef __CSIBCUtil_H__
00016 #define __CSIBCUtil_H__
00017 
00018 #if defined(unix) && (defined(WIN64) || defined(_WIN64) || defined(__x86_64))
00019 typedef unsigned int ULONG;
00020 typedef int LONG;
00021 #else
00022 typedef unsigned long ULONG;
00023 typedef long LONG;
00024 #endif
00025 
00026 #ifdef unix
00027   #include <string.h>
00028   #ifdef __APPLE__
00029     #include <math.h>
00030   #endif
00031 #endif
00032 
00033 #include <SIBCMath.h>
00034 
00035 #ifdef _WIN32
00036 #ifndef _XBOX
00037 #include <windows.h>
00038 #include <winuser.h>
00039 #else
00040 #include <xtl.h>
00041 #endif
00042 #endif
00043 
00044 //**************************************************************************************
00045 // Includes
00046 //**************************************************************************************
00047 #ifndef _WIN32_WCE
00048 #include <assert.h>
00049 #else
00050 #endif
00051 
00052 
00053 //**************************************************************************************
00054 // Typedefs
00055 //**************************************************************************************
00056 #ifndef _CUS_DLL
00057 
00067 typedef enum {
00068 
00069 
00070     SI_SUCCESS      =   0,      
00071 
00072     // general errors //
00073     SI_ERR_NONE     =   0,      
00074     SI_ERR_STATUS_MSG,          
00075     SI_ERR_MESSAGE_MSG,         
00076     SI_ERR_WARNING_MSG,         
00077     SI_ERR_ERROR_MSG,           
00078     SI_ERR_MODE_MSG,            
00079     SI_ERR_INTERNAL,            
00080     SI_ERR_NOTYETIMPLEMENTED,   
00081     SI_ERR_NOTSUPPORTED,        
00082 
00083     // argument check //
00084     SI_ERR_BAD_MDLTYPE,     
00085     SI_ERR_BAD_CHAPID,      
00086     SI_ERR_BAD_GROUPID,     
00087     SI_ERR_BAD_GROUPLIST,   
00088     SI_ERR_BAD_ELEMENT,     
00089     SI_ERR_BAD_DICTIONARY,  
00090     SI_ERR_BAD_RELID,       
00091     SI_ERR_BAD_ARGUMENT,    
00092     SI_ERR_BAD_DATABASE,    
00093     SI_ERR_BAD_RELNDX,      
00094     SI_ERR_BAD_MSMSH,       
00095     SI_ERR_BAD_MFACE,       
00096     SI_ERR_BAD_MPTCH,       
00097     SI_ERR_BAD_MSPLN,       
00098     SI_ERR_BAD_PARAM,       
00099     SI_ERR_BAD_NBPARAM,     
00100     SI_ERR_BAD_NOPARAM,     
00101     SI_ERR_BAD_CHP4REL,     
00102     SI_ERR_BAD_SHAPEID,     
00103     SI_ERR_CLS_NOMODEL,     
00104     SI_ERR_LAT_NOMODEL,     
00105 
00106     // relations & rel resources //
00107     SI_ERR_RELRSRC_CANTOPEN,    
00108     SI_ERR_RELRSRC_INVGRP,      
00109     SI_ERR_RELRSRC_INVCHP,      
00110     SI_ERR_RELPAIR_CANTADD,     
00111     SI_ERR_RELPAIR_CANTDEL,     
00112     SI_ERR_REL_CANTDEL,         
00113 
00114     // dictionary //
00115     SI_ERR_ELEM_NOTFOUND,   
00116     SI_ERR_NAME_DUPL,       
00117     SI_ERR_NAME_FORMAT,     
00118 
00119     // file access //
00120     SI_ERR_DB_NOTFOUND,     
00121     SI_ERR_DB_INVALID,      
00122     SI_ERR_DB_CANTCREATE,   
00123     SI_ERR_DB_CANTDELETE,   
00124     SI_ERR_DBDELETE,        
00125     SI_ERR_ACCESS_CANTSET,  
00126     SI_ERR_SCENE_CANTREAD,  
00127     SI_ERR_SCENE_CANTWRITE, 
00128     SI_ERR_SCENE_CANTDEL,   
00129     SI_ERR_ELEM_CANTREAD,   
00130     SI_ERR_ELEM_CANTWRITE,  
00131     SI_ERR_SAVE_NOTROOT,    
00132     SI_ERR_NOVERS_FOUND,    
00133 
00134     // Data access and Conversion //
00135     SI_ERR_NUM_VERTICES,        
00136     SI_ERR_SHAPE_VERTICES,      
00137     SI_ERR_TOO_FEW_VERTICES,    
00138     SI_ERR_TOO_MANY_VERTICES,   
00139     SI_ERR_NULL_TRANSFO,        
00140     SI_ERR_NULL_VECTOR,         
00141     SI_ERR_BAD_COORDSYS,        
00142     SI_ERR_BAD_VNDX,            
00143     SI_ERR_CHAPNOTFOUND,        
00144     SI_ERR_FCVNOTFOUND,         
00145     SI_ERR_NOT_TRIANGULATED,    
00146 
00147     // Update list and animation //
00148     SI_ERR_CYCLE_DETECTED,      
00149 
00150     // Dynalink library //
00151     SI_ERR_DYNALINK_NOT_LOADED,     
00152     SI_ERR_DYNALINK_NOT_RESOLVED,   
00153     SI_ERR_DYNALINK_NOT_UNLOADED,   
00154 
00155     // Custom Value //
00156     SI_ERR_CUSVAL_SYMBOL_NOT_FOUND, 
00157     SI_ERR_CUSVAL_INCORRECT_TYPE,   
00158     SI_ERR_CUSVAL_BUFFER_TOO_SMALL, 
00159 
00160     // SAAPHIRE stuff //
00161     SI_ERR_ALLOC_PROBLEM,       
00162     SI_ERR_INVALID_SCENE,       
00163     SI_ERR_ELEM_UNSCENE,        
00164     SI_ERR_ELEM_TYPE,           
00165     SI_ERR_ELEM_ROOT,           
00166     SI_ERR_WRONG_COUNT,         
00167     SI_ERR_INVALID_LTYPE,       
00168     SI_ERR_NO_RESET,            
00169     SI_ERR_INVALID_SELEM,       
00170     SI_ERR_BAD_MATERIAL,        
00171     SI_ERR_INVALID_TESSELATION, 
00172     SI_ERR_NON_TESSELATABLE,    
00173     SI_ERR_INVALID_MODEL_DATA,  
00174     SI_ERR_NO_MATERIAL,         
00175     SI_ERR_NO_TEXTURE,          
00176     SI_ERR_ELEM_NOT_LEAF_NODE,  
00177     SI_ERR_ELEM_CANTDEL,        
00178     SI_ERR_FCURVE_EXISTS,       
00179     SI_ERR_ELEM_CHNROOT,        
00180     SI_ERR_ELEM_EFFECTOR,       
00181     SI_ERR_GOAL_NOT_SET,        
00182     SI_ERR_USERDATA_EXISTS,     
00183     SI_ERR_INVALID_INDEX,       
00184 
00185     // Opensyst //
00186     SI_ERR_CUS_SECOND_SYMBOL,   
00187     SI_ERR_CUS_NO_SYMBOL_NAME,  
00188 
00189     // DSO's //
00190     SI_ERR_CUSTOM_FATAL,        
00191 
00192     // DLL's //
00193     SI_ERR_UNFOUND_GLBSYMB_TAB, 
00194 
00195     // Graphic //
00196     SI_ERR_STOP,        
00197     SI_ERR_TXT_NAME,    
00198     SI_ERR_NO_CAM,      
00199 
00200     // Reason why a transformation is not applicable to a model //
00201     SI_ERR_TRANSFO_METASYSTEM,      
00202     SI_ERR_TRANSFO_PATCHDEFORM,     
00203     SI_ERR_TRANSFO_SPLINEDEFORM,    
00204     SI_ERR_SCAL_CHAIN,              
00205     SI_ERR_SCAL_CNSSCL,             
00206     SI_ERR_ROT_JOINT,               
00207     SI_ERR_ROT_CHNROOT,             
00208     SI_ERR_ROT_CNSORI,              
00209     SI_ERR_TRANS_CHNROOT,           
00210     SI_ERR_TRANS_JOINT,             
00211     SI_ERR_TRANS_DYNLEAF,           
00212     SI_ERR_TRANS_MAINGLOBENV,       
00213     SI_ERR_TRANS_CONSTRAINT,        
00214 
00215     // Additional SAAPHIRE error codes //
00216     SI_ERR_SUBELEM_TOTAL_FAILURE,   
00217     SI_ERR_SOFTIMAGE_TOO_OLD,       
00218     SI_ERR_SAAPHIRE_TOO_OLD,        
00219     SI_ERR_SAA_TOO_OLD_FOR_EFFECT,  
00220     SI_ERR_FILE_EXISTS,             
00221     SI_ERR_UNRELATED_T2D,           
00222     SI_ERR_INCOMPATIBLE_T2DMAP,     
00223     SI_ERR_SHADER_EXISTS,           
00224     SI_ERR_INCOMPAT_MAP_METHOD,     
00225     SI_ERR_MODEL_NO_SHAPES,         
00226     SI_ERR_CLUSTER_NO_KEYS,         
00227 
00228     // DSO's (no status bar message) //
00229     SI_ERR_CUSTOM_FATAL_NOMSG,      
00230     SI_ERR_NO_FCV_EDITOR,           
00231 
00232     // Render errors //
00233     SI_ERR_RENDER_WARNING,          
00234     SI_ERR_RENDER_ERROR,            
00235 
00236     // physical property Error //
00237     SI_ERR_MODEL_NO_PHYSPROPS,      
00238 
00239     // dialog errors //
00240     SI_ERR_EFFECT_NODG,     
00241     SI_ERR_DG_NOTFOUND,     
00242 
00243     // more render errors //
00244     SI_ERR_RENDER_VOLUNTARYEXIT,    
00245 
00246     // Audio support //
00247     SI_ERR_AUDIO_DEVICEINUSE,   
00248     SI_ERR_AUDIO_INVALIDFORMAT, 
00249     SI_ERR_AUDIO_INACTIVE,      
00250     SI_ERR_FILENOTFOUND,        
00251     SI_ERR_AUDIO_INVALIDTRACK,  
00252     SI_ERR_FILEPASSEDEOF,       
00253 
00254     // Action Support //
00255     SI_ERR_NO_ACTION,               
00256     SI_ERR_MARKER_NOTFOUND,         
00257     SI_ERR_ACTIONMARKERS_OVERLAP,   
00258 
00259     // More audio errors //
00260     SI_ERR_AUDIO_FILENOTSET,        
00261     SI_ERR_AUDIO_FILEALREADYSET,    
00262     SI_ERR_AUDIO_MIXINGNOTENABLED,  
00263 
00264     // Licensing //
00265     SI_ERR_LIC_INVALID_HANDLE,  
00266     SI_ERR_LIC_INVALID_ARGS,    
00267     SI_ERR_LIC_CHECKOUT,        
00268     SI_ERR_NUM,                 
00269 
00270     // Softimage specific
00271     SI_FILE_NOT_FOUND,          
00272     SI_NO_AVAILABLE_DRIVER,     
00273     //Image Lib error
00274     SI_IMAGE_BAD_FORMAT     
00275 
00276 } eSI_Error;
00277 
00280 typedef int SI_Error;
00281 
00284 #else
00285 
00286 //To be cross compatible with SAAphire
00287 #include <saa.h>
00288 
00289 #define SI_FILE_NOT_FOUND (SI_ERR_NUM + 1)
00290 #define SI_NO_AVAILABLE_DRIVER (SI_FILE_NOT_FOUND + 1)
00291 #endif
00292 
00297 #ifndef TRUE
00298 #define TRUE        1       
00299 #endif
00300 
00301 #ifndef FALSE
00302 #define FALSE       0       
00303 #endif
00304 
00305 #define SI_TRUE TRUE        
00306 #define SI_FALSE FALSE      
00310 // Already documented in SIBCMathLib.h
00311 #ifndef NULL
00312 #define NULL 0
00313 #endif
00314 
00322 #define SI_Bool     unsigned short      
00323 #define SI_Byte     char                
00324 #define SI_UByte    unsigned char       
00325 #define SI_Short    short               
00326 #define SI_UShort   unsigned short      
00327 #define SI_Int      int                 
00328 #define SI_UInt     unsigned int        
00329 #define SI_Float    float               
00330 #define SI_Double   double              
00331 #define SI_Long     int                 
00332 #define SI_Void     void                
00333 #define SI_ULong    unsigned int        
00334 typedef SI_Float    SI_Matrix[4][4];    
00335 /* @} */    // endgroup
00336 
00337 // CustomPset Data Type String. These are not used in the FTK.
00338 #define SI_CUSTOMPSET_PCHAR "Text"
00339 #define SI_CUSTOMPSET_BOOL  "Boolean"
00340 #define SI_CUSTOMPSET_INT   "Integer"
00341 #define SI_CUSTOMPSET_UBYTE "Small Integer Number"
00342 #define SI_CUSTOMPSET_DOUBLE    "Floating Point Number"
00343 
00344 
00352 #define SI_VT_BOOL      0   
00353 #define SI_VT_BYTE      1   
00354 #define SI_VT_UBYTE     2   
00355 #define SI_VT_SHORT     3   
00356 #define SI_VT_USHORT    4   
00357 #define SI_VT_INT       5   
00358 #define SI_VT_UINT      6   
00359 #define SI_VT_FLOAT     7   
00360 #define SI_VT_DOUBLE    8   
00361 #define SI_VT_LONG      9   
00362 #define SI_VT_ULONG     10  
00364 #define SI_VT_PBOOL     11  
00365 #define SI_VT_PBYTE     12  
00366 #define SI_VT_PUBYTE    13  
00367 #define SI_VT_PSHORT    14  
00368 #define SI_VT_PUSHORT   15  
00369 #define SI_VT_PINT      16  
00370 #define SI_VT_PUINT     17  
00371 #define SI_VT_PFLOAT    18  
00372 #define SI_VT_PDOUBLE   19  
00373 #define SI_VT_PLONG     20  
00374 #define SI_VT_PULONG    21  
00376 #define SI_VT_PCHAR     22  
00377 #define SI_VT_PPCHAR    23  
00379 #define SI_VT_PVOID     24      // endgroup.
00381 
00382 
00390 #define SI_TT_NONE      0   
00391 #define SI_TT_POSITION  1   
00392 #define SI_TT_NORMAL    2   
00393 #define SI_TT_TEXCOORD  3   
00394 #define SI_TT_COLOR     4   
00395 #define SI_TT_TRANSFO   5   
00396 #define SI_TT_INTEGER   6   
00397 #define SI_TT_FLOAT     7   
00398 #define SI_TT_TINYFLOAT 8       // endgroup.
00400 
00408 struct TinyVariant {
00409 
00410     TinyVariant() { memset(this,0,sizeof(TinyVariant));};
00411     TinyVariant(SI_Int v,SI_Int t,SI_Int e )
00412     {
00413         variantType = v;
00414         tweakType = t;
00415         numElems = e;
00416     };
00417 
00418     SI_Int          variantType;    
00419     SI_Int          tweakType;      
00420     SI_Int          numElems;       
00425     union {
00426         SI_Bool     boolVal;    
00427         SI_Byte     bVal;       
00428         SI_UByte    ubVal;      
00429         SI_Short    sVal;       
00430         SI_UShort   usVal;      
00431         SI_Int      nVal;       
00432         SI_UInt     unVal;      
00433         SI_Float    fVal;       
00434         SI_Double   dVal;       
00435         SI_Long     lVal;       
00436         SI_ULong    ulVal;      
00438         SI_Bool     *p_boolVal; 
00439         SI_Byte     *p_bVal;    
00440         SI_UByte    *p_ubVal;   
00441         SI_Short    *p_sVal;    
00442         SI_UShort   *p_usVal;   
00443         SI_Int      *p_nVal;    
00444         SI_UInt     *p_unVal;   
00445         SI_Float    *p_fVal;    
00446         SI_Double   *p_dVal;    
00447         SI_Long     *p_lVal;    
00448         SI_ULong    *p_ulVal;   
00450         // We used char instead of SI_Char because SI_Char is plateform dependant.
00451         char        *p_cVal;    
00452         char        **pp_cVal;  
00454         SI_Void     *p_voidVal; 
00455     };
00456 };
00457 
00461 typedef TinyVariant SI_TinyVariant;
00462 
00465 //**************************************************************************************
00466 // Macros
00467 //**************************************************************************************
00469 //
00470 #if defined(unix)
00471 
00472 #include <stdio.h>
00473 #include <stdlib.h>
00474 #include <stdarg.h>
00475 #ifndef __APPLE__
00476 #include <malloc.h>
00477 #else
00478 #include <sys/malloc.h>
00479 #endif
00480 
00481 #ifdef __XSI_MAINLIB_
00482 #define XSIEXPORT
00483 #define XSITEMPLATEEXP
00484 #endif
00485 
00486 #ifdef __XSI_PLUGIN_
00487 #define XSIEXPORT
00488 #define XSITEMPLATEEXP
00489 #endif
00490 
00491 #ifdef __XSI_APPLICATION_
00492 #ifdef XSI_STATIC_LINK
00493 #define XSIEXPORT
00494 #define XSITEMPLATEEXP
00495 #else
00496 #define XSIEXPORT
00497 #define XSITEMPLATEEXP
00498 #endif
00499 #endif
00500 
00501 #define XSICOREEXPORT
00502 
00503 #define _SI_INITCORE
00504 #define _SI_EXITCORE
00505 
00506 // Memory stuff
00507 #define _SI_MSIZE( x )          0
00508 #define _SI_MEMCPY( x, y, z )   memcpy( x, y, z )
00509 
00510 // character string format
00511 #define SI_Char         char
00512 #define _SI_STRCMP      strcmp
00513 #define _SI_STRNCMP     strncmp
00514 #define _SI_STRICMP     strcasecmp
00515 #define _SI_STRDUP      si_strdup
00516 #define _SI_BSTRDUP     si_bstrdup
00517 #define _SI_STRCPY      strcpy
00518 #define _SI_STRNCPY     strncpy
00519 #define _SI_STRCAT      strcat
00520 #define _SI_SPRINTF     sprintf
00521 #define _SI_STRLEN      strlen
00522 #define _SI_TEXT(quote) quote
00523 #define _SI_PRINTF      CSIBCUtil::printf
00524 #define _SI_RAND()      rand()
00525 #define _SI_STRTOK      strtok
00526 #define _SI_STRSTR      strstr
00527 #define _SI_STRCHR      strchr
00528 #define _SI_STRRCHR     strrchr
00529 #define _SI_SPLITPATH   si_splitpath
00530 #define _SI_ATOI        atoi
00531 #define _SI_ATOF        atof
00532 
00533 #ifndef __APPLE__
00534 //Math Stuff
00535 #define _SI_SQRT        sqrt
00536 #define _SI_SQRTF       sqrtf
00537 #define _SI_ASIN        asin
00538 #define _SI_ASINF       asinf
00539 #define _SI_ACOS        acos
00540 #define _SI_ACOSF       acosf
00541 #define _SI_FLOOR       floor
00542 #define _SI_FLOORF      floorf
00543 #define _SI_COS         cos
00544 #define _SI_COSF        cosf
00545 #define _SI_SIN         sin
00546 #define _SI_SINF        sinf
00547 #define _SI_TAN         tan
00548 #define _SI_TANF        tanf
00549 #define _SI_ATANF       atanf
00550 #define _SI_ATAN        atan
00551 #else
00552 //Math Stuff
00553 #define _SI_SQRT                sqrt
00554 #define _SI_SQRTF               sqrt
00555 #define _SI_ASIN                asin
00556 #define _SI_ASINF               asin
00557 #define _SI_ACOS                acos
00558 #define _SI_ACOSF               acos
00559 #define _SI_FLOOR               floor
00560 #define _SI_FLOORF              floor
00561 #define _SI_COS                 cos
00562 #define _SI_COSF                cos
00563 #define _SI_SIN                 sin
00564 #define _SI_SINF                sin
00565 #define _SI_TAN                 tan
00566 #define _SI_TANF                tan
00567 #define _SI_ATANF               atan
00568 #define _SI_ATAN                atan
00569 #endif
00570 
00571 
00572 //File stuff
00573 #define __SI_FILE       FILE *
00574 #define __SI_FILE_MODE  SI_Char *
00575 #define __SI_FILE_NULL  (NULL)
00576 #define __SI_FILE_READ_TEXT "r"
00577 #define __SI_FILE_READ_BINARY "rb"
00578 #define __SI_FILE_WRITE_TEXT    "w"
00579 #define __SI_FILE_WRITE_BINARY "wb"
00580 #define __SI_FILE_SET SEEK_SET
00581 #define __SI_FILE_CUR SEEK_CUR
00582 #define __SI_FILE_END SEEK_END
00583 #define __SI_IS_FILE_MODE( a, b ) !_SI_STRCMP ( a, b )
00584 #define __SI_FOPEN( name, mode )        fopen( name, mode )
00585 #define __SI_FCLOSE( x )        fclose( x )
00586 #define __SI_FREAD( a, b, c, d ) fread( a, b, c, d )
00587 #define __SI_FWRITE( a, b, c, d ) fwrite( a, b, c, d )
00588 #define __SI_FPRINTF( a, b ) fprintf( a, b )
00589 #define __SI_FSEEK( ptr, count, type ) fseek( ptr, count, type )
00590 #define __SI_FTELL( ptr ) ftell( ptr )
00591 #define __SI_FGETC( fp ) ::fgetc(fp)
00592 #define __SI_FEOF( x )   feof(x)
00593 #define __SI_FERROR( x ) (ferror(x))
00594 #define __SI_FFLUSH( x ) (fflush(x))
00595 #define __SI_UNGETC( ch, fp )  (ungetc(ch,fp))
00596 
00597 //Assertion
00598 #ifdef _DEBUG
00599 #define _SI_ASSERT(x) assert(x)
00600 #else
00601 //void XSIEXPORT si_exit(SI_Char *, SI_Char *, const int );
00602 //#define _SI_ASSERT(exp) if (!(exp)) si_exit( #exp, __FILE__, __LINE__ );
00603 #define _SI_ASSERT(exp)
00604 #endif
00605 
00606 //Loadable module
00607 #define _SI_LIBHANDLE int
00608 
00609 // Local Memory Allocators
00610 XSICOREEXPORT void AllocateLocalMemory(SI_Char* &, SI_Long);
00611 XSICOREEXPORT void AllocateLocalMemory(SI_Char** &, SI_Long);
00612 
00613 #if !defined(MAX_PATH)
00614 #define MAX_PATH PATH_MAX
00615 #endif
00616 
00617 #endif
00618 
00619 //
00621 //
00622 //
00624 //
00625 
00626 #if ((defined _WIN32) || (defined WIN32)) && !(defined _WIN32_WCE) && !(defined _XBOX)
00627 
00628 #include <string.h>
00629 #include <stdio.h>
00630 #include <stdlib.h>
00631 #include <stdarg.h>
00632 #include <malloc.h>
00633 
00634 #ifdef __XSI_MAINLIB_
00635 #define XSIEXPORT _declspec(dllexport)
00636 #define XSITEMPLATEEXP
00637 #endif
00638 
00639 #ifdef __XSI_PLUGIN_
00640 #define XSIEXPORT _declspec(dllexport)
00641 #define XSITEMPLATEEXP
00642 #endif
00643 
00644 #ifdef __XSI_APPLICATION_
00645 #ifdef XSI_STATIC_LINK
00646 #define XSIEXPORT
00647 #define XSITEMPLATEEXP
00648 #else
00649 #define XSIEXPORT _declspec(dllimport)
00650 #define XSITEMPLATEEXP extern
00651 #endif
00652 #endif
00653 
00654 #ifndef XSICOREEXPORT
00655 # if ((defined _WIN32) || (defined WIN32)) && !(defined _WIN32_WCE) && !(defined _XBOX)
00656 #  ifdef XSICORE_IMPL
00657 #   define XSICOREEXPORT __declspec(dllexport)
00658 #  elif defined(XSICORE_STATIC)
00659 #   define XSICOREEXPORT
00660 #  else
00661 #   define XSICOREEXPORT __declspec(dllimport)
00662 #  endif
00663 # else
00664 #  define XSICOREEXPORT
00665 # endif
00666 #endif
00667 
00668 #define _SI_INITCORE
00669 #define _SI_EXITCORE
00670 
00671 // Memory stuff
00672 #define _SI_MSIZE( x )          _msize( x )
00673 #define _SI_MEMCPY( x, y, z )   memcpy( x, y, z )
00674 
00675 // character string format
00676 #define SI_Char         char
00677 #define _SI_STRCMP      strcmp
00678 #define _SI_STRNCMP     strncmp
00679 #define _SI_STRICMP     stricmp
00680 #define _SI_STRDUP      si_strdup
00681 #define _SI_BSTRDUP     si_bstrdup
00682 #define _SI_STRCPY      strcpy
00683 #define _SI_STRNCPY     strncpy
00684 #define _SI_STRCAT      strcat
00685 #define _SI_SPRINTF     sprintf
00686 #define _SI_STRLEN      strlen
00687 #define _SI_TEXT(quote) quote
00688 #define _SI_PRINTF      CSIBCUtil::printf
00689 #define _SI_RAND()      rand()
00690 #define _SI_STRTOK      strtok
00691 #define _SI_STRSTR      strstr
00692 #define _SI_STRCHR      strchr
00693 #define _SI_STRRCHR     strrchr
00694 #define _SI_SPLITPATH   _splitpath
00695 #define _SI_ATOI        atoi
00696 #define _SI_ATOF        atof
00697 
00698 
00699 //Math Stuff
00700 #define _SI_SQRT        sqrt
00701 #define _SI_SQRTF       sqrtf
00702 #define _SI_ASIN        asin
00703 #define _SI_ASINF       asinf
00704 #define _SI_ACOS        acos
00705 #define _SI_ACOSF       acosf
00706 #define _SI_FLOOR       floor
00707 #define _SI_FLOORF      floorf
00708 #define _SI_COS         cos
00709 #define _SI_COSF        cosf
00710 #define _SI_SIN         sin
00711 #define _SI_SINF        sinf
00712 #define _SI_TAN         tan
00713 #define _SI_TANF        tanf
00714 #define _SI_ATANF       atanf
00715 #define _SI_ATAN        atan
00716 
00717 //File stuff
00718 #define __SI_FILE       FILE *
00719 #define __SI_FILE_MODE  SI_Char *
00720 #define __SI_FILE_NULL  (NULL)
00721 #define __SI_FILE_READ_TEXT "r"
00722 #define __SI_FILE_READ_BINARY "rb"
00723 #define __SI_FILE_WRITE_TEXT    "w"
00724 #define __SI_FILE_WRITE_BINARY "wb"
00725 #define __SI_FILE_SET SEEK_SET
00726 #define __SI_FILE_CUR SEEK_CUR
00727 #define __SI_FILE_END SEEK_END
00728 #define __SI_IS_FILE_MODE( a, b ) !_SI_STRCMP ( a, b )
00729 #define __SI_FOPEN( name, mode )        fopen( name, mode )
00730 #define __SI_FCLOSE( x )        fclose( x )
00731 #define __SI_FREAD( a, b, c, d ) fread( a, b, c, d )
00732 #define __SI_FWRITE( a, b, c, d ) fwrite( a, b, c, d )
00733 #define __SI_FPRINTF( a, b ) fprintf( a, b )
00734 #define __SI_FSEEK( ptr, count, type ) fseek( ptr, count, type )
00735 #define __SI_FTELL( ptr ) ftell( ptr )
00736 #define __SI_FGETC( fp ) ::fgetc(fp)
00737 #define __SI_FEOF( x )   feof( x )
00738 #define __SI_FERROR( x ) (ferror(x))
00739 #define __SI_FFLUSH( x ) (fflush(x))
00740 #define __SI_UNGETC( ch, fp )  (ungetc(ch,fp))
00741 
00742 
00743 //Assertion
00744 #ifdef _DEBUG
00745 #define _SI_ASSERT(x) assert(x)
00746 #else
00747 //void XSIEXPORT si_exit(SI_Char *, SI_Char *, const int );
00748 //#define _SI_ASSERT(exp) if (!(exp)) si_exit( #exp, __FILE__, __LINE__ );
00749 #define _SI_ASSERT(exp)
00750 #endif
00751 
00752 //Loadable module
00753 #define SI_INVALID_LIB_HANDLE NULL
00754 #define _SI_LIBHANDLE   HMODULE
00755 #define _SI_LOADMODULE  LoadLibrary
00756 #define _SI_UNLOADMODULE( x )  FreeLibrary( x )
00757 #define _SI_LOADFUNCTION( HAND, NAME ) GetProcAddress( HAND, NAME )
00758 
00759 // Local Memory Allocators
00760 XSICOREEXPORT void AllocateLocalMemory(SI_Char* &, SI_Long);
00761 XSICOREEXPORT void AllocateLocalMemory(SI_Char** &, SI_Long);
00762 
00763 #endif
00764 
00765 //
00767 //
00768 
00769 //
00771 //
00772 #ifdef _WIN32_WCE
00773 
00774 #include <string.h>
00775 #include <stdio.h>
00776 #include <stdlib.h>
00777 #include <stdarg.h>
00778 
00779 //WINDOWS CE
00780 #define _SI_ASSERT(x)
00781 #include <tchar.h>
00782 #include <winbase.h>
00783 
00784 // Memory stuff
00785 #define _SI_MSIZE( x )          0
00786 #define _SI_MEMCPY( x, y, z )   0
00787 
00788 // character string format
00789 #define SI_Char         wchar_t
00790 #define _SI_STRCMP      wcscmp
00791 #define _SI_STRNCMP     wcsncmp
00792 #define _SI_STRICMP     wcsicmp
00793 #define _SI_STRCPY      lstrcpy
00794 #define _SI_STRNCPY     wsncpy
00795 #define _SI_STRDUP      si_strdup
00796 #define _SI_BSTRDUP     si_bstrdup
00797 #define _SI_STRCAT      wcscat
00798 #define _SI_SPRINTF     swprintf
00799 #define _SI_FPRINTF     fprintf
00800 #define _SI_STRLEN      wcslen
00801 #define _SI_TEXT(quote) __TEXT(quote)
00802 #define _SI_ATOI        _wtoi
00803 
00804 #define _SI_PRINTF      NKDbgPrintfW
00805 #define _SI_RAND()      rand()
00806 #define _SI_STRTOK      wcstok
00807 #define _SI_STRSTR      wcsstr
00808 #define _SI_STRCHR      wcschr
00809 #define _SI_STRRCHR     wcsrchr
00810 #define _SI_SPLITPATH   _wsplitpath
00811 
00812 extern  SI_Char         *_SI_ENDCHAR;
00813 #define _SI_ATOF(x)     wcstod(x, &_SI_ENDCHAR)
00814 
00815 #define _SI_SQRT        sqrt
00816 #define _SI_SQRTF       (SI_Float)sqrt
00817 #define _SI_ASIN        asin
00818 #define _SI_ASINF       (SI_Float)asin
00819 #define _SI_ACOS        acos
00820 #define _SI_ACOSF       (SI_Float)acos
00821 #define _SI_FLOOR       floor
00822 #define _SI_FLOORF      (SI_Float)floor
00823 #define _SI_COS         cos
00824 #define _SI_COSF        (SI_Float)cos
00825 #define _SI_SIN         sin
00826 #define _SI_SINF        (SI_Float)sin
00827 #define _SI_TAN         tan
00828 #define _SI_TANF        (SI_Float)tan
00829 
00830 // Some PPSH helper functions.
00831 extern "C"
00832 {
00833     int U_ropen(const WCHAR *, UINT);
00834     int U_rread(int, BYTE *, int);
00835     int U_rclose(int);
00836 }
00837 
00838 
00839 #define __SI_FILE               int
00840 #define __SI_FILE_MODE          int
00841 #define __SI_FILE_NULL          0
00842 #define __SI_FILE_READ_TEXT     0x00010002
00843 #define __SI_FILE_READ_BINARY   0x00010002
00844 #define __SI_FOPEN( name, mode )    U_ropen( name, mode)
00845 #define __SI_FCLOSE( x )            U_rclose( x )
00846 #define __SI_FREAD(a,b,c,d)     U_rread( d, (BYTE *) a, b * c)
00847 #define __SI_FEOF( x )           0
00848 #define __SI_IS_FILE_MODE( a, b ) a == b
00849 
00850 #endif
00851 
00852 //
00854 //
00855 
00856 //
00858 //
00859 #ifdef  _XBOX
00860 #include <string.h>
00861 #include <stdio.h>
00862 #include <stdlib.h>
00863 #include <stdarg.h>
00864 #include <malloc.h>
00865 
00866 
00867 #ifdef __XSI_MAINLIB_
00868 #define XSIEXPORT       _declspec(dllexport)
00869 #endif
00870 
00871 #ifdef __XSI_PLUGIN_
00872 #define XSIEXPORT _declspec(dllexport)
00873 #define XSITEMPLATEEXP
00874 #endif
00875 
00876 #ifdef __XSI_APPLICATION_
00877 #ifdef XSI_STATIC_LINK
00878 #define XSIEXPORT
00879 #undef XSICOREEXPORT
00880 #define XSICOREEXPORT
00881 #define XSITEMPLATEEXP
00882 #else
00883 #define XSIEXPORT _declspec(dllimport)
00884 #define XSICOREEXPORT   _declspec(dllimport)
00885 #define XSITEMPLATEEXP extern
00886 #endif
00887 #endif
00888 
00889 #define _SI_INITCORE
00890 #define _SI_EXITCORE
00891 
00892 // Memory stuff
00893 #define _SI_MSIZE( x )          _msize( x )
00894 #define _SI_MEMCPY( x, y, z )   memcpy( x, y, z )
00895 
00896 // character string format
00897 #define SI_Char         char
00898 #define _SI_STRCMP      strcmp
00899 #define _SI_STRNCMP     strncmp
00900 #define _SI_STRICMP     stricmp
00901 #define _SI_STRDUP      si_strdup
00902 #define _SI_BSTRDUP     si_bstrdup
00903 #define _SI_STRCPY      strcpy
00904 #define _SI_STRNCPY     strncpy
00905 #define _SI_STRCAT      strcat
00906 #define _SI_SPRINTF     sprintf
00907 #define _SI_STRLEN      strlen
00908 #define _SI_TEXT(quote) quote
00909 #define _SI_PRINTF      CSIBCUtil::printf
00910 #define _SI_RAND()      rand()
00911 #define _SI_STRTOK      strtok
00912 #define _SI_STRSTR      strstr
00913 #define _SI_STRCHR      strchr
00914 #define _SI_STRRCHR     strrchr
00915 #define _SI_SPLITPATH   _splitpath
00916 #define _SI_ATOI        atoi
00917 #define _SI_ATOF        atof
00918 
00919 //Math Stuff
00920 #define _SI_SQRT        sqrt
00921 #define _SI_SQRTF       sqrtf
00922 #define _SI_ASIN        asin
00923 #define _SI_ASINF       asinf
00924 #define _SI_ACOS        acos
00925 #define _SI_ACOSF       acosf
00926 #define _SI_FLOOR       floor
00927 #define _SI_FLOORF      floorf
00928 #define _SI_COS         cos
00929 #define _SI_COSF        cosf
00930 #define _SI_SIN         sin
00931 #define _SI_SINF        sinf
00932 #define _SI_TAN         tan
00933 #define _SI_TANF        tanf
00934 #define _SI_ATANF       atanf
00935 #define _SI_ATAN        atan
00936 
00937 typedef FILE* (*_XBOX_FOPEN_FNC)    ( char * filename, char* mode );
00938 typedef int (*_XBOX_FCLOSE_FNC) ( FILE* fdesc );
00939 typedef int (*_XBOX_FREAD_FNC)  ( void *result, int size, int count, FILE* );
00940 typedef int (*_XBOX_FWRITE_FNC) ( void *data, int size, int count, FILE* );
00941 typedef int (*_XBOX_FSEEK_FNC)  ( FILE*, LONG count, int mode );
00942 typedef int (*_XBOX_FTELL_FNC)  ( FILE* );
00943 typedef int (*_XBOX_FEOF_FNC)   ( FILE* );
00944 typedef int (*_XBOX_FGETC_FNC)  ( FILE* );
00945 
00946 
00947 FILE*   XBOXFileOpen ( char *filename , char* mode );
00948 int XBOXFileClose ( FILE* );
00949 int XBOXFileRead ( void *result, int size, int count, FILE* );
00950 int XBOXFileWrite ( void *data, int size, int count, FILE* );
00951 int XBOXFileSeek ( FILE*, LONG count, int mode );
00952 int XBOXFileTell ( FILE* );
00953 int XBOXFileEOF ( FILE* fdesc );
00954 int XBOXFileGETC ( FILE* fdesc );
00955 
00956 //File stuff
00957 
00958 #define __SI_FILE       FILE *
00959 #define __SI_FILE_MODE  SI_Char *
00960 #define __SI_FILE_NULL  (NULL)
00961 #define __SI_FILE_READ_TEXT "r"
00962 #define __SI_FILE_READ_BINARY "rb"
00963 #define __SI_FILE_WRITE_TEXT    "w"
00964 #define __SI_FILE_WRITE_BINARY "wb"
00965 #define __SI_FILE_SET SEEK_SET
00966 #define __SI_FILE_CUR SEEK_CUR
00967 #define __SI_FILE_END SEEK_END
00968 #define __SI_IS_FILE_MODE( a, b ) !_SI_STRCMP ( a, b )
00969 #define __SI_FOPEN( name, mode )    XBOXFileOpen( name, mode )
00970 #define __SI_FCLOSE( x )        XBOXFileClose( x )
00971 #define __SI_FREAD( a, b, c, d )    XBOXFileRead( a, b, c, d )
00972 #define __SI_FWRITE( a, b, c, d )   XBOXFileWrite( a, b, c, d )
00973 #define __SI_FPRINTF( a, b ) (0)
00974 #define __SI_FSEEK( ptr, count, type ) XBOXFileSeek( ptr, count, type )
00975 #define __SI_FTELL( ptr ) XBOXFileTell( ptr )
00976 #define __SI_FGETC( fp ) XBOXFileGETC(fp)
00977 #define __SI_FEOF( x )   XBOXFileEOF( x )
00978 #define __SI_FERROR( x ) (0)
00979 #define __SI_FFLUSH( x ) (0)
00980 
00981 XSICOREEXPORT SI_Char si_ungetc( SI_Char ch, __SI_FILE x );
00982 
00983 #define __SI_UNGETC( ch, fp )  (0)
00984 
00985 //Assertion
00986 #ifdef _DEBUG
00987 #define _SI_ASSERT(x) assert(x)
00988 #else
00989 //void XSIEXPORT si_exit(SI_Char *, SI_Char *, const int );
00990 //#define _SI_ASSERT(exp) if (!(exp)) si_exit( #exp, __FILE__, __LINE__ );
00991 #define _SI_ASSERT(exp)
00992 #endif
00993 
00994 //Loadable module
00995 #define SI_INVALID_LIB_HANDLE NULL
00996 #define _SI_LIBHANDLE   HMODULE
00997 #define _SI_LOADMODULE  LoadLibrary
00998 #define _SI_UNLOADMODULE( x )  FreeLibrary( x )
00999 #define _SI_LOADFUNCTION( HAND, NAME ) GetProcAddress( HAND, NAME )
01000 
01001 // Local Memory Allocators
01002 XSICOREEXPORT void AllocateLocalMemory(SI_Char* &, SI_Long);
01003 XSICOREEXPORT void AllocateLocalMemory(SI_Char** &, SI_Long);
01004 #endif
01005 
01006 
01007 //
01009 //
01010 #if defined( _PSX2 ) || defined( __MWERKS__ )
01011 
01012 #include <eekernel.h>
01013 #include <sifdev.h>
01014 #include <eeregs.h>
01015 #include <eetypes.h>
01016 #include <stdio.h>
01017 #include <string.h>
01018 #include <stdlib.h>
01019 #include <SIPS2Comm.h>
01020 
01021 //#include "SIPS2DisplayDriverSwitch.h"
01022 
01023 //#include <sys/types.h>
01024 //#include <fcntl.h>
01025 
01026 #ifdef __XSI_MAINLIB_
01027 #define XSIEXPORT
01028 #define XSITEMPLATEEXP
01029 #endif
01030 
01031 #ifdef __XSI_PLUGIN_
01032 #define XSIEXPORT
01033 #define XSITEMPLATEEXP
01034 #endif
01035 
01036 #ifdef __XSI_APPLICATION_
01037 #ifdef XSI_STATIC_LINK
01038 #define XSIEXPORT
01039 #define XSITEMPLATEEXP
01040 #else
01041 #define XSIEXPORT
01042 #define XSITEMPLATEEXP
01043 #endif
01044 #endif
01045 
01046 #ifndef XSICOREEXPORT
01047 #define XSICOREEXPORT
01048 #endif
01049 
01050 #ifndef XSIEXPORT
01051 #define XSIEXPORT
01052 #endif
01053 
01054 #ifndef min
01055 # define min(a,b) ((a) < (b) ? (a) : (b))
01056 #endif
01057 
01058 #ifndef max
01059 # define max(a,b) ((a) > (b) ? (a) : (b))
01060 #endif
01061 
01062 #ifndef _PSX2_FILEIO_NATIVE
01063 #define _PSX2_FILEIO_NATIVE
01064 #endif
01065 
01066 //predefinition
01067 #ifdef __cplusplus
01068 extern "C"
01069 {
01070 #endif
01071     int open( const char *, int );
01072     int close( int );
01073 //  off_t lseek( int fildes, off_t offset, int whence );
01074     char *strcat( char *dest, const char *src );
01075     int sprintf( char *str, const char *, ...);
01076     int printf( const char *, ... );
01077     int rand(void);
01078     int read( int , void*, int);
01079     int atoi( const char * );
01080     double atof( const char * );
01081     char * si_strchr( char *, int );
01082 
01083 #ifdef __cplusplus
01084 }
01085 #endif
01086 
01087 
01088 // Memory stuff
01089 #define _SI_MSIZE( x )          0
01090 #define _SI_MEMCPY( x, y, z )   memcpy( x, y, z )
01091 
01092 // character string format
01093 #define SI_Char         char
01094 #define _SI_STRCMP      strcmp
01095 #define _SI_STRNCMP     strncmp
01096 #define _SI_STRICMP     stricmp
01097 #define _SI_STRDUP      si_strdup
01098 #define _SI_BSTRDUP     si_bstrdup
01099 #define _SI_STRCPY      strcpy
01100 #define _SI_STRNCPY     strncpy
01101 #define _SI_STRCAT      strcat
01102 #define _SI_SPRINTF     sprintf
01103 #define _SI_STRLEN      strlen
01104 #define _SI_TEXT(quote) quote
01105 #define _SI_PRINTF      printf
01106 #define _SI_ATOI        atoi
01107 #define _SI_ATOF        atof
01108 
01109 // fprintf is not available and not needed on the PS2
01110 //#define _SI_FPRINTF
01111 
01112 #define _SI_RAND()      rand()
01113 #define _SI_STRTOK      strtok
01114 #define _SI_STRSTR      strstr
01115 #define _SI_STRCHR      si_strchr // MJD - Found a bug in strchr on GSCube
01116 #define _SI_STRRCHR     strrchr
01117 
01118 
01119 
01120 //Math Stuff
01121 #define _SI_SQRT        sqrt
01122 #define _SI_SQRTF       sqrtf
01123 #define _SI_ASIN        asin
01124 #define _SI_ASINF       asinf
01125 #define _SI_ACOS        acos
01126 #define _SI_ACOSF       acosf
01127 #define _SI_FLOOR       floor
01128 #define _SI_FLOORF      floorf
01129 #define _SI_TAN         tan
01130 #define _SI_TANF        tanf
01131 #define _SI_ATANF       atanf
01132 
01133 #ifdef _INLINETRIG_
01134 #define _SI_COS(x)      SI_CosineTable[((int)(x) * 10000) % 62831]
01135 #define _SI_COSF(x)     SI_CosineTable[((int)(x) * 10000) % 62831]
01136 #define _SI_SIN(x)      SI_SineTable[((int)(x) * 10000) % 62831]
01137 #define _SI_SINF(x)     SI_SineTable[((int)(x) * 10000) % 62831]
01138 #else
01139 #define _SI_COS         CSIBCUtil::cos
01140 #define _SI_COSF        CSIBCUtil::cos
01141 #define _SI_SIN         CSIBCUtil::sin
01142 #define _SI_SINF        CSIBCUtil::sin
01143 #endif
01144 
01145 
01146 
01147 
01148 
01149 
01150 
01151 // use only if files come from a DOS/Windows system (which is the case)
01152 #ifndef __APPLE__
01153 #define LITTLE_ENDIAN
01154 #endif
01155 
01156 //File stuff
01157 #define __SI_FILE               int
01158 #define __SI_FILE_MODE          int
01159 #define __SI_FILE_NULL          (int)(-1)
01160 #define __SI_FILE_READ_TEXT SCE_RDONLY
01161 #define __SI_FILE_READ_BINARY SCE_RDONLY
01162 #define __SI_FILE_WRITE_TEXT    SCE_WRONLY | SCE_TRUNC | SCE_CREAT
01163 #define __SI_FILE_WRITE_BINARY SCE_WRONLY | SCE_TRUNC | SCE_CREAT
01164 #define __SI_FILE_SET SCE_SEEK_SET
01165 #define __SI_FILE_CUR SCE_SEEK_CUR
01166 #define __SI_FILE_END SCE_SEEK_END
01167 #define __SI_IS_FILE_MODE( a, b ) ((a)==(b))
01168 #define __SI_FOPEN( NAME, MODE ) PS2FileOpen( NAME, MODE )
01169 #define __SI_FCLOSE( x ) PS2FileClose( x )
01170 #define __SI_FREAD( buf, size, count, fp ) PS2FileRead( fp, buf, size, count )
01171 #define __SI_FWRITE( buf, size, count, fp ) PS2FileWrite( fp, buf, size, count )
01172 // fprintf is not available and not needed on the PS2
01173 #define __SI_FSEEK( ptr, count, type ) PS2FileSeek( ptr, count, type )
01174 #define __SI_FTELL( ptr ) PS2FileTell( ptr )
01175 #define __SI_FGETC( fp ) PS2FileGetC( fp )
01176 #define __SI_FEOF( x )   PS2FileEOF( x )
01177 
01178 #define _SI_INITCORE SIPS2CommInit();
01179 #define _SI_EXITCORE SIPS2CommClose();
01180 
01181 #ifdef _DEBUG
01182 #define _SI_ASSERT(x) assert(x)
01183 #else
01184 void XSIEXPORT si_exit(SI_Char *, SI_Char *, const int );
01185 //#define _SI_ASSERT(exp) if (!(exp)) si_exit( #exp, __FILE__, __LINE__ );
01186 #define _SI_ASSERT(exp)
01187 #endif
01188 
01189 
01190 //Loadable module
01191 #define SI_INVALID_LIB_HANDLE -1
01192 #define _SI_LIBHANDLE   int
01193 
01194 #endif
01195 //
01197 //
01198 
01199 // Already documented in SIBCMath.h
01200 #ifndef M_PI
01201 #define M_PI        3.14159265358979323846
01202 #endif
01203 
01209 #define _ERRMSG(x) _SI_PRINTF(_SI_TEXT("ERROR : %s\n"),x);
01210 
01212 #define _MSG(x)    _SI_PRINTF(_SI_TEXT("MSG   : %s\n"),x);
01213 
01215 #define _SI_NEW(x,y) {  x = new y; _SI_ASSERT( x != NULL ); }
01216 
01218 #define _SI_DELETE( ptr ) { if ( ptr != NULL ) { delete ptr; ptr = NULL; }  }
01219 
01221 #define _SI_DELETE_ARRAY( ptr ) {if ( ptr != NULL ) { delete [] ptr; ptr = NULL; }  }
01222 
01227 #define _SI_CALL(x,y) { if (result==SI_SUCCESS) { result = x;if(result != SI_SUCCESS){_ERRMSG(y);}}}
01228 
01229 #define _SI_CHKRESULT( RESULT, MESSAGE, ACTION ){if (RESULT != SI_SUCCESS){ _ERRMSG( MESSAGE ); ACTION; }   }
01230 
01231 XSICOREEXPORT SI_Char *  si_strdup( const SI_Char * );
01232 XSICOREEXPORT SI_Char *  si_bstrdup( const SI_Byte * );
01233 XSICOREEXPORT SI_Error si_bstringtostring( SI_Char *, const SI_Byte * );
01234 XSICOREEXPORT SI_Void si_splitpath(const SI_Char *, SI_Char *, SI_Char *, SI_Char *, SI_Char *);
01235 
01236 #define _SI_STRDUPL(D,S) { D = (char *) alloca(strlen(S)); strcpy(D,S); }
01237 
01238 #ifdef __cplusplus //If included by C-files this causes an error
01239 
01240 #ifdef _INLINETRIG_
01241 extern  float   SI_SineTable[62831];
01242 extern  float   SI_CosineTable[62831];
01243 #endif
01244 
01245 //**************************************************************************************
01246 // CSIBCUtil | Utility functions.
01247 //**************************************************************************************
01248 
01250 
01254 class XSICOREEXPORT CSIBCUtil
01255 {
01256 public:
01257 
01261     CSIBCUtil();
01262     ~CSIBCUtil();
01263 
01274     static  SI_Error    Open(SI_Char *in_pFilename);
01275 
01285     static  SI_Error    Close();
01286 
01290     static  void        SetToStderr();
01291 
01298     static  void        printf(SI_Char * str,...);
01299 
01300     // Fast lookup table for trigonometric functions
01301 
01306     static  void        InitializeTrigTables();
01307 
01314     static  float       cos(float x);
01315 
01322     static  float       sin(float x);
01323 
01324 protected:
01325     static SI_Char m_Filename[256];
01326 
01327 private:
01328     SI_Void             *m_pUnused;
01329 
01330 };
01331 
01332 #endif
01333 
01334 
01335 //**************************************************************************************
01336 // Inline code
01337 //**************************************************************************************
01338 
01339 
01340 //***************************************************************************************
01341 // Author   : Games S.W.A.T. Team
01342 // Date     :
01343 //
01344 // Calculates the cosine of an angle.
01345 // float | x | Angle.
01346 // Result of the cosine operation.
01347 //***************************************************************************************
01348 inline float CSIBCUtil::cos(float x)
01349 {
01350 #ifdef _INLINETRIG_
01351     int     index = (int) ( x * 10000.0f);
01352 
01353     if (index < 0)
01354         index += 628310000;
01355 
01356     return SI_CosineTable[index % 62831];
01357 #else
01358     return _SI_COSF(x);
01359 #endif
01360 }
01361 
01362 //***************************************************************************************
01363 // Author   : Games S.W.A.T. Team
01364 // Date     :
01365 //
01366 // Calculates the sine of an angle.
01367 // float | x | Angle.
01368 // Result of the sin operation.
01369 //***************************************************************************************
01370 inline float CSIBCUtil::sin(float x)
01371 {
01372 #ifdef _INLINETRIG_
01373     int     index = (int) ( x * 10000.0f);
01374 
01375     if (index < 0)
01376         index += 628310000;
01377 
01378     return SI_SineTable[index % 62831];
01379 #else
01380     return _SI_SINF(x);
01381 #endif
01382 }
01383 
01384 //**************************************************************************************
01385 // _SI_FILE macro definitions
01386 //
01387 //
01388 //**************************************************************************************
01389 
01390 // SIFILE things
01391 
01392 // No need to document this class, it is only used as a private member of SIFilePtr.
01393 class SIFileInterface
01394 {
01395 public:
01396     virtual ~SIFileInterface()
01397     {
01398     }
01399 
01400     // FUNCTIONS
01401     virtual int close() = 0;
01402 
01403     virtual size_t read( void *pbuffer, size_t size, size_t count ) = 0;
01404 
01405     virtual size_t write( const void *buffer, size_t size, size_t count ) = 0;
01406 
01407     virtual int printf( const char *format ) = 0;
01408 
01409     virtual int seek( LONG offset, int origin ) = 0;
01410 
01411     virtual LONG tell() = 0;
01412 
01413     virtual int fgetc() = 0;
01414 
01415     virtual int eof() = 0;
01416 
01417     virtual int error() = 0;
01418 
01419     virtual int flush() = 0;
01420 
01421     virtual int siungetc( int ch ) = 0;
01422 
01423     // OPERATORS
01424     virtual operator __SI_FILE() = 0;
01425 
01426     //virtual operator bool() const = 0;
01427 
01428     // you must define:  operator=( __SI_FILE const& other )
01429 };
01430 class SIFile: public SIFileInterface
01431 {
01432 private:
01433     __SI_FILE fp;
01434 
01435 public:
01436     enum openMode
01437     {
01438         Read_Text = 0,
01439         Read_Binary,
01440         Write_Text,
01441         Write_Binary,
01442     };
01443 
01444     enum seekDir
01445     {
01446 #ifdef __SI_FILE_SET
01447         sdSet = __SI_FILE_SET,
01448 #endif
01449 #ifdef __SI_FILE_CUR
01450         sdCur = __SI_FILE_CUR,
01451 #endif
01452 #ifdef __SI_FILE_END
01453         sdEnd = __SI_FILE_END,
01454 #endif
01455     };
01456 
01457     // CONSTRUCTORS
01458 
01459     SIFile(): fp( __SI_FILE_NULL ) {}
01460 
01461     SIFile( __SI_FILE file ): fp( file ) {}
01462 
01463     SIFile( const char *name, int mode )        // open
01464     {
01465 #ifdef __SI_FOPEN
01466         static __SI_FILE_MODE const mt[] =
01467         {
01468 #ifdef __SI_FILE_READ_TEXT
01469         __SI_FILE_READ_TEXT,
01470 #else
01471     #error you need to define this
01472 #endif
01473 #ifdef __SI_FILE_READ_BINARY
01474         __SI_FILE_READ_BINARY,
01475 #else
01476     #error you need to define this
01477 #endif
01478 #ifdef __SI_FILE_WRITE_TEXT
01479         __SI_FILE_WRITE_TEXT,
01480 #else
01481     #error you need to define this
01482 #endif
01483 #ifdef __SI_FILE_WRITE_BINARY
01484         __SI_FILE_WRITE_BINARY,
01485 #else
01486     #error you need to define this
01487 #endif
01488         };
01489         fp = __SI_FOPEN( (char*)name, mt[mode] );
01490 #else
01491     #error you need to define this
01492 #endif
01493     }
01494 
01495     // FUNCTIONS
01496     int close()
01497     {
01498 #ifdef __SI_FCLOSE
01499         int     temp = __SI_FCLOSE( fp );
01500         fp = __SI_FILE_NULL;                        // extra safety
01501         return temp;
01502 #else
01503         _SI_ASSERT( false );
01504         return 0;
01505 #endif
01506     }
01507 
01508     size_t read( void *buffer, size_t size, size_t count )
01509     {
01510 #ifdef __SI_FREAD
01511         return __SI_FREAD( buffer, size, count, fp );
01512 #else
01513         _SI_ASSERT( false );
01514         return 0;
01515 #endif
01516     }
01517 
01518     size_t write( const void *buffer, size_t size, size_t count )
01519     {
01520 #ifdef __SI_FWRITE
01521         return __SI_FWRITE( (void*)buffer, size, count, fp );
01522 #else
01523         _SI_ASSERT( false );
01524         return 0;
01525 #endif
01526     }
01527 
01528     int printf( const char *format )
01529     {
01530 #ifdef __SI_FPRINTF
01531         return __SI_FPRINTF( fp, format );
01532 #else
01533         _SI_ASSERT( false );
01534         return 0;
01535 #endif
01536     }
01537 
01538     int seek( LONG offset, int origin )
01539     {
01540 #ifdef __SI_FSEEK
01541         return __SI_FSEEK( fp, offset, origin );
01542 #else
01543         _SI_ASSERT( false );
01544         return 0;
01545 #endif
01546     }
01547 
01548     LONG tell()
01549     {
01550 #ifdef __SI_FTELL
01551         return __SI_FTELL( fp );
01552 #else
01553         _SI_ASSERT( false );
01554         return 0;
01555 #endif
01556     }
01557 
01558     int fgetc()
01559     {
01560 #ifdef __SI_FGETC
01561         return __SI_FGETC( fp );
01562 #else
01563         _SI_ASSERT( false );
01564         return 0;
01565 #endif
01566     }
01567 
01568     int eof()
01569     {
01570 #ifdef __SI_FEOF
01571         return __SI_FEOF( fp );
01572 #else
01573         _SI_ASSERT( false );
01574         return 0;
01575 #endif
01576     }
01577 
01578     int error()
01579     {
01580 #ifdef __SI_FERROR
01581         return __SI_FERROR( fp );
01582 #else
01583         _SI_ASSERT( false );
01584         return 0;
01585 #endif
01586     }
01587 
01588     int flush()
01589     {
01590 #ifdef __SI_FFLUSH
01591         return __SI_FFLUSH( fp );
01592 #else
01593         _SI_ASSERT( false );
01594         return 0;
01595 #endif
01596     }
01597 
01598     int siungetc( int ch )
01599     {
01600 #ifdef __SI_UNGETC
01601         return __SI_UNGETC( ch, fp );
01602 #else
01603         _SI_ASSERT( false );
01604         return 0;
01605 #endif
01606     }
01607 
01608     // OPERATORS
01609     operator __SI_FILE()
01610     {
01611         return fp;
01612     }
01613 
01614     /*operator bool() const
01615     {
01616         return fp == __SI_FILE_NULL;
01617     }*/
01618 
01619     SIFile operator=( __SI_FILE const& other )
01620     {
01621         fp = other;
01622         return *this;
01623     }
01624 
01625     SIFile operator=( SIFile const& other )
01626     {
01627         fp = other.fp;
01628         return *this;
01629     }
01630 };
01631 
01632 //***************************************************************************************
01633 //
01634 // Author  : Neil Girdhar / Softimage Games Team
01635 // Date    : July 8th 2002
01636 //
01637 // FILE STUFF
01638 //
01639 //***************************************************************************************
01640 
01641 // BUFFERED FILE
01642 
01643 #if defined( _XBOX ) || defined( _PSX2 )
01644 class BufferedFile: public SIFileInterface
01645 {
01646 private:
01647     char                *buffer;
01648     int                 goodBytes;          // bytes of the buffer that are good
01649     int                 position;           // position of next read in buffer
01650     unsigned int        bufferSize;
01651     SIFile              fp;
01652     /*
01653     our position in the underlying stream will always be goodBytes.
01654     to synchronise the surface stream, we would seek (position-goodBytes) (a negative number) bytes forward.
01655     */
01656 
01657 public:
01658     // CONSTRUCTORS
01659     BufferedFile(): buffer( NULL ), goodBytes(0), position(0), bufferSize( 0 ), fp()
01660     {
01661     }
01662 
01663     BufferedFile( __SI_FILE fpIn ): buffer( NULL ), goodBytes(0), position(0), bufferSize( 0 ), fp( fpIn )
01664     {
01665     }
01666 
01667     BufferedFile( const char *name, int mode, unsigned int bs ): buffer( new char[bs] ), goodBytes(0), position(0), bufferSize( bs ), fp()
01668     {
01669         fp = SIFile( name, mode );
01670     }
01671 
01672     virtual ~BufferedFile()
01673     {
01674         if( buffer!=NULL ) delete [] buffer;
01675     }
01676 
01677     // BUFFERING FUNCTIONS
01678     void clearBuffer()
01679     {
01680         goodBytes = 0;
01681     }
01682 
01683     void reseekBuffer()
01684     {
01685         int         seekdistance = position-goodBytes;      // see note above
01686         if( seekdistance==0 ) return;           // already seeked
01687         fp.seek( seekdistance, SIFile::sdCur ); // seek forward to where the user thinks we are  (room for optimization)
01688         position = 0;                           // set our position
01689         clearBuffer();                          // clear the buffer after reseek
01690     }
01691 
01692     unsigned int fillBuffer()
01693     {
01694         reseekBuffer();
01695         goodBytes = fp.read( buffer, 1, bufferSize );
01696 #ifdef  _PSX2
01697         if (goodBytes < 0)
01698             goodBytes = 0;
01699 #endif
01700         position = 0;
01701         return  goodBytes;
01702     }
01703 
01704     unsigned int remainingBytesInBuffer()
01705     {
01706         return goodBytes-position;
01707     }
01708 
01709     // FUNCTIONS
01710     int close()
01711     {
01712         clearBuffer();
01713         return fp.close();
01714     }
01715 
01716     size_t read( void *pbuffer, size_t size, size_t count )
01717     {
01718         if( size*count<=bufferSize )        // only cache for small reads
01719         //if( false )
01720         {
01721             char        *dest = (char*)pbuffer;
01722             int         copiedWords = 0;
01723 
01724             while( count>0 )
01725             {
01726                 if( remainingBytesInBuffer()<size )
01727                 {
01728                     if( fillBuffer()<size )
01729                     {
01730                         break;  // could not read at least one word/record
01731                     }
01732                 }
01733 
01734                 // buffer is not empty, so copy out good bytes
01735                 {
01736                     int         copyWords = min( remainingBytesInBuffer()/size, count );    // words to copy
01737                     int         copyBytes = copyWords * size;                   // bytes to copy
01738 
01739                     _SI_MEMCPY( dest, buffer+position, copyBytes );
01740 
01741                     dest += copyBytes;
01742                     position += copyBytes;
01743 
01744                     copiedWords += copyWords;
01745                     count -= copyWords;
01746                 }
01747             }
01748 
01749             return copiedWords;
01750         }
01751         else
01752         {
01753             reseekBuffer();
01754             clearBuffer();
01755             return fp.read( pbuffer, size, count );
01756         }
01757     }
01758 
01759     size_t write( const void *buffer, size_t size, size_t count )
01760     {
01761         reseekBuffer();
01762         clearBuffer();
01763         return fp.write( buffer, size, count );
01764     }
01765 
01766     int printf( const char *format )
01767     {
01768         reseekBuffer();
01769         clearBuffer();
01770         return fp.printf( format );
01771     }
01772 
01773     int seek( LONG offset, int origin )
01774     {
01775         if( origin==SIFile::sdCur )
01776         {
01777             offset+=position-goodBytes;             // collect position and offset together
01778         }
01779         position = 0;                       // after the seek, we will be at position 0
01780         clearBuffer();                      // buffer is invalid after seek; there is room for optimization here, but it shouldn't matter in general use
01781         return fp.seek( offset, origin );   // recurse
01782     }
01783 
01784     LONG tell()
01785     {
01786         return fp.tell() + position;        // user thinks we are position bytes ahead
01787     }
01788 
01789     int fgetc()
01790     {
01791         char retval;
01792         if( read( &retval, 1, 1 )==0 )
01793         {
01794             return fp.fgetc();              // same EOF/error characteristics
01795         }
01796         return retval;
01797     }
01798 
01799     int eof()
01800     {
01801         if( goodBytes > position ) return 0;
01802         reseekBuffer();
01803         return fp.eof();
01804     }
01805 
01806     int error()
01807     {
01808         reseekBuffer();
01809         return fp.error();
01810     }
01811 
01812     int flush()
01813     {
01814         // no need to reseek or clear buffer
01815         return fp.flush();
01816     }
01817 
01818     int siungetc( int ch )
01819     {
01820         reseekBuffer();
01821         clearBuffer();
01822         return fp.siungetc( ch );
01823     }
01824 
01825     // OPERATORS
01826     operator SIFile()
01827     {
01828         reseekBuffer();
01829         clearBuffer();
01830         return fp;
01831     }
01832 
01833     operator __SI_FILE()
01834     {
01835         reseekBuffer();
01836         clearBuffer();
01837         return fp;
01838     }
01839 
01840     /*operator bool() const
01841     {
01842         return (bool)fp;
01843     }*/
01844 };
01845 #endif
01846 
01847 class SIFilePtr
01848 {
01849 private:
01850     SIFileInterface     *fp;
01851 
01852 public:
01853     SIFilePtr()
01854     {
01855         fp = NULL;
01856     }
01857 
01858     SIFilePtr( __SI_FILE file )
01859     {
01860         fp = NULL;
01861         this->operator=( file );
01862     }
01863 
01864 
01865     SIFilePtr( const char *name, int mode )
01866     {
01867 #if (defined _XBOX) || (defined _PSX2)
01868         fp = (SIFileInterface*)new BufferedFile( name, mode, 2048 );        // bufferring
01869 #elif (defined unix) \
01870         || ((defined _WIN32) || (defined WIN32)) && !(defined _WIN32_WCE) && !(defined _XBOX) \
01871         || (defined _WIN32_WCE)
01872         fp = (SIFileInterface*)new SIFile( name, mode );                    // no bufferring
01873 #else
01874         // unknown platform
01875         fp = (SIFileInterface*)new SIFile( name, mode );                    // no bufferring
01876 #endif
01877     }
01878 
01879     ~SIFilePtr()
01880     {
01881     }
01882 
01883     // FUNCTIONS
01884     int close()
01885     {
01886         int retval = fp->close();
01887         delete fp;
01888         return retval;
01889     }
01890 
01891     size_t read( void *pbuffer, size_t size, size_t count )
01892     {
01893         return fp->read( pbuffer, size, count );
01894     }
01895 
01896     size_t write( const void *buffer, size_t size, size_t count )
01897     {
01898         return fp->write( buffer, size, count );
01899     }
01900 
01901     int printf( const char *format )
01902     {
01903         return fp->printf( format );
01904     }
01905 
01906     int seek( LONG offset, int origin )
01907     {
01908         return fp->seek( offset, origin );  // recurse
01909     }
01910 
01911     LONG tell()
01912     {
01913         return fp->tell();
01914     }
01915 
01916     int fgetc()
01917     {
01918         return fp->fgetc();
01919     }
01920 
01921     int eof()
01922     {
01923         return fp->eof();
01924     }
01925 
01926     int error()
01927     {
01928         return fp->error();
01929     }
01930 
01931     int flush()
01932     {
01933         return fp->flush();
01934     }
01935 
01936     int siungetc( int ch )
01937     {
01938         return fp->siungetc( ch );
01939     }
01940 
01941     // OPERATORS
01942 
01943     operator __SI_FILE()
01944     {
01945         if( fp==NULL ) return __SI_FILE_NULL;
01946         return (__SI_FILE)(*fp);
01947     }
01948 
01949     /*operator bool() const
01950     {
01951         if( fp==NULL ) return false;
01952         return fp->operator bool();
01953     }*/
01954 
01955     SIFilePtr& operator=( __SI_FILE const & other )
01956     {
01957         if( other == __SI_FILE_NULL )
01958         {
01959             fp = NULL;
01960         }
01961         else
01962         {
01963             fp = (SIFileInterface*)new SIFile( other );
01964         }
01965         return *this;
01966     }
01967 
01968     SIFilePtr& operator=( const SIFilePtr &other )
01969     {
01970         // check for equality (are we the same as what we're assigning to)
01971         if (this != &other) {
01972             fp = other.fp;
01973         }
01974         return *this;
01975     }
01976 };
01977 
01978 typedef SIFilePtr _SI_FILE;
01979 
01980 XSICOREEXPORT SI_Char si_getc( _SI_FILE x );
01981 XSICOREEXPORT SI_Char si_ungetc( SI_Char ch, _SI_FILE x );
01982 
01983 
01984 // FILE MACROS
01985 #define _SI_FILE_MODE   SIFile::openMode
01986 #define _SI_FILE_NULL   __SI_FILE_NULL
01987 #define _SI_FILE_READ_TEXT  (SIFile::Read_Text)
01988 #define _SI_FILE_READ_BINARY (SIFile::Read_Binary)
01989 #define _SI_FILE_WRITE_TEXT (SIFile::Write_Text)
01990 #define _SI_FILE_WRITE_BINARY (SIFile::Write_Binary)
01991 #define _SI_FILE_SET (SIFile::sdSet)
01992 #define _SI_FILE_CUR (SIFile::sdCur)
01993 #define _SI_FILE_END (SIFile::sdEnd)
01994 #define _SI_IS_FILE_MODE( a, b ) ((a)==(b))
01995 #define _SI_FOPEN( name, mode )     (_SI_FILE( name, mode ))
01996 #define _SI_FCLOSE( x )     ((x).close())
01997 #define _SI_FREAD( a, b, c, d ) ((d).read( a, b, c ))
01998 #define _SI_FWRITE( a, b, c, d ) ((d).write( a, b, c ))
01999 #define _SI_FPRINTF( a, b ) ((a).printf( b ))
02000 #define _SI_FSEEK( ptr, count, type ) ((ptr).seek( count, type ))
02001 #define _SI_FTELL( ptr ) ((ptr).tell())
02002 #define _SI_FGETC( fp ) ((fp).fgetc())
02003 #define _SI_FEOF( x ) ((x).eof())
02004 #define _SI_FERROR( x ) ((x).error())
02005 #define _SI_FFLUSH( fp ) ((fp).flush())
02006 #define _SI_UNGETC( fp ) ((fp).siungetc())
02007 
02008 //**************************************************************************************
02009 // WARNING CALLBACK FUNCTION
02010 //
02011 //
02012 //**************************************************************************************
02013 
02014 typedef SI_Void (*SI_WARNING_CALLBACK_FNC)  ( SI_Char*, SI_Int );
02015 #define SI_MESSAGE  0
02016 #define SI_WARNING  1
02017 #define SI_ERROR    2
02018 
02019 //
02020 // Allocation
02021 //
02022 
02023 XSICOREEXPORT void  *   FTK_calloc( size_t, size_t );
02024 XSICOREEXPORT void      FTK_free( void * );
02025 XSICOREEXPORT void      FTK_delete( void * );
02026 
02027 //**************************************************************************************
02028 // URL FUNCTIONS
02029 //
02030 //
02031 //**************************************************************************************
02032 
02033 class CSIBCString;
02034 SI_Error FTK_GetURLParts(char* in_pURL, CSIBCString* out_pScheme, CSIBCString* out_pAuthority, CSIBCString* out_pPath, CSIBCString* out_pQuery, CSIBCString* out_pFragment);
02035 void FTK_ConvertStringFromURL(CSIBCString &io_String);
02036 void FTK_ConvertStringToURL(CSIBCString &io_String);
02037 
02038 #endif // CSIBCUtil